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协议本身内容不是很熟悉,也不影响阅读本文。只需要知道它是一套基于主从设备的通讯协议即可。

如果想了解多一些,可以参考以下本人觉得很不错的文档:

https://ipc2u.com/articles/knowledge-base/detailed-description-of-the-modbus-tcp-protocol-with-command-examples/#progr

4,实验的设定

因为Modbus是一个通讯协议,所以至少需要2个设备。一个是主设备,一个是从设备,当然可以多个从设备。这里我们设定Beaglebone为主设备,PC机为从设备。Beaglebone发起通信,向从设备(PC机)写数据或者是读数据。

5,设定Beaglebone 为Master

通过USB0连接Beaglebone 到PC机。因为在Beaglebone中USB0是当做网口使用的,它的IP地址是192.168.7.2。如图。

codesys支持哪些单片机 codesys支持的plc_Modbus

图1,USB0是一个网口

打开Codesys工程,添加Ethernet设备:

codesys支持哪些单片机 codesys支持的plc_tcp/ip_02

 

codesys支持哪些单片机 codesys支持的plc_寄存器_03

图2,添加以太网口

在新建的Ethernet设备上,右击, 继续添加Modbus TCP Master设备:

codesys支持哪些单片机 codesys支持的plc_Modbus_04

codesys支持哪些单片机 codesys支持的plc_Modbus_05

 图3,添加Modbus_TCP_Master设备

使用类似的方法,继续添加Modbus_TCP_Slave设备。

(注意这里添加的slave设备,并不是说Beaglebone上有一个slave物理设备,它只是提供一个接口,让主设备能够预先知道从设备支持的一些配置信息,如支持的modbus的数据类型等)

添加完成后的设备树结构,如图4的标识1部分所示。

添加设备完成后, 就可以开始配置设备。如下图步骤所示:

codesys支持哪些单片机 codesys支持的plc_codesys支持哪些单片机_06

图4,配置或者获取Beaglebone的以太网口 

  1. 选择Ethernet
  2. 点击General
  3. 点击Browse,这个时候会弹出登录界面:

codesys支持哪些单片机 codesys支持的plc_寄存器_07

 图5,登录Beaglebone界面

输入用户名和密码后,Codesys会从beaglebone中读取它的网口信息,并返回数据,让用户选择使用哪一个网口:

codesys支持哪些单片机 codesys支持的plc_Modbus_08

图6,Codesys从beaglebone中获得的网口信息

对比图1和图6,可以看出codesys读取的信息是正确的,此时,根据实际情况选择使用的网口。因为我们使用的是USB0,当然就选择USB0。

再继续点击IO mapping, 选择Bus cycle task 为Main Task,这是为了让以太网的数据能够通过主任务更新。

codesys支持哪些单片机 codesys支持的plc_Codesys_09

图7,设定以太网的bus cycle。

以太网的配置就完成了,下面继续配置Master。

codesys支持哪些单片机 codesys支持的plc_Modbus_10

图8,Master的配置

  1. 点击Modbus_TCP_Master
  2. 点击General
  3. 设定数据包超时的时间。这是使用默认值,如果网口信号不好的话,可以增大这两个时间。

另外勾选上Auto-reconnect。

继续设置Slave:

codesys支持哪些单片机 codesys支持的plc_寄存器_11

图9, Slave的配置

1,点击Modbus_TCP_Slave

2,点击General

3,设定从设备的IP地址。这里要根据自己的实际情况设定。在本人的计算机上,使用ipconfig命令查看IP地址,可以发现对应Beaglebone USB线的网口地址是192.168.7.1。因此在上图中设定从设备的IP地址是192.168.7.1.  从设备的端口号是502。 这个是固定的,不要改成其他端口。

codesys支持哪些单片机 codesys支持的plc_寄存器_12

图10,查看本机USB口的以太网IP地址:

最后一个配置,也是非常重要的和Modbus相关的配置,就是需要设定slave设备支持的modbus 协议数据包。在codesys中,称为Channel。如图11所示:

codesys支持哪些单片机 codesys支持的plc_寄存器_13

 图11,添加slave设备的channel

1,点击Modbus_TCP_Slave

2,点击Modbus Slave Channel

3,点击Add Channel。

这里我们选定两个Channel,一个负责写从设备寄存器,一个读从设备的输入寄存器。

寄存器的长度都是2,,偏移地址0x00。这里的单位是word,也就是16bit,所以2 个word,实际是4字节数据。

codesys支持哪些单片机 codesys支持的plc_Codesys_14

 

codesys支持哪些单片机 codesys支持的plc_tcp/ip_15

 

codesys支持哪些单片机 codesys支持的plc_Codesys_16

    图12,读寄存器和写寄存器命令设定

将上述的设定存盘后,Master 设定就完成了。可以编译并下载到beagle bone板子上。

6, 设定PC机为Modbus的从设备

另外打开一个codesys,新建一个工程。这个工程的目的是将PC机配置为一台PLC,所以它选择的PLC设备不是beaglebone设备,而是Win V3 x64这个基于Windows的虚拟PLC。

codesys支持哪些单片机 codesys支持的plc_tcp/ip_17

图13,新建基于Win V3的工程

 同样分别添加Ethernet和modbus slave设备:

codesys支持哪些单片机 codesys支持的plc_寄存器_18

图14,添加Ethernet设备和ModbusTCP Slave设备。

同样需要设定设备的IP地址

  1. 点击Ethernet
  2. 点击General
  3. 点击Brower…

codesys支持哪些单片机 codesys支持的plc_Codesys_19

图15,Gateway not configured property的错误

 这里在第三步的时候会爆“Gateway not configured property”的错误。

原因是还没有安装CODESYS Control Win SL。从网站上下载它:

CODESYS Control Win SL | CODESYS Store International

需要注意的是下载的包里面包括2个文件,如下图

codesys支持哪些单片机 codesys支持的plc_Modbus_20

图16,CODESYS Control Win SL安装包内容

其中exe文件其实在安装Codesys开发环境的时候已经安装过了,这里不需要再安装,只要安装其中后缀名为package的文件就好。安装的步骤可以参看下面的文章中关于安装CODESYS Control for BeagleBone SL 的步骤

Codesys + BeagleBone PLC控制达到小儿科水平

安装后,还需要使能CODESYS Control Win,如下图,点击PC机右下角,可以看到有一个灰色的立方体。点击,选择“start PLC”

codesys支持哪些单片机 codesys支持的plc_寄存器_21

codesys支持哪些单片机 codesys支持的plc_Codesys_22

图17,使能 CODESYS Control Win SL

这个时候,应该就能够连接上设备了。如果没有连接上,点击Scan Network,确保设备连接上了,如下图

codesys支持哪些单片机 codesys支持的plc_Codesys_23

图18,Win V3 PLC连接上了

再次回到图15的位置,点击Browse.., 正常情况下,就能弹出PC机上的网络接口了。

codesys支持哪些单片机 codesys支持的plc_tcp/ip_24

图19,PC机上的网络接口

重新将网口信息拷贝如下,如果此时USB是连接着beaglebone板子的,就能够找到类似Ethernet2的配置,IP地址为192.168.7.1

codesys支持哪些单片机 codesys支持的plc_codesys支持哪些单片机_25

图20, PC机中USB口的以太网接口

同样的, PC机作为从设备,需要设定从设备的配置。

点击ModbusTCP_Slave_Device à General

设置端口号502,寄存器长度为2个word。

codesys支持哪些单片机 codesys支持的plc_寄存器_26

 图21,从设备的配置

继续设置从设备支持的命令bus cycle和数值更新

  1. 点击ModbusTCP_Slave_Device
  2. 点击Modbus TCP Slave Device I/O mapping
  3. 选择Main Task以及Enable1

codesys支持哪些单片机 codesys支持的plc_tcp/ip_27


图22 设置从设备支持的命令bus cycle和数值更新

7, Modbus的测试

分别将步骤5和6的工程编译,下载,运行后,查看Modbus是否运行正确。

更改从设备的输入寄存器的数字,可以看到主设备的对应寄存器数值会更新。

更改主设备的写寄存器的数字,从设备中对应的数值也会更新。如图22所示。

codesys支持哪些单片机 codesys支持的plc_tcp/ip_28

图23, Modbus的测试

更改寄存器的数字的过程如下图所示:修改列Prepareed Value的值,然后点击命令

Debug -> Write Values.

codesys支持哪些单片机 codesys支持的plc_寄存器_29

图24,更改寄存器的数值

调试的过程中,也可以使用Wireshark来抓取数据包,进一步查看收发数据的过程。打开Wireshark,选择抓取数据包的网口是Ethernent2,即对应beaglebone连接的USB接口

codesys支持哪些单片机 codesys支持的plc_寄存器_30

25Wireshark选择抓取的网口

使用关键字 mbtcp来过滤数据包,如下图所示。可以看到每一次主设备会发送Query,从设备会发送Response.

codesys支持哪些单片机 codesys支持的plc_Modbus_31

图26, Modbus的传输过程

在最开始配置和测试的过程中,发现Modbus的从设备Not running,如下图:

codesys支持哪些单片机 codesys支持的plc_Codesys_32

图27,从设备not running。

本人重新启动PC机后,问题就得到解决。

…………………………………完…………………………………………………………………………