xiuwei 4 years ago
parent
commit
223d2c93c5

+ 24 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/AbstractModbusCommand.java

@@ -26,6 +26,10 @@ import java.util.List;
 public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 
 
+	public static final int R_MAX_NUM=120;
+
+	public static final int C_MAX_NUM=1968;
+
 	/**
 	 * 客户端地址 一字节
 	 */
@@ -59,6 +63,18 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	protected byte[] dataBytes;
 
 
+
+	public Integer getLength(){
+		if(functionCode==FunctionCode.WRITE_COIL){
+			return 6;
+		}else if(functionCode==FunctionCode.WRITE_REGISTER){
+			return 6;
+		}else {
+			return 7+dataBytes.length;
+		}
+	}
+
+
 	public AbstractModbusCommand setRegisters(@Nonnull Integer startAddress, @Nonnull List<RegisterValue> values) {
 		if (values.size() == 0) {
 			throw new RuntimeException("未传入具体的控制值");
@@ -68,7 +84,10 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 		for (RegisterValue rv : values) {
 			registers.addAll(rv.getRegisters());
 		}
-		if (registers.size() == 1) {
+		if(registers.size()>R_MAX_NUM){
+			throw new RuntimeException("传入寄存器的数量超过120个");
+		}
+		if (registers.size() > 1) {
 			functionCode = FunctionCode.WRITE_REGISTERS;
 			this.quantity = registers.size();
 			this.numOfByte = registers.size() * 2;
@@ -89,10 +108,13 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	}
 
 
-	public AbstractModbusCommand setCoils(Integer startAddress, List<Boolean> values) {
+	public AbstractModbusCommand setCoils(@Nonnull Integer startAddress, @Nonnull List<Boolean> values) {
 		if (values.size() == 0) {
 			throw new RuntimeException("未传入具体的控制值");
 		}
+		if(values.size()>C_MAX_NUM){
+			throw new RuntimeException("传入线圈的数量超过1968个");
+		}
 		this.startAddress = startAddress;
 		if (values.size() == 1) {
 			functionCode = FunctionCode.WRITE_COIL;

+ 3 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/TcpModbusCommand.java

@@ -1,5 +1,6 @@
 package wei.yigulu.modbus.domain.command;
 
+import lombok.Getter;
 import lombok.Setter;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.tcpextracode.TcpExtraCode;
@@ -22,6 +23,7 @@ public class TcpModbusCommand extends AbstractModbusCommand {
 	 * tcp通讯时的前端附加码
 	 */
 	@Setter
+	@Getter
 	protected TcpExtraCode tcpExtraCode = new TcpExtraCode();
 	/**
 	 * 除去四个附加码 和两个长度字节 剩余的报文的字节个数
@@ -43,7 +45,7 @@ public class TcpModbusCommand extends AbstractModbusCommand {
 	@Override
 	public TcpModbusCommand encode(List<Byte> bytes) throws ModbusException {
 		tcpExtraCode.encode(bytes);
-		new P_AB(BigDecimal.valueOf(length)).encode(bytes);
+		new P_AB(BigDecimal.valueOf(super.getLength())).encode(bytes);
 		super.encode(bytes);
 		return this;
 	}

+ 7 - 101
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/AbstractModbusConfirm.java

@@ -1,20 +1,13 @@
 package wei.yigulu.modbus.domain.confirm;
 
-import com.google.common.primitives.Bytes;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.ModbusPacketInterface;
-import wei.yigulu.modbus.domain.datatype.BooleanModbusDataInCoil;
-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.datatype.numeric.SingleCommandCoilValue;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 
-import javax.annotation.Nonnull;
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -23,13 +16,9 @@ import java.util.List;
  * @author: xiuwei
  * @create: 2021-04-26 16:14
  */
-public abstract class AbstractModbusCommand implements ModbusPacketInterface {
+public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 
 
-	public static final int R_MAX_NUM=120;
-
-	public static final int C_MAX_NUM=1968;
-
 	/**
 	 * 客户端地址 一字节
 	 */
@@ -38,7 +27,7 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	protected Integer slaveId = 01;
 
 	/**
-	 * 功能码  一字节
+	 * 功能码  一字节  5,6,15,16
 	 */
 	protected FunctionCode functionCode;
 
@@ -48,104 +37,21 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	protected Integer startAddress;
 
 	/**
-	 * 输出数据的数量  两字节  (线圈或者寄存器的数量) 两字节  15 16 有    5 6 没有
+	 * 输出数据的数量(15,16) 或数据值(5,6)  两字节
 	 */
 	protected Integer quantity;
 
-	/**
-	 * 输出数据的字节数  一字节(线圈数量*1或寄存器数量*2) 15 16 有    5 6 没有
-	 */
-	protected Integer numOfByte;
-
-	/**
-	 * 具体输出值的内容
-	 */
-	protected byte[] dataBytes;
-
-
-
-	public Integer getLength(){
-		if(functionCode==FunctionCode.WRITE_COIL){
-			return 6;
-		}else if(functionCode==FunctionCode.WRITE_REGISTER){
-			return 6;
-		}else {
-			return 7+dataBytes.length;
-		}
-	}
-
-
-	public AbstractModbusCommand setRegisters(@Nonnull Integer startAddress, @Nonnull List<RegisterValue> values) {
-		if (values.size() == 0) {
-			throw new RuntimeException("未传入具体的控制值");
-		}
-		this.startAddress = startAddress;
-		List<Register> registers = new ArrayList<>();
-		for (RegisterValue rv : values) {
-			registers.addAll(rv.getRegisters());
-		}
-		if(registers.size()>R_MAX_NUM){
-			throw new RuntimeException("传入寄存器的数量超过120个");
-		}
-		if (registers.size() > 1) {
-			functionCode = FunctionCode.WRITE_REGISTERS;
-			this.quantity = registers.size();
-			this.numOfByte = registers.size() * 2;
-			dataBytes = new byte[numOfByte];
-			for (int i = 0; i < registers.size(); i++) {
-				this.dataBytes[i * 2] = registers.get(i).getB1();
-				this.dataBytes[i * 2 + 1] = registers.get(i).getB2();
-			}
-		} else {
-			functionCode = FunctionCode.WRITE_REGISTER;
-			this.quantity = null;
-			this.numOfByte = null;
-			dataBytes = new byte[2];
-			this.dataBytes[0] = registers.get(0).getB1();
-			this.dataBytes[1] = registers.get(0).getB2();
-		}
-		return this;
-	}
-
-
-	public AbstractModbusCommand setCoils(@Nonnull Integer startAddress, @Nonnull List<Boolean> values) {
-		if (values.size() == 0) {
-			throw new RuntimeException("未传入具体的控制值");
-		}
-		if(values.size()>C_MAX_NUM){
-			throw new RuntimeException("传入线圈的数量超过1968个");
-		}
-		this.startAddress = startAddress;
-		if (values.size() == 1) {
-			functionCode = FunctionCode.WRITE_COIL;
-			this.quantity = null;
-			this.numOfByte = null;
-			dataBytes = new SingleCommandCoilValue(values.get(0)).encode();
-		} else {
-			functionCode = FunctionCode.WRITE_COILS;
-			this.quantity = values.size();
-			List<BooleanModbusDataInCoil> booleanModbusDataInCoils = BooleanModbusDataInCoil.getFormBooleanList(values);
-			this.numOfByte = booleanModbusDataInCoils.size();
-			List<Byte> byteList = new ArrayList<>();
-			booleanModbusDataInCoils.forEach(o -> o.encode(byteList));
-			this.dataBytes = Bytes.toArray(byteList);
-		}
-		return this;
+	public Integer getLength() {
+		return 8;
 	}
 
 
 	@Override
-	public AbstractModbusCommand encode(List<Byte> bytes) throws ModbusException {
+	public AbstractModbusConfirm encode(List<Byte> bytes) throws ModbusException {
 		bytes.add((byte) (slaveId & 0xff));
 		bytes.add((byte) (functionCode.getCode() & 0xff));
 		new P_AB(BigDecimal.valueOf(startAddress)).encode(bytes);
-		if (quantity != null) {
-			new P_AB(BigDecimal.valueOf(quantity)).encode(bytes);
-		}
-		if (numOfByte != null) {
-			bytes.add((byte) (numOfByte & 0xff));
-		}
-		bytes.addAll(Bytes.asList(dataBytes));
+		new P_AB(BigDecimal.valueOf(quantity)).encode(bytes);
 		return this;
 	}
 

+ 2 - 4
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/RtuModbusCommand.java

@@ -1,9 +1,7 @@
-package wei.yigulu.modbus.domain.command;
+package wei.yigulu.modbus.domain.confirm;
 
 import com.google.common.primitives.Bytes;
-import wei.yigulu.modbus.domain.ModbusPacketInterface;
 import wei.yigulu.modbus.domain.datatype.numeric.P_BA;
-import wei.yigulu.modbus.domain.request.RtuModbusRequest;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.utils.CrcUtils;
 
@@ -17,7 +15,7 @@ import java.util.List;
  * @author: xiuwei
  * @version:
  */
-public class RtuModbusCommand extends AbstractModbusCommand{
+public class RtuModbusCommand extends AbstractModbusConfirm {
 
 	/**
 	 * crc 校验  两位 除去本两位 其余所有字节的校验位

+ 2 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/TcpModbusCommand.java

@@ -1,4 +1,4 @@
-package wei.yigulu.modbus.domain.command;
+package wei.yigulu.modbus.domain.confirm;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -18,7 +18,7 @@ import java.util.List;
  * @version:
  */
 
-public class TcpModbusCommand extends AbstractModbusCommand {
+public class TcpModbusCommand extends AbstractModbusConfirm {
 	/**
 	 * tcp通讯时的前端附加码
 	 */

+ 65 - 38
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuMasterDelimiterHandler.java

@@ -23,25 +23,23 @@ import wei.yigulu.utils.DataConvertor;
 public class ModbusRtuMasterDelimiterHandler extends AbstractDelimiterHandler {
 
 
-	@Setter
-	@Accessors(chain = true)
-	/**
-	 * 是否进行CRC校验判断
-	 */
-	private boolean doCrcCheck = true;
-
 	/**
 	 * 判断是否是断包的最大时间间隔
 	 */
 	@Setter
 	@Getter
 	@Accessors(chain = true)
-	protected  int maxTimeSpace=1000;
-
+	protected int maxTimeSpace = 1000;
+	@Setter
+	@Accessors(chain = true)
+	/**
+	 * 是否进行CRC校验判断
+	 */
+	private boolean doCrcCheck = true;
 
 	@Override
 	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-		log.info("接收到原始的报文 :"+ DataConvertor.ByteBuf2String((ByteBuf) msg));
+		log.info("接收到原始的报文 :" + DataConvertor.ByteBuf2String((ByteBuf) msg));
 		if (isOverMaxLength((ByteBuf) msg)) {
 			return;
 		}
@@ -56,44 +54,73 @@ public class ModbusRtuMasterDelimiterHandler extends AbstractDelimiterHandler {
 			cumulation.markReaderIndex();
 			cumulation.readBytes(1).release();
 			functionCode = cumulation.readUnsignedByte();
-			if (functionCode > 0x80 ) {
-				//异常功能码 异常帧
-				byteNum = 0;
-			} else {
-				byteNum = cumulation.readUnsignedByte();
-			}
-			if (byteNum < 0 || byteNum > 250) {
-				cumulation.resetReaderIndex();
-				log.error("该帧字节长度不在规定范围内,整帧舍弃:" + DataConvertor.ByteBuf2String(cumulation.readBytes(cumulation.readableBytes())));
-				clearCumulation();
-				return;
-			}
-			if (this.doCrcCheck) {
-				bs = new byte[byteNum + 3];
-				cumulation.resetReaderIndex();
-				if (cumulation.readableBytes() < byteNum + 5) {
-					break;
+
+			if (functionCode <= 0x04 || functionCode > 0x80) {
+				if (functionCode > 0x80) {
+					//异常功能码 异常帧
+					byteNum = 0;
+				} else {
+					byteNum = cumulation.readUnsignedByte();
+				}
+				if (byteNum < 0 || byteNum > 250) {
+					cumulation.resetReaderIndex();
+					log.error("该帧字节长度不在规定范围内,整帧舍弃:" + DataConvertor.ByteBuf2String(cumulation.readBytes(cumulation.readableBytes())));
+					clearCumulation();
+					return;
 				}
-				cumulation.readBytes(bs);
-				crcO = cumulation.readUnsignedShortLE();
-				crcS = CrcUtils.generateCRC16(bs).intValue();
-				if (crcO == crcS) {
+				if (this.doCrcCheck) {
+					bs = new byte[byteNum + 3];
+					cumulation.resetReaderIndex();
+					if (cumulation.readableBytes() < byteNum + 5) {
+						break;
+					}
+					cumulation.readBytes(bs);
+					crcO = cumulation.readUnsignedShortLE();
+					crcS = CrcUtils.generateCRC16(bs).intValue();
+					if (crcO == crcS) {
+						cumulation.resetReaderIndex();
+						ctx.fireChannelRead(cumulation.readBytes(byteNum + 5));
+					} else {
+						cumulation.resetReaderIndex();
+						log.warn("数据帧crc校验错误,舍弃:" + DataConvertor.ByteBuf2String(cumulation) + "原CRC:" + DataConvertor.Byte2String(P_BA.decode(crcO)) + "理论CRC:" + DataConvertor.Byte2String(P_BA.decode(crcS)));
+						clearCumulation();
+						return;
+					}
+				} else {
 					cumulation.resetReaderIndex();
 					ctx.fireChannelRead(cumulation.readBytes(byteNum + 5));
+				}
+			} else if (functionCode == 05 || functionCode == 06 || functionCode == 15 || functionCode == 16) {
+				if (cumulation.readableBytes() < 6) {
+					break;
+				}
+				if (this.doCrcCheck) {
+					bs = new byte[6];
+					cumulation.resetReaderIndex();
+					cumulation.readBytes(bs);
+					crcO = cumulation.readUnsignedShortLE();
+					crcS = CrcUtils.generateCRC16(bs).intValue();
+					if (crcO == crcS) {
+						cumulation.resetReaderIndex();
+						ctx.fireChannelRead(cumulation.readBytes(8));
+					} else {
+						cumulation.resetReaderIndex();
+						log.warn("数据帧crc校验错误,舍弃:" + DataConvertor.ByteBuf2String(cumulation) + "原CRC:" + DataConvertor.Byte2String(P_BA.decode(crcO)) + "理论CRC:" + DataConvertor.Byte2String(P_BA.decode(crcS)));
+						clearCumulation();
+						return;
+					}
 				} else {
 					cumulation.resetReaderIndex();
-					log.warn("数据帧crc校验错误,舍弃:" + DataConvertor.ByteBuf2String(cumulation) + "原CRC:" + DataConvertor.Byte2String(P_BA.decode(crcO)) + "理论CRC:" + DataConvertor.Byte2String(P_BA.decode(crcS)));
-					clearCumulation();
-					return;
+					ctx.fireChannelRead(cumulation.readBytes(8));
 				}
-			} else {
-				cumulation.resetReaderIndex();
-				ctx.fireChannelRead(cumulation.readBytes(byteNum + 5));
+			}else{
+				log.error("不支持该种类型报文解析");
+				clearCumulation();
 			}
 		}
 		if (cumulation.readableBytes() == 0) {
 			clearCumulation();
-		}else{
+		} else {
 			timeMark = DateTime.now();
 		}
 

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

@@ -1,5 +1,23 @@
 package wei.yigulu.modbus.utils;
 
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.Unpooled;
+import wei.yigulu.modbus.domain.command.RtuModbusCommand;
+import wei.yigulu.modbus.domain.command.TcpModbusCommand;
+import wei.yigulu.modbus.domain.datatype.RegisterValue;
+import wei.yigulu.modbus.domain.request.TcpModbusRequest;
+import wei.yigulu.modbus.domain.tcpextracode.TransactionIdentifier;
+import wei.yigulu.modbus.exceptiom.ModbusException;
+import wei.yigulu.modbus.netty.ModbusMasterBuilderInterface;
+import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
+import wei.yigulu.netty.AbstractMasterBuilder;
+import wei.yigulu.netty.AbstractTcpMasterBuilder;
+import wei.yigulu.utils.DataConvertor;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * modbs下达数据命令的工具类
  *
@@ -7,4 +25,35 @@ package wei.yigulu.modbus.utils;
  * @version:
  */
 public class ModbusCommandDataUtils {
+
+
+	/**
+	 * 下达寄存器控制命令
+	 *
+	 * @param masterBuilder 主站对象
+	 * @param address       起始地址
+	 * @param values        命令值
+	 */
+	public static void commandRegister(AbstractMasterBuilder masterBuilder,Integer slaveId,Integer address, List<RegisterValue> values) throws ModbusException {
+		if (!(masterBuilder instanceof ModbusMasterBuilderInterface)) {
+			throw new RuntimeException("请传人实现了<ModbusMasterBuilderInterface>的Master");
+		}
+		List<Byte> bs=new ArrayList<>();
+		ByteBuffer buffer;
+		if(masterBuilder instanceof ModbusRtuMasterBuilder){
+			RtuModbusCommand rtuModbusCommand =new RtuModbusCommand();
+			rtuModbusCommand.setSlaveId(slaveId).setRegisters(address,values);
+			rtuModbusCommand.encode(bs);
+			masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+		}else{
+			TcpModbusCommand tcpModbusCommand =new TcpModbusCommand();
+			tcpModbusCommand.setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
+			tcpModbusCommand.setSlaveId(slaveId).setRegisters(address,values);
+			tcpModbusCommand.encode(bs);
+			masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(tcpModbusCommand.getTcpExtraCode().getTransactionIdentifier().getSeq());
+		}
+		System.out.println(DataConvertor.ByteBuf2String(Unpooled.copiedBuffer(buffer)));
+	}
 }

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

@@ -183,7 +183,7 @@ public class ModbusRequestDataUtils {
 	 */
 	public static <T extends AbstractModbusResponse> T requestData(AbstractMasterBuilder masterBuilder, AbstractModbusRequest modbusRequest, T response) throws ModbusException {
 		if (!(masterBuilder instanceof ModbusMasterBuilderInterface)) {
-			throw new ModbusException("请传人实现了<ModbusMasterBuilderInterface>的Master");
+			throw new RuntimeException("请传人实现了<ModbusMasterBuilderInterface>的Master");
 		}
 		if (masterBuilder.getFuture() != null && masterBuilder.getFuture().channel().isActive()) {
 			List<Byte> byteList = new ArrayList<>();

+ 7 - 11
protocol-modbus/src/test/java/TestRtuCommandMaster.java

@@ -1,35 +1,31 @@
 import lombok.extern.slf4j.Slf4j;
-import wei.yigulu.modbus.domain.FunctionCode;
-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.domain.datatype.RegisterValue;
 import wei.yigulu.modbus.domain.datatype.numeric.ABCD;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.synchronouswaitingroom.TcpSynchronousWaitingRoom;
 import wei.yigulu.modbus.exceptiom.ModbusException;
+import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
 import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
 import wei.yigulu.modbus.utils.ModbusCommandDataUtils;
-import wei.yigulu.modbus.utils.ModbusRequestDataUtils;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author: xiuwei
  * @version:
  */
 @Slf4j
-public class TestTcpCommandMaster {
+public class TestRtuCommandMaster {
 	public static void main(String[] args) throws InterruptedException, ModbusException {
-		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5002);
+		ModbusRtuMasterBuilder master = new ModbusRtuMasterBuilder("COM1");
 		master.createByUnBlock();
 		TcpSynchronousWaitingRoom.waitTime=5000L;
 		Thread.sleep(3000L);
 		List<RegisterValue> list = new ArrayList<>();
-		for (int i = 0; i <= 0; i++) {
-			list.add(new P_AB().setValue(BigDecimal.valueOf(5)));
+		for (int i = 0; i <= 00; i++) {
+			list.add(new P_AB().setValue(BigDecimal.valueOf(2*i)));
 		}
 		ModbusCommandDataUtils.commandRegister(master,1,0,list);
 		Thread.sleep(30L);

+ 12 - 27
protocol-modbus/src/test/java/TestTcpCommandMaster.java

@@ -1,17 +1,19 @@
-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;
-import wei.yigulu.modbus.domain.synchronouswaitingroom.SynchronousWaitingRoom;
+import wei.yigulu.modbus.domain.datatype.RegisterValue;
+import wei.yigulu.modbus.domain.datatype.numeric.ABCD;
+import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.synchronouswaitingroom.TcpSynchronousWaitingRoom;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
+import wei.yigulu.modbus.utils.ModbusCommandDataUtils;
 import wei.yigulu.modbus.utils.ModbusRequestDataUtils;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -19,36 +21,19 @@ import java.util.*;
  * @version:
  */
 @Slf4j
-public class TestMaster {
+public class TestTcpCommandMaster {
 	public static void main(String[] args) throws InterruptedException, ModbusException {
-		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5001);
+		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5002);
 		master.createByUnBlock();
 		TcpSynchronousWaitingRoom.waitTime=5000L;
 		Thread.sleep(3000L);
-		Map<Integer, ModbusDataTypeEnum> map = new HashMap<>();
-		for (int i = 0; i <= 90; i++) {
-			map.put(i , ModbusDataTypeEnum.P_AB);
+		List<RegisterValue> list = new ArrayList<>();
+		for (int i = 0; i <= 0; i++) {
+			list.add(new ABCD().setValue(BigDecimal.valueOf(2*i)));
 		}
-		List<Obj4RequestRegister> ll = ModbusRequestDataUtils.splitModbusRequest(map, 1, FunctionCode.READ_HOLDING_REGISTERS);
-
-		for (; ; ) {
-			try {
-				Map<Integer, IModbusDataType> map1 = ModbusRequestDataUtils.getRegisterData(master, ll);
-				ArrayList<Integer> lll = new ArrayList<Integer>(map1.keySet());
-				Collections.sort(lll);
-				for (Integer i : lll) {
-					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();
-			}
-			Thread.sleep(30L);
+		ModbusCommandDataUtils.commandRegister(master,1,0,list);
+		Thread.sleep(30L);
 		}
 
 
-	}
 }