3

ST で書かれた PLC のプロジェクトを維持しています。新しい機能を実装するには、周期的プログラム B でイベントが発生したときに、周期的プログラム A に通知する必要があります。

これは一般的にSTでどのように行われますか? グローバル変数を使用するだけですか、それとも別の方法がありますか? グローバル変数を使用する場合、これらは同時変更からどのように保護されますか?

B&R Automation の X20 PLC を使用しています。

4

2 に答える 2

2

非同期通信はトリッキーです。

したがって、グローバル A_DONE が false に初期化され、B がときどきそれを検査していると想像してください。A が実行され、A_DONE が設定されます。B はこのイベントに反応できますが、別のイベントを処理する必要がある場合はどうすればよいでしょうか?

A に A_DONE を通知するイベントが発生するのは、B が A_DONE を認識してからしばらく経った後のことだと思われる場合、B は A_DONE を false にリセットするだけで (これが常に次の A_DONE イベントの前に発生すると仮定して)、サイクルを繰り返すことができます。

B が A_DONE を見た結果を処理している間に A_DONE が「再び」発生する可能性がある場合、B は A_DONE をリセットすることはできません。B が A_DONE を読み取り、A が A_DONE を再度設定し、B が A_DONE をクリアするというタイミングの破片が発生する可能性があります。今、あなたはイベントを失いました。そのイベントが原子炉の非常用棒を制御している場合、これはかなり悪いことになる可能性があります。

この場合、A から B へのハンドシェークが必要になる可能性があります。B から A にシグナルを追加し、それを A_DONE_SEEN と呼び、B がイベントを処理したことを A に伝えます。次に、A は A_DONE を設定し、A_DONE_SEEN を待ちます。A は A_DONE をクリアし、A_DONE_SEEN が false になるのを待って、そのビジネスを続行します。A_DONE が既に設定されているときに A_DONE を設定する必要がある場合、または A_DONE_SEEN が設定されている場合、イベントを逃したことがわかり、災害復旧手順を実行できます。B は A_DONE を監視し、A_DONE アクションを処理し、A_DONE_SEEN を設定し、A_DONE が false になるのを監視し、A_DONE_SEEN_FALSE を設定します。

特定の PLC についてはわかりませんが、多くのシステムでは、カウントをインクリメントするアトミック操作などがあります。ハンドシェイクの代わりにこれを使用できます。

于 2015-01-28T03:51:48.720 に答える
1

はい、両方の循環プログラムに対して共有スコープを持つ変数を宣言する必要があります。

これを行うには、既存の global.var ファイルを使用するか、新しい変数ファイルを作成して、それを「パッケージ」(プロジェクト内のフォルダー) 内に配置することで、読み書きできるプログラムを制限します。

新しい var 宣言ファイルを作成するには...

-論理ビュー内で右クリック

-オブジェクトを追加

-「ファイル」カテゴリを選択し、新しいファイルを選択します

-name を選択し、ドロップダウンで「*.var として保存」に変更します

デフォルトでは、新しい変数宣言の可視性は、それが含まれているパッケージに限定されます。これを確認するには、ファイルを右クリックしてプロパティに移動します。詳細タブを選択します。

同時変更から保護する方法はありませんが、相互参照ツールを使用して、選択した変数がプロジェクト内のどこで書き込まれ、読み取られているかを確認できます。最初に相互参照を作成してから、下部のタブを使用します。

幸運を!

于 2015-01-27T22:10:33.730 に答える