データ交換のプロトコル

Hilscher card の構成に加えて、プログラマブルロジックコントローラ (PLC) も正しく構成しておく必要があります。MERLIC で要求および期待される定義済みの構造でデータを送受信するようセットアップしておかなくてはなりません。要求される構造でデータが転送されない場合、MERLIC や PLC はデータを正しく処理できません。データ交換のために要求される構造は、以下のプロトコルで定義されています。

  • FromMerlicProtocol
  • FromPLCProtocol

これらは、転送される情報と、それぞれのデータタイプを定義します。

MERLICHilscher 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」 値が可能です:

  • 0 (Undefined)
  • 1 (Completed): 処理が正しく行われました。
  • 2 (Processing): 処理はまだ終わっていません。
  • 3 (Aborted): 処理は、完了前のどこかの時点で停止しました。
  • 4 (Failed): 何らかの理由で処理が失敗しました。

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 に設定されます。