Modbus是master/slave架构的串行通信协议,允许多个设备连接在同一个网络上进行通信。Modbus已经成为工业领域通信协议事实上的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
- 公开发表并且无著作权要求
- 易于部署和维护
- 对供应商来说,修改移动本地的比特或字节没有很多限制
映翰通提供modbus
示例以便于客户基于InGateway二次开发实现Modbus数据采集。该示例主要基于modbus_tk
实现了InGateway作为Modbus master通过Modbus TCP和Modbus RTU协议读写Modbus slave的01、02、03和04功能码的Modbus变量,支持的变量类型包括bit、word、string等数据类型。modbus_tk
的详细使用方法请访问modbus_tk。 注意:请勿同时运行device_supervisor app
和demo示例
,否则可能导致代码运行异常。
在进行开发和测试前,你需要具备以下条件:
- InGateway
- 固件版本
- IG902:
IG9-V2.0.0.r12644
及以上(请联系客服获取) - IG501:
IG5-V2.0.0.r12884
及以上(请联系客服获取)
- IG902:
- Python3 SDK版本
- IG902:
py3sdk-V1.3.9_Edge-IG9
及以上(请联系客服获取) - IG501:
py3sdk-V1.3.9_Edge-IG5
及以上(请联系客服获取)
- IG902:
- 固件版本
- VS Code软件
- Modbus模拟软件或Modbus PLC(本文档使用Modbus模拟软件
mod_RSsim
进行说明,你可以访问 https://sourceforge.net/projects/modrssim2/ 下载该模拟器软件)
如果你已经配置了相应的Modbus slave,可以跳过这一小节。以下将说明如何配置PC上的Modbus模拟软件mod_RSsim
以便于后续测试验证。
-
步骤1:建立InGateway与PC的Modbus连接
-
步骤2:配置
mod_RSsim
软件-
Modbus TCP
运行PC上的
mod_RSsim
软件并选择协议为MODBUS TCP/IP
,该协议支持与Modbus主站进行Modbus TCP协议通讯。点击通讯参数配置按钮以配置相应的TCP通讯参数,本文档将通讯端口号配置为
503
。 -
Modbus RTU
运行PC上的
mod_RSsim
软件并选择协议为MODBUS RS-232
,该协议支持与Modbus主站进行Modbus RTU协议(RS232或RS485串口均可)。配置相应的RTU通讯参数,该通讯参数需与
modbus_example.py
中的modbus参数一致,见修改Modbus slave参数。
-
-
准备开发环境
InGateway联网、软件更新、IDE软件获取等基础的配置操作请查看MobiusPi Python Development Quick Start。以下操作我们将假设你已经完成了InGateway的软件更新、设备联网、开启调试模式等配置。
-
建立项目文件夹
建立一个项目文件夹,最终项目文件夹的结构如下:
├── .vscode │ └── sftp.json ├── build ├── lib ├── src │ │── main.py │ └── modbus_example.py └── setup.py
.vscode
:VS Code配置文件夹sftp.json
:与InGateway建立SFTP连接所需的SFTP配置文件。
build
:App发布包文件夹。lib
:App第三方依赖库文件夹。src
:App源码文件夹main.py
:App入口。modbus_example.py
:主要基于modbus_tk
实现了InGateway作为Modbus master通过Modbus TCP和Modbus RTU协议读取/写入Modbus slave的01、02、03和04功能码的Modbus变量。
setup.py
:App说明文件。
-
步骤1:安装
modbus_tk
建立与InGateway的SFTP连接,操作步骤见建立SFTP连接。SFTP连接建立成功后在终端执行
pip install modbus_tk --user
安装modbus_tk
依赖库。安装成功后如下图所示:
-
步骤2:修改Modbus slave参数
本demo的默认配置为使用
Modbus TCP
协议采集IP地址为192.168.2.10
,端口号为503
,从站地址为1
,字节序为cdab
,超时时间15
秒的Modbus slave中的以下变量数据:- 读取寄存器地址为
1
的bit
类型的modbus数据并写入数值0
,数据名称为power
- 读取寄存器地址为
30001
的bit
类型的modbus数据的第二位,数据名称为model
- 读取寄存器地址为
40001
的word
类型的modbus数据并写入数值20
,数据名称为speed
- 从寄存器地址
40003
开始读取4
个string
类型的modbus数据并依次写入字符串cvbn
,数据名称为pressure
如果你使用
mod_RSsim
模拟器或者你的PLC上中配置了以上modbus地址变量,则可以直接使用demo代码。否则请在modbus_example.py
中根据你的实际情况调整以下配置:mbProto
(Modbus TCP)reconnect_interval
:超时时间hostname
:Modbus模拟器或PLC的ip地址type
:通讯类型,以太网通讯时为TCP
port
:通讯端口号slave
:站地址byte_order
:字节序,包括abcd
、badc
、cdab
、dcba
四种
mbProto
(Modbus RTU)type
:通讯类型,串口通讯时为RTU
serialPort
:串口号,使用RS485串口时为/dev/tty03
;使用RS232串口时为/dev/ttyO1
baudrate
:波特率bytesize
:数据位parity
:校验位,无校验为N
、偶校验为E
、奇校验为O
stopbits
:停止位slave
:站地址byte_order
:字节序,包括abcd
、badc
、cdab
、dcba
四种
mbVal
addr
:modbus寄存器地址operation
:可读可写rw
、只读ro
、只写wo
len
:读写的数据长度,仅对string
数据类型有效name
:数据名称data_type
:数据类型register_bit
:03和04功能码数据的数据类型为bit
或bool
时,通过此项参数设置读取寄存器地址的哪一位。可配置0-15
中的任意一位write_value
:当数据可写时,写入该modbus寄存器地址的数值
- 读取寄存器地址为
-
步骤3:调试代码
如何使用VS Code调试代码请参考调试代码。
main.py
运行结果如下图所示:
-
步骤4:在
mod_RSsim
上核对数据读写在
mod_RSsim
的I/O
项中选择Coil Outputs
,查看寄存器地址1
的数据值为0,与power
数据值一致。在
mod_RSsim
的I/O
项中选择Analogue Inputs
,查看寄存器地址30001
第二位的数据值为1,与model
数据值一致。在
mod_RSsim
的I/O
项中选择Holding Registers
,查看寄存器地址40001
的数据值为20,与speed
写入的数据值一致。在
mod_RSsim
的Fmt
项中选择char string
,查看寄存器地址40003-40004
数据值为cvbn,与pressure
写入的数据值一致。
至此,完成了在InGateway上实现modbus数据采集的开发。