|
@@ -1,11 +1,17 @@
|
|
|
package com.ruoyi.hard.xuankang;
|
|
|
|
|
|
import com.jwk.spring.boot.autoconfigure.ModbusTcpMasterTemplate;
|
|
|
+import com.jwk.spring.boot.constant.DATA_TYPE_WRAPPER;
|
|
|
+import com.jwk.spring.boot.modbus4j.ModbusMasterUtil;
|
|
|
+import com.serotonin.modbus4j.base.ModbusUtils;
|
|
|
+import com.serotonin.modbus4j.msg.ReadResponse;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import static com.ruoyi.hard.xuankang.StirringTankClient.STIR_TANK_COMMAND.*;
|
|
|
+
|
|
|
/**
|
|
|
* 搅拌槽通讯客户端
|
|
|
*
|
|
@@ -16,9 +22,362 @@ import org.springframework.stereotype.Service;
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
public class StirringTankClient {
|
|
|
+ //转换为bool数组
|
|
|
+ protected boolean[] convertToBooleans(Number num) {
|
|
|
+ int i = num.intValue();
|
|
|
+ String string = Integer.toBinaryString(i);
|
|
|
+ StringBuilder stringBuilder = new StringBuilder(string);
|
|
|
+ String string1 = stringBuilder.reverse().toString();
|
|
|
+ char[] chars = string1.toCharArray();
|
|
|
+ boolean[] booleans = new boolean[chars.length];
|
|
|
+ for (int j = 0; j < chars.length; j++) {
|
|
|
+ if (chars[j] == 49) {
|
|
|
+ booleans[j] = true;
|
|
|
+ } else {
|
|
|
+ booleans[j] = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return booleans;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 搅拌槽
|
|
|
+ */
|
|
|
@Autowired(required = false)
|
|
|
@Qualifier("modbusTcpMasterTemplateFirst")
|
|
|
private ModbusTcpMasterTemplate modbusTcpMasterTemplateFirst;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搅拌槽命令
|
|
|
+ */
|
|
|
+ public enum STIR_TANK_COMMAND {
|
|
|
+ //读碳酸钠液位
|
|
|
+ READ_THE_STIRRING_TANK_01(1, 100, 1, 0),
|
|
|
+ //读丁黄药液位
|
|
|
+ READ_THE_STIRRING_TANK_02(1, 101, 1, 0),
|
|
|
+ //读丁铵黑药液位
|
|
|
+ READ_THE_STIRRING_TANK_03(1, 102, 1, 0),
|
|
|
+ //读六偏磷酸钠液位
|
|
|
+ READ_THE_STIRRING_TANK_04(1, 103, 1, 0),
|
|
|
+ //读硫酸铵液位
|
|
|
+ READ_THE_STIRRING_TANK_05(1, 104, 1, 0),
|
|
|
+ //读乙黄药液位
|
|
|
+ READ_THE_STIRRING_TANK_06(1, 105, 1, 0),
|
|
|
+ //读碳酸钠药剂量
|
|
|
+ READ_THE_STIRRING_TANK_07(1, 106, 1, 0),
|
|
|
+ //读丁黄药药剂量
|
|
|
+ READ_THE_STIRRING_TANK_08(1, 107, 1, 0),
|
|
|
+ //读丁铵黑药药剂量
|
|
|
+ READ_THE_STIRRING_TANK_09(1, 108, 1, 0),
|
|
|
+ //读六偏磷酸钠药剂量
|
|
|
+ READ_THE_STIRRING_TANK_10(1, 109, 1, 0),
|
|
|
+ //读硫酸铵药剂量
|
|
|
+ READ_THE_STIRRING_TANK_11(1, 110, 1, 0),
|
|
|
+ //读乙黄药药剂量
|
|
|
+ READ_THE_STIRRING_TANK_12(1, 111, 1, 0),
|
|
|
+
|
|
|
+
|
|
|
+ //读仓库是否可以完成该剂量的注入标志位
|
|
|
+ READ_THE_STIRRING_TANK_13(1, 112, 1, 0),
|
|
|
+ //读药剂注入请求
|
|
|
+ READ_THE_STIRRING_TANK_14(1, 113, 1, 0),
|
|
|
+ //读搅拌槽运行
|
|
|
+ READ_THE_STIRRING_TANK_15(1, 114, 1, 0),
|
|
|
+ //读确认开始生产
|
|
|
+ READ_THE_STIRRING_TANK_16(1, 115, 1, 0),
|
|
|
+
|
|
|
+
|
|
|
+ //写仓库无法完成注药量
|
|
|
+ WRITE_THE_STIRRING_TANK_01(1, 0, 1, 0),
|
|
|
+ //写仓库确认可完成注药量
|
|
|
+ WRITE_THE_STIRRING_TANK_02(1, 1, 1, 1),
|
|
|
+ //写仓库收到请求已经开始注药
|
|
|
+ WRITE_THE_STIRRING_TANK_03(1, 2, 1, 1),
|
|
|
+ //写仓库注入失败
|
|
|
+ WRITE_THE_STIRRING_TANK_04(1, 3, 1, 0),
|
|
|
+ //写仓库注入成功
|
|
|
+ WRITE_THE_STIRRING_TANK_05(1, 4, 1, 1);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从节点id
|
|
|
+ */
|
|
|
+ private int slaveId;
|
|
|
+ /**
|
|
|
+ * 地址
|
|
|
+ */
|
|
|
+ private int offset;
|
|
|
+ /**
|
|
|
+ * 读的长度
|
|
|
+ */
|
|
|
+ private int value;
|
|
|
+ /**
|
|
|
+ * 写的值
|
|
|
+ */
|
|
|
+ private int value1;
|
|
|
+
|
|
|
+ STIR_TANK_COMMAND(int slaveId, int offset, int value, int value1) {
|
|
|
+ this.slaveId = slaveId;
|
|
|
+ this.offset = offset;
|
|
|
+ this.value = value;
|
|
|
+ this.value1 = value1;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getSlaveId() {
|
|
|
+ return slaveId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getOffset() {
|
|
|
+ return offset;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getValue() {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getValue1() {
|
|
|
+ return value1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读碳酸钠搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return 搅拌槽液位 *100
|
|
|
+ */
|
|
|
+ public Number readTank01() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_01.getSlaveId(), READ_THE_STIRRING_TANK_01.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读丁黄药搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank02() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_02.getSlaveId(), READ_THE_STIRRING_TANK_02.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读丁铵黑药搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank03() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_03.getSlaveId(), READ_THE_STIRRING_TANK_03.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读六偏磷酸钠搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank04() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_04.getSlaveId(), READ_THE_STIRRING_TANK_04.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读硫酸铵搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank05() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_05.getSlaveId(), READ_THE_STIRRING_TANK_05.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读乙黄药搅拌槽液位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank06() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_06.getSlaveId(), READ_THE_STIRRING_TANK_06.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读碳酸钠药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank07() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_07.getSlaveId(), READ_THE_STIRRING_TANK_07.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读丁黄药药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank08() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_08.getSlaveId(), READ_THE_STIRRING_TANK_08.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读丁铵黑药药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank09() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_09.getSlaveId(), READ_THE_STIRRING_TANK_09.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读六偏磷酸钠药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank10() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_10.getSlaveId(), READ_THE_STIRRING_TANK_10.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读硫酸铵药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank11() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_11.getSlaveId(), READ_THE_STIRRING_TANK_11.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读乙黄药药剂量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Number readTank12() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_12.getSlaveId(), READ_THE_STIRRING_TANK_12.getOffset());
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读仓库是否可以完成该剂量的注入标志位
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean[] readTank13() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_13.getSlaveId(), READ_THE_STIRRING_TANK_13.getOffset());
|
|
|
+ boolean[] booleans = convertToBooleans(number);
|
|
|
+ return booleans;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读药剂注入请求
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean[] readTank14() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_14.getSlaveId(), READ_THE_STIRRING_TANK_14.getOffset());
|
|
|
+ boolean[] booleans = convertToBooleans(number);
|
|
|
+ return booleans;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读搅拌槽运行
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean[] readTank15() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_15.getSlaveId(), READ_THE_STIRRING_TANK_15.getOffset());
|
|
|
+ boolean[] booleans = convertToBooleans(number);
|
|
|
+ return booleans;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读确认开始生产
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean[] readTank16() {
|
|
|
+ Number number = read1(READ_THE_STIRRING_TANK_16.getSlaveId(), READ_THE_STIRRING_TANK_16.getOffset());
|
|
|
+ boolean[] booleans = convertToBooleans(number);
|
|
|
+ return booleans;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写仓库无法完成注药量
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean writeTank01() {
|
|
|
+ return write(WRITE_THE_STIRRING_TANK_01.getSlaveId(), WRITE_THE_STIRRING_TANK_01.getOffset(), WRITE_THE_STIRRING_TANK_01.getValue1());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写仓库确认可完成注药
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean writeTank02() {
|
|
|
+ return write(WRITE_THE_STIRRING_TANK_02.getSlaveId(), WRITE_THE_STIRRING_TANK_02.getOffset(), WRITE_THE_STIRRING_TANK_02.getValue1());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写仓库收到请求已经开始注药
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean writeTank03() {
|
|
|
+ return write(WRITE_THE_STIRRING_TANK_03.getSlaveId(), WRITE_THE_STIRRING_TANK_03.getOffset(), WRITE_THE_STIRRING_TANK_03.getValue1());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写仓库注入失败
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean writeTank04() {
|
|
|
+ return write(WRITE_THE_STIRRING_TANK_04.getSlaveId(), WRITE_THE_STIRRING_TANK_04.getOffset(), WRITE_THE_STIRRING_TANK_04.getValue1());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写仓库注入成功
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Boolean writeTank05() {
|
|
|
+ return write(WRITE_THE_STIRRING_TANK_05.getSlaveId(), WRITE_THE_STIRRING_TANK_05.getOffset(), WRITE_THE_STIRRING_TANK_05.getValue1());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读的方法
|
|
|
+ *
|
|
|
+ * @param slaveId
|
|
|
+ * @param offset
|
|
|
+ * @param len
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Number read1(int slaveId, int offset) {
|
|
|
+ ModbusMasterUtil modbusMasterUtil = modbusTcpMasterTemplateFirst.getModbusMasterUtil();
|
|
|
+ Number number = modbusMasterUtil.readHoldingRegister(slaveId, offset, DATA_TYPE_WRAPPER.TWO_BYTE_INT_UNSIGNED);
|
|
|
+ return number;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写的方法
|
|
|
+ *
|
|
|
+ * @param slaveId
|
|
|
+ * @param offset
|
|
|
+ * @param value
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Boolean write(int slaveId, int offset, int value) {
|
|
|
+ ModbusMasterUtil modbusMasterUtil = modbusTcpMasterTemplateFirst.getModbusMasterUtil();
|
|
|
+ return modbusMasterUtil.writeHoldingRegisters(slaveId, offset, value);
|
|
|
+ }
|
|
|
+
|
|
|
}
|