Java Modbus脉冲线圈与弹簧靴项目
必须使用Modbus协议在Spring Boot上通过Maven项目构建来实现对数字IO的调用 它应该是一个脉冲呼叫,在身体上持续一定时间(如5秒等) 以下是规范中的一个片段: 更多关于响应和错误的信息: 似乎在这个调用中,应用程序的行为应该像一个主程序。在这种情况下,Web中继应该像从机一样 我认为使用一些库与Modbus集成比从零开始编写要更好 哪种方法更适合在Spring Boot中采用此功能? 给你Java Modbus脉冲线圈与弹簧靴项目,java,spring-boot,modbus,modbus-tcp,Java,Spring Boot,Modbus,Modbus Tcp,必须使用Modbus协议在Spring Boot上通过Maven项目构建来实现对数字IO的调用 它应该是一个脉冲呼叫,在身体上持续一定时间(如5秒等) 以下是规范中的一个片段: 更多关于响应和错误的信息: 似乎在这个调用中,应用程序的行为应该像一个主程序。在这种情况下,Web中继应该像从机一样 我认为使用一些库与Modbus集成比从零开始编写要更好 哪种方法更适合在Spring Boot中采用此功能? 给你 更新: 尝试 以下是代码部分: @Override public void cal
更新: 尝试 以下是代码部分:
@Override
public void callDigitalIO(String ipAddress, String relay) {
log.debug("call Digital IO by MODBUS");
checkNotEmpty(ipAddress, relay);
ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder(ipAddress).build();
ModbusTcpMaster master = new ModbusTcpMaster(config);
master.connect();
ByteBuf buffer = Unpooled.buffer();
buffer.writeInt(0x00003F00);
buffer.writeInt(0x000040A0);
int relayNum = Integer.parseInt(relay);
WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(
relayNum,
0x02 * relayNum,
buffer
);
log.debug("MODBUS_REQUEST: {}", request);
master.sendRequest(request, 0xFF)
.whenCompleteAsync((response, ex) -> {
if (response != null) {
log.info("MODBUS_RESPONSE: {}", response);
} else {
log.error("EXECUTION_FAILED: {}", ex.getMessage(), ex);
}
});
master.disconnect();
}
使用真实设备尝试以下代码段,输出如下:
2021-02-25 22-07-03.955 [carpark-ex-4] DEBUG c.s.s.dio.ModbusDigitalIoServiceImpl - MODBUS_REQUEST: WriteMultipleRegistersRequest(UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 8, cap: 256))
2021-02-25 22-07-03.970 [ForkJoinPool.commonPool-worker-5] ERROR c.s.s.dio.ModbusDigitalIoServiceImpl - EXECUTION_FAILED: not connected
java.lang.Exception: not connected
at com.digitalpetri.netty.fsm.ChannelFsmFactory.lambda$null$2(ChannelFsmFactory.java:115)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
只有当我这样做的时候:
master.sendRequest(请求,0xFF).get()
它开始工作。使用支持WriteMultipleRegisters函数的现有库,这应该很容易实现 试一试
如何基于文档的屏幕截图构造WriteMultipleRegisters请求的示例:
类刮擦{
公共静态void main(字符串[]args)引发ExecutionException、InterruptedException{
ModbusTcpMasterConfig=new ModbusTcpMasterConfig.Builder(“ip_或_主机名”).build();
ModBustCmaster主机=新的ModBustCmaster(配置);
master.connect().get();
ByteBuf buffer=unmooled.buffer();
缓冲区写入(0x00003F00);
缓冲区写入(0x000040A0);
WriteMultipleRegisterRequest=新的WriteMultipleRegisterRequest(
0x16,
0x04,
缓冲器
);
master.sendRequest(请求,0xFF).get();
}
}
您能解释一下这个电话的更多细节吗?如果需要,是否可以将超时设置为itUpdated。是你开始实验的时候了。编写代码并试用。您能帮助理解unitId
的含义吗?它在规范中。当它是Modbus通过串行传输时,称为从属id。您的设备文档提到仅使用0xFF,这通常在直接与服务器而不是网关后面的从属设备通话时使用。请看,您能否再澄清一个位置-脉冲持续时间(每个继电器4个字节):0x3DCCCC–0x47A8C000(小端格式:0xCCCC3DCC–0xC00047A8)
-如何准确设置该持续时间取决于继电器编号?