1

IEC61131-3 / CodeSyS v2.3 で効率的かつ柔軟なステート ステート マシン (SM) を作成する最良の方法は何ですか? CodeSys V2.3 での SM 実現の良い例はありますか?

私が理解している限りでは、SM には 3 つの異なるタイプがあります。

1. ケース ロジック SM - シンプルで、if ロジックに基づいて状態を変更するだけで、柔軟性がまったくなく、維持が困難です。

2. テーブル駆動型 SM - より優れていますが、関数ポインターがなければ、現在の状態に基づいていくつかのアクションを実行するための追加の条件付き命令が必要です。

3. ステート デザイン パターン SM - 最適なオプション、柔軟、膨大な CASE ステートメントなし、重複なし。

Adam Tornhill による C ステート デザイン パターンを採用しようとしています: http://www.adamtornhill.com/Patterns%20in%20C%202,%20STATE.pdf しかし、プレーン C から構造テキストに変換するのは非常に困難です。CodeSys は Function Block ポインターをサポートしていますが、ST で不完全なポインター型を宣言する方法がわかりません (それは可能ですか?):

/*C-style incomplite state pointer*/
typedef struct State* StatePtr;

struct State
{
   EventFunc exampleFunc1;
   EventFunc exampleFunc2;
}

{ST-style incomplite state pointer ???}
TYPE Sm_state_t :
STRUCT
State:POINTER TO ???;
END_STRUCT
END_TYPE
4

1 に答える 1

1

マシンに単純な CASE ロジックを使用するだけです。

CASE iState OF
0:
    if x then
        iState := iState + 10;
    end_if

10:
    if y then
        iState := iState + 10;
    end_if

20:
etc..

非常に単純ですが、それは仕事をします。

CODESYS では、不完全なポインターを使用することはできません。あなたが持っている唯一のオプションは、 POINTER TO BYTE を作成することです。次に、ポインターを使用する必要がある場合は、使用するデータ構造を指す新しいポインターを作成し、アドレスを渡します。

于 2016-06-08T10:34:09.447 に答える