数据交换协议

除配置 Hilscher card外,您还必须确保正确配置可编程逻辑控制器 (PLC)。它必须设置为以 MERLIC 要求和预期的预定义结构发送和接收数据。如果数据未以要求的结构传输,则 MERLIC 或 PLC 将无法正确处理数据。以下协议规定了数据交换所需的结构:

  • FromMerlicProtocol
  • FromPLCProtocol

它们定义哪些信息与相应的数据类型一起传输。

要建立 MERLICHilscher card之间的通讯,还必须在流程集成期间考虑 MERLIC 的可用内部状态以及可用命令,例如启动单次执行。需要此信息才能为流程集成正确配置通信流程。有关更多信息,请参阅MERLIC 状态命令 (Hilscher)

如果数据作为整个内存阵列交换,例如通过定义数据结构体声明交换,则在默认情况下,某些 PLC 会在结构体声明的成员之间添加填充字节。

FromPLCProtocol

此协议定义从 PLC 传输到 MERLIC 的数据的预期结构。以下代码块展示了 MERLIC 预期和解释来自 PLC 的数据时使用的顺序和数据类型。

复制
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 开始,每出一个结果依次增加。

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 结果,依此类推。

有关各个位的含义的更多信息,请参阅Byte Information for 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 传输的字节包含关于特定结果值的各种信息。前两位数说明值是否有效及其是否包含任何值。

名称

描述

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。