Codesys + BeagleBone PLC控制达到小儿科水平之Modbus TCP通讯
1,项目目标
准备将自己设计的AM335x平台变成一个PLC平台,所以准备学习一些有关PLC控制和开发的技术。
2,项目环境
因为Beaglebone 使用的也是AM335x处理器,所以准备先在Beaglebone 平台上练练手。
硬件:
Beaglebone black C版本
软件:
Beaglebone Debian操作系统。
CODESYS 64 3.5.18
本文地址:
Codesys + BeagleBone PLC控制达到小儿科水平之Modbus TCP通讯
3,Modbus的基础知识
如果对Modbus协议本身内容不是很熟悉,也不影响阅读本文。只需要知道它是一套基于主从设备的通讯协议即可。
如果想了解多一些,可以参考以下本人觉得很不错的文档:
4,实验的设定
因为Modbus是一个通讯协议,所以至少需要2个设备。一个是主设备,一个是从设备,当然可以多个从设备。这里我们设定Beaglebone为主设备,PC机为从设备。Beaglebone发起通信,向从设备(PC机)写数据或者是读数据。
5,设定Beaglebone 为Master
通过USB0连接Beaglebone 到PC机。因为在Beaglebone中USB0是当做网口使用的,它的IP地址是192.168.7.2。如图。
图1,USB0是一个网口
打开Codesys工程,添加Ethernet设备:
图2,添加以太网口
在新建的Ethernet设备上,右击, 继续添加Modbus TCP Master设备:
图3,添加Modbus_TCP_Master设备
使用类似的方法,继续添加Modbus_TCP_Slave设备。
(注意这里添加的slave设备,并不是说Beaglebone上有一个slave物理设备,它只是提供一个接口,让主设备能够预先知道从设备支持的一些配置信息,如支持的modbus的数据类型等)
添加完成后的设备树结构,如图4的标识1部分所示。
添加设备完成后, 就可以开始配置设备。如下图步骤所示:
图4,配置或者获取Beaglebone的以太网口
- 选择Ethernet
- 点击General
- 点击Browse,这个时候会弹出登录界面:
图5,登录Beaglebone界面
输入用户名和密码后,Codesys会从beaglebone中读取它的网口信息,并返回数据,让用户选择使用哪一个网口:
图6,Codesys从beaglebone中获得的网口信息
对比图1和图6,可以看出codesys读取的信息是正确的,此时,根据实际情况选择使用的网口。因为我们使用的是USB0,当然就选择USB0。
再继续点击IO mapping, 选择Bus cycle task 为Main Task,这是为了让以太网的数据能够通过主任务更新。
图7,设定以太网的bus cycle。
以太网的配置就完成了,下面继续配置Master。
图8,Master的配置
- 点击Modbus_TCP_Master
- 点击General
- 设定数据包超时的时间。这是使用默认值,如果网口信号不好的话,可以增大这两个时间。
另外勾选上Auto-reconnect。
继续设置Slave:
图9, Slave的配置
1,点击Modbus_TCP_Slave
2,点击General
3,设定从设备的IP地址。这里要根据自己的实际情况设定。在本人的计算机上,使用ipconfig命令查看IP地址,可以发现对应Beaglebone USB线的网口地址是192.168.7.1。因此在上图中设定从设备的IP地址是192.168.7.1. 从设备的端口号是502。 这个是固定的,不要改成其他端口。
图10,查看本机USB口的以太网IP地址:
最后一个配置,也是非常重要的和Modbus相关的配置,就是需要设定slave设备支持的modbus 协议数据包。在codesys中,称为Channel。如图11所示:
图11,添加slave设备的channel
1,点击Modbus_TCP_Slave
2,点击Modbus Slave Channel
3,点击Add Channel。
这里我们选定两个Channel,一个负责写从设备寄存器,一个读从设备的输入寄存器。
寄存器的长度都是2,,偏移地址0x00。这里的单位是word,也就是16bit,所以2 个word,实际是4字节数据。
图12,读寄存器和写寄存器命令设定
将上述的设定存盘后,Master 设定就完成了。可以编译并下载到beagle bone板子上。
6, 设定PC机为Modbus的从设备
另外打开一个codesys,新建一个工程。这个工程的目的是将PC机配置为一台PLC,所以它选择的PLC设备不是beaglebone设备,而是Win V3 x64这个基于Windows的虚拟PLC。
图13,新建基于Win V3的工程
同样分别添加Ethernet和modbus slave设备:
图14,添加Ethernet设备和ModbusTCP Slave设备。
同样需要设定设备的IP地址
- 点击Ethernet
- 点击General
- 点击Brower…
图15,Gateway not configured property的错误
这里在第三步的时候会爆“Gateway not configured property”的错误。
原因是还没有安装CODESYS Control Win SL。从网站上下载它:
CODESYS Control Win SL | CODESYS Store International
需要注意的是下载的包里面包括2个文件,如下图
图16,CODESYS Control Win SL安装包内容
其中exe文件其实在安装Codesys开发环境的时候已经安装过了,这里不需要再安装,只要安装其中后缀名为package的文件就好。安装的步骤可以参看下面的文章中关于安装CODESYS Control for BeagleBone SL 的步骤
Codesys + BeagleBone PLC控制达到小儿科水平
安装后,还需要使能CODESYS Control Win,如下图,点击PC机右下角,可以看到有一个灰色的立方体。点击,选择“start PLC”
图17,使能 CODESYS Control Win SL
这个时候,应该就能够连接上设备了。如果没有连接上,点击Scan Network,确保设备连接上了,如下图
图18,Win V3 PLC连接上了
再次回到图15的位置,点击Browse.., 正常情况下,就能弹出PC机上的网络接口了。
图19,PC机上的网络接口
重新将网口信息拷贝如下,如果此时USB是连接着beaglebone板子的,就能够找到类似Ethernet2的配置,IP地址为192.168.7.1
图20, PC机中USB口的以太网接口
同样的, PC机作为从设备,需要设定从设备的配置。
点击ModbusTCP_Slave_Device à General
设置端口号502,寄存器长度为2个word。
图21,从设备的配置
继续设置从设备支持的命令bus cycle和数值更新
- 点击ModbusTCP_Slave_Device
- 点击Modbus TCP Slave Device I/O mapping
- 选择Main Task以及Enable1
图22 设置从设备支持的命令bus cycle和数值更新
7, Modbus的测试
分别将步骤5和6的工程编译,下载,运行后,查看Modbus是否运行正确。
更改从设备的输入寄存器的数字,可以看到主设备的对应寄存器数值会更新。
更改主设备的写寄存器的数字,从设备中对应的数值也会更新。如图22所示。
图23, Modbus的测试
更改寄存器的数字的过程如下图所示:修改列Prepareed Value的值,然后点击命令
Debug -> Write Values.
图24,更改寄存器的数值
调试的过程中,也可以使用Wireshark来抓取数据包,进一步查看收发数据的过程。打开Wireshark,选择抓取数据包的网口是Ethernent2,即对应beaglebone连接的USB接口
图
25
,
Wireshark选择抓取的网口
使用关键字 mbtcp
来过滤数据包,如下图所示。可以看到每一次主设备会发送
Query,
从设备会发送
Response.
图26, Modbus的传输过程
在最开始配置和测试的过程中,发现Modbus的从设备Not running,如下图:
图27,从设备not running。
本人重新启动PC机后,问题就得到解决。
…………………………………完…………………………………………………………………………