TcpModbusCommand.java 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package wei.yigulu.modbus.domain.command;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
  5. import wei.yigulu.modbus.domain.tcpextracode.TcpExtraCode;
  6. import wei.yigulu.modbus.domain.tcpextracode.TransactionIdentifier;
  7. import wei.yigulu.modbus.exceptiom.ModbusException;
  8. import java.math.BigDecimal;
  9. import java.nio.ByteBuffer;
  10. import java.util.List;
  11. /**
  12. * tcp写的modbus 控制命令
  13. *
  14. * @author: xiuwei
  15. * @version:
  16. */
  17. public class TcpModbusCommand extends AbstractModbusCommand {
  18. /**
  19. * tcp通讯时的前端附加码
  20. */
  21. @Setter
  22. @Getter
  23. protected TcpExtraCode tcpExtraCode = new TcpExtraCode();
  24. /**
  25. * 除去四个附加码 和两个长度字节 剩余的报文的字节个数
  26. */
  27. @Setter
  28. protected Integer length = 6;
  29. /**
  30. * 设置事务标识符
  31. *
  32. * @param transactionIdentifier
  33. * @return
  34. */
  35. public TcpModbusCommand setTransactionIdentifier(TransactionIdentifier transactionIdentifier) {
  36. this.tcpExtraCode.setTransactionIdentifier(transactionIdentifier);
  37. return this;
  38. }
  39. @Override
  40. public TcpModbusCommand encode(List<Byte> bytes) throws ModbusException {
  41. tcpExtraCode.encode(bytes);
  42. new P_AB(BigDecimal.valueOf(super.getLength())).encode(bytes);
  43. super.encode(bytes);
  44. return this;
  45. }
  46. @Override
  47. public TcpModbusCommand decode(ByteBuffer byteBuf) throws ModbusException {
  48. if (byteBuf.remaining() != 12) {
  49. throw new ModbusException("该帧非数据请求帧");
  50. }
  51. this.tcpExtraCode.decode(byteBuf);
  52. this.setLength(new P_AB().decode(byteBuf).getValue().intValue());
  53. //super.decode(byteBuf);
  54. return this;
  55. }
  56. }