|
@@ -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);
|
|
|
+ }
|
|
|
}
|