有问题可以私信和评论,看到会回复。
一个项目,需要用Java实现使用ModbusTCP和硬件设备通信
视频地址:https://www.bilibili.com/video/BV1cz4y1R7cg
代码下载
- 本文的代码和仿真软件:蓝奏云下载
官网资料
- 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
Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
个人感觉:
Modbus和RS485的关系:Modbus是协议,物理层接口有RS232、RS422、RS485和以太网接口几种
验证4个常用功能码,仿真软件上面有F=01,F=02,F=03和F=04来显示
- 0x01:读线圈
- 0x02:读离散量输入
- 0x03:读保持寄存器
- 0x04:读输入寄存器
对应的代码要写4个方法
我要写一个Master(主站),所以需要一个Slave(从站)
- Modbus Slave下载
- 安装:一直下一步
- 激活码:75662(来源)
- 激活:Connection-->connect...(F3),输入激活码,下面截图没输入激活码,因为当时没找到激活码
- 操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。
- 一个旧版的Modbus Slave:https://ioufev.lanzout.com/inPtpxp9yef
代码参数的理解
- saveid:看资料"从站在modbus总线上可以有多个",仿真软件就能模拟一个从站,就是ID=1,当然可以修改成ID=2
- 功能码:4个功能码,对应写4个方法,,仿真软件上的F=1,或者F=2,3,4
- addr:一开始看代码4个方法都是从0开始,是否重复?答案是:4个功能码表示4个区域或者设备,addr表示各自区域的地址编号。
选择TCP模式,端口是固定的502
F8:
Slave Definition
可以自由设置地址的开始地址是多少(默认0),设置有多少个数量(默认10个)。
功能码
操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。
功能码01
功能码02
功能码03,选择Float类型
signed:有符号
unsigned:无符号
hex:十六进制
binary:二进制swap:交换
关于 大端和小端
modbus 一个地址是16位(2个字节),表示 float 类型的时候需要4个字节,也就是要2个16位地址,这就涉及到是哪个值在前面的问题了。
一般硬件CPU都是小端,低地址在前,上层应用程序都是大端,高地址在前。
双击第一个地址输入数据,会提示输入数据的类型,32位数据占2个地址,所以下一个地址是
功能码04
- 参考:Java实现ModBus的poll端(主机master端,查询和接受数据)
- 源码1:https://sourceforge.net/projects/jlibmodbus/
- 源码2:https://github.com/kochedykov/jlibmodbus
特别有意思:常用的串口通信库都加进去了
打印到控制台的信息
- 官方说明:https://github.com/infiniteautomation/modbus4j
- 有个坑:Maven配的阿里云仓库,下载不下来,注释掉阿里云仓库使用默认仓库才能下载好。
pom.xml
- modbus4j.jar
- commons-lang3-3.0.jar
Modbus4jUtils类
代码理解
slave配置
操作:新建四个不同功能码的窗口,然后运行代码,修改仿真软件上的值。
输出信息
原文链接:http://www.leftso.com/blog/83.html
类Modbus4jWriteUtils.java
代码理解
原文链接:http://www.leftso.com/blog/310.html
源码地址:https://github.com/digitalpetri/modbus
modbus tcp通讯Java的方案之前已经讲解过一种,modbus4j实现Java语言的modbus tcp协议通讯。从上一个方案中我们不难发现modbus4j的通讯实现方式是同步的。
实际应用中可能会读取大量的数据。同步处理对于应用的响应还是不太友好的。
本博客主要讲解另外一种Java语言的modbux tcp通讯方案。那就是modbus-master-tcp。
pom.xml注意,需要将java的编译版本指定到1.8.因为只有1.8以后才支持lambda表达式。
观察可以发现,modbus-master-tcp项目的底层是基于netty框架开发。天然的支持异步处理。在性能方面有很好的提升。
类SimpleMasterExample
0x06 Write Single Register
功能码06 写入单个寄存器
类WriteSingleRegisterRequest
0x10 Write Multiple Registers
功能码10 写入多个寄存器
写入多个寄存器
类WriteMultipleRegistersRequest
代码理解
slave:和上面的一样
输出信息
- jlibmodbus:集成多个串口通信开源库,有意思
- modbus4j:很有名
- modbus-master-tcp:底层netty,支持异步
- Jamod:Github上安卓开发modbus通信用的多
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/11104.html