Browse Source

direktantrieb wip

Martin Kunz 4 years ago
parent
commit
30f303cee3
2 changed files with 107 additions and 57 deletions
  1. 3 3
      src/main/java/at/acdp/urweb/Main.java
  2. 104 54
      src/main/java/at/acdp/urweb/fhpp/FHMaster.java

+ 3 - 3
src/main/java/at/acdp/urweb/Main.java

@@ -1,5 +1,6 @@
 package at.acdp.urweb;
 
+import at.acdp.urweb.fhpp.FHMaster;
 import at.acdp.urweb.fhpp.FHPP;
 import at.acdp.urweb.web.XRServer;
 import com.nmote.nanohttp.NanoServer;
@@ -12,9 +13,8 @@ public class Main {
         Params app = null;
         try {
             app = picocli.CommandLine.populateCommand(new Params(), args);
-
-            var a=new FHPP();
-            a.connect();
+            var a=new FHMaster();
+            a.start();
         } catch (Exception e) {
             logger.error("failed.", e);
             picocli.CommandLine.usage(new Params(), System.out);

+ 104 - 54
src/main/java/at/acdp/urweb/fhpp/FHMaster.java

@@ -3,6 +3,7 @@
 package at.acdp.urweb.fhpp;
 
 import java.nio.charset.Charset;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
@@ -14,100 +15,149 @@ 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.requests.*;
+import com.digitalpetri.modbus.responses.ModbusResponse;
 import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
 import io.netty.util.ReferenceCountUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class FHMaster {
+    public static int posfaktorNum=1;
+    public static int posfaktorDiv=1;
+
+
 
     public static void main(String[] args) {
-        new FHMaster(100, 100).start();
+        try {
+            new FHMaster().start();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
     }
-
     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 FHMaster() {
     }
 
-    public void start() {
+    public void start() throws InterruptedException {
         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);
+        var f=master.connect()
+                .whenComplete((result, ex) -> bereitschaft(master))
+                .whenComplete((result, ex) -> direktAuftrag(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);
+        while(true) {
+            Thread.sleep(1000);
+            readStatus(master);
+        }
+    }
 
-        //master.sendRequest(new ReadWriteMultipleRegisters(0, 4), 0);
+    private void sendRequests(ModbusTcpMaster master, List<ModbusRequest> reqs) {
+        for(var req: reqs) {
+            var future=master.sendRequest(req, 0);
+            future.whenCompleteAsync((response, ex) -> {
+                if (response != null) {
+                    ReferenceCountUtil.release(response);
+                }
+                else {
+                    logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
+                }
+            }, Modbus.sharedExecutor());
+        }
+    }
 
+    void direktAuftrag(ModbusTcpMaster master) {
+        byte ccon=0x0;
+        ccon|=(1<<0); //Enable drive
+        ccon|=(0<<1); //Stop
+        ccon|=(1<<2); //Release Brake
+        ccon|=(0<<3); //Reset fault
+        ccon|=(0<<4); //Reserved
+        ccon|=(0<<5); //lock software
+        ccon|=(0<<6 | 1 <<7); //lock software
+                            // 0,0 Satzselektion
+                            // 1,0 Direktauftrag
+                            // 0,1 Reserviert
+                            // 1,1 Reserviert
+
+        byte cpos=0x0;
+        ccon|=(1<<0); // !Halt
+        ccon|=(0<<1); // start fahrauftrag
+        ccon|=(1<<2); // start homing
+        ccon|=(0<<3); // jog pos
+        ccon|=(0<<4); // jog neg
+        ccon|=(0<<5); //  teach value
+        ccon|=(0<<6); //  teach value
+        ccon|=(0<<7); //  teach value
+
+        byte cdir=0x0;
+        cdir|=(1<<0); //absolute/relative
+        cdir|= (1<<1| 1<<2); //absolute/relative
+                                // 0,0 Positionsregelung
+                                // 0,1 Kraftbetrieb
+                                // 1,0 Geschwindigkeitsregelung
+                                // 1,1 Reserviert
+        cdir|=(1<<3);   // Function Number Kurvenscheibenfunktion (0=nein)
+        cdir|=(1<<5);   // Function Group Kurvenscheibenfunktion (0=nein)
+        cdir|=(1<<7);   // 0 = normal; 1=kurvenscheibenfunktion
+
+        byte sbyte4=100; // Geschw, in % vom Basiswert (PNU540
+        int pos=50; //position in positionseinheit;
+        byte sbyte5= (byte)(pos& 0xff);
+        byte sbyte6= (byte)(pos>>8 & 0xff);
+        byte sbyte7= (byte)(pos>>16 & 0xff);
+        byte sbyte8= (byte)(pos>>24 & 0xff);
+
+        CompletableFuture<ReadHoldingRegistersResponse> f =
+                master.sendRequest(new WriteMultipleRegistersRequest(0,4, new byte[]{
+                        ccon,
+                        cpos,
+                        cdir,
+                        sbyte4,
+                        sbyte5,
+                        sbyte6,
+                        sbyte7,
+                        sbyte8}), 0);
+    }
 
-        future.whenCompleteAsync((response, ex) -> {
+    void readStatus(ModbusTcpMaster master) {
+        CompletableFuture<ReadHoldingRegistersResponse> f =master.sendRequest(new ReadHoldingRegistersRequest(0,4), 0);
+        f.whenCompleteAsync((response, ex) -> {
             if (response != null) {
-                ReferenceCountUtil.release(response);
+                var bb=response.getRegisters();
                 try {
 
-
-                    var reg = response.getRegisters();
-                    byte[] bytes = new byte[reg.readableBytes()];
-                    System.out.println(String.format("%02X", bytes));
+                    System.out.println(ByteBufUtil.hexDump(bb));
                 }
                 catch (Exception e) {
                     e.printStackTrace();
                 }
+                ReferenceCountUtil.release(response);
             }
-                else {
+            else {
                 logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
             }
-            scheduler.schedule(() -> sendAndReceive(master), 1, TimeUnit.SECONDS);
         }, Modbus.sharedExecutor());
     }
 
+    private void bereitschaft(ModbusTcpMaster master) {
+        List<ModbusRequest> blist = new ArrayList<>();
+        blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}));
+        blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x11,0,0,0,0,0,0,0}));
+        blist.add(new WriteMultipleRegistersRequest(0,4, new byte[]{0x01,0,0,0,0,0,0,0}));
+        sendRequests(master, blist);
+    }
+
     public void stop() {
         started = false;
         masters.forEach(ModbusTcpMaster::disconnect);