プラグインと PLC の間の通信

MELSEC Communication プラグインと Mitsubishi Electric MELSEC PLC の間の通信には、MELSEC 通信 (MC) プロトコルが使用されます。現在、このプラグインでサポートされるのは、次のシリーズの MELSEC PLC との通信のみです。

  • MELSEC iQ-F シリーズ
  • MELSEC iQ-R シリーズ
  • MELSEC-L シリーズ
  • MELSEC-Q シリーズ

プラグインと PLC の接続を確立した後、プラグインと PLC の両方がプロトコルにアクセスし、コマンド、結果、詳細情報を転送できます。

プロトコルは、各種の情報を含む一連のフィールドで構成されています。一部のフィールドは、PLC により、単一の実行などのコマンドリクエストを送信し、リクエストされたコマンドの追加引数を定義するために使用されます。たとえば、レシピを変更する場合にはレシピの ID が変更されます。これに対して、他のタイプのフィールドは、プラグインにより、ビジョンシステムが提供する情報、たとえばビジョンシステムに関する一般情報や実行結果などを書き込むために使用されます。PLC は、プラグインによってフィールドに書き込まれる情報を読み取って処理できます。その逆も可能です。ハンドシェイクプロセスを達成するために、MERLIC は、リクエストされたコマンドに対して PLC から転送されたものと同じコマンドコードを使用して応答します。

詳しく言えば、PLC では、それぞれのフィールド「gMV_ReqCommandCode」のために値を設定することで、希望のコマンドを転送する必要があります。MERLIC がコマンドを認識するとすぐに、フィールド「gMV_AckCommandCode」の値を同じ値に設定して、コマンドが受け取られたことを確認します。MERLIC では、各コマンドの実行も開始し、PLC がコマンドコードをリセットするまで待機します。MERLIC は、PLC が「gMV_ReqCommandCode」フィールドの値をリセットし、MERLIC がすでにコマンドの実行を終了したことを認識すると、「gMV_AckCommandCode」フィールドの値もリセットします。ハンドシェイク処理の詳細な説明と例は、以下のハンドシェイクによる同期のセクションにあります。 MC プロトコルの構造とフィールドの詳細については、PLC との通信のためのフィールドを参照してください。

使用可能なコマンド

PLC から MERLIC の挙動を制御する機能は、2 つのフィールドを通じて伝えられます。

  • gMV_ReqCommandCode (requested command code)
  • gMV_AckCommandCode (acknowledged command code)

gMV_ReqCommandCode」フィールドは、PLC が書き込むべきデータセクションに属します。一方、「gMV_AckCommandCode」フィールドは、プラグインが書き込むべきデータセクションに属し、PLC はそこからしか読み取ることはできません。これらのフィールドは、いずれも以下の許容されるコマンドを符号化したデータタイプ INT の整数値が含まれることになります。

コマンド

コード

NoCommand

0

SelectModeAutomatic

1

PrepareRecipe

2

UnprepareRecipe

3

StartSingleJob

4

StartContinuous

5

Halt

6

Reset

7

Stop

8

Abort

9

DequeueResult

10

AcknowledgeError

11

ビジョンシステムの状態を制御するために使用される「アクション」以外に、上のリストには中立のオプション「NoCommand」、およびコマンド「DequeueResult」と「AcknowledgeError」があります。

MERLIC が取りうる状態とその遷移については、MERLIC の状態を参照してください。

ハンドシェイクによる同期

PLC がビジョンシステムにコマンドを送信するときには、以下のようなハンドシェイクが使用され、両方の側が正しく同期していることが確認されます。

初期時には、「gMV_ReqCommandCode」と「gMV_AckCommandCode」の値はどちらも 0 に設定されています。これは、コマンドがリクエストされているわけでも、コマンドが現在実行中でもないことを示します。コマンドを送信するために、PLC はまず、それぞれのコマンドコードを「gMV_ReqCommandCode」フィールドに書き込みます。このプラグインは「gMV_ReqCommandCode」フィールドを継続的にポーリングして、この値の変化を探ります。新しいコマンドコード値を読み取ると、プラグインは同じコマンドコードを「gMV_AckCommandCode」フィールドに書き込み、このコマンドの実行を開始します。「gMV_AckCommandCode」の値に基づいて、PLC は値がミラーリングされていることを検出します。これにより、リクエストされたコマンドが認識され、プラグインがコマンドの実行を開始したと想定されます。これで安全に「gMV_ReqCommandCode」の値を 0 にリセットできます。

その場合、プラグインは「gMV_ReqCommandCode」フィールドがリセットされたことを認識します。ただし、現在実行中のコマンドの値については、コマンドの実行が終了するまで「gMV_AckCommandCode」フィールドに保持します。「StartSingleJob」および「StartContinuous」のコマンドは、実際のジョブが開始されるとすぐに実行済みとしてカウントされることに注意してください。つまり、構成された画像ソースが非同期グラブを開始し、トリガー信号を受信できる状態になるということです。また、状態はそれぞれ「SingleExecution」または「ContinuousExecution」に変化しています。

コマンドの実行が終了し、PLC がすでに「gMV_ReqCommandCode」フィールドを 0 にリセットしている場合、「gMV_AckCommandCode」フィールドも 0 にリセットされます。これで PLC は、コマンドが完了し、ビジョンシステムが次のコマンドを受け取る準備ができていると判断することができます。下の図では、「StartSingleJob」と「Halt」のコマンドを例として取り上げ、ハンドシェイクのプロセスを示しています。

StartSingleJob のコマンドを送信する場合、PLC はコマンドコード 4 を「gMV_ReqCommandCode」フィールドに書き込みます。プラグインは、コマンドコード 4 を読み取ると、「gMV_AckCommandCode」フィールドに 4 を書き込んでコマンドを確認し、「StartSingleJob」コマンドの実行を開始します。PLC は、「gMV_AckCommandCode」フィールドの値 4 を読み取るとすぐに、「gMV_ReqCommandCode」の値を 0 にリセットします。コマンド「StartSingleJob」の実行が開始され、状態が「SingleExecution」に変更されると、プラグインは「gMV_AckCommandCode」の値を 0 にリセットし、PLC が次のコマンドを受信できる状態であることを示します。

この例では、次に「Halt」コマンドがリクエストされます。PLC はコマンドコード 6 を「gMV_ReqCommandCode」フィールドに書き込みます。プラグインは新しいコマンドコードを読み取り、「Halt」コマンドの実行を開始し、「gMV_AckCommandCode」を 6 に設定して、コマンドが実行中であることを示します。今回は、PLC が反応する前に、コマンドがすぐに実行を終了したと想定します。この場合、プラグインは、PLC が「gMV_AckCommandCode」を 0 にリセットする前に「gMV_ReqCommandCode」フィールドを 0 にリセットするまで待機します。この間、「Halt」コマンドはそれ以上実行されません。PLC が最終的に「gMV_ReqCommandCode」を 0 にリセットすると、プラグインも「gMV_AckCommandCode」をリセットして、次のコマンドに対応する準備ができていることを示します。