|
@@ -3,6 +3,7 @@
|
|
package at.acdp.urweb.fhpp;
|
|
package at.acdp.urweb.fhpp;
|
|
|
|
|
|
import java.nio.charset.Charset;
|
|
import java.nio.charset.Charset;
|
|
|
|
+import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.CompletableFuture;
|
|
@@ -14,100 +15,149 @@ import java.util.concurrent.TimeUnit;
|
|
import com.digitalpetri.modbus.codec.Modbus;
|
|
import com.digitalpetri.modbus.codec.Modbus;
|
|
import com.digitalpetri.modbus.master.ModbusTcpMaster;
|
|
import com.digitalpetri.modbus.master.ModbusTcpMaster;
|
|
import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
|
|
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 com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
|
|
import io.netty.buffer.ByteBuf;
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
+import io.netty.buffer.ByteBufUtil;
|
|
import io.netty.util.ReferenceCountUtil;
|
|
import io.netty.util.ReferenceCountUtil;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
public class FHMaster {
|
|
public class FHMaster {
|
|
|
|
+ public static int posfaktorNum=1;
|
|
|
|
+ public static int posfaktorDiv=1;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
public static void main(String[] args) {
|
|
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 Logger logger = LoggerFactory.getLogger(getClass());
|
|
-
|
|
|
|
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
|
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
|
-
|
|
|
|
private final List<ModbusTcpMaster> masters = new CopyOnWriteArrayList<>();
|
|
private final List<ModbusTcpMaster> masters = new CopyOnWriteArrayList<>();
|
|
private volatile boolean started = false;
|
|
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;
|
|
started = true;
|
|
-
|
|
|
|
ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("10.0.31.14")
|
|
ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("10.0.31.14")
|
|
.setPort(502)
|
|
.setPort(502)
|
|
.build();
|
|
.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);
|
|
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) {
|
|
if (response != null) {
|
|
- ReferenceCountUtil.release(response);
|
|
|
|
|
|
+ var bb=response.getRegisters();
|
|
try {
|
|
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) {
|
|
catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
+ ReferenceCountUtil.release(response);
|
|
}
|
|
}
|
|
- else {
|
|
|
|
|
|
+ else {
|
|
logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
|
|
logger.error("Completed exceptionally, message={}", ex.getMessage(), ex);
|
|
}
|
|
}
|
|
- scheduler.schedule(() -> sendAndReceive(master), 1, TimeUnit.SECONDS);
|
|
|
|
}, Modbus.sharedExecutor());
|
|
}, 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() {
|
|
public void stop() {
|
|
started = false;
|
|
started = false;
|
|
masters.forEach(ModbusTcpMaster::disconnect);
|
|
masters.forEach(ModbusTcpMaster::disconnect);
|