CODESYS Control(Runtime)のPLCプログラムから同一デバイス(Zynq ultrascale+ボード)内のPythonプログラムを起動する。
Pythonプログラムを起動
- まずCODESYS Controlを動作させているWindows PCでPythonプログラムファイルを作成
- CODESYS Controlでプロジェクトを開く
- 左のNavigationのApplicationで右クリックしてフォルダを作成。 ここでは『test_python』フォルダを作成した。
- そのフォルダ上で右クリックして『オブジェクトの追加』~『外部ファイル』
- 『ファイルパス』に作成したPythonプログラムファイルを設定する
サンプルプログラムで使うグローバル変数の設定
- 左のNavigationのApplicationで右クリックして
- 『オブジェクトの追加』~『グローバル変数リスト』を選択して、『GVL』という名前でグローバル変数リストを作成し
- 以下の様に、BOOL型の『init』と言う変数を作成します。
PLCプログラム起動前に実行するイベントと関数の設定
- 左のNavigationの『タスク構成(Task configuration)』をダブルクリック
- 『タスク構成』のタブが現れるので選択
- 『システムイベント』タブを選択
- 『イベントハンドラーの追加』をクリック
- イベントのプルダウンで『PrepareStart』を選択
イベントと実行する関数の関連付け
MyExecPythonFunc関数はまだ作成していませんが、先にPLCプログラムが起動する前に発生するイベントに関連付けておきます。
- 上記で『OK』を押すと自動的にMyExecPythonFunc 関数(FUN)が作成されるのでそのFUNをクリックして
- 下のWindow(Functionのプログラム記述)に『GVL.init:=FALSE;』と記述する。 グローバル変数、運転(RUN)開始になった時GVL.initビットをOFFにしておく。 メインプログラムでこのビットを見て、OFFの時初期化プログラムを走らせた後ONにする。
- このFUNは運転開始(PrepareStart)イベントで自動的に実行される
- このFUNはタスク構成に入れる必要なく、Applicationの直下に配置したままで実行される
実際にPythonを起動するPLCプログラム(POU)の作成
- Application上で右クリックして『オブジェクトの追加』~『POU…』でPOUを作成します。
- ここではPOU名を『_PythonExecute』としています。
- ST(Structured Text)で記述するので実装言語をSTにします。
- 『追加』を押すとApplicationの下に追加されます。
- プログラムの内容は後で記述します。
Pythonプログラム用意
- /home/petalinux/PlcLogic/Application/にtest_codesys.pyを用意します。
- これは同じディレクトリにlog.txtファイルを作り、実行されると実行された時間をログしていきます。
import datetime print('Hello,CodeSys') d=datetime.datetime.now() path='log.txt' f=open(path,"a") f.write(str(d)+'\n') f.close() print("hello ichiri")
PLCプログラム記述
_PythonExecuteの変数設定部分です。
PROGRAM _PyrhonExecute VAR dwCopySize: DWORD; dutResult : RTS_IEC_RESULT; szCommand : STRING(200); fbTimer : TON; szStdOout : STRING(1000); fbTimer1 : TON; Command : STRING(100); Command2 : STRING(100); END_VAR
- _PythonExecuteのPLCプログラム部分です。
- (* から *)はコメントです。
- //も行のコメントです。
- chmod +xで実行するPythonプログラムを実行可能形式にしています。 これがエラーになる場合は、予めsudo chownで所有者をpetalinux:petalinuxに変更して、sudo chmodで777にでも変更しておくといいと思います。
- 私の場合、SysProcessCommand2でsudoが使えず、chmodは出来ませんでした。
(* /etc/CODESYSControl.cfg: [SysProcess] Command=AllowAll *) dwCopySize:=9; IF NOT GVL.init THEN //Change the permission that can execute SysProcess_Implementation.SysProcessExecuteCommand2(pszCommand:='chmod +x /home/petalinux/PlcLogic/Application/test_codesys.py' , pszStdOut:=szStdOout , udiStdOutLen:= SIZEOF(szStdOout) , pResult := ADR(dutResult)); //Init is finished GVL.init:=TRUE; GVL.MyCount:=10000; END_IF //Flash Timer fbTimer1(IN:= TRUE, PT:=T#1S); //Command Command:= 'python /home/petalinux/PlcLogic/Application/test_codesys.py'; //Timer is ON IF fbTimer1.Q THEN //Reset it and flash again fbTimer1(IN:= FALSE); //Execute SysProcess_Implementation.SysProcessExecuteCommand2(pszCommand:=Command , pszStdOut:=szStdOout , udiStdOutLen:= SIZEOF(szStdOout) , pResult := ADR(dutResult)); GVL.MyCount:=GVL.MyCount+1; END_IF
プログラム(POU)をタスク構成に追加
POUはApplicationの下にあるだけでは実行しません。 なので_PythonExecuteをコピペでタスク構成のMainTaskの下に追加します。
必要なライブラリを追加(インポート)
外部Pythonを実行するには、デフォルトでは入っていないSysProcessCommand2ライブラリ等を追加しなければなりません。 SysProcessCommand2は、Linuxの場合シェルコマンドを実行します。 なのでシェルでPythonプログラムを実行するのと同じようにPythonプログラムを実行できるのです。
- 左のNavigationから『ライブラリマネージャー』をダブルクリック
- 『ライブラリの追加』をクリック
- 追加するライブラリ名(ファンクション名)で検索する。 下の例では、 上記POUで使用している『SysProcessExecuteCommand2』
- 検索で見つかったら、クリックして水色にハイライトされたら『OK』で『SysProcessExecuteCommand2』を追加します。
/etc/CODESYSControl.cfg設定
SysProcessCommand2ライブラリを追加しても実行できないので、/etc/CODESYSControl_User.cfgに以下を追加します。
[SysProcess] Command=AllowAll
しかし、私の場合、/etc/下にCODESYSControl_User.cfgがあっても、CODESYS Controlが見つけれておらず、SysProcessCommand2コマンドを実行したら『25』(これは10進数表記)が入ってきたので調べたら、16#19は『No access rights FOR THIS operation』(CODESYSマニュアル(エラーコード)には16進数表記のみ)だった。 そこでCODESYS DevelopmentでDeviceのログを見たら以下があった。 RuntimeがCODESYScontrol.cfgを見れてないんだなというのが分かりました。
そこで(CODESYS Developmentの『Device』~『File』で右側のランタイムの緑色の をクリックしたらRuntime場所が分かった。 Runtimeが実行されているのは『/』と表示されていますが、これはホームdirectoryの事で『~』でした。 そこで/etc/CODESYSControl.cfgを~/に移動すると『25』エラーは発生せず、無事SysProcessCommand2が実行できました。
その他
ログイン(オンライン)~プログラム実行(運転)の方法は、『CODESYS Control(Runtime)をPetalinuxにインストール』にCODESYS Controlの起動から、オンライン~運転方法を書いていますので参考にしてみてください。
コメント