FHMaster.java 6.1 KB

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