FHMaster.java 6.0 KB

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