1

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

4

2 に答える 2

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 ステートメントを使用する必要があり、読みやすさが妨げられます。

それが役立つことを願っています。

于 2016-04-14T14:22:03.440 に答える
0

SFC を使用しない理由は、それ自体がステート マシン言語であるため、多くの場合、作業が楽になるからです。サブプログラムを実行し、待機条件を実行して、別の..すすぎを繰り返します。:)

ST のためだけにハングアップしないでください。他の IEC 言語は他のいくつかのタスクでより優れており、物事をできるだけ明確に保ちます。アプリケーションのタイムラインは 40 年になる可能性があり、20 年前に会社を辞めてより良い仕事に就き、プログラムはほとんどの場合、場所/顧客、または少なくともハードウェア固有です。

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

于 2016-05-06T02:45:35.843 に答える