Cognex InSight 实现ModBusTCP通讯详解

发布时间 2023-08-25 15:08:29作者: 一杯清酒邀明月

1. 实验准备:
1.智能相机:本次实验使用的相机型号为:IS8200M,支持目前最新的InSight6.13版本固件,所以相机的固件也升级到了最新的6.01.03,这里建议固件版本最好使用最新的。注意,5.3以下的版本不支持Modbus TCP通讯,所以如果最高支持不到5.3的相机,请选择其他通讯方式。

2.软件(InSight)版本: 6.13。 官网下载

3.Modbus Poll 测试软件,网上一堆,请自行搜索下载。

2. 相机配置:

1.硬件连接部分可以查询我的博客:点击 这里不做说明。

2.在电子表格视图下,点击菜单 “传感器–网络设置”:选择工业协议,如图。

3.保存作业,并按照提示重启相机。

3. 相机的控制/状态字:

上图中红色部分为输入输出的IO信号:
VisionControl 是相机的输入,总共32个bit,每个bit分别控制相机触发、离线等操作。
VisionStatus 是相机的输出,总共32个bit,每个bit分别输出相机的准备和完成信号等。
具体的通讯位见下图:***红圈中的点位是经常用到的

4. 测试相机的控制 / 状态:
VisionControl 控制相机对应的区:WriteSingleCoil ,地址从0开始,共32个bit。

VisionStatus 相机状态对应的区:ReadDiscreteInputs,地址从100000开始,共32个bit。

在电子表格中插入Count工具,用于观察相机是否触发,相机在线。

打开Modbus Poll测试软件,并选择Modbus TCP连接方式,IP为相机的IP,端口502。

测试触发:点击菜单栏的Functions,选择 “05_WriteSingleCoil”,将Address设为1(TriggerEnabled),Value值修改为On,点击Send。然后将Address设为2(Trigger),Value值修改为On,点击Send。然后观察电子表格中Count值是否增加,相机每触发一次,Count函数+1。

查看相机状态:选择 “ReadDiscreteInputs[1x]” 区,可以看到Address 1(TriggerReady)已经置1了。

可以用同样的方式,测试Offline信号(05_WriteSingleCoil 区中 Address 7置On或者Off,观察ReadDiscreteInputs[1x] 区 Address 7 的状态)。

5. 相机的输入数据 / 输出数据:

区地址:

数据地址:

1.输入数据对应的区地址:16_WriteMultiRegisters,地址从402002开始。

2.输出数据对应的区地址:03_ReadHoldingRegisters,地址从407006开始。

6. 相机发送数据工具编辑:

1.在电子表格中将A0触发器类型改为“网络”,并按照以下流程插入函数:

2.插入” FormatOutputBuffer”函数,引用要发送的值,选择类型,这里添加3个16位整数。

 3.插入"WriteResultsBuffer",事件引用 A0,Buffer 引用 FormatOutputBuffer,协议选择"Modbus TCP 服务器"。

7. 相机接收数据工具编辑:

1.插入” FormatInputBuffer”函数,定义接收的数据类型,这里定义4个16位整数。

 2.插入” ReadUserDataBuffer”函数,事件引用 A0,协议选择”ModBus TCP”

3.因为有4个输入,所以分别插入4个 ” GetBufferData” 函数,Buffer 全部引用” ReadUserDataBuffer”,Index 分别设0、1、2、3 。

8. 最终测试:

为了方便观察,这里新建了4个mbp,左边是相机的输入,右边是相机的输出。

 测试触发 / 相机离线

 测试相机输入数据:

测试相机发送数据:

9. 相机操作流程:
a. 触发拍照: TriggerEnabled 置 1,Trigger 置 1
b. 切换 Job_ID: SetOffline 置 1,写入 16 位整数的 ID 号至 Command,ExecuteCommand置 1,SetOffline 置 0
c. 写入数据到相机: 写入数据到 UserData,SetUserData 置 1,Trigger 置 1
d. 读取相机结果: BufferResultEnabled 置 1,Trigger 置 1,等 ResultsValid 出现下降沿时读取 InspectionResults。