上面我们写了一篇关于modbus-tcp的文章,这一篇我们主要将关于modbus-rtu的对接方式,好了,废话不多说,直接开搞。

一、环境准备

1.下载Virtual Serial Port Driver 6.9,使用此工具模拟com串口
下载地址或自行百度搜索(网上资源还是很多的):
链接:https://pan.baidu.com/s/1mBoqHZ4LzaSuY7EFHEjyxQ
提取码:7qku

2.下载modscan32,其中应该会包含modscan32(主机)及modsim32(从机),我们后续会使用modsim32模拟从机。
下载地址或自行百度搜索(网上资源还是很多的):
https://download.csdn.net/download/liboyang71/74307745

3.java环境准备,此处我们使用的是jdk1.8

二、代码编写

2.1 Virtual Serial Port Driver准备

首先我们先使用Virtual Serial Port Driver打开两个串口COM7,COM8,入下图所示

2.2 modsim准备

然后我们打开modsim,开始模拟准备从机数据,操作流程入下图所示。

1.连接设置->连接->端口7(因为我们刚才添加的com7和com8,我们使用com7作为从机口,com8一会我们java代码使用)


2.文件->新建

3.配置从机相关数据

2.3 编写Java代码

上述准备工作都做完了,我们开始编写Java主机代码rtu解析
整体操作会用到以下资源,请直接下载

https://download.csdn.net/download/liboyang71/75506251

1.创建一个maven项目

2.创建lib文件夹在maven项目中,并添加modbus4J.jar、RXTXcomm.jar、seroUtils.jar三个jar包


3.添加maven依赖

    <dependencies><dependency><groupId>com.beyondli</groupId><artifactId>modbus4j</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/modbus4J.jar</systemPath></dependency><dependency><groupId>com.beyondli</groupId><artifactId>sero</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/seroUtils.jar</systemPath></dependency><dependency><groupId>com.beyondli</groupId><artifactId>rxtx</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/RXTXcomm.jar</systemPath></dependency></dependencies>

4.jre中添加rxtxParallel.dll和rxtxSerial.dll文件

首先,我们找到我们的jdk环境安装地址进入到对应的jre文件夹中,此地址每个同学需要根据自己的安装目录进行调整。以下是我的目录结构

rxtxSerial.dll文件我们放到jdk的jre/bin文件夹下

rxtxParallel.dll文件我们放到jre\lib\ext文件夹下

5.编写Java代码(主机)获取从机信息

读取从机和修改写入从机的对应方法均在下面的代码中,同学们可以自行阅读注释,根据自行业务进行调整。

package com.beyondli;import com.serotonin.io.serial.SerialParameters;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.msg.*;import java.util.Arrays;public class ModbusPollRTUTest {public static void main(String[] args) {SerialParameters serialParameters = new SerialParameters();// 设定MODBUS通讯的串行口serialParameters.setCommPortId("COM8");// 设定成无奇偶校验serialParameters.setParity(0);// 设定成数据位是8位serialParameters.setDataBits(8);// 设定为1个停止位serialParameters.setStopBits(1);// 设定端口名称serialParameters.setPortOwnerName("Numb nuts");// 设定端口波特率serialParameters.setBaudRate(19200);// 创建ModbusFactory工厂实例ModbusFactory modbusFactory = new ModbusFactory();// 创建ModbusMaster实例ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);// 初始化try {master.init();//写入从站3号位为7166writeHoldingRegistersTest(master,1,2,7166);//读取从站信息while (true) {readHoldingRegistersTest(master,1,0,5);Thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();} finally {master.destroy();}}private static void readHoldingRegistersTest(ModbusMaster master,int slaveId, int start, int len) {try {ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);if (response.isException()) {System.out.println("Exception response: message="+ response.getExceptionMessage());} else {//System.out.println(Arrays.toString(response.getShortData()));short[] list = response.getShortData();for(int i = 0; i < list.length; i++){System.out.println(list[i] + " ");}/*System.out.println();int hight = (list[3] - 4000) /160;if(hight <= 0){System.out.println("水位高度为:0CM");}else{System.out.println("水位高度为:" + (hight + 13.5) + "CM");}*/}} catch (ModbusTransportException e) {e.printStackTrace();}}private static void writeHoldingRegistersTest(ModbusMaster master,int slaveId, int start, int value) {try {/*value.replace(" ", ""); //去除所有空格,包括首尾、中间//先把Stirng数据转成char数组char[] dataChar = value.toCharArray();//创建一个short数组,大小为参数的长度short[] dataShort = new short[value.length()];//循环dataChar数组,把dataChar一个一个存到short中for (int i = 0; i < dataChar.length; i++) {dataShort[i] = (short) dataChar[i];}*/WriteRegisterRequest request = new WriteRegisterRequest(slaveId, start, value);WriteRegisterResponse  response = (WriteRegisterResponse) master.send(request);if (response.isException()){System.out.println("Exception response: message=" + response.getExceptionMessage());}else {System.out.println("Success");}} catch (ModbusTransportException e) {e.printStackTrace();}}}

最终效果入下图所示


Java 使用Virtual Serial Port Driver及Modsim32进行modbus-rtu协议模拟(从机)并使用java当做主机(Maven项目)进行从机信息获取及修改相关推荐

  1. Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法

    虚拟串口安装之后,不要立刻运行它.将压缩包内附的用vspdctl.dll文件放到C:\Program Files\Eltima Software\Virtual Serial Port Driver ...

  2. VSPD V9版(Virtual Serial Port Driver 9.0)

    VSPD V9版(Virtual Serial Port Driver 9.0) 最好用的虚拟串口对: Virtual Serial Port Driver 最新版 Standard V9.0.575 ...

  3. 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理

    关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理分析         一直以来对该程序的注册分析总是针对 vspdpro.exe,没有针对服 ...

  4. vspd 虚拟串口 Virtual Serial Port Driver 7.2+破解补丁

    安装说明: Virtual Serial Port Driver 7.2英文版 1.运行vspd.exe安装软件. 2.复制vspdctl.dll到安装目录,覆盖原文件. 3.启动vspdconfig ...

  5. 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979

    关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979 Virtual Serial Port Driver PRO 是基于「 ...

  6. Virtual Serial Port Driver Pro 9.0的破解和汉化

    Virtual Serial Port Driver Pro 9.0 官方原版: https://cdn.eltima.com/download/vspdpro.exe Virtual Serial ...

  7. Virtual Serial Port Driver Pro 11 Crack

    Virtual Serial Port Driver 虚拟串行端口驱动程序允许创建大量的虚拟COM端口,并为您提供充分模拟串行端口行为的巨大可能性.虚拟串行端口软件不仅仅是一个简单的COM端口模拟器. ...

  8. Virtual Serial Port Driver Pro(虚拟串口工具)破解版

    1.Virtual Serial Port Driver介绍 Virtual Serial Port Driver是一款爱不释手的虚拟串口工具,其由著名软件公司Eltima开发,简称为VSPD,是虚拟 ...

  9. Virtual Serial Port Driver 虚拟串口工具软件 使用介绍

    一般来说,电脑的外部设备可以用过各种端口和电脑连接.常见的有USB,VGA,DVI等等.在工业领域或者是软件开发领域,我们常常需要用简单低成本快捷的方式,完成电脑和设备的连接.那么串口就是非常好的选择 ...

最新文章

  1. portscaner 多线程、多协程并发端口扫描
  2. cfa三级真题和mock_两年高分过CFA三级的女学霸:复习秘诀刷爆了朋友圈!
  3. 《从0到1学习Flink》—— Flink Data transformation(转换)
  4. 动态隐藏ALV的行和列
  5. chmod与umask区分命令
  6. php文件上传并保存路径到数据库,thinkphp表单上传文件并将文件路径保存到数据库中?...
  7. docker run后台启动命令_Docker-第五部分:15个 Docker 命令
  8. Java代码有效和片段有效_Java 9 尝鲜之交互式编程环境
  9. rk3288 lvds屏参资料_RK3288四核高性能主板,微型工业主机
  10. C#中的方法(函数),委托和事件
  11. 移动页面框架头尾固定中间滚动 absolute模拟fixed
  12. 大咖说:如何借助腾讯云简单、高效移动开发
  13. Android系统中的常用时间戳及时间单位
  14. php网站做分享到朋友圈,PHP实现微信分享朋友圈
  15. 一个小白对接电子面单的哪些坑?
  16. laravel 微博登录
  17. matlab图片固定阙值分割
  18. 使用MySQL的binlog日志恢复误删数据
  19. One、that、it 做代词的区别
  20. AHK 区域找图功能的使用和实例子

热门文章

  1. 威尔科克森符号秩检验 (Wilcoxon Signed Rank Test)
  2. 数字阅读正成移动互联网趋势
  3. 深入浅出通信原理2021-03-03
  4. 像素、分辨率、DPI、PPI
  5. 大数据周会-本周学习内容总结016
  6. 对scoped的理解
  7. mybatis中#与$的区别
  8. linux inet_init
  9. ctfshow baby杯 六一快乐 部分MISC WriteUp
  10. 2018老男孩脱产班linux运维51期