Commit bc2729d0 authored by wanghao's avatar wanghao

1 使用 modbus4j + juc 实现 读取老化柜和老化层状态--测试中

parent 984865fe
...@@ -61,23 +61,23 @@ public class AgingCabinetInspectionAndPowerCheckTask { ...@@ -61,23 +61,23 @@ public class AgingCabinetInspectionAndPowerCheckTask {
type.add("2"); type.add("2");
List<TEquipmentInfo> equipmentInfos = tEquipmentInfoService.selectTEquipmentList(type); List<TEquipmentInfo> equipmentInfos = tEquipmentInfoService.selectTEquipmentList(type);
try { // try {
if (equipmentInfos.size() == 0) { // if (equipmentInfos.size() == 0) {
log.error("设备列表查询结果为空"); // log.error("设备列表查询结果为空");
throw new Exception("无设备信息!"); // throw new Exception("无设备信息!");
} // }
//
// 10 层 // // 10 层
// List<Integer> registerOffset = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); // List<Integer> registerOffset = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
// //
// List<CompletableFuture<ModbusDeviceData>> futures = equipmentInfos.stream().map(equipmentInfo -> CompletableFuture.supplyAsync(() -> { // List<CompletableFuture<ModbusDeviceData>> futures = equipmentInfos.stream().map(equipmentInfo -> CompletableFuture.supplyAsync(() -> {
// ModbusMaster master = null; // ModbusMaster master = null;
// try { // try {
// master = Modbus4jUtils.getMaster(equipmentInfo.getfIp(), equipmentInfo.getfPort()); // master = Modbus4jUtils.getMaster(equipmentInfo.getfIp(), equipmentInfo.getfPort());
// Map<Integer, Object> integerObjectMap = Modbus4jUtils.batchReadAgingCabinet(master, registerOffset); // Map<Integer, Object> integerObjectMap = Modbus4jUtils.batchReadAgingCabinetStatus(master, registerOffset);
// // 构造结果对象 // // 构造结果对象
// ModbusDeviceData deviceData = new ModbusDeviceData(); // ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDeviceId(equipmentInfo.getfEquipmentId().toString()); // deviceData.setDeviceCode(equipmentInfo.getfEquipmentCode());
// deviceData.setRegisterValues(integerObjectMap.entrySet().stream() // deviceData.setRegisterValues(integerObjectMap.entrySet().stream()
// .collect(Collectors.toMap( // .collect(Collectors.toMap(
// Map.Entry::getKey, // Map.Entry::getKey,
...@@ -92,7 +92,7 @@ public class AgingCabinetInspectionAndPowerCheckTask { ...@@ -92,7 +92,7 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// Map<Integer, String> errorMap = new HashMap<>(); // Map<Integer, String> errorMap = new HashMap<>();
// //
// ModbusDeviceData deviceData = new ModbusDeviceData(); // ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDeviceId(""); // deviceData.setDeviceCode("");
// deviceData.setRegisterValues(errorMap); // deviceData.setRegisterValues(errorMap);
// //
// return deviceData; // return deviceData;
...@@ -102,7 +102,7 @@ public class AgingCabinetInspectionAndPowerCheckTask { ...@@ -102,7 +102,7 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// registerOffset.forEach(offset -> errorMap.put(offset, "ERROR: " + e.getMessage())); // registerOffset.forEach(offset -> errorMap.put(offset, "ERROR: " + e.getMessage()));
// //
// ModbusDeviceData deviceData = new ModbusDeviceData(); // ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDeviceId(equipmentInfo.getfEquipmentId().toString()); // deviceData.setDeviceCode(equipmentInfo.getfEquipmentCode());
// deviceData.setRegisterValues(errorMap); // deviceData.setRegisterValues(errorMap);
// //
// return deviceData; // return deviceData;
...@@ -128,15 +128,15 @@ public class AgingCabinetInspectionAndPowerCheckTask { ...@@ -128,15 +128,15 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// deferredResult.setResult(result); // deferredResult.setResult(result);
// } // }
// }); // });
//
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
} // }
} }
private ModbusDeviceData createErrorData(Throwable ex) { private ModbusDeviceData createErrorData(Throwable ex) {
ModbusDeviceData errorData = new ModbusDeviceData(); ModbusDeviceData errorData = new ModbusDeviceData();
errorData.setDeviceId("error"); errorData.setDeviceCode("error");
errorData.setRegisterValues(Collections.singletonMap(0, "系统错误:" + ex.getMessage())); errorData.setRegisterValues(Collections.singletonMap(0, "系统错误:" + ex.getMessage()));
return errorData; return errorData;
} }
......
...@@ -14,6 +14,7 @@ import com.serotonin.modbus4j.msg.*; ...@@ -14,6 +14,7 @@ import com.serotonin.modbus4j.msg.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -22,6 +23,7 @@ import java.util.Map; ...@@ -22,6 +23,7 @@ import java.util.Map;
* modbus通讯工具类,采用modbus4j实现 * modbus通讯工具类,采用modbus4j实现
* *
*/ */
@SuppressWarnings(value = "all")
public class Modbus4jUtils { public class Modbus4jUtils {
private static final Logger log = LoggerFactory.getLogger(Modbus4jUtils.class); private static final Logger log = LoggerFactory.getLogger(Modbus4jUtils.class);
...@@ -196,10 +198,32 @@ public class Modbus4jUtils { ...@@ -196,10 +198,32 @@ public class Modbus4jUtils {
throws ModbusTransportException, ErrorResponseException, ModbusInitException { throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 04 Input Registers类型数据读取 // 04 Input Registers类型数据读取
BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType); BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
Number value = getMaster().getValue(loc); Number value = master.getValue(loc);
return value; return value;
} }
/**
* 读老化柜的 10层数据
* @param master
* @return
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static Map<Integer, Object> readInputRegistersForAgeng(ModbusMaster master)
throws ModbusTransportException, ErrorResponseException {
// 10 层
List<Integer> registerOffsets = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Map<Integer, Object> result = new HashMap<>();
for (Integer registerOffset : registerOffsets) {
// 04 Input Registers类型数据读取
BaseLocator<Number> loc = BaseLocator.inputRegister(1, registerOffset, DataType.TWO_BYTE_INT_UNSIGNED);
Number value = master.getValue(loc);
result.put(registerOffset, value);
}
return result;
}
/** /**
* 批量读取使用方法 * 批量读取使用方法
* *
...@@ -229,18 +253,18 @@ public class Modbus4jUtils { ...@@ -229,18 +253,18 @@ public class Modbus4jUtils {
* @throws ErrorResponseException e * @throws ErrorResponseException e
* @throws ModbusInitException m * @throws ModbusInitException m
*/ */
public static Map<Integer, Object> batchReadAgingCabinet(ModbusMaster master, List<Integer> registerOffsets) throws ModbusTransportException, ErrorResponseException { public static Map<Integer, Object> batchReadAgingCabinetStatus(ModbusMaster master, List<Integer> registerOffsets) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
BatchRead<Integer> batch = new BatchRead<Integer>(); BatchRead<Integer> batch = new BatchRead<Integer>();
for (Integer registerOffset : registerOffsets) { for (Integer registerOffset : registerOffsets) {
batch.addLocator(registerOffset, BaseLocator.holdingRegister(1, registerOffset, DataType.FOUR_BYTE_FLOAT)); batch.addLocator(registerOffset, BaseLocator.inputStatus(1, registerOffset));
} }
// 非连续地址也支持 // 非连续地址也支持
batch.setContiguousRequests(false); batch.setContiguousRequests(true);
BatchResults<Integer> send = master.send(batch); BatchResults<Integer> send = master.send(batch);
//
Map<Integer, Object> result = new HashMap<>(); Map<Integer, Object> result = new HashMap<>();
for (Integer registerOffset : registerOffsets) { for (Integer registerOffset : registerOffsets) {
result.put(registerOffset, send.getValue(registerOffset)); result.put(registerOffset, send.getValue(registerOffset));
...@@ -276,6 +300,27 @@ public class Modbus4jUtils { ...@@ -276,6 +300,27 @@ public class Modbus4jUtils {
} }
} }
/**
* 写[01 Coil Status(0x)] 写一个 function ID = 5
* @param master
* @param slaveId
* @param writeOffset
* @param writeValue
* @return
* @throws ModbusTransportException
*/
public static boolean writeCoil(ModbusMaster master, int slaveId, int writeOffset, boolean writeValue) throws ModbusTransportException {
// 创建请求
WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
// 发送请求并获取响应对象
WriteCoilResponse response = (WriteCoilResponse) master.send(request);
if (response.isException()) {
return false;
} else {
return true;
}
}
/** /**
* 写[01 Coil Status(0x)] 写多个 function ID = 15 * 写[01 Coil Status(0x)] 写多个 function ID = 15
* *
......
...@@ -29,7 +29,7 @@ public class ModbusTcpTask implements Callable<Map<Integer, Object>> { ...@@ -29,7 +29,7 @@ public class ModbusTcpTask implements Callable<Map<Integer, Object>> {
ModbusMaster master = null; ModbusMaster master = null;
try { try {
master = Modbus4jUtils.getMaster(equipmentInfo.getfIp(), equipmentInfo.getfPort()); master = Modbus4jUtils.getMaster(equipmentInfo.getfIp(), equipmentInfo.getfPort());
return Modbus4jUtils.batchReadAgingCabinet(master,registerOffsets); return Modbus4jUtils.batchReadAgingCabinetStatus(master,registerOffsets);
} catch (ModbusInitException e) { } catch (ModbusInitException e) {
Map<Integer, Object> errorMap = new HashMap<>(); Map<Integer, Object> errorMap = new HashMap<>();
errorMap.put(1,-1); errorMap.put(1,-1);
......
...@@ -5,18 +5,35 @@ import java.util.Map; ...@@ -5,18 +5,35 @@ import java.util.Map;
/** /**
* @author lenovo * @author lenovo
* @date 2025/6/9 * @date 2025/6/9
* @description TODO * @description modbus设备数据
*/ */
public class ModbusDeviceData { public class ModbusDeviceData {
private String deviceId; private String deviceCode;
/** IP地址 */
private String fIp;
/** 端口号 */
private Integer fPort;
/**
* 0空闲,1运行,2故障
*/
private String deviceStatus;
/**
* 故障原因
*/
private String errorReason;
private Map<Integer, String> registerValues; // key: 寄存器地址, value: 读取结果 private Map<Integer, String> registerValues; // key: 寄存器地址, value: 读取结果
public String getDeviceId() { public String getDeviceCode() {
return deviceId; return deviceCode;
} }
public void setDeviceId(String deviceId) { public void setDeviceCode(String deviceCode) {
this.deviceId = deviceId; this.deviceCode = deviceCode;
} }
public Map<Integer, String> getRegisterValues() { public Map<Integer, String> getRegisterValues() {
...@@ -26,4 +43,36 @@ public class ModbusDeviceData { ...@@ -26,4 +43,36 @@ public class ModbusDeviceData {
public void setRegisterValues(Map<Integer, String> registerValues) { public void setRegisterValues(Map<Integer, String> registerValues) {
this.registerValues = registerValues; this.registerValues = registerValues;
} }
public String getDeviceStatus() {
return deviceStatus;
}
public void setDeviceStatus(String deviceStatus) {
this.deviceStatus = deviceStatus;
}
public String getErrorReason() {
return errorReason;
}
public void setErrorReason(String errorReason) {
this.errorReason = errorReason;
}
public String getfIp() {
return fIp;
}
public void setfIp(String fIp) {
this.fIp = fIp;
}
public Integer getfPort() {
return fPort;
}
public void setfPort(Integer fPort) {
this.fPort = fPort;
}
} }
import request from '@/utils/request'
// 查询用户列表
export function getAgingCabinetAndPowerCheck() {
return request({
url: '/testTaskController/getAgingCabinetAndPowerCheck',
method: 'get'
})
}
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
size="mini"
@click="testAgingCabinetAndPowerCheck"
>测试老化柜状态获取
</el-button>
</el-col>
</el-row>
<el-input
type="textarea"
:rows="25"
placeholder="返回内容信息"
v-model="textarea">
</el-input>
</div>
</template>
<script>
import {getAgingCabinetAndPowerCheck} from "@/api/testScheduledTasks/testTasks";
export default {
name: "TestScheduledTasks",
data() {
return {
textarea: null
};
},
created() {
},
methods: {
testAgingCabinetAndPowerCheck() {
getAgingCabinetAndPowerCheck().then(response => {
this.textarea = "";
if (response.length > 0) {
for (let i = 0; i < response.length; i++) {
let item = response[i];
let deviceCode = item.deviceCode;
let registerValues = item.registerValues;
let deviceStatus = item.deviceStatus;
for (let i = 0; i < 10; i++) {
let registerValue = registerValues[i];
this.textarea += "设备编号:" + deviceCode + "状态是:" + deviceStatus + " 寄存器编号:" + i + " 寄存器值:" + registerValue + "\n";
}
}
}
}
);
}
}
};
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment