From af5cd94403e6b594c5bccca0fef3a4c6d79af274 Mon Sep 17 00:00:00 2001
From: jiazx0107@163.com <jiazx0107@163.com>
Date: 星期四, 24 八月 2023 09:17:52 +0800
Subject: [PATCH] 更新MODBUS-TCP协议 4
---
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java | 42 ++--
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java | 189 +++++++++++++++++++++++
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java | 234 +++++++++++++++++++++++++++++
3 files changed, 443 insertions(+), 22 deletions(-)
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java
new file mode 100644
index 0000000..20e82cd
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java
@@ -0,0 +1,234 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusFactory;
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.exception.ErrorResponseException;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.exception.ModbusTransportException;
+import com.serotonin.modbus4j.ip.IpParameters;
+import com.serotonin.modbus4j.locator.BaseLocator;
+import com.serotonin.modbus4j.msg.*;
+
+/**
+ * Modbus 宸ュ叿绫�
+ */
+public class ModbusTest {
+
+ /**
+ * 宸ュ巶
+ */
+ static ModbusFactory modbusFactory;
+ static ModbusMaster modbusMaster;
+
+ static {
+ if (modbusFactory == null) {
+ modbusFactory = new ModbusFactory();
+ }
+ }
+
+
+ /**
+ * 鑾峰彇master
+ *
+ * @return
+ */
+ public static ModbusMaster getMaster() throws ModbusInitException {
+ if (modbusMaster == null) {
+ IpParameters ipParameters = new IpParameters();
+ ipParameters.setHost("127.0.0.1");
+ ipParameters.setPort(502);
+ modbusMaster = modbusFactory.createTcpMaster(ipParameters, true);
+ modbusMaster.init();
+ return modbusMaster;
+ }
+ return modbusMaster;
+ }
+
+
+ /**
+ * 璇诲彇绾垮湀寮�鍏崇姸鎬佹暟鎹� 0x01
+ *
+ * @param slaveId
+ * @param offset
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Boolean readCoilStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset);
+ Boolean res = getMaster().getValue(coilStatus);
+ return res;
+ }
+
+ /**
+ * 璇荤鏁h緭鍏ュ瘎瀛樺櫒鐘舵�佹暟鎹� 0x02
+ *
+ * @param slaveId
+ * @param offset
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Boolean inputStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset);
+ Boolean res = getMaster().getValue(inputStatus);
+ return res;
+ }
+
+ /**
+ * 璇讳繚鎸佸瘎瀛樺櫒鏁版嵁 0x03
+ *
+ * @param slaveId
+ * @param offset
+ * @param dataType
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Number holdingRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);
+ Number value = getMaster().getValue(holdingRegister);
+ return value;
+ }
+
+ /**
+ * 璇昏緭鍏ュ瘎瀛樺櫒鏁版嵁 0x04
+ *
+ * @param slaveId
+ * @param offset
+ * @param dataType
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Number inputRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType);
+ Number value = getMaster().getValue(inputRegister);
+ return value;
+ }
+
+
+ /**
+ * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹� 0x05
+ *
+ * @param slaveId
+ * @param offset
+ * @param status
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeCoilStatus(int slaveId, int offset, boolean status) throws ModbusTransportException, ModbusInitException {
+ boolean coilValue = status;
+ WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue);
+ WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster().send(coilRequest);
+ return !coilResponse.isException();
+ }
+
+
+ /**
+ * 鍐欏崟涓繚鎸佸瘎瀛樺櫒鏁版嵁 0x06
+ *
+ * @param slaveId
+ * @param offset
+ * @param vlaue
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeRegister(int slaveId, int offset, int vlaue) throws ModbusTransportException, ModbusInitException {
+ WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, vlaue);
+ WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster().send(registerRequest);
+ return !registerResponse.isException();
+
+ }
+
+ /**
+ * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�愬銆� 0x0f
+ *
+ * @param slaveId
+ * @param offset
+ * @param booleans
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeCoils(int slaveId, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException {
+ WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans);
+ WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster().send(writeCoils);
+ return !coilsResponse.isException();
+ }
+
+
+ /**
+ * 鍐欎繚瀛樺瘎瀛樺櫒鏁版嵁銆愬銆� 0x10
+ *
+ * @param slaveId
+ * @param offset
+ * @param nums
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeRegisters(int slaveId, int offset, short[] nums) throws ModbusTransportException, ModbusInitException {
+ WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums);
+ WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster().send(writeRegisters);
+ return !registersResponse.isException();
+ }
+
+
+ public static void main(String[] args) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ // 01娴嬭瘯
+ Boolean v0001 = readCoilStatus(1, 2148);
+ System.out.println("get 2148 :" + v0001);
+
+
+ // 03娴嬭瘯
+// Number v0001 = holdingRegister(136, 3, DataType.TWO_BYTE_INT_SIGNED);
+// Number v0003 = holdingRegister(1, 2, DataType.TWO_BYTE_INT_SIGNED);
+// Number v0009 = holdingRegister(1, 8, DataType.TWO_BYTE_INT_SIGNED);
+// System.out.println("get v0001 result:" + v0001);
+// System.out.println("get v0003 result:" + v0003);
+// System.out.println("get v0009 result:" + v0009);
+
+ // 04娴嬭瘯
+// Number v0001 = inputRegister(136, 0, DataType.TWO_BYTE_INT_SIGNED);
+// Number v0003 = inputRegister(136, 2, DataType.TWO_BYTE_INT_SIGNED);
+// Number v0009 = inputRegister(136, 8, DataType.TWO_BYTE_INT_SIGNED);
+// System.out.println("get v0001 result:" + v0001);
+// System.out.println("get v0003 result:" + v0003);
+// System.out.println("get v0009 result:" + v0009);
+
+
+ // 05娴嬭瘯
+// Boolean v0001 = writeCoilStatus(1, 0, true);
+// Boolean v0002 = writeCoilStatus(1, 1, false);
+// Boolean v0007 = writeCoilStatus(1, 6, true);
+// System.out.println("update v0001 status result:" + v0001);
+// System.out.println("update v0002 status result:" + v0002);
+// System.out.println("update v0007 status result:" + v0007);
+
+
+ // 06娴嬭瘯
+// Boolean v0001 = writeRegister(136, 0, 98);
+// Boolean v0002 = writeRegister(136, 1, 0);
+// Boolean v0007 = writeRegister(136, 6, 100);
+// System.out.println("update v0001 status result:" + v0001);
+// System.out.println("update v0002 status result:" + v0002);
+// System.out.println("update v0007 status result:" + v0007);
+
+
+ // 0f娴嬭瘯
+ //Boolean res1 = writeCoils(1, 1, new boolean[]{true, true, false, true});
+ // 10娴嬭瘯
+ //Boolean res2 = writeRegisters(136, 7, new short[]{1, 2, 3});
+ //Boolean res3 = writeRegisters(136, 7, new short[]{991, 778, 25, 0});
+
+ }
+
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
new file mode 100644
index 0000000..5090776
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -0,0 +1,189 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusFactory;
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.exception.ErrorResponseException;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.exception.ModbusTransportException;
+import com.serotonin.modbus4j.ip.IpParameters;
+import com.serotonin.modbus4j.locator.BaseLocator;
+import com.serotonin.modbus4j.msg.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+
+/**
+ * @Desc: 宸ュ叿绫�
+ * @author: Andy
+ * @update-time: 2023/8/11
+ */
+@Slf4j
+public class ModbusUtil2 {
+
+ //浠庢満榛樿鍊�
+ private static Integer slaveId = 1;
+
+ private static HashMap<String, ModbusMaster> masterMap = new HashMap<>();
+
+ /**
+ * 宸ュ巶
+ */
+ static ModbusFactory modbusFactory;
+ //static ModbusMaster modbusMaster;
+
+ static {
+ if (modbusFactory == null) {
+ modbusFactory = new ModbusFactory();
+ }
+ }
+
+
+ /**
+ * 鑾峰彇master
+ *
+ * @return
+ */
+ public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException {
+ String key = ip;
+ ModbusMaster modbusMaster = masterMap.get(key);
+ if (modbusMaster == null || !modbusMaster.isConnected()) {
+ IpParameters ipParameters = new IpParameters();
+ ipParameters.setHost(ip);
+ ipParameters.setPort(port);
+ modbusMaster = modbusFactory.createTcpMaster(ipParameters, true);
+ modbusMaster.init();
+ masterMap.put(key, modbusMaster);
+ return modbusMaster;
+ }
+ return modbusMaster;
+ }
+
+
+ /**
+ * 璇诲彇绾垮湀寮�鍏崇姸鎬佹暟鎹� 0x01
+ *
+ * @param offset
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Boolean readCoilStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset);
+ Boolean res = getMaster(ip, port).getValue(coilStatus);
+ return res;
+ }
+
+ /**
+ * 璇荤鏁h緭鍏ュ瘎瀛樺櫒鐘舵�佹暟鎹� 0x02
+ *
+ * @param offset
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Boolean readInputStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset);
+ Boolean res = getMaster(ip, port).getValue(inputStatus);
+ return res;
+ }
+
+ /**
+ * 璇讳繚鎸佸瘎瀛樺櫒鏁版嵁 0x03
+ *
+ * @param offset
+ * @param dataType
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Number readHoldingRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);
+ Number value = getMaster(ip, port).getValue(holdingRegister);
+ return value;
+ }
+
+ /**
+ * 璇昏緭鍏ュ瘎瀛樺櫒鏁版嵁 0x04
+ *
+ * @param offset
+ * @param dataType
+ * @return
+ * @throws ModbusInitException
+ * @throws ModbusTransportException
+ * @throws ErrorResponseException
+ */
+ public static Number readInputRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+ BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType);
+ Number value = getMaster(ip, port).getValue(inputRegister);
+ return value;
+ }
+
+
+ /**
+ * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹� 0x05
+ *
+ * @param offset
+ * @param status
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeCoilStatus(String ip, int port, int offset, boolean status) throws ModbusTransportException, ModbusInitException {
+ boolean coilValue = status;
+ WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue);
+ WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest);
+ return !coilResponse.isException();
+ }
+
+
+ /**
+ * 鍐欏崟涓繚鎸佸瘎瀛樺櫒鏁版嵁 0x06
+ *
+ * @param offset
+ * @param value
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeRegister(String ip, int port, int offset, int value) throws ModbusTransportException, ModbusInitException {
+ WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, value);
+ WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster(ip, port).send(registerRequest);
+ return !registerResponse.isException();
+
+ }
+
+ /**
+ * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�愬銆� 0x0f
+ *
+ * @param offset
+ * @param booleans
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeCoils(String ip, int port, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException {
+ WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans);
+ WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster(ip, port).send(writeCoils);
+ return !coilsResponse.isException();
+ }
+
+
+ /**
+ * 鍐欎繚瀛樺瘎瀛樺櫒鏁版嵁銆愬銆� 0x10
+ *
+ * @param offset
+ * @param nums
+ * @return
+ * @throws ModbusTransportException
+ * @throws ModbusInitException
+ */
+ public static Boolean writeRegisters(String ip, int port, int offset, short[] nums) throws ModbusTransportException, ModbusInitException {
+ WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums);
+ WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster(ip, port).send(writeRegisters);
+ return !registersResponse.isException();
+ }
+}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
index 756c767..2bf1d8e 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -14,7 +14,7 @@
import com.ld.igds.modbus.service.HDeviceModbusService;
import com.ld.igds.models.Device;
import com.ld.igds.models.DeviceModbus;
-import com.ld.igds.protocol.modbus.ModbusUtil;
+import com.ld.igds.protocol.modbus.ModbusUtil2;
import com.ld.igds.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusTcp;
import lombok.extern.slf4j.Slf4j;
@@ -43,8 +43,6 @@
private HDeviceModbusService deviceModbusService;
@Resource
private AnalysisService analysisService;
- @Resource
- private ModbusUtil modbusUtil;
@Override
@@ -89,8 +87,7 @@
temp = modbusTcp.getDeviceModbus().getOpen();
}
-
- if (StringUtils.isEmpty(exeDevice.getLink())) {
+ if (StringUtils.isBlank(exeDevice.getLink()) || "null".equals(exeDevice.getLink())) {
//鏍规嵁璁惧鐩爣鐘舵�侊紝璋冪敤MODBUS鎵ц
modbusTcp.setAddrExe(this.getAddrExe(temp));
doWriteExe(modbusTcp, exeDevice.getTargetStatus());
@@ -180,8 +177,9 @@
}
private void doWriteExe(ModbusTcp modbusTcp, String targetStatus) throws Exception {
- boolean exeResult = modbusUtil.writeValue05(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
+ boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
if (exeResult) {
+ log.debug("--------鍐欏叆鍊�---{}-{}-{}", modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus);
ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus);
}
}
@@ -200,13 +198,10 @@
if (null == list || list.isEmpty()) {
return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鏈幏鍙栧埌璁惧鍒楄〃淇℃伅");
}
-
DeviceModbus deviceModbus;
ModbusTcp modbusTcp;
ModbusTcp modbusTcpLink;
- int i = 1;
for (Device device : list) {
-
deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + "");
if (null == deviceModbus) {
@@ -223,14 +218,9 @@
modbusTcp.setSerId(device.getSerId());
modbusTcp.setCompanyId(device.getCompanyId());
- // modbusTcp.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
+ doReadStatus(modbusTcp);
- modbusTcp.setAddrExe(1024);
- doReadExe(modbusTcp);
-
- if (i == 1) break;
-
- if (StringUtils.isEmpty(device.getLink())) continue;
+ if (StringUtils.isBlank(device.getLink()) || "null".equals(device.getLink())) continue;
Thread.sleep(300);
@@ -247,7 +237,7 @@
modbusTcpLink.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
- doReadExe(modbusTcpLink);
+ doReadStatus(modbusTcpLink);
}
} catch (Exception e) {
@@ -266,17 +256,25 @@
* @param modbusTcp
* @throws Exception
*/
- private void doReadExe(ModbusTcp modbusTcp) throws Exception {
+ private void doReadStatus(ModbusTcp modbusTcp) throws Exception {
if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return;
- boolean[] result = modbusUtil.readStatus02(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), 2);
- log.debug("---------璇诲彇鐘舵��------{}--{}", modbusTcp.getDeviceCode(), result.toString());
+ int addrExe = getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd());
- if (result[0]) {
+ boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
+ log.debug("---------璇诲紑鍒颁綅鐘舵��------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result);
+
+ if (result) {
ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode());
}
- if (result[1]) {
+
+
+ addrExe = getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd());
+ result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
+ log.debug("---------璇诲叧鍒颁綅鐘舵��------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result);
+
+ if (result) {
ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.CLOSE.getCode());
}
}
--
Gitblit v1.9.3