Codesys + BeagleBone PLC控制达到小儿科水平之Modbus RTU通讯
1,项目目标
准备将自己设计的AM335x平台变成一个PLC平台,所以需要尝试一些有关PLC控制和开发的技术。
2,项目环境
本来准备先在Beaglebone 平台上练练手,但是Beaglebone的板子没有RS232/RS485的接口,所以直接就在自己的板子上测试。
硬件:
个人基于Beaglebone设计的板子
软件:
Debian操作系统。
CODESYS 64 3.5.18
本文地址:
https://blog.csdn.net/dylanZheng/article/details/125732090
3,Modbus的基础知识
如果对Modbus协议本身内容不是很熟悉,也不影响阅读本文。只需要知道它是一套基于主从设备的通讯协议即可。
如果想了解多一些,可以参考以下本人觉得很不错的文档:
https://ipc2u.com/articles/knowledge-base/detailed-description-of-the-modbus-tcp-protocol-with-command-examples/#progr
4,实验的设定
因为Modbus是一个通讯协议,所以至少需要2个设备。一个是主设备,一个是从设备,当然可以有多个从设备。这里我们设定自己的板子为主设备,PC机为从设备。板子发起通信,向从设备(PC机)写数据或者是读数据。
5,设定个人板子为Master
将个人板子通过网口连接到交换机,从而通过网络联通PC机。
个人板子IP: 192.168.1.100
PC机IP: 192.168.1.101
打开或者新建一个基于Beaglebone Balck SL的Codesys工程,先添加Modbus_COM设备,然后再添加Modbus_Master_COM和Modbus_Slave_COM:
图1,添加Modbus COM口
然后开始配置各个设备。首先需要设定COM port号。
点击Modbus_COM ->General
图2,设定COM Port口
这是设定的COM port是6,波特率9600, 8bit数据,1个停止位,不用校验。
对于具体的COM port是和具体的硬件相关的。在我个人的板子上连接的是ttyO5端口。这里有一个深坑,就是Codesys计算端口是从1开始的,所以ttyO5 对应的不是COM5,而是COM6。
其他串口具体的对应是
ttyO0 –> COM1
ttyO1 –> COM2
ttyO2 –> COM3
ttyO3 –> COM4
ttyO4 –> COM5
所以这里,需要查看原理图,将COM口设定正确。
在配置Codesys之前,其实保险起见,还是需要测试一下串口是否工作。这里通过SSH登录到板子里,通过stty –F /dev/ttyO5 9600设定端口波特率,然后就可以通过echo命令发送数据,通过cat命令接收数据。
下图中的COM5是USB-RS232连接到PC机的端口,可以看到串口是能够正常收发数据的。
图3,串口的测试
在测试后,需要修改文件 /etc/CODESYSControl.cfg
将以下两行添加到文件中
[SysCom]
Linux.Devicefile=/dev/ttyO
这里添加的是串口的前缀。当在Codesys中配置COM port为6时,runtime系统会认识设备为
/dev/ttyO5
继续回到Codesys,对Master进行端口的配置
图4,对Master口的设置
这里我们设定传输模式是RTU,Bus cycle task 是mainTask。
然后对Slave的参数进行配置。注意这里添加的Modbus_slave_COM_Port设备,并不是说板上有一个slave的物理设备(真正的Slave设备是PC机),这里它只是提供一个接口,让主设备能够预先知道从设备支持的一些配置信息,如支持的从设备的地址号等。真实目的是告诉主设备,系统存在有一个从设备,等着你去连接呢。
首先我们配置从设备地址号为2。默认是1,这里为了练手,将它改为了2,如下图
图5,Slave的设备地址号
接着需要设定从设备支持的命令。关于Modbus的命令格式,可以参看第三节中提供的链接。这里本人设定了一个读命令和一个写命令,如下图
图6,Slave支持的命令(Channel)
最后设定从设备中的数据能够自动更新
图7,Slave设备数据自动更新使能
6, 设定PC机为Modbus的从设备
在设定PC机为从设备之前,需要确保有安装CODESYS Control Win SL。
如果还没有安装,可以从网站上下载它:
CODESYS Control Win SL | CODESYS Store International
需要注意的是下载的包里面包括2个文件,如下图
图8,CODESYS Control Win SL安装包内容
其中exe文件其实在安装Codesys开发环境的时候已经安装过了,这里不需要再安装,只要安装其中后缀名为package的文件就好。安装的步骤可以参看下面的文章中关于安装CODESYS Control for BeagleBone SL 的步骤
Codesys + BeagleBone PLC控制达到小儿科水平_dylanZheng的博客-CSDN博客
安装后,还需要使能CODESYS Control Win,如下图,点击PC机右下角,可以看到有一个灰色的立方体。点击,选择“start PLC”
图9,使能 CODESYS Control Win SL
安装完CODESYS Control Win SL后,新建一个工程。这个工程的目的是将PC机配置为一台PLC,所以它选择的PLC设备不是beaglebone设备,而是Win V3 x64这个基于Windows的虚拟PLC。
图10,新建基于Win V3的工程
同样分别添加Modbus_COM和Modbus_serial_Device设备:
图11,添加Modbus_COM和Modbus_serial_Device设备。
同样需要设定设备的COM port,以及波特率等信息,如上图
点击Modbus_COM ->General
这里的COM port设定为5,这是通过查看PC机的设备管理器得到的。波特率以及其他设置和图2的一致。
继续点击Modbus_Serial_Device ->General 来设置从设备的信息,如下图
图12,设置Modbus_serial_Device设备
这里的Unit ID就是从设备网络地址号,需要和第5步骤中图5的设定一样,这里是2. Holding register 和Input registers的字节长度和图6的一致,这里设置都是2.
图13,Slave设备bus cycle和更新使能
继续点击Modbus_Serial_Device ->Modbus Serial Device I/O mapping,
选择Bus cycle为MainTask,并且使能Always update Variables
7, Modbus的测试
分别将步骤5和6的工程编译,下载,运行后,查看Modbus是否运行正确。
更改从设备的输入寄存器的数字,可以看到主设备的对应寄存器数值会更新。
更改主设备的写寄存器的数字,从设备中对应的数值也会更新。