2016-04-08 43 views
1

私は構造化テキストを使用して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のライブラリには、ブール値を返すメソッドを使用するものがあり、私のプログラムで期待どおりに動作するようです。つまり、サイクルがメソッドへの呼び出しに初めて到達すると、プログラムフローは何らかの形で「ずれている」ので、次のサイクルで、メソッドが終了するまで再びメソッドに入ります。このような行動をとる方法はありますか?

+0

あなたはSomachineまたはUnityを使用していますか? – mrsargent

+0

SoMachine、4.1バージョン – Marconi

答えて

2

一般的にOOPは、IEC61131の言語を使用するときに人々が取る方法ではありません。あなたの最善の策はおそらく状態マシンとしてあなたのコードを実装することです。私はこれまで、複雑なシーケンスを単純化する方法として、植物の保守者が解釈しやすいようにこのアプローチを使用しました。

通常、このアプローチをとる場合は、作業用コードからステートマシン自体を分離することをお勧めします。 Xステップのステートマシンを実装して、作業コードがステートマシンステップを参照するようにすることができます。あなたが置くことができ、他のコードセクションに次に

stepNo := 0; 
IF (start AND stepNo = 0) THEN 
    StepNo = 1; 
END_IF; 

(* there's a shortcut unity operation for resetting this array to zeroes which is faster, but I can't remember it off the top of my head... *) 
ActiveStepArray := BlankStepArray; 

IF stepNo > 0 THEN 
    IF StepComplete[stepNo] THEN 
     stepNo := stepNo +1; 
    END_IF; 

    ActiveStepArray[stepNo] := true; 
END_IF; 

...:

簡単な例は、次のようになります

IF ActiveStep[1] THEN 
    (* Do something *) 

    StepComplete[1] := true; 
END_IF; 

IF ActiveStep[2] THEN 
    (* Do Something *) 
    StepComplete[2] := true; 
END_IF; 

(* etc *) 

このアプローチの良いところは、あなたが実際には、DFBに(ジャンプ、リセットなどを含む)は、状態マシンコードのすべてを入れて、それをテストし、それを棚上げして、ちょうどアクティブなステップを使用することができるということです、ステップ完了、および必要なその他の入力が含まれます。

あなたのコードはまだロジックのセクション全体を実行しますが、本当にそれを避けたいのであれば、多くのIFステートメントを使用する必要があり、読みやすさが損なわれます。

希望に役立ちます。

0

なぜSFCを使用しないと、多くの場合、ステートマシンの言語そのものなので、ライブが簡単になります。サブプログラムを実行し、別の条件を待ちます。rinceと繰り返し。 :)

STだけでハングしないでください。他のIEC言語は他のタスクでは優れており、可能な限り明確にしています。アプリケーションのタイムラインは40年になる可能性があり、20年前に会社をより良い仕事やプログラムに移したので、他の多くのプログラミング分野と同じように、産業用PLCプログラミングサークルに対する「これは私のケーキです」という考え方はあまりないはずですほとんどの場合、ロケーション/顧客または少なくともハードウェアに固有のものです。

http://www.automation.com/pdf_articles/IEC_Programming_Thayer_L.pdf

関連する問題