Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Modbus脉冲线圈与弹簧靴项目_Java_Spring Boot_Modbus_Modbus Tcp - Fatal编程技术网

Java Modbus脉冲线圈与弹簧靴项目

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

必须使用Modbus协议在Spring Boot上通过Maven项目构建来实现对数字IO的调用

它应该是一个脉冲呼叫,在身体上持续一定时间(如5秒等)

以下是规范中的一个片段:

更多关于响应和错误的信息:

似乎在这个调用中,应用程序的行为应该像一个主程序。在这种情况下,Web中继应该像从机一样

我认为使用一些库与Modbus集成比从零开始编写要更好

哪种方法更适合在Spring Boot中采用此功能?

给你


更新:

尝试

以下是代码部分:

@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)
-如何准确设置该持续时间取决于继电器编号?