avatar

目录
modbus通信-java实现

硬件测试仿真

工具:

vspd虚拟串口:仿真串口、创建虚拟 COM 对

ModbusPoll:主站设备仿真软件

ModbusSlave:从站设备仿真软件

实现ModbusPoll与ModbusSlave的通信

Code
1
2
Modbus Poll与Modbus Slave安装破解教程及使用指南
https://www.jb51.net/softjc/597246.html

modbus4j实现通信

modbus4j: https://github.com/infiniteautomation/modbus4j

pom.xml

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<repositories>
<repository>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>ias-snapshots</id>
<name>Infinite Automation Snapshot Repository</name>
<url>https://maven.mangoautomation.net/repository/ias-snapshot/</url>
</repository>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>ias-releases</id>
<name>Infinite Automation Release Repository</name>
<url>https://maven.mangoautomation.net/repository/ias-release/</url>
</repository>
</repositories>

<dependency>
<groupId>com.infiniteautomation</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
</dependency>

ModbusUtils

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package machine.example.modbus.utils;

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.msg.*;
import com.serotonin.modbus4j.sero.util.queue.ByteQueue;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ModbusUtils {

/**
* 写数据到寄存器
* @param ip 从站IP
* @param port modbus端口
* @param slaveId 从站id
* @param writeOffset 启始地址偏移量
* @param sdata 待写数据
*/
public static void modbusWriteTCP(String ip, int port,
int slaveId, int writeOffset,short[] sdata){

//设置要连接的modbus从站信息
ModbusFactory modbusFactory = new ModbusFactory();
IpParameters params = new IpParameters();
params.setHost(ip);
if (502!=port){
params.setPort(port);
}

//创建modbus主站
ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, true);
try {
tcpMaster.init();
log.info("modbus主站初始化成功");
} catch (ModbusInitException e) {
log.error("modbus主站初始化异常:"+e.getStackTrace());
e.printStackTrace();
}

try {
//功能码16(slave设置为03)
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, writeOffset, sdata);
WriteRegistersResponse response = (WriteRegistersResponse)tcpMaster.send(request);
if(response.isException()){
log.error("Exception response: "+ response.getExceptionMessage());
}else{
log.info("response success");
}

} catch (ModbusTransportException e) {
e.printStackTrace();
}


}

/**
* 从寄存器读数据
* @param host 从站IP
* @param port modbus端口
* @param slaveId 从站id
* @param startOffset 起始地址偏移量
* @param numberOfRegisters 待读寄存器个数
* @return
*/
public static ByteQueue modbusReadTCP(String host,int port,int slaveId
,int startOffset,int numberOfRegisters){
ModbusFactory modbusFactory = new ModbusFactory();
IpParameters params = new IpParameters();
params.setHost(host);
if (502!=port){
params.setPort(port);
}

ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, true);
try {
tcpMaster.init();
log.info("modbus主站初始化成功");
} catch (ModbusInitException e) {
log.error("modbus主站初始化异常:"+e.getStackTrace());
e.printStackTrace();
}

ReadHoldingRegistersRequest request = null;
try {
//功能码03(在slave上修改寄存器即可)
request = new ReadHoldingRegistersRequest(slaveId, startOffset, numberOfRegisters);
} catch (ModbusTransportException e) {
e.printStackTrace();
}

ModbusResponse response = null;
try {
response = tcpMaster.send(request);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
ByteQueue byteQueue = new ByteQueue(1024);
response.write(byteQueue);

log.info("功能码:"+request.getFunctionCode());
log.info("从站地址:"+request.getSlaveId());
log.info("收到响应信息大小:"+byteQueue.size());
log.info("收到响应信息值:"+byteQueue);

return byteQueue;
}


public static void main(String[] args) {
short[] sdata = {5,5,5,5,5,5,5,5};
//ModbusUtils.modbusWriteTCP("192.168.199.228",502,1,40001,sdata);
ModbusUtils.modbusReadTCP("192.168.199.228",502,1,
40001,9);
}
}
文章作者: Machine
文章链接: https://machine4869.gitee.io/2018/10/10/15391468341911/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论