FHMaster.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package at.acdp.urweb.fhpp;
  2. import java.nio.charset.Charset;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.concurrent.CompletableFuture;
  6. import java.util.concurrent.CopyOnWriteArrayList;
  7. import java.util.concurrent.Executors;
  8. import java.util.concurrent.ScheduledExecutorService;
  9. import java.util.concurrent.TimeUnit;
  10. import com.digitalpetri.modbus.codec.Modbus;
  11. import com.digitalpetri.modbus.master.ModbusTcpMaster;
  12. import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
  13. import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest;
  14. import com.digitalpetri.modbus.requests.WriteMultipleRegistersRequest;
  15. import com.digitalpetri.modbus.requests.WriteSingleRegisterRequest;
  16. import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
  17. import io.netty.buffer.ByteBuf;
  18. import io.netty.util.ReferenceCountUtil;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. public class FHMaster {
  22. public static void main(String[] args) {
  23. new FHMaster(100, 100).start();
  24. }
  25. private final Logger logger = LoggerFactory.getLogger(getClass());
  26. private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  27. private final List<ModbusTcpMaster> masters = new CopyOnWriteArrayList<>();
  28. private volatile boolean started = false;
  29. private final int nMasters;
  30. private final int nRequests;
  31. public FHMaster(int nMasters, int nRequests) {
  32. this.nMasters = nMasters;
  33. this.nRequests = nRequests;
  34. }
  35. public void start() {
  36. started = true;
  37. ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("10.0.31.14")
  38. .setPort(502)
  39. .build();
  40. new Thread(() -> {
  41. while (started) {
  42. try {
  43. Thread.sleep(5000);
  44. } catch (InterruptedException e) {
  45. e.printStackTrace();
  46. }
  47. double mean = 0.0;
  48. double oneMinute = 0.0;
  49. for (ModbusTcpMaster master : masters) {
  50. mean += master.getResponseTimer().getMeanRate();
  51. oneMinute += master.getResponseTimer().getOneMinuteRate();
  52. }
  53. logger.info("Mean rate={}, 1m rate={}", mean, oneMinute);
  54. }
  55. }).start();
  56. ModbusTcpMaster master = new ModbusTcpMaster(config);
  57. master.connect();
  58. sendAndReceive(master);
  59. }
  60. private void sendAndReceive(ModbusTcpMaster master) {
  61. if (!started) return;
  62. CompletableFuture<ReadHoldingRegistersResponse> future =
  63. master.sendRequest(new ReadHoldingRegistersRequest(0,4), 0);
  64. //master.sendRequest(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}), 0);
  65. //master.sendRequest(new ReadWriteMultipleRegisters(0, 4), 0);
  66. future.whenCompleteAsync((response, ex) -> {
  67. if (response != null) {
  68. ReferenceCountUtil.release(response);
  69. try {
  70. var reg = response.getRegisters();
  71. byte[] bytes = new byte[reg.readableBytes()];
  72. System.out.println(String.format("%02X", bytes));
  73. }
  74. catch (Exception e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. else {
  79. logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
  80. }
  81. scheduler.schedule(() -> sendAndReceive(master), 1, TimeUnit.SECONDS);
  82. }, Modbus.sharedExecutor());
  83. }
  84. public void stop() {
  85. started = false;
  86. masters.forEach(ModbusTcpMaster::disconnect);
  87. masters.clear();
  88. }
  89. }