参考地址:
https://blog.youkuaiyun.com/sifanlook/article/details/81251626
最近项目应用场景:
采集污水坑中水泵状态、污水坑溢出液位报警等设备状态。
引入相关maven依赖
<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>
<dependencies>
<dependency>
<groupId>com.infiniteautomation</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
Java代码
@Test
public void testModbusTCP(){
modbusTCP(“192.168.5.103”,502,1,0);
}
public static ByteQueue modbusTCP(String ip, int port, int start, int readLenth) {
ModbusFactory modbusFactory = new ModbusFactory();
// 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
IpParameters params = new IpParameters();
params.setHost(ip);
if(502!=port){params.setPort(port);}//设置端口,默认502
ModbusMaster tcpMaster = null;
tcpMaster = modbusFactory.createTcpMaster(params, false);
try {
tcpMaster.init();
System.out.println("==============="+1111111);
} catch (ModbusInitException e) {
return null;
}
BaseLocator<Boolean> loc = BaseLocator.inputStatus(1, 1);
try {
Boolean value = tcpMaster.getValue(loc);
System.out.println("读输入寄存器状态值:" +value);
} catch (ModbusTransportException e) {
e.printStackTrace();
} catch (ErrorResponseException e) {
e.printStackTrace();
}
ModbusRequest modbusRequest=null;
try {
modbusRequest = new ReadInputRegistersRequest(1, 1, 1);//功能码03
} catch (ModbusTransportException e) {
e.printStackTrace();
}
ModbusResponse modbusResponse=null;
try {
modbusResponse = tcpMaster.send(modbusRequest);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
ByteQueue byteQueue= new ByteQueue(12);
modbusResponse.write(byteQueue);
System.out.println("功能码:"+modbusResponse.getFunctionCode());
System.out.println("从站地址:"+modbusResponse.getSlaveId());
System.out.println("收到的响应信息大小:"+byteQueue.size());
System.out.println("收到的响应信息值:"+byteQueue);
//Boolean value = tcpMaster.getValue();
return byteQueue;
}
api说明文档参考:
https://help.aliyun.com/document_detail/161095.html
根据api文档说明找到引入jar包中的相关api
测试工具Modscan32
打开modsim32创建从主机设备模拟服务端
打开modsan32模拟客户端连接服务端
相关参数跟服务端一一对应
关键代码说明