package at.acdp.urweb.fhpp; import java.nio.charset.Charset; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import com.digitalpetri.modbus.codec.Modbus; import com.digitalpetri.modbus.master.ModbusTcpMaster; import com.digitalpetri.modbus.master.ModbusTcpMasterConfig; import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest; import com.digitalpetri.modbus.requests.WriteMultipleRegistersRequest; import com.digitalpetri.modbus.requests.WriteSingleRegisterRequest; import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse; import io.netty.buffer.ByteBuf; import io.netty.util.ReferenceCountUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FHMaster { public static void main(String[] args) { new FHMaster(100, 100).start(); } private final Logger logger = LoggerFactory.getLogger(getClass()); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final List masters = new CopyOnWriteArrayList<>(); private volatile boolean started = false; private final int nMasters; private final int nRequests; public FHMaster(int nMasters, int nRequests) { this.nMasters = nMasters; this.nRequests = nRequests; } public void start() { started = true; ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("10.0.31.14") .setPort(502) .build(); new Thread(() -> { while (started) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } double mean = 0.0; double oneMinute = 0.0; for (ModbusTcpMaster master : masters) { mean += master.getResponseTimer().getMeanRate(); oneMinute += master.getResponseTimer().getOneMinuteRate(); } logger.info("Mean rate={}, 1m rate={}", mean, oneMinute); } }).start(); ModbusTcpMaster master = new ModbusTcpMaster(config); master.connect(); sendAndReceive(master); } private void sendAndReceive(ModbusTcpMaster master) { if (!started) return; CompletableFuture future = master.sendRequest(new ReadHoldingRegistersRequest(0,4), 0); //master.sendRequest(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}), 0); //master.sendRequest(new ReadWriteMultipleRegisters(0, 4), 0); future.whenCompleteAsync((response, ex) -> { if (response != null) { ReferenceCountUtil.release(response); try { var reg = response.getRegisters(); byte[] bytes = new byte[reg.readableBytes()]; System.out.println(String.format("%02X", bytes)); } catch (Exception e) { e.printStackTrace(); } } else { logger.error("Completed exceptionally, message={}", ex.getMessage(), ex); } scheduler.schedule(() -> sendAndReceive(master), 1, TimeUnit.SECONDS); }, Modbus.sharedExecutor()); } public void stop() { started = false; masters.forEach(ModbusTcpMaster::disconnect); masters.clear(); } }