参考上章节(java实现modbus rtu协议与 modscan等工具_weixin_42240941的博客-CSDN博客)最后连接的java代码
新增0x06 与 0x10的测试。试对接数码人u位条(v5型)
package com.willservice.cmdb.rtu;
import java.util.Arrays;
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.msg.*;
import com.serotonin.modbus4j.serial.SerialPortWrapper;
public class CollectionMain {
// 设定MODBUS网络上从站地址
private final static int SLAVE_ADDRESS = 1;
//串行波特率
private final static int BAUD_RATE = 38400;
public static void main(String[] args) {
SerialPortWrapper serialParameters = new
SerialPortWrapperImpl("COM2", BAUD_RATE, 8, 1, 0, 0, 0);
ModbusFactory modbusFactory = new ModbusFactory();
ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
try {
master.init();
// readHoldingRegisters(master, SLAVE_ADDRESS, 0, 24);
writeSingleHoldingRegister(master, SLAVE_ADDRESS, 1, 1);
// writeMultipleHoldingRegisters(master, SLAVE_ADDRESS, 0, (short)1,(short)1);
} catch (ModbusInitException e) {
e.printStackTrace();
} finally {
master.destroy();
}
}
private static void readHoldingRegisters(ModbusMaster master, int slaveId, int start, int len) {
try {
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse)master.send(request);
System.out.println(response.toString());
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.print(list[i] + " ");
}
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}
// 0x06 写单个保持寄存器
// 线圈寄存器是coil,所以保持寄存器method-name非holding修饰
private static void writeSingleHoldingRegister(ModbusMaster master, int slaveId, int offset, int value){
try {
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, offset, value);
WriteRegisterResponse response =
(WriteRegisterResponse)master.send(request);
if (response.isException()) {
System.out.println("Exception response: message=" + response.getExceptionMessage());
} else {
System.out.println("RunRight reponse: messgae="+"no-response-data");
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}
// 0x10 写多个保持寄存器
//
private static void writeMultipleHoldingRegisters(ModbusMaster master, int slaveId, int offset, short... sdata){
try {
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, offset, sdata);
WriteRegistersResponse response =
(WriteRegistersResponse)master.send(request);
if (response.isException()) {
System.out.println("Exception response: message=" + response.getExceptionMessage());
} else {
System.out.println("RunRight reponse: messgae="+"no-response-data");
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}
}
用上章节方式,得到
写单保持寄存器 offset =0 value =1
输出码01 06 00 00 00 01 48 0A
测试发送,用modsim接收
此次创建两窗口,address不同。得以明白modsim的多窗口与address的含义。
可见40001 数据被修改,40003被修改是因为又调用了一次 其他的 输出码
注:功能码0x06 单写保持寄存器 需要modsimType03:Holding Register
功能码0x10的已经写在代码里了。连续型写入,没大的差别。



