当前位置:网站首页 > Java教程 > 正文

modbus java 教程



有问题可以私信和评论,看到会回复。

一个项目,需要用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通信用的多

版权声明


相关文章:

  • 千锋java编程教程2025-01-11 21:10:00
  • 成都java自学教程2025-01-11 21:10:00
  • 菜鸟教程 java枚举2025-01-11 21:10:00
  • java hql教程2025-01-11 21:10:00
  • java保存session教程2025-01-11 21:10:00
  • java教程北大青鸟2025-01-11 21:10:00
  • java动力线程教程2025-01-11 21:10:00
  • 小马哥java教程2025-01-11 21:10:00
  • java玩法教程2025-01-11 21:10:00
  • java宠物系统教程2025-01-11 21:10:00