Selaa lähdekoodia

格式化代码+小修改优化

weiyigulu 4 vuotta sitten
vanhempi
commit
00ab1fc0dd
24 muutettua tiedostoa jossa 131 lisäystä ja 112 poistoa
  1. 1 1
      pom.xml
  2. 1 1
      protocol-cdt/src/test/java/TestMaster.java
  3. 1 0
      protocol-core/src/main/java/wei/yigulu/connectfilterofslave/ConnectFilterManager.java
  4. 1 1
      protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpSlaverBuilder.java
  5. 9 12
      protocol-core/src/main/java/wei/yigulu/utils/PCON.java
  6. BIN
      protocol-iec104/附件3:规约解析细则.xlsx
  7. 1 0
      protocol-modbus/pom.xml
  8. 34 20
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/FunctionCode.java
  9. 17 20
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/ModbusSlaveDataContainer.java
  10. 5 5
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestCoil.java
  11. 1 8
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestData.java
  12. 5 5
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestRegister.java
  13. 7 8
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInCoil.java
  14. 25 4
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInRegister.java
  15. 0 9
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/CoilValue.java
  16. 0 3
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/IModbusDataType.java
  17. 2 0
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/ModbusDataTypeEnum.java
  18. 0 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/NumericModbusData.java
  19. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuSlaverHandler.java
  20. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpSlaverHandle.java
  21. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusRequestDataUtils.java
  22. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusResponseDataUtils.java
  23. 9 2
      protocol-modbus/src/test/java/TestMaster.java
  24. 8 8
      protocol-modbus/src/test/java/TestMasterCoil.java

+ 1 - 1
pom.xml

@@ -34,7 +34,7 @@
         <java.version>1.8</java.version>
         <protocol.version>1.0</protocol.version>
         <iec104.version>1.4.7</iec104.version>
-        <modbus.version>1.2.0</modbus.version>
+        <modbus.version>1.2.1</modbus.version>
         <cdt.version>1.0.0</cdt.version>
     </properties>
     <distributionManagement>

+ 1 - 1
protocol-cdt/src/test/java/TestMaster.java

@@ -8,7 +8,7 @@ import wei.yigulu.cdt.netty.CDTMaster;
 public class TestMaster {
 	public static void main(String[] args) throws InterruptedException {
 		new Thread(() -> {
-				new CDTMaster("COM1", new LocalCDTDataHandler()).create();
+			new CDTMaster("COM1", new LocalCDTDataHandler()).create();
 		}).start();
        /*for (;;){
            System.out.println(DataContainer.getInstance().toString());

+ 1 - 0
protocol-core/src/main/java/wei/yigulu/connectfilterofslave/ConnectFilterManager.java

@@ -1,6 +1,7 @@
 package wei.yigulu.connectfilterofslave;
 
 import io.netty.channel.Channel;
+
 import java.util.ArrayList;
 import java.util.List;
 

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

@@ -77,7 +77,7 @@ public abstract class AbstractTcpSlaverBuilder extends BaseProtocolBuilder {
 	public void create() throws Exception {
 		// 服务器异步创建绑定
 		ChannelFuture cf = getOrCrateServerBootstrap().bind().sync();
-		this.fatherChannel=cf.channel();
+		this.fatherChannel = cf.channel();
 		log.info("Slaver端启动成功;端口" + port);
 		// 关闭服务器通道
 		cf.channel().closeFuture().sync();

+ 9 - 12
protocol-core/src/main/java/wei/yigulu/utils/PCON.java

@@ -11,42 +11,39 @@ public class PCON {
 	/**
 	 * byte中bits
 	 */
-	public static final  int BYTEBITS=8;
+	public static final int BYTEBITS = 8;
 
 
 	/**
 	 * 1
 	 */
 
-	public static final int ONE=1;
+	public static final int ONE = 1;
 
 	/**
 	 * 2
 	 */
-	public static final int TWO=2;
+	public static final int TWO = 2;
 
 	/**
 	 * 3
 	 */
-	public static final int THREE=3;
+	public static final int THREE = 3;
 
 
 	/**
 	 * 4
 	 */
-	public static final int FOUR=4;
+	public static final int FOUR = 4;
 
 
+	public static final int FUNCTION_READ_COILS = 1;
 
-	public static final int FUNCTION_READ_COILS=1;
-
-	public static final int FUNCTION_READ_DISCRETE_INPUTS=2;
-
-	public static final int FUNCTION_READ_HOLDING_REGISTERS=3;
-
-	public static final int FUNCTION_READ_INPUT_REGISTERS=4;
+	public static final int FUNCTION_READ_DISCRETE_INPUTS = 2;
 
+	public static final int FUNCTION_READ_HOLDING_REGISTERS = 3;
 
+	public static final int FUNCTION_READ_INPUT_REGISTERS = 4;
 
 
 }

BIN
protocol-iec104/附件3:规约解析细则.xlsx


+ 1 - 0
protocol-modbus/pom.xml

@@ -9,6 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <version>${modbus.version}</version>
+    <description> 1.2.1 支持线圈的读取和发送</description>
 
     <artifactId>protocol-modbus</artifactId>
     <dependencies>

+ 34 - 20
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/FunctionCode.java

@@ -2,8 +2,6 @@ package wei.yigulu.modbus.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
 
 /**
  * 功能码 copy from modbus4j
@@ -67,24 +65,40 @@ public enum FunctionCode {
 	private Integer code;
 
 
-	public static FunctionCode valueOf(int code){
-		switch (code){
-			case 1:return READ_COILS;
-			case 2:return READ_DISCRETE_INPUTS;
-			case 3:return READ_HOLDING_REGISTERS;
-			case 4:return READ_INPUT_REGISTERS;
-			case 0x81:return READ_COILS_ERROR;
-			case 0x82:return READ_DISCRETE_INPUTS_ERROR;
-			case 0x83:return READ_HOLDING_REGISTERS_ERROR;
-			case 0x84:return READ_INPUT_REGISTERS_ERROR;
-			case 5:return WRITE_COIL;
-			case 6:return WRITE_REGISTER;
-			case 7:return READ_EXCEPTION_STATUS;
-			case 15:return WRITE_COILS;
-			case 16:return WRITE_REGISTERS;
-			case 17:return REPORT_SLAVE_ID;
-			case 22:return WRITE_MASK_REGISTER;
-			default:throw  new IllegalArgumentException();
+	public static FunctionCode valueOf(int code) {
+		switch (code) {
+			case 1:
+				return READ_COILS;
+			case 2:
+				return READ_DISCRETE_INPUTS;
+			case 3:
+				return READ_HOLDING_REGISTERS;
+			case 4:
+				return READ_INPUT_REGISTERS;
+			case 0x81:
+				return READ_COILS_ERROR;
+			case 0x82:
+				return READ_DISCRETE_INPUTS_ERROR;
+			case 0x83:
+				return READ_HOLDING_REGISTERS_ERROR;
+			case 0x84:
+				return READ_INPUT_REGISTERS_ERROR;
+			case 5:
+				return WRITE_COIL;
+			case 6:
+				return WRITE_REGISTER;
+			case 7:
+				return READ_EXCEPTION_STATUS;
+			case 15:
+				return WRITE_COILS;
+			case 16:
+				return WRITE_REGISTERS;
+			case 17:
+				return REPORT_SLAVE_ID;
+			case 22:
+				return WRITE_MASK_REGISTER;
+			default:
+				throw new IllegalArgumentException();
 		}
 
 	}

+ 17 - 20
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/ModbusSlaveDataContainer.java

@@ -7,14 +7,11 @@ import lombok.Setter;
 import lombok.experimental.Accessors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import wei.yigulu.modbus.domain.datatype.BooleanModbusDataInCoil;
-import wei.yigulu.modbus.domain.datatype.CoilValue;
 import wei.yigulu.modbus.domain.datatype.Register;
 import wei.yigulu.modbus.domain.datatype.RegisterValue;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.request.AbstractModbusRequest;
 import wei.yigulu.modbus.exceptiom.ModbusException;
-import wei.yigulu.utils.PCON;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -80,8 +77,8 @@ public class ModbusSlaveDataContainer {
 		getOrCreate(slaveId).setRegister(value);
 	}
 
-	public void setCoil(int slaveId,int position,boolean value) {
-		getOrCreate(slaveId).setCoil(position,value);
+	public void setCoil(int slaveId, int position, boolean value) {
+		getOrCreate(slaveId).setCoil(position, value);
 	}
 
 	private DataDrawer getOrCreate(int slave) {
@@ -133,13 +130,13 @@ public class ModbusSlaveDataContainer {
 		 * @param value    值
 		 */
 		public void setCoil(int position, boolean value) {
-			int coilsSize=this.coils.size();
-			if(coilsSize<=position){
-				for(int i=0;i<coilsSize-position+1;i++){
+			int coilsSize = this.coils.size();
+			if (coilsSize <= position) {
+				for (int i = 0; i < coilsSize - position + 1; i++) {
 					coils.add(false);
 				}
 			}
-			this.coils.set(position,value);
+			this.coils.set(position, value);
 		}
 
 
@@ -159,21 +156,21 @@ public class ModbusSlaveDataContainer {
 		}
 
 		public byte[] getCoilDataBytes(int position, int bitNum) {
-			int coilsSize=coils.size();
-			List<Byte> bytes=new ArrayList<>();
-			byte b=0;
-			int  siftNum=0;
-			for(int i=position;i<bitNum+position;i++){
-				if(coilsSize>i && coils.get(i)){
-					b |= (0x01 <<siftNum);
+			int coilsSize = coils.size();
+			List<Byte> bytes = new ArrayList<>();
+			byte b = 0;
+			int siftNum = 0;
+			for (int i = position; i < bitNum + position; i++) {
+				if (coilsSize > i && coils.get(i)) {
+					b |= (0x01 << siftNum);
 				}
-				if(++siftNum==8){
-					siftNum=0;
+				if (++siftNum == 8) {
+					siftNum = 0;
 					bytes.add(b);
-					b=0;
+					b = 0;
 				}
 			}
-			if(siftNum!=0){
+			if (siftNum != 0) {
 				bytes.add(b);
 			}
 			return Bytes.toArray(bytes);

+ 5 - 5
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestCoil.java

@@ -14,17 +14,17 @@ import java.util.List;
  * @author: xiuwei
  * @version:
  */
-public class Obj4RequestCoil extends  Obj4RequestData {
+public class Obj4RequestCoil extends Obj4RequestData {
 
 	@Getter
 	List<Integer> locator;
 
 	public Obj4RequestCoil(int slaveId, FunctionCode functionCode, List<Integer> locator) throws ModbusException {
 		super(slaveId, functionCode);
-		if(FunctionCode.READ_COILS!=functionCode && FunctionCode.READ_DISCRETE_INPUTS !=functionCode){
-			throw new ModbusException("该实体仅能接受1,2功能码,请求寄存器数据");
+		if (FunctionCode.READ_COILS != functionCode && FunctionCode.READ_DISCRETE_INPUTS != functionCode) {
+			throw new ModbusException("该实体仅能接受1,2功能码,请求线圈数据");
 		}
-		this.locator=locator;
+		this.locator = locator;
 	}
 
 	@Override
@@ -37,7 +37,7 @@ public class Obj4RequestCoil extends  Obj4RequestData {
 
 	@Override
 	public RtuModbusRequest getRtuModbusRequest() throws ModbusException {
-		if(this.rtuModbusRequest ==null){
+		if (this.rtuModbusRequest == null) {
 			this.rtuModbusRequest = ModbusRequestDataUtils.verifyAndCreateRequest(new RtuModbusRequest(), slaveId, functionCode, locator);
 		}
 		return this.rtuModbusRequest;

+ 1 - 8
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestData.java

@@ -1,18 +1,12 @@
 package wei.yigulu.modbus.domain;
 
-import lombok.Getter;
-import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
 import wei.yigulu.modbus.domain.request.RtuModbusRequest;
 import wei.yigulu.modbus.domain.request.TcpModbusRequest;
 import wei.yigulu.modbus.exceptiom.ModbusException;
-import wei.yigulu.modbus.utils.ModbusRequestDataUtils;
-import wei.yigulu.utils.PCON;
-
-import java.util.List;
-import java.util.Map;
 
 /**
  * 方便请求和解析数据所构建的对象
+ *
  * @author Administrator
  */
 public abstract class Obj4RequestData {
@@ -27,7 +21,6 @@ public abstract class Obj4RequestData {
 	RtuModbusRequest rtuModbusRequest = null;
 
 
-
 	public Obj4RequestData(int slaveId, FunctionCode functionCode) {
 		this.slaveId = slaveId;
 		this.functionCode = functionCode;

+ 5 - 5
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/Obj4RequestRegister.java

@@ -15,17 +15,17 @@ import java.util.Map;
  * @author: xiuwei
  * @version:
  */
-public class Obj4RequestRegister extends  Obj4RequestData {
+public class Obj4RequestRegister extends Obj4RequestData {
 
 	@Getter
 	Map<Integer, ModbusDataTypeEnum> locator;
 
-	public Obj4RequestRegister(int slaveId, FunctionCode functionCode,Map<Integer, ModbusDataTypeEnum> locator) throws ModbusException {
+	public Obj4RequestRegister(int slaveId, FunctionCode functionCode, Map<Integer, ModbusDataTypeEnum> locator) throws ModbusException {
 		super(slaveId, functionCode);
-		if(functionCode!=FunctionCode.READ_HOLDING_REGISTERS && functionCode !=FunctionCode.READ_INPUT_REGISTERS){
+		if (functionCode != FunctionCode.READ_HOLDING_REGISTERS && functionCode != FunctionCode.READ_INPUT_REGISTERS) {
 			throw new ModbusException("该实体仅能接受3,4功能码,请求寄存器数据");
 		}
-		this.locator=locator;
+		this.locator = locator;
 	}
 
 	@Override
@@ -38,7 +38,7 @@ public class Obj4RequestRegister extends  Obj4RequestData {
 
 	@Override
 	public RtuModbusRequest getRtuModbusRequest() throws ModbusException {
-		if(this.rtuModbusRequest ==null){
+		if (this.rtuModbusRequest == null) {
 			this.rtuModbusRequest = ModbusRequestDataUtils.verifyAndCreateRequest(new RtuModbusRequest(), slaveId, functionCode, locator);
 		}
 		return this.rtuModbusRequest;

+ 7 - 8
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInCoil.java

@@ -1,7 +1,6 @@
 package wei.yigulu.modbus.domain.datatype;
 
 import java.nio.ByteBuffer;
-import java.util.List;
 
 /**
  * 8个布尔值组成的数据类型
@@ -37,18 +36,18 @@ public class BooleanModbusDataInCoil extends CoilValue {
 	}
 
 
-	public void setValue(int index,boolean value){
-		if(index<values.length){
-			this.values[index]=value;
-		}else{
+	public void setValue(int index, boolean value) {
+		if (index < values.length) {
+			this.values[index] = value;
+		} else {
 			throw new IllegalArgumentException();
 		}
 	}
 
-	public boolean getValue(int index){
-		if(index<values.length){
+	public boolean getValue(int index) {
+		if (index < values.length) {
 			return this.values[index];
-		}else{
+		} else {
 			throw new IllegalArgumentException();
 		}
 	}

+ 25 - 4
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInRegister.java

@@ -51,12 +51,13 @@ public class BooleanModbusDataInRegister extends RegisterValue {
 	/**
 	 * 入参0  即获取高位的byte
 	 * 入参1 即获取低位的byte
+	 *
 	 * @param whichByte
 	 * @return
 	 */
-	private byte getByteFormValue(int whichByte){
-		byte b=0;
-		for (int i = whichByte*ONEBYTEBOOL; i < (whichByte+1)*ONEBYTEBOOL; i++) {
+	private byte getByteFormValue(int whichByte) {
+		byte b = 0;
+		for (int i = whichByte * ONEBYTEBOOL; i < (whichByte + 1) * ONEBYTEBOOL; i++) {
 			if (this.values[i]) {
 				b |= (0x01 << i);
 			}
@@ -64,10 +65,30 @@ public class BooleanModbusDataInRegister extends RegisterValue {
 		return b;
 	}
 
+	public boolean getValue(int index) {
+		if (index < values.length) {
+			return this.values[index];
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	public void setValue(int index,boolean value) {
+		if (index < values.length) {
+			this.values[index]=value;
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	public boolean[] getValues() {
+		return this.values;
+	}
+
 	@Override
 	public List<Register> getRegisters() {
 		List<Register> registers = new ArrayList<>();
-		registers.add(new Register(getByteFormValue(0),getByteFormValue(1)));
+		registers.add(new Register(getByteFormValue(0), getByteFormValue(1)));
 		return registers;
 	}
 }

+ 0 - 9
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/CoilValue.java

@@ -1,9 +1,5 @@
 package wei.yigulu.modbus.domain.datatype;
 
-import wei.yigulu.utils.PCON;
-
-import java.util.List;
-
 /**
  * @program: modbus
  * @description: 线圈值
@@ -13,9 +9,4 @@ import java.util.List;
 public abstract class CoilValue implements IModbusDataType {
 
 
-
-
-
-
-
 }

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

@@ -1,7 +1,6 @@
 package wei.yigulu.modbus.domain.datatype;
 
 import java.nio.ByteBuffer;
-import java.util.List;
 
 /**
  * modbus的数据类型的抽象类
@@ -29,6 +28,4 @@ public interface IModbusDataType {
 	IModbusDataType decode(ByteBuffer byteBuf);
 
 
-
-
 }

+ 2 - 0
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/ModbusDataTypeEnum.java

@@ -75,6 +75,8 @@ public enum ModbusDataTypeEnum {
 				return new CDAB();
 			case DCBA:
 				return new DCBA();
+			case A16:
+				return new BooleanModbusDataInRegister();
 			default:
 				return new P_AB();
 		}

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

@@ -6,7 +6,6 @@ import lombok.Setter;
 import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
-import java.nio.ByteBuffer;
 import java.util.List;
 
 /**

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuSlaverHandler.java

@@ -79,7 +79,7 @@ public class ModbusRtuSlaverHandler extends SimpleChannelInboundHandler<ByteBuf>
 				byte[] bbs = ModbusResponseDataUtils.buildResponse(this.modbusSlaver.getModbusSlaveDataContainer(), request, response);
 				ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
 				modbusSlaver.getLog().debug("se =>" + DataConvertor.Byte2String(bbs));
-			}catch (ModbusException e){
+			} catch (ModbusException e) {
 				log.error(e.getMsg());
 			}
 		}

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpSlaverHandle.java

@@ -51,7 +51,7 @@ public class ModbusTcpSlaverHandle extends ChannelInboundHandlerAdapter {
 			byte[] bbs = ModbusResponseDataUtils.buildResponse(this.slaverBuilder.getModbusSlaveDataContainer(), request, response);
 			ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
 			log.debug("se =>" + DataConvertor.Byte2String(bbs));
-		}catch (ModbusException e){
+		} catch (ModbusException e) {
 			log.error(e.getMsg());
 		}
 	}

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

@@ -167,7 +167,7 @@ public class ModbusRequestDataUtils {
 		if (max - min > 255) {
 			throw new ModbusException("请求的modbus数据量过多,超出长度的表达范围");
 		}
-		requestType.setStartAddress(min).setQuantity(max - min+1).setSlaveId(slaveId).setFunctionCode(functionCode);
+		requestType.setStartAddress(min).setQuantity(max - min + 1).setSlaveId(slaveId).setFunctionCode(functionCode);
 		return requestType;
 	}
 

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

@@ -27,7 +27,7 @@ public class ModbusResponseDataUtils {
 			if (e.getCode() != null) {
 				if (e.getCode() == 3004) {
 					response.setSlaveId(request.getSlaveId());
-					response.setFunctionCode(FunctionCode.valueOf(request.getFunctionCode().getCode()+ 0x80));
+					response.setFunctionCode(FunctionCode.valueOf(request.getFunctionCode().getCode() + 0x80));
 					response.setDataBitNum(0x01);
 				}
 			}

+ 9 - 2
protocol-modbus/src/test/java/TestMaster.java

@@ -1,6 +1,8 @@
+import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.Obj4RequestRegister;
+import wei.yigulu.modbus.domain.datatype.BooleanModbusDataInRegister;
 import wei.yigulu.modbus.domain.datatype.IModbusDataType;
 import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
 import wei.yigulu.modbus.domain.datatype.NumericModbusData;
@@ -21,20 +23,25 @@ public class TestMaster {
 	public static void main(String[] args) throws InterruptedException, ModbusException {
 
 
-		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5025);
+		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 502);
 		master.createByUnBlock();
 		Thread.sleep(3000L);
 		Map<Integer, ModbusDataTypeEnum> map = new HashMap<>();
 		for (int i = 0; i <= 7; i++) {
 			map.put(i * 2, ModbusDataTypeEnum.P_CDAB);
 		}
+		map.put(18,ModbusDataTypeEnum.A16);
 		List<Obj4RequestRegister> ll = ModbusRequestDataUtils.splitModbusRequest(map, 1, FunctionCode.READ_HOLDING_REGISTERS);
 
 		for (; ; ) {
 			try {
 				Map<Integer, IModbusDataType> map1 = ModbusRequestDataUtils.getRegisterData(master, ll);
 				for (Integer i : map1.keySet()) {
-					System.out.println(i + " ============ " + ((NumericModbusData) map1.get(i)).getValue());
+					if(map1.get(i) instanceof  NumericModbusData) {
+						System.out.println(i + " ============ " + ((NumericModbusData) map1.get(i)).getValue());
+					}else {
+						System.out.println(i + " ============ " + JSON.toJSONString(((BooleanModbusDataInRegister) map1.get(i)).getValues()));
+				}
 				}
 			} catch (Exception e) {
 				e.printStackTrace();

+ 8 - 8
protocol-modbus/src/test/java/TestMasterCoil.java

@@ -1,15 +1,14 @@
 import lombok.extern.slf4j.Slf4j;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.Obj4RequestCoil;
-import wei.yigulu.modbus.domain.Obj4RequestRegister;
-import wei.yigulu.modbus.domain.datatype.IModbusDataType;
-import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
-import wei.yigulu.modbus.domain.datatype.NumericModbusData;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
 import wei.yigulu.modbus.utils.ModbusRequestDataUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author: xiuwei
@@ -23,10 +22,11 @@ public class TestMasterCoil {
 		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 502);
 		master.createByUnBlock();
 		Thread.sleep(3000L);
-		List<Integer> list=new ArrayList<>();
-		for (int i = 0; i <=19; i++) {
-			list.add(i*2 );
+		List<Integer> list = new ArrayList<>();
+		for (int i = 0; i <= 7; i++) {
+			list.add(i );
 		}
+		list.add(30);
 		List<Obj4RequestCoil> ll = ModbusRequestDataUtils.splitModbusRequest(list, 1, FunctionCode.READ_COILS);
 
 		for (; ; ) {