插件与 PLC 之间的通讯

MELSEC Communication 插件与 Mitsubishi Electric MELSEC PLC 之间的通讯使用 MELSEC 通讯(MC)协议。当前,插件仅支持与以下系列的 MELSEC 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”字段的值。以下通过握手进行同步部分中更详细地描述了握手过程并提供了一个示例。有关 MC 协议的结构和字段的更多信息,请参阅用于与 PLC 通讯的字段

可用命令

从 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 的连接

通过握手进行同步

当 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”,表明它已准备好执行下一个命令。