技術資料#

システム#

オブジェクト構成#

クラス図を図 2.7に示します。タスクの定義は、InterfaceFutureのインターフェースを実装して行いますが、ユーザが実装する基底ファンクションブロックFB_AbstructFutureと、各種ジョブコンテナファンクションブロックで実装されています。FB_Executorは、ジョブであるFutureオブジェクトの実行主体ですので、1:1の関係で包含します。

また、各種ジョブコンテナは、FB_Executor型の配列を内包します。配列サイズはライブラリパラメータMAX_FUTURE_NUMで設定します。これを順に実行する場合はBatchJobContainer、または、QueueJobContainer、並行して同時実行する場合はParallelJobContainer、または、ParallelQueueJobContainerを用います。

このように、ジョブコンテナも、FB_AbstructFutureを継承したユーザタスクも、どちらもInterfaceFutureが基底インターフェースとなり、同様にFB_Executorは実行することができます。

Tip

このデータモデルは、コンテナとユーザ定義タスクインスタンスが親子関係を構成し、さらにコンテナの中にコンテナを構成するなど、深いツリーモデルが構築可能です。このデザインパターンを、GoFのCompositeパターンと呼びます。

../_images/activity_control_class_diag.png

図 2.7 JOB制御クラス図#

FB_Executor状態マシン#

Futureオブジェクトは処理内容の静的な定義のみ行い、InterfaceFutureのインターフェースをを用いて実行する主体はFB_Executorファンクションブロックです。

FB_ExecutorファンクションブロックではE_FutureExecutionState enum型の変数を持ちた状態を持ち、current_stateプロパティを用いて参照することができます。状態遷移図を図 2.8,表 2.1に示します。

../_images/fb_executor_state_machine.png

図 2.8 FB_Executorステートマシン図#

表 2.1 E_FutureExecutionState メンバとFB_Executorの状態遷移制御一覧#

ステート

説明

終了条件

idle

初期状態(非活性状態)

FB_Executorが制御するジョブオブジェクトが、idleまたはfinish状態など実行中でない状態であること。

init

futureオブジェクトの初期化処理init()を実行している状態。

futureオブジェクトのinit()が完了する

wait_for_process

外部からの実行指示待ち状態。

FB_Executorのstart()メソッドを実行する

process

実行中状態

futureオブジェクトのexecute()が完了する

quit

終了処理状態

futureオブジェクトのquit()が完了する

abort

中断処理中、または中断処理完了状態

中断処理完了状態で、FB_Executorのstart()メソッドを実行する

finish

終了状態(非活性状態)

idleとおなじ

ファンクションブロック#

InterfaceFuture#

タスク、および、ジョブコンテナ向けのインターフェースです。

表 2.2 InterfaceFutureのメソッド一覧#

メソッド名

戻り値

説明

init

BOOL

実行前に必要な変数やオブジェクトの初期化を行います。処理完了時にTRUEを返す必要があります。

execute

BOOL

タスク本体の処理を実装します。処理完了時にTRUEを返す必要があります。

quit

BOOL

実行後の変数やオブジェクトの後始末を行います。処理完了時にTRUEを返す必要があります。

abort

BOOL

中断処理が行われた際に実施する処理を実装します。処理完了時にTRUEを返す必要があります。

表 2.3 InterfaceFutureのプロパティ一覧#

プロパティ名

方向

説明

nErrorID

UDINT

GET

エラー発生時は0以外の値を返します。参照

future_name

STRING

GET SET

ジョブ名称を定義します。FB_Executorjob_event_reporterイベントハンドラにて記録する際に、どのFutureオブジェクトが状態遷移を行ったのか判別できるよう、インスタンスに名前を付けることができます。このプロパティで設定してください。

state

E_FutureExecutionState

GET SET

FutureインスタンスがFB_Executorに紐づけられ、init以上の実行状態になるとFB_Executorの状態をこのプロパティを通じてミラーします。他のFB_Executorに同じFutureオブジェクトが共用されてしまった場合、互いの実行状態が競合しないよう、排他を取ることを目的としています。

排他の仕組み

FB_Executor内ではidle状態からinit状態に遷移する条件として、リンクされたFutureオブジェクトのstateプロパティを経由して得た状態が、idleまたはfinishである必要があります。すでに他のExecutorにより実行中である場合、Futureオブジェクトのミラーstateの状態がこのいずれの状態でもないため、initへ遷移することができません。先行して取得しているExecutorがfinish状態にすることで後発のExecutorが同じFutureオブジェクトを用いてinitから処理を開始することができるようになります。

InterfaceFutureインターフェースの名前はFutureパターンから由来しています。複数の演算コアで並列処理を行うのではなく、単一の演算コア上にタスクを順次パイプライン実行していく仕組みにより、処理完了を待たされる(ブロックされる)ことなく処理を進めることができます。実際の演算は将来行われることからFutureパターンと呼ばれています。

このインターフェースにより実装したファンクションブロックをタスクとして、次節に示すFB_Executorで統一的に実行することが可能になります。

InterfaceContainer#

ジョブコンテナ用のインターフェースです。

表 2.4 InerfaceContainerのメソッド一覧#

メソッド名

戻り値

説明

add_future

UINT

登録されたFuture番号を返す

ジョブコンテナにFutureを登録する。

reset

BOOL

コンテナの初期化完了でTRUEを返す

add_futureで登録したFutureを全てクリアする。

get_future_statue

E_FutureExecutionState

引数で指定したFuture番号の現在の実行状態を返す

指定したFuture番号の現在状態を調べる。

表 2.5 InerfaceContainerのプロパティ一覧#

プロパティ名

方向

説明

active_futures

UINT

Get

FB_SerialJobContainerでは現在実行中のFutureの連番を返します。FB_ParallelJobContainerでは実行中のFuture数を返します。

continuous_mode

BOOL

Set

全てのfutureが実行完了しても終了せず、新たなfutureが追加されるのを待つモードを有効にします。QueueJobContainer,ParallelQueueJobContainerのみ有効。

job_event_reporter

InterfaceJobEventReporter

Set

包含しているFB_Executorの各配列にセットするInterfaceJobEventReporter実装オブジェクトを受け取ります。

num_of_future

UINT

Get

add_futureで追加されたFuture数を返します。

parent_executor

REFERENCE TO FB_Executor

Set Get

親のコンテナジョブオブジェクトが有る場合、そのExecutorオブジェクトにアクセスします。

FB_Executor#

FB_Executorは、InterfaceFutureを実装したファンクションブロックを実行するファンクションブロックです。

表 2.6 FB_Executorのメソッド一覧#

メソッド名

戻り値

説明

init

BOOL

初期化処理完了時にTRUEが返る

タスクの処理を開始できる状態に初期化する。

execute

BOOL

タスク処理完了時にTRUEが返る

future.init(),future.execute(),future.quit()を順次実行します。すべて完了したら戻り値がTRUEになります。

abort

BOOL

中断処理完了時にTRUEが返る

future.init()future.execute()future.quit()何れか実行中にこのメソッドを実行すると、E_FutureExecutionState.abortの状態に遷移し、future.abort()を実行する。

start

BOOL

なし

E_FutureExecutionState.wait_for_process状態時にこのメソッド実行すると、InterfaceFuture.execute()処理を、E_FutureExecutionState.abortの状態の際にこのメソッドを実行すると、中断する前に実行していたfuture.init()future.execute()future.quit()の処理を再開する。

表 2.7 FB_Executorのプロパティ一覧#

プロパティ名

方向

説明

nErrorID

UDINT

GET

エラー発生時は0以外の値を返します。参照

active_task_id

UINT

GET

FB_SerialJobContainerFB_ParallelJobContainerの実行状態がモニタできます。FB_SerialJobContainerの場合は現在処理中のFuture番号を返します。FB_ParallelJobContainerでは、実行するFutureの合計数を返します。いずれもexecuting()メソッド実行中以外は0を返します。

current_state

E_FutureExecutionState

GET

execute()中の実行状態を返します。

future

InterfaceFuture

SET

実装したタスクをセットします。

done

BOOL

GET

InterfaceFutureで実装したexecute()の処理が完了後TRUEを返します。

ready

BOOL

GET

InterfaceFutureで実装したinit()の処理が完了後TRUEを返します。

job_event_reporter

InterfaceJobEventReporter

SET

InterfaceJobEventReporter実装ファンクションブロックのインスタンスをセットします。FB_Executorの状態遷移時には、イベントハンドラとしてこのインスタンスのreport()メソッドが呼び出されます。

start()メソッドや、readydoneプロパティはタスク同士を連続して実行する際、InterfaceFutureのinit()quit()の処理によりサイクルの隙間が発生しないようにするトリガやイベントです。

InterfaceJobEventReporter#

FB_Executorの状態変化時にコールされるイベントハンドラ用のインターフェースです。このインターフェースを実装したファンクションブロックインスタンスを、FB_Executorjob_event_reporterにプロパティにセットして使います。

reportメソッド

FB_Executorの処理で状態遷移が発生した際にコールされるイベントハンドラ。

引数
old_state

E_FutureExecutionState;

説明

状態遷移が発生する旧状態

new_state

E_FutureExecutionState;

説明

状態遷移が発生する新状態

record_time

Tc2_Utilities.T_FILETIME64;

説明

状態遷移が発生したWindowsファイルタイム(100ns精度)

executor

REFERENCE TO FB_Executor;

説明

状態遷移の発生元FB_executorインスタンスへのリファレンス

戻り値

BOOL

説明

イベントハンドラ処理が終了したらTRUEを返す

データ型#

E_FutureExecutionState#

名称

説明

idle

0

未実行状態

init

1

初期化中状態

wait_for_process

2

初期化完了で実行指示待ち。start()メソッドによりprocessへ移行。

process

3

実行中状態

abort

4

中断処理中、または、中断処理完了状態。中断処理完了状態であれば、start()メソッド実行することで、再度中断前の状態に遷移する。

pause

5

未使用

quit

6

終了処理中状態

finish

7

全処理完了状態