Springboot实现ModbusTCP通信的示例详解
发布日期:2025-01-04 15:03 点击次数:105
Modbus官网 Modbus协议 Modbus技术资源 MODBUS TCP / IP 关于Java的开源库
Jamod:Java Modbus实现:Java Modbus库。该库由Dieter Wimberger实施。ModbusPal:ModbusPal是一个正在进行的Java项目,用于创建逼真的Modbus从站模拟器。由于预定义的数学函数和/或Python脚本,寄存器值是动态生成的。ModbusPal依赖于RxTx进行串行通信,而Jython则依赖于脚本支持。Modbus4J:Serotonin Software用Java编写的Modbus协议的高性能且易于使用的实现。支持ASCII,RTU,TCP和UDP传输作为从站或主站,自动请求分区,响应数据类型解析和节点扫描。JLibModbus:JLibModbus是java语言中Modbus协议的一种实现。jSSC和RXTX用于通过串行端口进行通信。该库是一个经过积极测试和改进的项目。
ModbusTCP协议
基于TCP/IP协议的Modbus modbus tcp通讯modbus4j使用说明-java编程 modbus tcp 通讯modbus-master-tcp Java使用说明 Github资料
modbus4j
ModbusTCP协议 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
个人感觉:
modbus协议也是对地址变量进行读取或者写入操作,变化的可能是地址变量的地址和数据类型。这个功能码(指定要做什么,对4个不同modbus对象寄存器:是读啊,是写啊,还是对多个一起操作啊)
Modbus和RS485的关系:Modbus是协议,物理层接口有RS232、RS422、RS485和以太网接口几种
仿真软件
验证4个常用功能码,仿真软件上面有F=01,F=02,F=03和F=04来显示
0x01:读线圈 0x02:读离散量输入 0x03:读保持寄存器 0x04:读输入寄存器 对应的代码要写4个方法
我要写一个Master(主站),所以需要一个Slave(从站)
Modbus Slave下载 安装:一直下一步 激活码:5455415451475662(来源) 激活:Connection–>connect…(F3),输入激活码,下面截图没输入激活码,因为当时没找到激活码 操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。代码参数的理解
saveid:看资料"从站在modbus总线上可以有多个",仿真软件就能模拟一个从站,就是ID=1,当然可以修改成ID=2 功能码:4个功能码,对应写4个方法,,仿真软件上的F=1,或者F=2,3,4 addr:一开始看代码4个方法addr都是从0开始,是否重复?答案是:4个功能码表示4个区域或者设备,addr表示各自区域的地址编号。
选择TCP模式,端口是固定的502
地址类型 F8:
Slave Definition
软件下载地址:https://www.modbustools.com/download.html
功能码
操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。
数据类型 功能码01
功能码02
功能码03,选择Float类型
signed:有符号 unsigned:无符号 hex:十六进制 binary:二进制
big-endian:大端,将高序字节存储在起始地址(高位编址) little-endian:小端,将低序字节存储在起始地址(低位编址)
swap:交换
双击第一个地址输入数据,会提示输入数据的类型,32位数据占2个地址,所以下一个地址是–
功能码04
源码1:https://sourceforge.net/projects/jlibmodbus/
源码2:https://github.com/kochedykov/jlibmodbus 特别有意思:常用的串口通信库都加进去了
maven依赖
测试功能码04
打印到控制台的信息
Address: 0, Value: 88Address: 1, Value: 66Address: 2, Value: 8Address: 3, Value: 6Address: 4, Value: 32727Address: 5, Value: 32808Address: 6, Value: 0Address: 7, Value: 3Address: 8, Value: 2Address: 9, Value: 1
使用modbus4j
maven依赖 官方说明:https://github.com/infiniteautomation/modbus4j 有个坑:Maven配的阿里云仓库,下载不下来,注释掉阿里云仓库使用默认仓库才能下载好。
pom.xml
Springboot实现modbus协议通讯
参考链接:Java使用modbus4j实现modbus tcp通讯
核心依赖:
modbus4j.jar commons-lang3-3.0.jar Modbus4jUtils类
slave配置
操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。
输出信息
v011:truev012:falsev013:truev021:truev022:falsev023:truev031:7.5v032:10.5v041:1.5v042:3.07.5true
Java通过modbus4j对数据的写入 参考链接:Java使用modbus4j实现modbus tcp通讯
类Modbus4jWriteUtils.java
使用modbus-master-tcp
参考链接:Java使用modbus-master-tcp实现modbus tcp通讯
源码地址:https://github.com/digitalpetri/modbus modbus tcp
通讯Java的方案之前已经讲解过一种,modbus4j实现Java语言的modbus tcp协议通讯。从上一个方案中我们不难发现modbus4j的通讯实现方式是同步的。实际应用中可能会读取大量的数据。同步处理对于应用的响应还是不太友好的。本博客主要讲解另外一种Java语言的modbux tcp通讯方案。那就是modbus-master-tcp。
maven依赖
pom.xml注意,需要将java的编译版本指定到1.8.因为只有1.8以后才支持lambda表达式。
观察可以发现,modbus-master-tcp项目的底层是基于netty框架开发。天然的支持异步处理。在性能方面有很好的提升。
编写modbus tcp读取案例 类SimpleMasterExample
编写modbus tcp写入案例 0x06 Write Single Register
功能码06 写入单个寄存器
类WriteSingleRegisterRequest
// 发送单个寄存器数据,一般是无符号16位值:比如10
master.sendRequest(new WriteSingleRegisterRequest(address, value), unitId);0x10 Write Multiple Registers
功能码10 写入多个寄存器
写入多个寄存器
类WriteMultipleRegistersRequest
slave:和上面的一样
输出信息
truefalsefalse10.1-5.69.26.00002-90.122222
评价感受 jlibmodbus:集成多个串口通信开源库,有意思 modbus4j:很有名 modbus-master-tcp:底层netty,支持异步 Jamod:Github上安卓开发modbus通信用的多
以上就是Springboot实现ModbusTCP通信的示例详解的详细内容,更多关于Springboot ModbusTCP通信的资料请关注脚本之家其它相关文章!