データ交換のプロトコル
Hilscher card の構成に加えて、プログラマブルロジックコントローラ (PLC) も正しく構成しておく必要があります。MERLIC で要求および期待される定義済みの構造でデータを送受信するようセットアップしておかなくてはなりません。要求される構造でデータが転送されない場合、MERLIC や PLC はデータを正しく処理できません。データ交換のために要求される構造は、以下のプロトコルで定義されています。
- FromMerlicProtocol
- FromPLCProtocol
これらは、転送される情報と、それぞれのデータタイプを定義します。
MERLIC と Hilscher card の間で通信を確立するには、プロセス統合の間に MERLIC が取りうる内部状態と、使用可能なコマンド (たとえば 1 回実行を開始するコマンド) も考慮する必要があります。このような情報は、プロセス統合用の通信プロセスを適切に構成するために必要です。詳細については、「MERLIC の状態」および「コマンド (Hilscher)」を参照してください。
データ構造体宣言の定義による交換など、データがメモリアレイ全体として交換される場合、一部の PLC では、構造体宣言のメンバー間にデフォルトでパディングバイトを追加します。
FromPLCProtocol
このプロトコルでは、PLC から MERLIC に転送されるデータに想定される構造を定義します。以下のコードブロックは、PLC からのデータに期待される順序とデータタイプ、および MERLIC による解釈を示します。
TYPE FromPLCProtocol :
STRUCT
Preamble : BYTE;
CommandCode : WORD;
Selector : DINT;
END_STRUCT
END_TYPE
下表に、このプロトコルで要求される各メンバーの説明を示します。
|
メンバー |
説明 |
オフセット |
バイト単位のサイズ |
|---|---|---|---|
|
Preamble |
実際のプロトコルのデータが始まる位置を定義するプリアンブル。MERLIC は値 17 を想定します。 |
0 |
1 |
|
CommandCode |
PLC が MERLIC に実行を要求するコマンドのコード。コマンドの詳細については、「コマンド (Hilscher)」を参照してください。 |
1 |
2 |
|
Selector |
コマンドで使用可能なパラメーター。現在は、「PrepareRecipe」および「GetResult」コマンドと組み合わせて、それぞれ、レシピ ID または結果 ID を渡すために使用されています。 |
3 |
4 |
FromMerlicProtocol
このプロトコルでは、MERLIC から PLC に転送されるデータの構造を定義します。以下のコードブロックは、MERLIC から転送されるデータの順序とデータタイプを示します。
TYPE FromMerlicProtocol :
STRUCT
Preamble : BYTE;
VersionMajor : USINT;
VersionMinor : USINT;
RecipeId : INT;
CommandCode : WORD;
ActionResponse : WORD;
CurrentState : WORD;
LastResultId : UDINT;
LastStartedJobId : UDINT;
Reserved : ARRAY[1..5] OF BYTE;
ResultState : BYTE;
BoolCount : USINT;
ByteCount : USINT;
WordCount : USINT;
DWordCount : USINT;
LWordCount : USINT;
SIntCount : USINT;
USIntCount : USINT;
IntCount : 0USINT;
UIntCount : USINT;
DIntCount : USINT;
UDIntCount : USINT;
LIntCount : USINT;
ULIntCount : USINT;
RealCount : USINT;
LRealCount : USINT;
TimeCount : USINT;
TimeOfDayCount : USINT;
LTimeCount : USINT;
DateCount : USINT;
DateAndTimeCount : USINT;
Str80Count: USINT;
TotalResultCount : UINT;
// For each transmitted result, the data integrity
// and value is returned.
// They are assigned by their index i.
DataIntegrity{i} : BYTE;
Result{i} : VALUE_TYPE;
DataIntegrity{i+1} : BYTE;
Result{i+1} : VALUE_TYPE;
...
END_STRUCT
END_TYPE
下表に、このプロトコルで要求される各メンバーの説明を示します。
|
Member |
説明 |
オフセット |
バイト単位のサイズ |
|---|---|---|---|
|
Preamble |
実際のプロトコルのデータが始まる位置を定義するプリアンブル。MERLIC によるデフォルト設定値は 17 です。 |
0 |
1 |
|
VersionMajor |
プロトコルのメジャーバージョン番号。 |
1 |
1 |
|
VersionMinor |
プロトコルのマイナーバージョン番号。 |
2 |
1 |
|
RecipeId |
読み込まれたレシピの ID。 |
3 |
2 |
|
CommandCode |
コマンドが読み込まれたことを確認するために MERLIC によって PLC に対してミラーリングされたコマンドコード。 |
5 |
2 |
|
ActionResponse |
リクエストされたコマンドへのレスポンス。取りうる値の詳細については、「ActionResponse」セクションを参照してください。 |
7 |
2 |
|
CurrentState |
MERLIC の現在の状態。サポートされる状態の詳細については、「MERLIC の状態」を参照してください。 |
9 |
2 |
|
LastResultId |
MVApp の最後の反復で計算された完全な結果セットの ID。ID は 0 で始まり、1 つの結果につき 1 増加します。 |
11 |
4 |
|
LastStartedJobId |
タイプ UDINT で最後に開始されたジョブの ID。 |
15 |
4 |
|
Reserved |
将来の使用のために予約されています。 |
19 |
5 |
|
ResultState |
照会した結果データの状態。結果を照会すると必ず設定されます。以下の 「ResultState」 値が可能です:
|
24 |
1 |
|
BoolCount |
PLC に転送されたブール結果の数。 |
25 |
1 |
|
ByteCount |
PLC に転送された BYTE 結果の数。 |
26 |
1 |
|
WordCount |
PLC に転送された WORD 結果の数。 |
27 |
1 |
|
DWordCount |
PLC に転送された DWORD 結果の数。 |
28 |
1 |
|
LWordCount |
PLC に転送された LWORD 結果の数。 |
29 |
1 |
|
SIntCount |
PLC に転送された SINT 結果の数。 |
30 |
1 |
|
USIntCount |
PLC に転送された USINT 結果の数。 |
31 |
1 |
|
IntCount |
PLC に転送された INT 結果の数。 |
32 |
1 |
|
UIntCount |
PLC に転送された UINT 結果の数。 |
33 |
1 |
|
DIntCount |
PLC に転送された DINT 結果の数。 |
34 |
1 |
|
UDIntCount |
PLC に転送された UDINT 結果の数。 |
35 |
1 |
|
LIntCount |
PLC に転送された LINT 結果の数。 |
36 |
1 |
|
ULIntCount |
PLC に転送された ULINT 結果の数。 |
37 |
1 |
|
RealCount |
PLC に転送された REAL 結果の数。 |
38 |
1 |
|
LRealCount |
PLC に転送された LREAL 結果の数。 |
39 |
1 |
|
TimeCount |
PLC に転送された TIME 結果の数。 |
40 |
1 |
|
TimeOfDayCount |
PLC に転送された TIME_OF_DAY 結果の数。 |
41 |
1 |
|
LTimeCount |
PLC に転送された LTIME 結果の数。 |
42 |
1 |
|
DateCount |
PLC から転送された DATE 結果の数。 |
43 |
1 |
|
DateAndTimeCount |
PLC に転送された DATE_AND_TIME 結果の数。 |
44 |
1 |
|
Str80Count |
PLC に転送された STRING_80 結果の数。 |
45 |
1 |
|
TotalResultCount |
PLC に転送されたすべての結果の数。 |
46 |
2 |
|
DataIntegrity{i} |
インデックス i を持つ結果値の有効性および可能性のある変換エラーに関する情報。インデックス i は 0 で始まり、リクエストされた 「LastResultId」 について返された i 番目の MVApp 結果の結果値を指します。 結果は、前述のプロトコルの説明の通りの順序で転送されます。たとえば、最初に Boolean の結果がすべて返され、次に、 BYTE の結果がすべて返され、以下順次結果が返されます。 各ビットの意味の詳細については、「DataIntegrity のためのバイト情報」セクションを参照してください。 |
48 |
1 |
|
Result{i} |
インデックス i を持つ転送された結果の値。インデックス i は 0 で始まり、リクエストされた 「LastResultId」 について返された i 番目の MVApp 結果を指します。 結果は、前述のプロトコルの説明の通りの順序で転送されます。たとえば、最初にタイプが Boolean の結果がすべて返され、次に、タイプが BYTE の結果がすべて返され、以下順次結果が返されます。 |
|
|
ActionResponse
以下の表は、ActionResponse メンバーが取りうるすべての値の一覧です。
|
値 |
ActionResponse |
説明 |
|---|---|---|
|
0x0000 |
Unknown |
応答は不明です。たとえば、まだコマンドが実行されていません。 |
|
0x0001 |
Success |
コマンドは正常に処理された可能性があります。 |
|
0x1110 |
InternalError |
重大なエラーが発生したため、 ビジョンシステムの内部状態に矛盾が生じました。ビジョンシステムの再起動が必要です。 |
|
0x1134 |
RecipeUnpreparationFailed |
アプリケーションをアンロードできませんでした。システムの初期状態を回復できませんでした。 |
|
0x2113 |
NotImplemented |
このコマンドはサポートされていません。 |
|
0x2116 |
AcquisitionDeviceLost |
画像取得デバイス (カメラまたは画像ファイルディレクトリ) がありません。 |
|
0x2130 |
UserAccessDenied |
リクエストされたコマンドは、現時点で呼び出し元の権限が不十分なため実行できません。 |
|
0x2133 |
RecipePreparationFailed |
レシピファイルで指定されたアプリケーションを読み込めませんでした。 |
|
0x2135 |
ResponsePromiseBroken |
リクエストされたコマンドのステータスは不明であり、将来設定されることはありません。 |
|
0x2138 |
AcquisitionConflictingTimeout |
画像取得が、一部、タイムアウトになります。マルチカメラセットアップでは、一部のハードウェアトリガーカメラによる取得は成功しますが、その他のカメラによる取得はタイムアウトになり、すべてのカメラの画像バッファの一貫性を確実に保つことができません。 |
|
0x2139 |
AcquisitionError |
画像取得が失敗しました。 |
|
0x2175 |
UnknownRecipeId |
指定されたレシピ ID は不明です。 |
|
0x2236 |
DataflowError |
リクエストされたレシピファイルで指定されたアプリケーションのデータフローには、ブロックまたは競合があります。 |
|
0x2801 |
MessageTooSmall |
メッセージを転送するために十分な空き容量がありません。 |
|
0x4131 |
ActionRejected |
リクエストされたアクションは、ビジョンシステムの現在の状態では許可されません。 |
|
0x4132 |
ActionSuperseded |
リクエストされたアクションは、優先される別のアクションに取って代わられたため、期待通りに終了されませんでした。 |
|
0x4137 |
AcquisitionTimeout |
取得がタイムアウトになりました。おそらく、指定した「grab_timeout」内にハードウェアトリガーのカメラが信号を受け取らなかったか、取得中にカメラへの接続が切れたと思われます。 |
|
0x4176 |
UnknownResultId |
指定された結果 ID は不明です。対応する結果は結果ストアのリングバッファから削除され、利用できなくなった可能性があります。 |
|
0x4296 |
IncompatibleParameters |
指定されたジョブパラメータータプルは、レシピインターフェースと一致しません。たとえば、タプル要素の数がレシピ値の数と一致しないか、タプル要素を各レシピ値のデータタイプに変換すると損失が発生します。 |
DataIntegrity のバイト情報
メンバー DataIntegrity について転送されたバイトには、特定の結果の値に関する様々な情報が含まれます。最初の 2 ビットは、値が有効かどうかおよび、値を含んでいるかどうかを指定します。
|
ビット |
名前 |
説明 |
|---|---|---|
|
0 |
有効性 |
このビットは、値が有効な場合は 1、それ以外の場合は 0 に設定されます。 |
|
1 |
最後の反復の値 |
このビットは、値が MVApp の最後の反復で決定されている場合は 1 に設定されます。値が最後の反復中に計算されなかった場合、たとえば、パラメーターが非アクティブなブランチに合った場合、このビットは 0 に設定されます。 |
以下のビットは、可能性のある変換エラーに関する情報を提供します。
|
ビット |
名前 |
説明 |
|---|---|---|
|
2 |
空の値 |
このビットは、値が空の場合は 1、それ以外の場合は 0 に設定されます。 |
|
3 |
非可逆変換 |
このビットは、値の変換時に情報が失われる場合は 1、それ以外の場合は 0 に設定されます。 |
|
4 |
複数の値 |
このビットは、結果に複数の値が含まれる場合は 1、それ以外の場合は 0 に設定されます。複数の値は現在サポートされていないため、このビットは予約されています。 |
|
5 |
変換可能性 |
このビットは、結果値がそれぞれの MVApp 結果用に選択されたデータタイプに変換可能な場合は 1、それ以外の場合は 0 に設定されます。 |
|
6 |
範囲外 |
このビットは、結果値がそれぞれの MVApp 結果用に選択された許容される範囲外の場合は 1、それ以外の場合は 0 に設定されます。 |
|
7 |
文字列が長すぎ |
このビットは、値が長すぎる文字列を表す場合は 1、それ以外の場合は 0 に設定されます。 |