浏览代码

补充modbus 线圈控制命令

xiuwei 3 年之前
父节点
当前提交
73cb2fcda9
共有 1 个文件被更改,包括 70 次插入0 次删除
  1. 70 0
      protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusCommandDataUtils.java

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

@@ -90,6 +90,63 @@ public class ModbusCommandDataUtils {
 
 
 	/**
+	 * 下达线圈控制命令
+	 *
+	 * @param masterBuilder 主站对象
+	 * @param address       起始地址
+	 * @param values        命令值
+	 */
+	public static boolean commandCoils(MasterInterface masterBuilder, Integer slaveId, Integer address, List<Boolean> values) throws ModbusException {
+		if (!(masterBuilder instanceof ModbusMasterBuilderInterface)) {
+			throw new RuntimeException("请传人实现了<ModbusMasterBuilderInterface>的Master");
+		}
+		List<Byte> bs = new ArrayList<>();
+		AbstractModbusCommand modbusCommand;
+		ByteBuffer buffer;
+		AbstractModbusConfirm confirm;
+		try {
+			if (masterBuilder instanceof ModbusRtuMasterBuilder) {
+				modbusCommand = new RtuModbusCommand();
+				modbusCommand.setSlaveId(slaveId).setCoils(address, values);
+				modbusCommand.encode(bs);
+				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+				confirm = new RtuModbusConfirm().decode(buffer);
+			} else {
+				modbusCommand = new TcpModbusCommand();
+				((TcpModbusCommand) modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
+				modbusCommand.setSlaveId(slaveId).setCoils(address, values);
+				modbusCommand.encode(bs);
+				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand) modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
+				confirm = new TcpModbusConfirm().decode(buffer);
+			}
+		} catch (ModbusException e) {
+			log.error("控制命令执行失败:" + e.getMsg());
+			return false;
+		}
+		if (address.equals(confirm.getStartAddress())) {
+			if (confirm.getFunctionCode() == modbusCommand.getFunctionCode()) {
+				if (confirm.getFunctionCode() == FunctionCode.WRITE_COIL || confirm.getFunctionCode() == FunctionCode.WRITE_REGISTER) {
+					if (Bytes.indexOf(confirm.getB2(), modbusCommand.getDataBytes()) == 0) {
+						return true;
+					} else {
+						log.warn("返回的确认值和输出值不同");
+					}
+				} else {
+					if (confirm.getQuantity().equals(modbusCommand.getQuantity())) {
+						return true;
+					} else {
+						log.warn("返回的值数量和输出数量不同");
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+
+	/**
 	 * 下达寄存器控制命令
 	 *
 	 * @param masterBuilder 主站对象
@@ -101,4 +158,17 @@ public class ModbusCommandDataUtils {
 		list.add(value);
 		return commandRegister(masterBuilder, slaveId, address, list);
 	}
+
+	/**
+	 * 下达线圈控制命令
+	 *
+	 * @param masterBuilder 主站对象
+	 * @param address       起始地址
+	 * @param value         命令值
+	 */
+	public static boolean commandCoil(MasterInterface masterBuilder, Integer slaveId, Integer address, Boolean value) throws ModbusException {
+		List<Boolean> list = new ArrayList<>();
+		list.add(value);
+		return commandCoils(masterBuilder, slaveId, address, list);
+	}
 }