FHMaster.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package at.acdp.urweb.fhpp;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.*;
  5. import com.digitalpetri.modbus.codec.Modbus;
  6. import com.digitalpetri.modbus.master.ModbusTcpMaster;
  7. import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
  8. import com.digitalpetri.modbus.requests.*;
  9. import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
  10. import io.netty.util.ReferenceCountUtil;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. public class FHMaster {
  14. public static int posfaktorNum=1;
  15. public static int posfaktorDiv=1;
  16. private ModbusTcpMaster master;
  17. public static void main(String[] args) {
  18. try {
  19. new FHMaster().start();
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. private final Logger logger = LoggerFactory.getLogger(getClass());
  25. private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  26. private volatile boolean started = false;
  27. public FHMaster() {
  28. }
  29. public void start() throws InterruptedException {
  30. started = true;
  31. ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("10.0.31.14")
  32. .setPort(502)
  33. .build();
  34. master = new ModbusTcpMaster(config);
  35. // var f=master.connect()
  36. // .whenComplete((result, ex) -> bereitschaft(master))
  37. // .whenComplete((result, ex) -> direktAuftrag(master,100));
  38. while(true) {
  39. Thread.sleep(1000);
  40. readStatus();
  41. }
  42. }
  43. private void sendRequests(ModbusTcpMaster master, List<ModbusRequest> reqs) {
  44. for(var req: reqs) {
  45. var future=master.sendRequest(req, 0);
  46. future.whenCompleteAsync((response, ex) -> {
  47. if (response != null) {
  48. ReferenceCountUtil.release(response);
  49. }
  50. else {
  51. logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
  52. }
  53. }, Modbus.sharedExecutor());
  54. }
  55. }
  56. public void prepare() {
  57. byte[] sb=new byte[8];
  58. sb[0]=0x00;
  59. sb[1]=0x00;
  60. send(sb, 4);
  61. }
  62. private void send(byte[] bytes, int quantity) {
  63. CompletableFuture<ReadHoldingRegistersResponse> f =
  64. master.sendRequest(new WriteMultipleRegistersRequest(0, quantity, bytes), 0);
  65. f.join();
  66. }
  67. public void direktAuftrag(int pos, int start) {
  68. byte ccon=0x0;
  69. ccon|=(1<<0); // Enable drive
  70. ccon|=(1<<1); // !Stop
  71. ccon|=(1<<2); // Release Brake
  72. ccon|=(0<<3); //Reset fault
  73. ccon|=(0<<4); //Reserved
  74. ccon|=(0<<5); //lock software
  75. ccon|=(1<<6 |0 <<7); //lock software
  76. // 0,0 Satzselektion
  77. // 1,0 Direktauftrag
  78. // 0,1 Reserviert
  79. // 1,1 Reserviert
  80. byte cpos=0x0;
  81. cpos|=(1<<0); // !Halt
  82. cpos|=(start<<1); // start fahrauftrag
  83. cpos|=(0<<2); // start homing
  84. cpos|=(0<<3); // jog pos
  85. cpos|=(0<<4); // jog neg
  86. cpos|=(0<<5); // teach value
  87. cpos|=(0<<6); // clear remaining pos.
  88. cpos|=(0<<7); // Reserved
  89. byte cdir=0x0;
  90. cdir|=(0<<0); // relative(0), absolute(1)
  91. cdir|= (0<<1| 0<<2); //absolute/relative
  92. // 0,0 Positionsregelung
  93. // 0,1 Kraftbetrieb
  94. // 1,0 Geschwindigkeitsregelung
  95. // 1,1 Reserviert
  96. cdir|=(0<<3); // Function Number Kurvenscheibenfunktion (0=nein)
  97. cdir|=(0<<4); // Function Number Kurvenscheibenfunktion (0=nein)
  98. cdir|=(0<<5); // Function Group Kurvenscheibenfunktion (0=nein)
  99. cdir|=(0<<6); // Function Group Kurvenscheibenfunktion (0=nein)
  100. cdir|=(0<<7); // 0 = normal; 1=kurvenscheibenfunktion
  101. byte sbyte4=5; // Geschw, in % vom Basiswert (PNU540
  102. byte sbyte8= (byte)(pos& 0xff);
  103. byte sbyte7= (byte)(pos>>8 & 0xff);
  104. byte sbyte6= (byte)(pos>>16 & 0xff);
  105. byte sbyte5= (byte)(pos>>24 & 0xff);
  106. send(new byte[]{ccon,
  107. cpos,
  108. cdir,
  109. sbyte4,
  110. sbyte5,
  111. sbyte6,
  112. sbyte7,
  113. sbyte8,
  114. },4);
  115. }
  116. public CompletableFuture<Status> readStatus() {
  117. if(master==null)
  118. return null;
  119. CompletableFuture<ReadHoldingRegistersResponse> f =master.sendRequest(new ReadHoldingRegistersRequest(0,4), 0);
  120. CompletableFuture<Status> fc= f.thenApply((response) -> {
  121. if (response != null) {
  122. var bb=response.getRegisters();
  123. try {
  124. byte[] bytes = new byte[bb.readableBytes()];
  125. bb.readBytes(bytes);
  126. Status s=new Status();
  127. s.read(bytes);
  128. return s;
  129. // System.out.println(s.toString());
  130. // System.out.println(ByteBufUtil.hexDump(bb));
  131. }
  132. catch (Exception e) {
  133. e.printStackTrace();
  134. }
  135. ReferenceCountUtil.release(response);
  136. }
  137. else {
  138. logger.error("Completed exceptionally, message={}", "null");
  139. }
  140. return null;
  141. });
  142. return fc;
  143. }
  144. private void bereitschaft(ModbusTcpMaster master) {
  145. List<ModbusRequest> blist = new ArrayList<>();
  146. blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}));
  147. blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x11,0,0,0,0,0,0,0}));
  148. blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}));
  149. sendRequests(master, blist);
  150. }
  151. public void stop() {
  152. started = false;
  153. }
  154. }