私は構造化テキストを使用してSchneider PLCのプログラムを作成しています。オブジェクト指向プログラミングを使用してそれを実行しようとしています。PLCオブジェクト指向プログラミング - メソッドを使用
は、PLCプログラミングの初心者なので、私は簡単なテストプログラムを書いたように、この:
okFlag:=myObject.aMethod();
IF okFlag THEN
// it's ok, go on
ELSE
// error handling
END_IF
aMethod
避けるためにチェックし、「タイムアウト」がある(結果を待って、いくつかの操作を実行する必要がありますデッドロック)と戻りTRUEまたはFALSE
okFlag:=myObject.aMethod();
に達したときに結果が返されるまで、
aMethod
内のコードが実行されるプログラムの実行
1)の間に期待したものである
。私が「実行された」と言うとき、私は次のスキャンサイクルで、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のライブラリには、ブール値を返すメソッドを使用するものがあり、私のプログラムで期待どおりに動作するようです。つまり、サイクルがメソッドへの呼び出しに初めて到達すると、プログラムフローは何らかの形で「ずれている」ので、次のサイクルで、メソッドが終了するまで再びメソッドに入ります。このような行動をとる方法はありますか?
あなたはSomachineまたはUnityを使用していますか? – mrsargent
SoMachine、4.1バージョン – Marconi