123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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<ModbusTcpMaster> 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<ReadHoldingRegistersResponse> 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();
- }
- }
|