ModbusTcpSlaver.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package tunnelworker.slavers.iml;
  2. import container.ProtocolDataContainer;
  3. import entity.datapoint.SenderDataPoint;
  4. import enums.TunnelStatus;
  5. import exception.DataExchangeException;
  6. import slavertunnelinfo.SlaverModbusTcpTunnelInfo;
  7. import tunnelworker.BaseProtocolTunnel;
  8. import tunnelworker.slavers.SlaverInterface;
  9. import tunnelworker.workassist.SingleThreadPoolExecutorUtil;
  10. import wei.yigulu.modbus.domain.datatype.BooleanModbusDataInRegister;
  11. import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
  12. import wei.yigulu.modbus.domain.datatype.NumericModbusData;
  13. import wei.yigulu.modbus.netty.ModbusTcpSlaverBuilder;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * modbus 转发数据通道
  19. *
  20. * @author 修唯xiuwei
  21. * @version 3.0
  22. */
  23. public class ModbusTcpSlaver extends BaseProtocolTunnel<SlaverModbusTcpTunnelInfo, ModbusTcpSlaverBuilder> implements SlaverInterface {
  24. /**
  25. * 通道点位 ---- 点位对象
  26. */
  27. Map<Integer, SenderDataPoint> dataPointMap;
  28. /**
  29. * 0: 线圈 1:寄存器
  30. */
  31. private int functionFlag;
  32. /**
  33. * 顶层的构造方法
  34. *
  35. * @param tunnelInfo 通道信息
  36. */
  37. public ModbusTcpSlaver(SlaverModbusTcpTunnelInfo tunnelInfo) {
  38. super(tunnelInfo);
  39. }
  40. @Override
  41. protected ModbusTcpSlaver buildTunnel() throws DataExchangeException {
  42. return this;
  43. }
  44. @Override
  45. protected void parseDataPoint() throws DataExchangeException {
  46. this.log.info("解析该通道下所管理的点位");
  47. List<SenderDataPoint> dataPoints = this.tunnelInfo.getDataPoints();
  48. if (dataPoints == null || dataPoints.size() == 0) {
  49. return;
  50. }
  51. this.dataPointMap = new HashMap<>();
  52. for (SenderDataPoint d : dataPoints) {
  53. this.dataPointMap.put(d.getProtocolPoint(), d);
  54. }
  55. this.log.info("解析该通道下所管理的点位完成");
  56. }
  57. @Override
  58. public ModbusTcpSlaver startTunnel() throws DataExchangeException {
  59. log.info("modbus TCP slaver {} 通道开始连接", getTunnelInfo().getTunnelName());
  60. protocolTunnelContainer.addUpdateDateTask(this);
  61. try {
  62. SingleThreadPoolExecutorUtil.executeBySingleThreadExecutor(() -> {
  63. try {
  64. this.protocolBuilder.create();
  65. log.error("Modbus TCP slaver 创建通道失败");
  66. setTunnelStatus(TunnelStatus.LISTENPORTFAIL);
  67. } catch (Exception e) {
  68. log.error("Modbus TCP slaver 创建通道失败", e);
  69. setTunnelStatus(TunnelStatus.LISTENPORTFAIL);
  70. }
  71. });
  72. } catch (Exception e) {
  73. log.error("Modbus TCP slaver 创建通道失败", e);
  74. setTunnelStatus(TunnelStatus.LISTENPORTFAIL);
  75. throw new DataExchangeException(10007, "Modbus TCP slaver创建通道失败");
  76. }
  77. if (!TunnelStatus.LISTENPORTFAIL.equals(getTunnelStatus())) {
  78. setTunnelStatus(TunnelStatus.LISTENPORTSUCCESS);
  79. }
  80. return this;
  81. }
  82. @Override
  83. public BaseProtocolTunnel tunnelStop() throws DataExchangeException {
  84. if (this.protocolBuilder != null) {
  85. this.protocolBuilder.stop();
  86. }
  87. log.info("关闭 Modbus TCP slaver 通道 {}", this.tunnelInfo.getTunnelName());
  88. return super.tunnelStop();
  89. }
  90. @Override
  91. public void updateData2Protocol() throws DataExchangeException {
  92. ProtocolDataContainer dataContainer = ProtocolDataContainer.getInstance();
  93. if (functionFlag == 1) {
  94. this.dataPointMap.forEach((k, v) -> {
  95. if (ModbusDataTypeEnum.A16.equals(v.getDataType().getModbusDataType())) {
  96. BooleanModbusDataInRegister booleanModbusDataInRegister = new BooleanModbusDataInRegister();
  97. booleanModbusDataInRegister.setValue(0, dataContainer.getBoolean(v.getDataPointId()));
  98. this.protocolBuilder.getModbusSlaveDataContainer().setRegister(this.tunnelInfo.getSlaveId(), k, booleanModbusDataInRegister);
  99. } else {
  100. this.protocolBuilder.getModbusSlaveDataContainer().setRegister(this.tunnelInfo.getSlaveId(), k, ((NumericModbusData) (v.getDataType().getModbusDataType().getObject())).setValue(dataContainer.getNumber(v.getDataPointId()).multiply(v.getRatio())));
  101. }
  102. });
  103. } else {
  104. this.dataPointMap.forEach((k, v) ->
  105. this.protocolBuilder.getModbusSlaveDataContainer().setCoil(this.tunnelInfo.getSlaveId(), k, dataContainer.getBoolean(v.getDataPointId()))
  106. );
  107. }
  108. }
  109. }