Java 使用Virtual Serial Port Driver及Modsim32进行modbus-rtu协议模拟(从机)并使用java当做主机(Maven项目)进行从机信息获取及修改
上面我们写了一篇关于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项目)进行从机信息获取及修改相关推荐
- Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法
虚拟串口安装之后,不要立刻运行它.将压缩包内附的用vspdctl.dll文件放到C:\Program Files\Eltima Software\Virtual Serial Port Driver ...
- VSPD V9版(Virtual Serial Port Driver 9.0)
VSPD V9版(Virtual Serial Port Driver 9.0) 最好用的虚拟串口对: Virtual Serial Port Driver 最新版 Standard V9.0.575 ...
- 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理
关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理分析 一直以来对该程序的注册分析总是针对 vspdpro.exe,没有针对服 ...
- vspd 虚拟串口 Virtual Serial Port Driver 7.2+破解补丁
安装说明: Virtual Serial Port Driver 7.2英文版 1.运行vspd.exe安装软件. 2.复制vspdctl.dll到安装目录,覆盖原文件. 3.启动vspdconfig ...
- 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979
关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979 Virtual Serial Port Driver PRO 是基于「 ...
- Virtual Serial Port Driver Pro 9.0的破解和汉化
Virtual Serial Port Driver Pro 9.0 官方原版: https://cdn.eltima.com/download/vspdpro.exe Virtual Serial ...
- Virtual Serial Port Driver Pro 11 Crack
Virtual Serial Port Driver 虚拟串行端口驱动程序允许创建大量的虚拟COM端口,并为您提供充分模拟串行端口行为的巨大可能性.虚拟串行端口软件不仅仅是一个简单的COM端口模拟器. ...
- Virtual Serial Port Driver Pro(虚拟串口工具)破解版
1.Virtual Serial Port Driver介绍 Virtual Serial Port Driver是一款爱不释手的虚拟串口工具,其由著名软件公司Eltima开发,简称为VSPD,是虚拟 ...
- Virtual Serial Port Driver 虚拟串口工具软件 使用介绍
一般来说,电脑的外部设备可以用过各种端口和电脑连接.常见的有USB,VGA,DVI等等.在工业领域或者是软件开发领域,我们常常需要用简单低成本快捷的方式,完成电脑和设备的连接.那么串口就是非常好的选择 ...
最新文章
- portscaner 多线程、多协程并发端口扫描
- cfa三级真题和mock_两年高分过CFA三级的女学霸:复习秘诀刷爆了朋友圈!
- 《从0到1学习Flink》—— Flink Data transformation(转换)
- 动态隐藏ALV的行和列
- chmod与umask区分命令
- php文件上传并保存路径到数据库,thinkphp表单上传文件并将文件路径保存到数据库中?...
- docker run后台启动命令_Docker-第五部分:15个 Docker 命令
- Java代码有效和片段有效_Java 9 尝鲜之交互式编程环境
- rk3288 lvds屏参资料_RK3288四核高性能主板,微型工业主机
- C#中的方法(函数),委托和事件
- 移动页面框架头尾固定中间滚动 absolute模拟fixed
- 大咖说:如何借助腾讯云简单、高效移动开发
- Android系统中的常用时间戳及时间单位
- php网站做分享到朋友圈,PHP实现微信分享朋友圈
- 一个小白对接电子面单的哪些坑?
- laravel 微博登录
- matlab图片固定阙值分割
- 使用MySQL的binlog日志恢复误删数据
- One、that、it 做代词的区别
- AHK 区域找图功能的使用和实例子