硬件测试仿真
工具:
vspd虚拟串口:仿真串口、创建虚拟 COM 对
ModbusPoll:主站设备仿真软件
ModbusSlave:从站设备仿真软件
实现ModbusPoll与ModbusSlave的通信
1 2
| Modbus Poll与Modbus Slave安装破解教程及使用指南 https://www.jb51.net/softjc/597246.html
|
modbus4j实现通信
modbus4j: https://github.com/infiniteautomation/modbus4j
pom.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
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 {
public static void modbusWriteTCP(String ip, int port, int slaveId, int writeOffset,short[] sdata){
ModbusFactory modbusFactory = new ModbusFactory(); IpParameters params = new IpParameters(); params.setHost(ip); 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(); }
try { 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(); }
}
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 { 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.modbusReadTCP("192.168.199.228",502,1, 40001,9); } }
|