插件与 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”字段的值。
可用命令
从 PLC 控制 MERLIC 行为的能力通过两个字段实现:
- 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 时,它会通过将 4 写入“gMV_AckCommandCode”字段并开始执行“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_ReqCommandCode”重置为 0 后才将“gMV_AckCommandCode”字段重置为 0。在此期间,不会再执行“Halt”命令。当 PLC 最终将“gMV_ReqCommandCode”重置为 0 时,插件也将重置“gMV_AckCommandCode”,表明它已准备好执行下一个命令。