ModbusCommandDataUtils.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package wei.yigulu.modbus.utils;
  2. import com.google.common.primitives.Bytes;
  3. import lombok.extern.slf4j.Slf4j;
  4. import wei.yigulu.modbus.domain.FunctionCode;
  5. import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
  6. import wei.yigulu.modbus.domain.command.RtuModbusCommand;
  7. import wei.yigulu.modbus.domain.command.TcpModbusCommand;
  8. import wei.yigulu.modbus.domain.confirm.AbstractModbusConfirm;
  9. import wei.yigulu.modbus.domain.confirm.RtuModbusConfirm;
  10. import wei.yigulu.modbus.domain.confirm.TcpModbusConfirm;
  11. import wei.yigulu.modbus.domain.datatype.RegisterValue;
  12. import wei.yigulu.modbus.domain.tcpextracode.TransactionIdentifier;
  13. import wei.yigulu.modbus.exceptiom.ModbusException;
  14. import wei.yigulu.modbus.netty.ModbusMasterBuilderInterface;
  15. import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
  16. import wei.yigulu.netty.AbstractMasterBuilder;
  17. import wei.yigulu.netty.AbstractTcpMasterBuilder;
  18. import wei.yigulu.netty.MasterInterface;
  19. import java.nio.ByteBuffer;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. /**
  23. * modbs下达数据命令的工具类
  24. *
  25. * @author: xiuwei
  26. * @version:
  27. */
  28. @Slf4j
  29. public class ModbusCommandDataUtils {
  30. /**
  31. * 下达寄存器控制命令
  32. *
  33. * @param masterBuilder 主站对象
  34. * @param address 起始地址
  35. * @param values 命令值
  36. */
  37. public static boolean commandRegister(MasterInterface masterBuilder, Integer slaveId, Integer address, List<RegisterValue> values) throws ModbusException {
  38. if (!(masterBuilder instanceof ModbusMasterBuilderInterface)) {
  39. throw new RuntimeException("请传人实现了<ModbusMasterBuilderInterface>的Master");
  40. }
  41. List<Byte> bs = new ArrayList<>();
  42. AbstractModbusCommand modbusCommand;
  43. ByteBuffer buffer;
  44. AbstractModbusConfirm confirm;
  45. try {
  46. if (masterBuilder instanceof ModbusRtuMasterBuilder) {
  47. modbusCommand = new RtuModbusCommand();
  48. modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
  49. modbusCommand.encode(bs);
  50. masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
  51. buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
  52. confirm = new RtuModbusConfirm().decode(buffer);
  53. } else {
  54. modbusCommand = new TcpModbusCommand();
  55. ((TcpModbusCommand) modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
  56. modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
  57. modbusCommand.encode(bs);
  58. masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
  59. buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand) modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
  60. confirm = new TcpModbusConfirm().decode(buffer);
  61. }
  62. } catch (ModbusException e) {
  63. log.error("控制命令执行失败:" + e.getMsg());
  64. return false;
  65. }
  66. if (address.equals(confirm.getStartAddress())) {
  67. if (confirm.getFunctionCode() == modbusCommand.getFunctionCode()) {
  68. if (confirm.getFunctionCode() == FunctionCode.WRITE_COIL || confirm.getFunctionCode() == FunctionCode.WRITE_REGISTER) {
  69. if (Bytes.indexOf(confirm.getB2(), modbusCommand.getDataBytes()) == 0) {
  70. return true;
  71. } else {
  72. log.warn("返回的确认值和输出值不同");
  73. }
  74. } else {
  75. if (confirm.getQuantity().equals(modbusCommand.getQuantity())) {
  76. return true;
  77. } else {
  78. log.warn("返回的值数量和输出数量不同");
  79. }
  80. }
  81. }
  82. }
  83. return false;
  84. }
  85. /**
  86. * 下达寄存器控制命令
  87. *
  88. * @param masterBuilder 主站对象
  89. * @param address 起始地址
  90. * @param value 命令值
  91. */
  92. public static boolean commandRegister(MasterInterface masterBuilder, Integer slaveId, Integer address, RegisterValue value) throws ModbusException {
  93. List<RegisterValue> list = new ArrayList<>();
  94. list.add(value);
  95. return commandRegister(masterBuilder, slaveId, address, list);
  96. }
  97. }