Explorar el Código

初步写了一下modbus 子站接收到命令的处理过程 有空继续完善

xiuwei hace 3 años
padre
commit
535999a329

+ 25 - 0
protocol-modbus/README.md

@@ -48,6 +48,31 @@ create() 方法会阻塞线程,如果不希望阻塞线程可以使用createBy
 		}
 ```
 
+#### 发送遥控遥调命令
+
+``` java
+ModbusRtuMasterBuilder master = new ModbusRtuMasterBuilder("COM1");
+		master.createByUnBlock();
+		TcpSynchronousWaitingRoom.waitTime = 5000L;
+		Thread.sleep(3000L);
+		Random random = new Random();
+		BigDecimal val;
+		BigDecimal val1;
+		for (; ; ) {
+			val = BigDecimal.valueOf(random.nextInt(100));
+			System.out.println("数据个数:" + val);
+			List<RegisterValue> list = new ArrayList<>();
+			for (int i = 0; i <= val.intValue(); i++) {
+				val1 = BigDecimal.valueOf(random.nextInt(11));
+				System.out.println("数据值:" + val1);
+				list.add(new P_AB().setValue(val1));
+			}
+            //ModbusCommandDataUtils.commandRegister(master, 1, 0, list) 发送命令返回结果
+			System.out.println(ModbusCommandDataUtils.commandRegister(master, 1, 0, list));
+			Thread.sleep(60000L);
+		}
+```
+
 
 
 ### SLAVER的创建 

+ 26 - 0
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/AbstractModbusCommand.java

@@ -15,7 +15,10 @@ import wei.yigulu.modbus.exceptiom.ModbusException;
 
 import javax.annotation.Nonnull;
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -27,6 +30,9 @@ import java.util.List;
 public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 
 
+	public static  final HashSet<Byte> FUNCTION_CODES=new HashSet(Arrays.asList(new Byte[]{0x05, (byte) 0x85, 0x06, (byte) 0x86, 0x0F, (byte) 0x8F, 0x10, (byte) 0x90, 0x17, (byte) 0x97}));
+
+
 	public static final int R_MAX_NUM = 120;
 
 	public static final int C_MAX_NUM = 1968;
@@ -35,6 +41,7 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	 * 客户端地址 一字节
 	 */
 	@Setter
+	@Getter
 	@Accessors(chain = true)
 	protected Integer slaveId = 01;
 
@@ -47,6 +54,7 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	/**
 	 * 下达数据的起始地址位  两字节
 	 */
+	@Getter
 	protected Integer startAddress;
 
 	/**
@@ -153,5 +161,23 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 		return this;
 	}
 
+	@Override
+	public AbstractModbusCommand decode(ByteBuffer byteBuf) throws ModbusException {
+		this.slaveId=(int)byteBuf.get();
+		this.functionCode=FunctionCode.valueOf(byteBuf.get());
+		this.startAddress=(int)byteBuf.getShort();
+		if(this.functionCode==FunctionCode.WRITE_COILS ||this.functionCode==FunctionCode.WRITE_REGISTERS){
+			this.quantity=(int)byteBuf.getShort();
+			this.numOfByte=(int)byteBuf.get();
+			this.dataBytes=new byte[this.numOfByte];
+			byteBuf.get(dataBytes);
+		}else{
+			this.dataBytes=new byte[2];
+			byteBuf.get(dataBytes);
+		}
+		return this;
+	}
+
+
 
 }

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

@@ -43,7 +43,7 @@ public class RtuModbusCommand extends AbstractModbusCommand {
 	 */
 	@Override
 	public RtuModbusCommand decode(ByteBuffer byteBuf) throws ModbusException {
-		//super.decode(byteBuf);
+		super.decode(byteBuf);
 		return this;
 	}
 }

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

@@ -53,12 +53,9 @@ public class TcpModbusCommand extends AbstractModbusCommand {
 
 	@Override
 	public TcpModbusCommand decode(ByteBuffer byteBuf) throws ModbusException {
-		if (byteBuf.remaining() != 12) {
-			throw new ModbusException("该帧非数据请求帧");
-		}
 		this.tcpExtraCode.decode(byteBuf);
 		this.setLength(new P_AB().decode(byteBuf).getValue().intValue());
-		//super.decode(byteBuf);
+		super.decode(byteBuf);
 		return this;
 	}
 

+ 10 - 9
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/AbstractModbusConfirm.java

@@ -18,39 +18,36 @@ import java.util.List;
  * @author: xiuwei
  * @create: 2021-04-26 16:14
  */
+@Getter
+@Setter
+@Accessors(chain = true)
 public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 
 
 	/**
 	 * 客户端地址 一字节
 	 */
-	@Setter
-	@Accessors(chain = true)
 	protected Integer slaveId = 01;
 
 	/**
 	 * 功能码  一字节  5,6,15,16
 	 */
-	@Getter
 	protected FunctionCode functionCode;
 
 	/**
 	 * 下达数据的起始地址位  两字节
 	 */
-	@Getter
 	protected Integer startAddress;
 
 	/**
 	 * 输出数据的数量(15,16)  两字节
 	 */
-	@Getter
 	protected Integer quantity;
 
 	/**
 	 * 输出数据 (5,6)  两字节
 	 */
-	@Getter
-	protected byte[] b2;
+	protected byte[] b2= new byte[2];
 
 
 	public Integer getLength() {
@@ -63,7 +60,12 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 		bytes.add((byte) (slaveId & 0xff));
 		bytes.add((byte) (functionCode.getCode() & 0xff));
 		new P_AB(BigDecimal.valueOf(startAddress)).encode(bytes);
-		new P_AB(BigDecimal.valueOf(quantity)).encode(bytes);
+		if (functionCode == FunctionCode.WRITE_COIL || functionCode == FunctionCode.WRITE_REGISTER) {
+			bytes.add(b2[0]);
+			bytes.add(b2[1]);
+		}else {
+			new P_AB(BigDecimal.valueOf(quantity)).encode(bytes);
+		}
 		return this;
 	}
 
@@ -92,7 +94,6 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 						throw new ModbusException("写入过程异常");
 				}
 			} else {
-
 				switch (i) {
 					case 1:
 						throw new ModbusException("功能码异常");

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

@@ -0,0 +1,47 @@
+package wei.yigulu.modbus.domain.datatype;
+
+
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * AB +AB 数据类型
+ *
+ * @author: xiuwei
+ * @version:
+ */
+@NoArgsConstructor
+public class UnknownTypeRegisterValue extends RegisterValue {
+
+	Register  register=new Register();
+
+	@Override
+	public List<Register> getRegisters() {
+		List<Register> l=new ArrayList<>();
+		l.add(this.register);
+		return l;
+	}
+
+	@Override
+	public UnknownTypeRegisterValue decode(byte[] bytes, int offset) {
+		this.register=new Register(bytes[offset],bytes[offset+1]);
+		return this;
+	}
+
+	@Override
+	public UnknownTypeRegisterValue decode(ByteBuffer byteBuf) {
+		this.register=new Register(byteBuf.get(),byteBuf.get());
+		return this;
+	}
+
+	@Override
+	public UnknownTypeRegisterValue encode(List<Byte> bytes) {
+		bytes.add(this.register.getB1());
+		bytes.add(this.register.getB2());
+		return this;
+	}
+}

+ 5 - 0
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/AbstractModbusRequest.java

@@ -10,6 +10,8 @@ import wei.yigulu.modbus.exceptiom.ModbusException;
 
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -23,6 +25,9 @@ import java.util.List;
 public class AbstractModbusRequest implements ModbusPacketInterface {
 
 
+	public static final HashSet<Byte> FUNCTION_CODES = new HashSet(Arrays.asList((new Byte[]{0x01, (byte) 0x81, 0x02, (byte) 0x82, 0x03, (byte) 0x83, 0x04, (byte) 0x84})));
+
+
 	/**
 	 * 客户端地址 一字节
 	 */

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

@@ -4,6 +4,7 @@ package wei.yigulu.modbus.netty;
 import lombok.Getter;
 import lombok.experimental.Accessors;
 import wei.yigulu.modbus.domain.ModbusSlaveDataContainer;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
 import wei.yigulu.netty.AbstractRtuModeBuilder;
 import wei.yigulu.netty.ProtocolChannelInitializer;
 import wei.yigulu.purejavacomm.PureJavaCommChannel;
@@ -19,7 +20,7 @@ import wei.yigulu.purejavacomm.PureJavaCommChannel;
 
 
 @Accessors(chain = true)
-public class ModbusRtuSlaverBuilder extends AbstractRtuModeBuilder {
+public class ModbusRtuSlaverBuilder extends AbstractRtuModeBuilder implements ModbusSlaverInterface {
 
 	@Getter
 	private ModbusSlaveDataContainer modbusSlaveDataContainer = new ModbusSlaveDataContainer().setLog(getLog());
@@ -43,4 +44,9 @@ public class ModbusRtuSlaverBuilder extends AbstractRtuModeBuilder {
 		}
 		return this.channelInitializer;
 	}
+
+	@Override
+	public boolean receiveCommand(AbstractModbusCommand command) {
+		return true;
+	}
 }

+ 21 - 3
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuSlaverDelimiterHandler.java

@@ -35,9 +35,27 @@ public class ModbusRtuSlaverDelimiterHandler extends AbstractDelimiterHandler {
 	@Override
 	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
 
-		//log.warn("接收到原始的报文 :"+ DataConvertor.ByteBuf2String((ByteBuf) msg));
+		log.warn("接收到原始的报文 :"+ DataConvertor.ByteBuf2String((ByteBuf) msg));
 		isOverMaxLength((ByteBuf) msg);
-		byte[] bs = new byte[6];
+		if (cumulation.readableBytes() < 8) {
+			timeMark = DateTime.now();
+			return;
+		}
+		byte function = cumulation.getByte(1);
+		byte[] bs;
+		if (function == 5 || function == 6) {
+			bs = new byte[6];
+		} else if (function == 15 || function == 16) {
+			int i = cumulation.getByte(6);
+			if (i >= 0 && i < 250) {
+				bs = new byte[7 + i];
+			} else {
+				clearCumulation();
+				return;
+			}
+		} else {
+			bs = new byte[6];
+		}
 		//原crc值
 		int crcO;
 		//理论crc值
@@ -49,7 +67,7 @@ public class ModbusRtuSlaverDelimiterHandler extends AbstractDelimiterHandler {
 			crcS = CrcUtils.generateCRC16(bs).intValue();
 			if (crcO == crcS) {
 				cumulation.resetReaderIndex();
-				ctx.fireChannelRead(cumulation.readBytes(8));
+				ctx.fireChannelRead(cumulation.readBytes(bs.length+2));
 			} else {
 				log.warn("数据帧crc校验错误,舍弃:" + DataConvertor.Byte2String(bs) + "原CRC:" + DataConvertor.Byte2String(P_BA.decode(crcO)) + "理论CRC:" + DataConvertor.Byte2String(P_BA.decode(crcS)));
 			}

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

@@ -8,6 +8,10 @@ import io.netty.channel.EventLoop;
 import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
+import wei.yigulu.modbus.domain.command.RtuModbusCommand;
+import wei.yigulu.modbus.domain.confirm.RtuModbusConfirm;
+import wei.yigulu.modbus.domain.request.AbstractModbusRequest;
 import wei.yigulu.modbus.domain.request.RtuModbusRequest;
 import wei.yigulu.modbus.domain.response.RtuModbusResponse;
 import wei.yigulu.modbus.exceptiom.ModbusException;
@@ -73,14 +77,27 @@ public class ModbusRtuSlaverHandler extends SimpleChannelInboundHandler<ByteBuf>
 	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
 		modbusSlaver.getLog().debug("接收到串口{}发来数据帧: <= " + DataConvertor.ByteBuf2String(msg), this.modbusSlaver.getCommPortId());
 		if (msg.readableBytes() > MINLEN) {
-			RtuModbusRequest request = new RtuModbusRequest().decode(msg.nioBuffer());
-			RtuModbusResponse response = new RtuModbusResponse();
-			try {
-				byte[] bbs = ModbusResponseDataUtils.buildResponse(this.modbusSlaver.getModbusSlaveDataContainer(), request, response);
+			byte[] bbs = new byte[0];
+			if (AbstractModbusRequest.FUNCTION_CODES.contains(msg.getByte(1))) {
+				RtuModbusRequest request = new RtuModbusRequest().decode(msg.nioBuffer());
+				RtuModbusResponse response = new RtuModbusResponse();
+				try {
+					bbs = ModbusResponseDataUtils.buildResponse(this.modbusSlaver.getModbusSlaveDataContainer(), request, response);
+				} catch (ModbusException e) {
+					log.error(e.getMsg());
+				}
+			} else if (AbstractModbusCommand.FUNCTION_CODES.contains(msg.getByte(1))) {
+				RtuModbusCommand command = new RtuModbusCommand().decode(msg.nioBuffer());
+				RtuModbusConfirm confirm = new RtuModbusConfirm();
+				try {
+					bbs = modbusSlaver.receiveCommandAndAnswer(command, confirm);
+				} catch (ModbusException e) {
+					log.error(e.getMsg());
+				}
+			}
+			if (bbs.length > 0) {
 				ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
 				modbusSlaver.getLog().debug("se =>" + DataConvertor.Byte2String(bbs));
-			} catch (ModbusException e) {
-				log.error(e.getMsg());
 			}
 		}
 	}

+ 75 - 0
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusSlaverInterface.java

@@ -0,0 +1,75 @@
+package wei.yigulu.modbus.netty;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.primitives.Bytes;
+import wei.yigulu.modbus.domain.FunctionCode;
+import wei.yigulu.modbus.domain.ModbusSlaveDataContainer;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
+import wei.yigulu.modbus.domain.confirm.AbstractModbusConfirm;
+import wei.yigulu.modbus.domain.datatype.RegisterValue;
+import wei.yigulu.modbus.domain.datatype.UnknownTypeRegisterValue;
+import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
+import wei.yigulu.modbus.exceptiom.ModbusException;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * modbus 子站端的接口
+ *
+ * @author: xiuwei
+ * @version:
+ */
+public interface ModbusSlaverInterface {
+
+	/**
+	 * 获取modbus子站的数据容器
+	 *
+	 * @return {@link ModbusSlaveDataContainer}
+	 */
+	public ModbusSlaveDataContainer getModbusSlaveDataContainer();
+
+
+	/**
+	 * 接收命令
+	 *
+	 * @param command 命令
+	 * @return boolean
+	 */
+	public boolean receiveCommand(AbstractModbusCommand command);
+
+
+	/**
+	 * 接收命令并回答
+	 *
+	 * @param command               命令
+	 * @param confirm modbus确认
+	 * @return {@link AbstractModbusConfirm}
+	 */
+	public  default byte[] receiveCommandAndAnswer(AbstractModbusCommand command,AbstractModbusConfirm confirm) throws ModbusException {
+		List<RegisterValue> list=new ArrayList<>();
+		for(int i=0;i<command.getDataBytes().length;i+=2){
+			list.add(new UnknownTypeRegisterValue().decode(command.getDataBytes(),i));
+		}
+		if(receiveCommand(command)) {
+			getModbusSlaveDataContainer().setRegister(command.getSlaveId(), command.getStartAddress(), list);
+			confirm.setSlaveId(command.getSlaveId())
+					.setFunctionCode(command.getFunctionCode())
+					.setQuantity(command.getQuantity())
+					.setStartAddress(command.getStartAddress());
+			if(command.getFunctionCode()== FunctionCode.WRITE_COIL || command.getFunctionCode()==FunctionCode.WRITE_REGISTER){
+				confirm.setB2(command.getDataBytes());
+			}else{
+				confirm.getB2()[0]=(byte)(command.getQuantity() >> 8);
+				confirm.getB2()[1]=(byte)command.getQuantity().intValue();
+			}
+			List<Byte> bl=new ArrayList<>();
+			confirm.encode(bl);
+			return Bytes.toArray(bl);
+		}
+		System.out.println(JSON.toJSONString(command));
+		return null;
+	}
+
+}

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

@@ -5,6 +5,7 @@ import io.netty.channel.Channel;
 import lombok.Getter;
 import lombok.experimental.Accessors;
 import wei.yigulu.modbus.domain.ModbusSlaveDataContainer;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
 import wei.yigulu.netty.AbstractTcpSlaverBuilder;
 import wei.yigulu.netty.ProtocolChannelInitializer;
 
@@ -18,7 +19,7 @@ import wei.yigulu.netty.ProtocolChannelInitializer;
  */
 
 @Accessors(chain = true)
-public class ModbusTcpSlaverBuilder extends AbstractTcpSlaverBuilder {
+public class ModbusTcpSlaverBuilder extends AbstractTcpSlaverBuilder implements ModbusSlaverInterface {
 
 
 	@Getter
@@ -40,4 +41,8 @@ public class ModbusTcpSlaverBuilder extends AbstractTcpSlaverBuilder {
 		};
 	}
 
+	@Override
+	public boolean receiveCommand(AbstractModbusCommand command) {
+		return true;
+	}
 }

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

@@ -1,19 +1,30 @@
 package wei.yigulu.modbus.netty;
 
 
+import com.alibaba.fastjson.JSON;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.NoArgsConstructor;
 import org.slf4j.Logger;
+import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
+import wei.yigulu.modbus.domain.command.RtuModbusCommand;
+import wei.yigulu.modbus.domain.command.TcpModbusCommand;
+import wei.yigulu.modbus.domain.confirm.TcpModbusConfirm;
+import wei.yigulu.modbus.domain.datatype.RegisterValue;
+import wei.yigulu.modbus.domain.datatype.UnknownTypeRegisterValue;
+import wei.yigulu.modbus.domain.request.AbstractModbusRequest;
 import wei.yigulu.modbus.domain.request.TcpModbusRequest;
+import wei.yigulu.modbus.domain.response.RtuModbusResponse;
 import wei.yigulu.modbus.domain.response.TcpModbusResponse;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.modbus.utils.ModbusResponseDataUtils;
 import wei.yigulu.utils.DataConvertor;
 
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 消息处理类
@@ -43,15 +54,28 @@ public class ModbusTcpSlaverHandle extends SimpleChannelInboundHandler<ByteBuf>
 	public void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
 		//收数据
 		log.debug("re <=" + DataConvertor.ByteBuf2String(byteBuf));
-		TcpModbusRequest request = new TcpModbusRequest().decode(byteBuf.nioBuffer());
-		TcpModbusResponse response = new TcpModbusResponse();
-		response.setTcpExtraCode(request.getTcpExtraCode());
-		try {
-			byte[] bbs = ModbusResponseDataUtils.buildResponse(this.slaverBuilder.getModbusSlaveDataContainer(), request, response);
+		byte[] bbs = new byte[0];
+		if (AbstractModbusRequest.FUNCTION_CODES.contains(byteBuf.getByte(7))) {
+			TcpModbusRequest request = new TcpModbusRequest().decode(byteBuf.nioBuffer());
+			TcpModbusResponse response = new TcpModbusResponse();
+			response.setTcpExtraCode(request.getTcpExtraCode());
+			try {
+				bbs = ModbusResponseDataUtils.buildResponse(this.slaverBuilder.getModbusSlaveDataContainer(), request, response);
+			} catch (ModbusException e) {
+				log.error(e.getMsg());
+			}
+		}else if (AbstractModbusCommand.FUNCTION_CODES.contains(byteBuf.getByte(7))) {
+			TcpModbusCommand command = new TcpModbusCommand().decode(byteBuf.nioBuffer());
+			TcpModbusConfirm confirm = new TcpModbusConfirm().setTransactionIdentifier(command.getTcpExtraCode().getTransactionIdentifier());
+			try {
+			bbs=slaverBuilder.receiveCommandAndAnswer(command,confirm);
+			} catch (ModbusException e) {
+				log.error(e.getMsg());
+			}
+		}
+		if (bbs.length>0) {
 			ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
 			log.debug("se =>" + DataConvertor.Byte2String(bbs));
-		} catch (ModbusException e) {
-			log.error(e.getMsg());
 		}
 	}
 

+ 1 - 1
protocol-modbus/src/test/java/TestRtuSlave.java

@@ -24,7 +24,7 @@ public class TestRtuSlave {
 			for (int i = 0; i < 10; i++) {
 				d = (0.5 - random.nextDouble()) * 100;
 				System.out.println(d);
-				slaver.getModbusSlaveDataContainer().setRegister(1, i * 2, new P_ABCD(BigDecimal.valueOf(d)));
+				//slaver.getModbusSlaveDataContainer().setRegister(1, i * 2, new P_ABCD(BigDecimal.valueOf(d)));
 			}
 			Thread.sleep(1000000L);
 		}

+ 1 - 1
protocol-modbus/src/test/java/TestSlaver.java

@@ -17,7 +17,7 @@ public class TestSlaver {
 		boolean f;
 		for (; ; ) {
 			for (int i = 0; i < 10; i++) {
-				slaverBuilder.getModbusSlaveDataContainer().setRegister(1, i, new BADC(BigDecimal.valueOf(random.nextFloat())));
+				//slaverBuilder.getModbusSlaveDataContainer().setRegister(1, i, new BADC(BigDecimal.valueOf(random.nextFloat())));
 				/*f = random.nextBoolean();
 				System.out.println(i + ":" + f);
 				slaverBuilder.getModbusSlaveDataContainer().setCoil(1, i, f);*/