Skip to main content

Modbus TCP

ModbusTCP协议相关共三个组件,分别为ModbusSlave,ModbusReader,ModbusWriter,组件通过寄存器配置文件,首先启用ModbusSlave组件流程,其次启用ModbusReader组件流程,最后启用ModbusWriter流程,来完成ModbusTCP通讯。

示例

此处以sensor.xml文件中四个寄存器配置示例,说明modbus相关组件的使用。

Register配置信息

-<?xml version="1.0" encoding="UTF-8"?>
-<controllers>
-<controller id="3">
- <name>Sensor</name>
- <mode>SimulateOnly</mode>
- <ctorName>com.dn9x.modbus.controller.SensorController</ctorName>
- <ip>127.0.0.1</ip>
- <port>502</port>
- <registers>
- <register>
- <address>0</address>
- <defaultValue>true</defaultValue> <!-- 1x -->
- <funtype>DI</funtype>
- <datatype>1</datatype>
- </register>
- <register>
- <address>1</address>
- <defaultValue>false</defaultValue> <!-- 0x -->
- <funtype>DO</funtype>
- <datatype>1</datatype>
- </register>
- <register>
- <address>2</address>
- <defaultValue>53</defaultValue> <!-- 3x -->
- <funtype>IR</funtype>
- <datatype>2</datatype>
- </register>
- <register>
- <address>3</address>
- <defaultValue>63</defaultValue> <!-- 4x -->
- <funtype>RE</funtype>
- <datatype>2</datatype>
- </register>
- </registers>
-</controller>
-</controllers>

配置参数说明

1、 controllers 表示控制器,一个控制器表示一台modbus设备,一个配置文件中可以配置多个控制器 2、 registers 表述寄存器,一个控制器下可以添加多个寄存器,每一个寄存器下对应一条具体的配置信息,也是modbus协议命令的核心参数 3、 address 表示寄存器地址码 4、 defaultValue 表示寄存器的默认值 5、 funtype 表示功能码 6、 datatype 表示寄存器数据类型,下面列出每种数据类型代码含义:

 Boolean 类型 =1
TWO_BYTE_INT_UNSIGNED =2
TWO_BYTE_INT_SIGNED =3
TWO_BYTE_INT_UNSIGNED_SWAPPED=22
TWO_BYTE_INT_SIGNED_SWAPPED=23

FOUR_BYTE_INT_UNSIGNED=4
FOUR_BYTE_INT_SIGNED=5
FOUR_BYTE_INT_UNSIGNED_SWAPPED=6
FOUR_BYTE_INT_SIGNED_SWAPPED =7
FOUR_BYTE_INT_UNSIGNED_SWAPPED_SWAPPED=24
FOUR_BYTE_INT_SIGNED_SWAPPED_SWAPPED=25

FOUR_BYTE_FLOAT=8
FOUR_BYTE_FLOAT_SWAPPED=9
FOUR_BYTE_FLOAT_SWAPPED_INVERTED=21

EIGHT_BYTE_INT_UNSIGNED=10
EIGHT_BYTE_INT_SIGNED=11
EIGHT_BYTE_INT_UNSIGNED_SWAPPED=12
EIGHT_BYTE_INT_SIGNED_SWAPPED=13
EIGHT_BYTE_FLOAT=14
EIGHT_BYTE_FLOAT_SWAPPED=15

TWO_BYTE_BCD=16
FOUR_BYTE_BCD=17
FOUR_BYTE_BCD_SWAPPED=20

CHAR=18
VARCHAR=19

FOUR_BYTE_MOD_10K=26
SIX_BYTE_MOD_10K=27
EIGHT_BYTE_MOD_10K=28
FOUR_BYTE_MOD_10K_SWAPPED=29
SIX_BYTE_MOD_10K_SWAPPED=30
SIX_BYTE_MOD_10K_SWAPPED = 30
EIGHT_BYTE_MOD_10K_SWAPPED=31

ONE_BYTE_INT_UNSIGNED_LOWER=32
ONE_BYTE_INT_UNSIGNED_UPPER=33

配置

ModbusTCP 通讯涉及的组件有三个,分别时ModbusSlave、ModbusReader、ModbusWriter,三个组件都是通过配置xml文件方式来抽象Modbus指令,下面是模拟一个modbus通讯流程的使用,首先ModbusSlave流程从配置文件中ModbusSlave组件按照controller方式加载每一个控制器的寄存器信息并加载到register容器中,ModbusSlave 组件启动成功后,可开启ModbusReader流程进行读取操作,如果Reader中的配置文件的属性值和Slave中注册的寄存器属性值除了result之外都相同,那么Reader流程读取成功则会在Success 的Relationship中输出,否则会在Failure输出,如果想修改某个寄存器值那么需要启用ModbusWriter组件来实现修改寄存器值得功能,如果新增控制器或者新增寄存器,只要修改ModbusSlave流程得配置文件即可。

首先, ModbusSlave需要导入xml配置文件,其他设置默认:

并配置Slave端IP和端口参数:

其中:

  1. 配置文件得格式必须按照Register配置信息提供得格式添加或修改,不能添加其他标签,即使添加也不会解析。
  2. datatype必须配置正确,否职解析命令时候会报错。

配置好ModbusSlave流程后,则可以继续配置ModbusReader进行读取寄存器实现通讯,ModbusReader只要配置一个线程池大小值,一般设置1-10之间得任意数即可

ModbusRead流程配置如下图所示:

从图中可看出,ModbusReader作为modbus得Master端发送request到Slave端,Slave解析request并返回response,如图右侧显示的位收到的Slave端的响应数据,由于和Slave的配置文件是一样的,所以四个寄存器的配置信息和Slave端都一致,4条读取命令都成功返回了response并以AVRO格式输出,再通过ConverAvroToJson组件来转为json格式便于查看结果数据

下面开始开启ModbusWriter流程来实现修改Slave端的寄存器的值,修改成功后,再次调度ModbusReader流程时则会得到修改后得新值

ModbusWriter流程配置如下图所示:

如图所示,当ModbusWriter也时属于Modbus得Master端,和ModbusReader类似,区别是传输得指令不同而已,但是图中可以看出Success和Failure都同时有数据输出,这是因为四条寄存器指令中只有DO和RE是同时支持读写而DI和RI是只读功能,当发送写命令时modbus会自动判断并抛出异常,结果中可以看出报出得具体异常信息

结果

修改后再次读取Slave端数据对比结果:

如图所示,红线表示得结果未改变,因为给定命令得功能码属于只读类型,所以写失败,值未改变,蓝色线表示可读写方法,所以值被改变

注意:三个流程中得配置文件配置相同寄存器时候,datatype必须要保持一致否则会发生未知错误。

说明

针对modbus支持的其他datatype会后续同步更新。