こちらは新しいシリーズでBeckhoffジャパンが開発してるPLC_JobManagementFrameworkを使って様々な記事を展開していきます。最初にPLC_JobManagementFrameworkの簡単な説明・インストール方法・使用方法までを説明し、プログラムを作ってEtherCATとOMRONのCouplerを接続し、検証していきます。
さ、FAを楽しもう。

前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
現在、私達の活動はほぼ無償で続けており、より多くのコンテンツを提供するためには、皆様の温かいご支援が大変重要です。もし可能であれば、以下のリンクから応援していただけると大変嬉しく思います。
高橋クリスのメンバーシップ
こちらはFullさん(full@桜 八重 (@fulhause) / X)と共にやっているラジオにメンバーシップを登録いただけます。
https://note.com/fulhause/membership/join
AMAZON ギフトリスト
こちらは自分のブログのコンテンツ制作や設備の充実に大いに役立てさせていただきます。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon
こちらは自分のブログのコンテンツ制作や設備の充実に対する小さな応援の気持ちのPatreonです。
https://www.patreon.com/user?u=84249391
皆様のサポートが、私たちの活動をより充実させる力となります。
どうぞよろしくお願いします。
メールアドレス(*=@)
X
PLC_JobManagementFramework
PLC_JobManagementFrameworkは上でさまざまな制御アクティビティを定義するためのフレームワークであり、InterfaceFuture インタフェースを実装した Future と呼ばれるユニットオブジェクトが、FB_Executor と呼ばれる実行エンジンによって実行されます。
Reference Link
https://github.com/Beckhoff-JP/PLC_JobManagementFramework
Class
こちらは全体のクラス図です。
こちらはFB_ExecutorのClass図です。
Implementation
論よりRUN!では実際動かしてみて導入方法や動きを確認しましょう。
Install the library
Beckhoff JapanのライブラリをGithubからDownloadできます。下記のLinkをアクセスし、Local>Downloa ZIPをクリックします。
https://github.com/Beckhoff-JP/PLC_JobManagementFramework
GithubからDownloadされたZIP FILEを解凍します。
次はTwinCAT XAEから先のプロジェクトFILEを開き、右クリック>Save as library and Installをクリックします。
ライブラリを適切なLocationに保存してください。
Add Library in your project
次は新規プロジェクトを作成し、先ほどインストールしてたJobManagementFrameworkライブラリを追加します。Reference>Add Libraryします。
Beckhoff-JP>Unitily>JobManagementFrameworkを選び、OKで進みます。
Add Function Block – Extends From FB_AbstructFuture
最初はプロジェクトに実現したいFBを追加します。今回の記事では設定した時間内に信号をON/OFF繰り返しする動作になります。
POUs>右クリック>Add>POUをクリックします。
VAR
こちらはFB_AbstructFutureからExtendsしたFBの変数定義です。
FUNCTION_BLOCK fbController EXTENDS FB_AbstructFuture VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR _own_parameter: TIME; _set_time: TIME; process_timer: TON; blink_timer: TON; _result :UDINT; _own_output: REFERENCE TO BOOL; END_VAR |
FBの名前を入力し、TypeをFunction Blockに設定してください。
次はFBをFB_AbstructFutureからExtendsするように設定します。そのために…ボタンをクリックしてください。
Jobmgnt>POUs>Model>Library>FB_AbstructFutureを選択し、Okで進みます。
実はBeckhoffジャパンからPLC_JobManagementFrameworkのClass図がありまして、現在わたちたちがExrendsしてるFBはJOBの初期化・リセット・実行などのMethodとPropertyがあります。
Done!このfbControllerがFB_AbstructFutureからExtendsされたので、中にはすでにFBを初期化するInit Methodや現在状態を取得するStateなどが存在しています。
PROPERTY own_output : REFERENCE TO BOOL
Set
own_output のSet PropertyはfbControllerの出力のONもしくはOFFを制御します。
_own_output REF= own_output; |
PROPERTY own_parameter : TIME
Set
own_parameterのSet PropertyはfbControllerの内部パラメータown_parameter(ON/OFF繰り返しの時間)を設定します。
_own_parameter := own_parameter; |
Get
own_parameterのSet PropertyはfbControllerの内部パラメータown_parameter)を取得します。
own_parameter := _own_parameter; |
METHOD abort : BOOL
abort Methodを実行すると、中断処理完了時にTRUEがReturnします。
abort Methodが実行されているとき、タイマーが稼働中であれば残り時間を一時保存します。そしてタイマーをリセットし、Return値をTRUEにします。
(* Return TRUE if finish.*) IF process_timer.IN THEN _set_time := process_timer.PT – process_timer.ET; END_IF process_timer(IN := FALSE); _own_output := FALSE; abort := TRUE; |
METHOD execute : BOOL
execute Methodは実行されているとき、出力信号をON/OFF繰り返します。
(* Return TRUE if finish.*) blink_timer(IN := NOT blink_timer.Q, PT := T#0.5S); IF _own_output AND blink_timer.Q THEN _own_output := FALSE; ELSIF blink_timer.Q THEN _own_output := TRUE; END_IF process_timer(IN := TRUE,PT := _set_time); execute := process_timer.Q; |
METHOD init : BOOL (* Return TRUE if finish.*)
init Methodは実行されているとき、出力をOFFをし、内部パラメータを更新します。
(* Return TRUE if finish.*) _own_output := FALSE; _set_time := _own_parameter; process_timer(IN := FALSE); blink_timer(IN := FALSE); init := TRUE; |
METHOD quit : BOOL (* Return TRUE if finish.*)
quit Methodは実行されているとき、init Methodを実行します。
(* Return TRUE if finish.*) THIS^.init(); quit := TRUE; |
MAIN
次はMainプログラムを作成します。プログラム内にPROCESS IN/OUT変数も定義し、EtherCAT経由で通信するOMRON Couplerの入出力を読み書きします。
PROGRAM MAIN VAR fbTask1 : fbController; output : BOOL; // executor : FB_Executor; start : BOOL; // _state : UDINT; Inputs AT %I*:UINT; Outputs AT %Q*:UINT; END_VAR |
start:=Inputs.0; CASE _state OF 0: _state := 1; 1: // Configure the Job fbTask1.own_output REF= output; // Outputs fbTask1.own_parameter := T#4S; // Configure the Flashing Time fbTask1.future_name := ‘Blinker’; // Configure the Future name executor.future := fbTask1; // Set the future inside exector executor.init(); // Init _state := 2; 2: // IF executor.execute() THEN // Execute and Moniting _state := 0; END_IF // Start Conidiiton IF start AND executor.ready THEN executor.start(); start := FALSE; END_IF END_CASE Outputs.0:=output; |
その中で注意するのはexecutorというFBが作成されていることです。プログラム内ではexecutorに実効するJOB(今回の記事では(fbController)を渡す必要があります。

Init()
Case=0のときにはInit() Methodを呼び出して、executorを初期化します。また、executor.futureに実行や管理したいJOB(今回の例ではfbController1)を渡してください。

ready
executor準備状態を確認します。

start()
executor.start()でJOBをスタート状態に遷移します。

execute()
そしてexecutor.execute()でJOBを実行しましょう。

Add EtherCAT Master
最後はEtherCATネットワークを構築します。I/O>Devices>Add New Itemをクリックします。
EtherCAT>EtherCAT masterをクリックし、OKで進みます。
Configure Ethernet Adapter
先ほど追加したEtherCATマスターをダブルクリックし、AdapterのTabでSearchボタンをクリックしてください。
EtherCAT Masterとして使用するEthernet Adapterを選択し、Okで進みます。
Done!
Scan EtherCAT Slave
先ほど追加したEtherCAT Masterを右クリックし>Scanでネットワーク内のEtherCAT スレーブを検索します。
Done!今回記事で使用するOMORN Couplerを見つかりました。
OMRON Couplerにインストールした入出力モジュールにも認識されました。
Mapping Inputs
入力モジュールをMappingします。
入力モジュールをMappingするためにInput Bit 16 bitsをクリックします。
プログラムのPROCESS INPUT変数と接続してください。
Mapping Output
次は出力データをMappingするためにOutput Bits 16 bitを右クリックし、Change Linkします。
プログラムのPROCESS 出力変数と接続してください。
Active Cofiguration
Active ConfigurationをクリックしプロジェクトのHard構成をTwinCAR RuntimeにDownloadします。
Login
プログラムをTwinCAR RuntimeにDowloadします。
Yesですすみます。
Start
TwinCAR Runtimeをスタートします。
Result
こちらの動画でPLC_JobManagementFrameworkの動作を確認できます。