Преглед на файлове

命令格式修改,,modbusRTU等待室修改

xiuwei преди 2 години
родител
ревизия
2e0b3838a3

+ 7 - 7
pom.xml

@@ -6,7 +6,7 @@
 
     <groupId>wei.yigulu</groupId>
     <artifactId>protocol</artifactId>
-    <version>2.3.15</version>
+    <version>2.3.16</version>
     <packaging>pom</packaging>
     <modules>
         <module>protocol-core</module>
@@ -32,21 +32,21 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
-        <protocol.version>2.3.15</protocol.version>
+        <protocol.version>2.3.16</protocol.version>
         <iec104.version>2.4.23</iec104.version>
-        <modbus.version>2.2.7</modbus.version>
+        <modbus.version>2.3.7</modbus.version>
         <cdt.version>2.0.1</cdt.version>
     </properties>
     <distributionManagement>
         <repository>
             <id>jiayue-releases</id>
-            <name>Releases Repository of SmartGap</name>
-            <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-releases/</url>
+            <name>Nexus Release Repository</name>
+            <url>http://49.4.68.219:8888/repository/jiayue-releases/</url>
         </repository>
         <snapshotRepository>
             <id>jiayue-snapshots</id>
-            <name>Snapshots Repository of SmartGap</name>
-            <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-snapshots/</url>
+            <name>Nexus Snapshot Repository</name>
+            <url>http://49.4.68.219:8888/repository/jiayue-snapshots/</url>
         </snapshotRepository>
     </distributionManagement>
     <build>

+ 1 - 1
protocol-all/pom.xml

@@ -6,7 +6,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>2.3.15</version>
+        <version>2.3.16</version>
     </parent>
 
 

+ 1 - 1
protocol-cdt/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>2.3.15</version>
+        <version>2.3.16</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>2.3.15</version>
+        <version>2.3.16</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 0
protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpMasterBuilder.java

@@ -127,6 +127,7 @@ public abstract class AbstractTcpMasterBuilder extends AbstractMasterBuilder {
 					.handler(getOrCreateChannelInitializer());
 			bootstrap.option(ChannelOption.SO_KEEPALIVE, false);
 			bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000);
+			bootstrap.option(ChannelOption.SO_LINGER, 0);
 		}
 		return this.bootstrap;
 	}

+ 1 - 1
protocol-iec104/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>2.3.15</version>
+        <version>2.3.16</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 11 - 0
protocol-iec104/src/test/java/CommandTest.java

@@ -0,0 +1,11 @@
+import wei.yigulu.iec104.nettyconfig.Iec104MasterBuilder;
+import wei.yigulu.iec104.util.SendCommandHelper;
+
+public class CommandTest {
+    public static void main(String[] args) throws Exception {
+        Iec104MasterBuilder i=new Iec104MasterBuilder("127.0.0.1",2404);
+        i.createByUnBlock();
+        Thread.sleep(3000L);
+        SendCommandHelper.sendShortCommand(i,1,1,30,10700f);
+    }
+}

+ 8 - 0
protocol-iec104/src/test/java/TestClient.java

@@ -2,12 +2,20 @@ import wei.yigulu.iec104.apdumodel.Apdu;
 import wei.yigulu.iec104.apdumodel.Asdu;
 import wei.yigulu.iec104.asdudataframe.PulseTotalSummonType;
 import wei.yigulu.iec104.nettyconfig.Iec104MasterBuilder;
+import wei.yigulu.iec104.util.SendDataFrameHelper;
 
+/**
+ * 测试遥脉总招
+ *
+ * @author 3377
+ * @date 2022/11/01
+ */
 public class TestClient {
     public static void main(String[] args) throws Exception {
         Iec104MasterBuilder i=new Iec104MasterBuilder("127.0.0.1",2404);
         i.createByUnBlock();
         Thread.sleep(3000L);
+        SendDataFrameHelper.sendTotalSummonFrame(i.getFuture().channel(),1,6,i.getLog());
         PulseTotalSummonType pulseTotalSummonType =new PulseTotalSummonType();
         Asdu asdu = pulseTotalSummonType.generateBack();
         Apdu apdu=new Apdu();

+ 1 - 1
protocol-modbus/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>2.3.15</version>
+        <version>2.3.16</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <version>${modbus.version}</version>

+ 0 - 3
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/ModbusSlaveDataContainer.java

@@ -104,9 +104,6 @@ public class ModbusSlaveDataContainer {
 					this.registers.addAll(new P_AB(BigDecimal.ZERO).getRegisters());
 				}
 			}
-			for (int i = 0; i < value.getModbusDataTypeEnum().getOccupiedRegister(); i++) {
-				this.registers.remove(position);
-			}
 			this.registers.addAll(position, value.getRegisters());
 		}
 

+ 0 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/UnknownTypeRegisterValue.java

@@ -51,7 +51,6 @@ public class UnknownTypeRegisterValue extends RegisterValue {
 		return this;
 	}
 
-	@Override
 	public UnknownTypeRegisterValue encode(List<Byte> bytes) {
 		bytes.add(this.register.getB1());
 		bytes.add(this.register.getB2());

+ 43 - 20
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/synchronouswaitingroom/RtuSynchronousWaitingRoom.java

@@ -3,8 +3,11 @@ package wei.yigulu.modbus.domain.synchronouswaitingroom;
 
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 
 import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * 同步等待室 将请求和响应同步起来
@@ -17,17 +20,45 @@ public class RtuSynchronousWaitingRoom implements SynchronousWaitingRoom {
 
 	public static long waitTime = 2000L;
 
-	protected ByteBuffer bytes = null;
 
-	protected boolean hasGuest;
+	protected Map<Integer, RtuSynchronousWaitingRoom.Guest> guestMap = new ConcurrentHashMap<>();
 
 
 	@Override
-	@SneakyThrows
 	public ByteBuffer getData(int key) {
-		ByteBuffer returnBytes = null;
-		hasGuest = true;
-		synchronized (this) {
+		RtuSynchronousWaitingRoom.Guest guest = new RtuSynchronousWaitingRoom.Guest();
+		this.guestMap.put(key, guest);
+		ByteBuffer byteBuffer = null;
+		try {
+			byteBuffer = guest.getData();
+		} catch (InterruptedException e) {
+			log.trace("响应超时,通讯帧类型:" + key);
+		}
+		this.guestMap.remove(key);
+		return byteBuffer;
+	}
+
+	@Override
+	public void setData(ByteBuffer bytes) {
+		if (bytes.remaining() > 2) {
+			bytes.mark();
+			bytes.get();
+			int key =bytes.get();
+			bytes.reset();
+			if (this.guestMap.containsKey(key)) {
+				this.guestMap.get(key).setData(bytes);
+			} else {
+				log.trace("置入响应数据时,未发现等待者:" + key);
+			}
+		}
+	}
+
+	public class Guest {
+
+		protected ByteBuffer bytes = null;
+
+		public synchronized ByteBuffer getData() throws InterruptedException {
+			ByteBuffer returnBytes = null;
 			try {
 				if (this.bytes == null) {
 					this.wait(RtuSynchronousWaitingRoom.waitTime);
@@ -38,25 +69,17 @@ public class RtuSynchronousWaitingRoom implements SynchronousWaitingRoom {
 					log.warn("响应超时");
 				}
 			} catch (Exception e) {
-				hasGuest = false;
 				this.bytes = null;
 				throw e;
 			}
+			this.bytes = null;
+			return returnBytes;
 		}
-		this.bytes = null;
-		hasGuest = false;
-		return returnBytes;
-	}
 
-
-	@Override
-	public void setData(ByteBuffer bytes) {
-		if (this.hasGuest) {
-			synchronized (this) {
-				this.bytes = bytes;
-				this.notify();
-			}
+		public synchronized void setData(ByteBuffer bytes) {
+			this.bytes = bytes;
+			this.notifyAll();
 		}
 	}
 
-}
+}

+ 2 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusCommandDataUtils.java

@@ -53,7 +53,7 @@ public class ModbusCommandDataUtils {
 				modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
 				modbusCommand.encode(bs);
 				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
-				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(modbusCommand.getFunctionCode().getCode());
 				confirm = new RtuModbusConfirm().decode(buffer);
 			} else {
 				modbusCommand = new TcpModbusCommand();
@@ -110,7 +110,7 @@ public class ModbusCommandDataUtils {
 				modbusCommand.setSlaveId(slaveId).setCoils(address, values);
 				modbusCommand.encode(bs);
 				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
-				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(modbusCommand.getFunctionCode().getCode());
 				confirm = new RtuModbusConfirm().decode(buffer);
 			} else {
 				modbusCommand = new TcpModbusCommand();

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusRequestDataUtils.java

@@ -198,7 +198,7 @@ public class ModbusRequestDataUtils {
 		if (modbusRequest instanceof TcpModbusRequest) {
 			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusRequest) modbusRequest).getTcpExtraCode().getTransactionIdentifier().getSeq());
 		} else {
-			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(modbusRequest.getFunctionCode().getCode());
 		}
 		if (buffer == null) {
 			throw new ModbusException("Slave端响应超时");

+ 40 - 0
protocol-modbus/src/main/resources/logback.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="APP_Name" value="test"/>
+    <property name="Log_Dir" value="./"/>
+    <contextName>${APP_Name}</contextName>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder charset="UTF-8">
+            <pattern>${APP_Name}-%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="InfoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${Log_Dir}/${APP_Name}/logs/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>${Log_Dir}/logs/${APP_Name}/%d{yyyy-MM-dd}/info.%i.log</FileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <maxFileSize>100MB</maxFileSize>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder charset="UTF-8" class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <!--<appender name="SocketError" class="com.hrhx.logger.SocketAppend"></appender>-->
+
+
+    <!--子节点<root>:它也是<loger>元素,但是它是根loger,是所有<loger>的上级。
+    只有一个level属性,因为name已经被命名为"root",且已经是最上级了。
+  level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,
+    不能设置为INHERITED或者同义词NULL。 默认是DEBUG。-->
+    <root level="trace">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="InfoFile"/>
+        <!--<appender-ref ref="SocketE-->
+    </root>
+
+</configuration>

+ 54 - 0
protocol-modbus/src/test/java/RtuSlaveTest3.java

@@ -0,0 +1,54 @@
+import wei.yigulu.modbus.domain.ModbusSlaveDataContainer;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
+import wei.yigulu.modbus.domain.datatype.numeric.PM_AB;
+import wei.yigulu.modbus.netty.ModbusRtuSlaverBuilder;
+
+import java.math.BigDecimal;
+
+import static wei.yigulu.modbus.domain.FunctionCode.WRITE_REGISTER;
+
+public class RtuSlaveTest3 {
+
+    public static BigDecimal commandValue = BigDecimal.valueOf(10000);
+
+    public static final void setCommandValue(BigDecimal cv) {
+        commandValue = cv;
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        MyModbusRtuSlaverBuilder modbusRtuSlaverBuilder = new MyModbusRtuSlaverBuilder("COM2");
+        ModbusSlaveDataContainer modbusSlaveDataContainer = modbusRtuSlaverBuilder.getModbusSlaveDataContainer();
+        BigDecimal x;
+        modbusRtuSlaverBuilder.createByUnBlock();
+        for (; ; ) {
+            x = commandValue.divide(BigDecimal.valueOf(100));
+            System.out.println(x);
+            modbusSlaveDataContainer.setRegister(3, 1627, new PM_AB(BigDecimal.valueOf(2300).subtract(x.multiply(BigDecimal.valueOf(10)))));
+            modbusSlaveDataContainer.setRegister(3, 1628, new PM_AB(BigDecimal.valueOf(2300).add(x.multiply(BigDecimal.valueOf(10)))));
+            modbusSlaveDataContainer.setRegister(3, 1632, new PM_AB(x.multiply(BigDecimal.valueOf(100))));
+            Thread.sleep(3000L);
+        }
+
+    }
+
+    static class MyModbusRtuSlaverBuilder extends ModbusRtuSlaverBuilder {
+
+        public MyModbusRtuSlaverBuilder(String commPortId) {
+            super(commPortId);
+        }
+
+
+        public boolean receiveCommand(AbstractModbusCommand command) {
+            if (command.getFunctionCode() == WRITE_REGISTER) {
+                if (command.getStartAddress() == 2180) {
+                    if (command.getDataBytes().length == 2) {
+                        PM_AB decode = new PM_AB().decode(command.getDataBytes(), 0);
+                        System.out.println("接收到命令:" + command.getStartAddress() + "——————" + decode.getValue());
+                        setCommandValue(decode.getValue());
+                    }
+                }
+            }
+            return true;
+        }
+    }
+}

+ 55 - 0
protocol-modbus/src/test/java/RtuSlaveTest4.java

@@ -0,0 +1,55 @@
+import wei.yigulu.modbus.domain.ModbusSlaveDataContainer;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
+import wei.yigulu.modbus.domain.datatype.numeric.PM_AB;
+import wei.yigulu.modbus.netty.ModbusRtuSlaverBuilder;
+
+import java.math.BigDecimal;
+
+import static wei.yigulu.modbus.domain.FunctionCode.WRITE_REGISTER;
+
+public class RtuSlaveTest4 {
+
+    public static BigDecimal commandValue = BigDecimal.valueOf(10000);
+
+    public static final void setCommandValue(BigDecimal cv) {
+        commandValue = cv;
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        MyModbusRtuSlaverBuilder modbusRtuSlaverBuilder = new MyModbusRtuSlaverBuilder("COM4");
+        ModbusSlaveDataContainer modbusSlaveDataContainer = modbusRtuSlaverBuilder.getModbusSlaveDataContainer();
+        BigDecimal x;
+        modbusRtuSlaverBuilder.createByUnBlock();
+        for (; ; ) {
+            x = commandValue.divide(BigDecimal.valueOf(100));
+            System.out.println(x);
+            modbusSlaveDataContainer.setRegister(4, 1627, new PM_AB(BigDecimal.valueOf(2300).subtract(x.multiply(BigDecimal.valueOf(10)))));
+            modbusSlaveDataContainer.setRegister(4, 1628, new PM_AB(BigDecimal.valueOf(2300).add(x.multiply(BigDecimal.valueOf(10)))));
+            modbusSlaveDataContainer.setRegister(4, 1632, new PM_AB(x.multiply(BigDecimal.valueOf(100))));
+            Thread.sleep(3000L);
+        }
+
+    }
+
+    static class MyModbusRtuSlaverBuilder extends ModbusRtuSlaverBuilder {
+
+        public MyModbusRtuSlaverBuilder(String commPortId) {
+            super(commPortId);
+        }
+
+
+        public boolean receiveCommand(AbstractModbusCommand command) {
+
+            if (command.getFunctionCode() == WRITE_REGISTER) {
+                if (command.getStartAddress() == 2180) {
+                    if (command.getDataBytes().length == 2) {
+                        PM_AB decode = new PM_AB().decode(command.getDataBytes(), 0);
+                        System.out.println("接收到命令:" + command.getStartAddress() + "——————" + decode.getValue());
+                        setCommandValue(decode.getValue());
+                    }
+                }
+            }
+            return true;
+        }
+    }
+}