構造化テキストを使用して Schneider PLC 用のプログラムを作成しており、オブジェクト指向プログラミングを使用してそれを実行しようとしています。
PLC プログラミングの初心者として、次のような簡単なテスト プログラムを作成しました。
okFlag:=myObject.aMethod();
IF okFlag THEN
// it's ok, go on
ELSE
// error handling
END_IF
aMethod
いくつかの操作を実行し、結果を待ち (デッドロックを回避するための「タイムアウト」チェックがあります)、TRUE または FALSE を返す必要があります。
これは、プログラムの実行中に私が期待したことです
1) に到達すると、結果が返されるまでokFlag:=myObject.aMethod();
内部のコードが実行されます。aMethod
「実行された」とは、次のスキャン サイクルで、aMethod
前に到達したポイントから の実行が継続されることを意味します。
2) メソッド呼び出しの結果をチェックし、プログラムのメインフローを実行する
これが起こることです:
1)aMethod
が実行されますが、プログラム フローは続行されます。つまり、値の最後に到達すると、待機する必要がaMethod
あるイベントがまだ実行中であっても返されます。aMethod
2) 次のサイクルでaMethod
再度呼び出され、最初からやり直す
これは私が見つけた最初の解決策です:
VAR_STATIC
imBusy: BOOL
END_VAR
METHOD aMethod: INT;
IF NOT(imBusy) THEN
imBusy:=FALSE;
aMethod:=-1; // result of method while in progress
ELSE
aMethod:=-1;
<rest of code. If everything is ok, the result is 0, otherwise is 1>
END_IF
imBusy:=aMethod<0;
そしてメインプログラム:
CASE (myObject.aMethod()) OF
0: // it's ok, go on
1: // error handling
ELSE
// still executing...
END_CASE
これはうまくいくようですが、それが正しいアプローチかどうかはわかりません。
ブール値を返すメソッドを使用し、プログラムで期待どおりに動作するように見える Schneider のライブラリがいくつかあります。つまり、サイクルが最初にメソッドの呼び出しに到達すると、プログラムフローは何らかの形で「逸脱」し、次のサイクルでメソッドが終了するまで再びメソッドに入ります。この動作を行う方法はありますか?