数据交换协议
除配置 Hilscher card外,您还必须确保正确配置可编程逻辑控制器 (PLC)。它必须设置为以 MERLIC 要求和预期的预定义结构发送和接收数据。如果数据未以要求的结构传输,则 MERLIC 或 PLC 将无法正确处理数据。以下协议规定了数据交换所需的结构:
- FromMerlicProtocol
- FromPLCProtocol
它们定义哪些信息与相应的数据类型一起传输。
要建立 MERLIC 和 Hilscher 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”值:
|
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。 |