Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
Z
zhmes-agecal
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
耿迪迪
zhmes-agecal
Commits
bc2729d0
Commit
bc2729d0
authored
Jun 12, 2025
by
wanghao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1 使用 modbus4j + juc 实现 读取老化柜和老化层状态--测试中
parent
984865fe
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
413 additions
and
28 deletions
+413
-28
TestTaskController.java
...m/zehong/web/controller/equipment/TestTaskController.java
+224
-0
AgingCabinetInspectionAndPowerCheckTask.java
...ong/web/task/AgingCabinetInspectionAndPowerCheckTask.java
+16
-16
Modbus4jUtils.java
...ain/java/com/zehong/framework/modbus4j/Modbus4jUtils.java
+50
-5
ModbusTcpTask.java
...ain/java/com/zehong/framework/modbus4j/ModbusTcpTask.java
+1
-1
ModbusDeviceData.java
...ava/com/zehong/system/domain/modbus/ModbusDeviceData.java
+55
-6
testTasks.js
zhmes-agecal-web/src/api/testScheduledTasks/testTasks.js
+10
-0
index.vue
zhmes-agecal-web/src/views/testScheduledTasks/index.vue
+57
-0
No files found.
zhmes-agecal-admin/src/main/java/com/zehong/web/controller/equipment/TestTaskController.java
0 → 100644
View file @
bc2729d0
This diff is collapsed.
Click to expand it.
zhmes-agecal-admin/src/main/java/com/zehong/web/task/AgingCabinetInspectionAndPowerCheckTask.java
View file @
bc2729d0
...
...
@@ -61,23 +61,23 @@ public class AgingCabinetInspectionAndPowerCheckTask {
type
.
add
(
"2"
);
List
<
TEquipmentInfo
>
equipmentInfos
=
tEquipmentInfoService
.
selectTEquipmentList
(
type
);
try
{
if
(
equipmentInfos
.
size
()
==
0
)
{
log
.
error
(
"设备列表查询结果为空"
);
throw
new
Exception
(
"无设备信息!"
);
}
// 10 层
//
try {
//
if (equipmentInfos.size() == 0) {
//
log.error("设备列表查询结果为空");
//
throw new Exception("无设备信息!");
//
}
//
//
// 10 层
// 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(() -> {
// ModbusMaster master = null;
// try {
// master = Modbus4jUtils.getMaster(equipmentInfo.getfIp(), equipmentInfo.getfPort());
// Map<Integer, Object> integerObjectMap = Modbus4jUtils.batchReadAgingCabinet(master, registerOffset);
// Map<Integer, Object> integerObjectMap = Modbus4jUtils.batchReadAgingCabinet
Status
(master, registerOffset);
// // 构造结果对象
// ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDevice
Id(equipmentInfo.getfEquipmentId().toString
());
// deviceData.setDevice
Code(equipmentInfo.getfEquipmentCode
());
// deviceData.setRegisterValues(integerObjectMap.entrySet().stream()
// .collect(Collectors.toMap(
// Map.Entry::getKey,
...
...
@@ -92,7 +92,7 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// Map<Integer, String> errorMap = new HashMap<>();
//
// ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDevice
Id
("");
// deviceData.setDevice
Code
("");
// deviceData.setRegisterValues(errorMap);
//
// return deviceData;
...
...
@@ -102,7 +102,7 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// registerOffset.forEach(offset -> errorMap.put(offset, "ERROR: " + e.getMessage()));
//
// ModbusDeviceData deviceData = new ModbusDeviceData();
// deviceData.setDevice
Id(equipmentInfo.getfEquipmentId().toString
());
// deviceData.setDevice
Code(equipmentInfo.getfEquipmentCode
());
// deviceData.setRegisterValues(errorMap);
//
// return deviceData;
...
...
@@ -128,15 +128,15 @@ public class AgingCabinetInspectionAndPowerCheckTask {
// deferredResult.setResult(result);
// }
// });
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
//
//
} catch (Exception e) {
//
e.printStackTrace();
//
}
}
private
ModbusDeviceData
createErrorData
(
Throwable
ex
)
{
ModbusDeviceData
errorData
=
new
ModbusDeviceData
();
errorData
.
setDevice
Id
(
"error"
);
errorData
.
setDevice
Code
(
"error"
);
errorData
.
setRegisterValues
(
Collections
.
singletonMap
(
0
,
"系统错误:"
+
ex
.
getMessage
()));
return
errorData
;
}
...
...
zhmes-agecal-framework/src/main/java/com/zehong/framework/modbus4j/Modbus4jUtils.java
View file @
bc2729d0
...
...
@@ -14,6 +14,7 @@ import com.serotonin.modbus4j.msg.*;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -22,6 +23,7 @@ import java.util.Map;
* modbus通讯工具类,采用modbus4j实现
*
*/
@SuppressWarnings
(
value
=
"all"
)
public
class
Modbus4jUtils
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
Modbus4jUtils
.
class
);
...
...
@@ -196,10 +198,32 @@ public class Modbus4jUtils {
throws
ModbusTransportException
,
ErrorResponseException
,
ModbusInitException
{
// 04 Input Registers类型数据读取
BaseLocator
<
Number
>
loc
=
BaseLocator
.
inputRegister
(
slaveId
,
offset
,
dataType
);
Number
value
=
getMaster
()
.
getValue
(
loc
);
Number
value
=
master
.
getValue
(
loc
);
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 {
* @throws ErrorResponseException e
* @throws ModbusInitException m
*/
public
static
Map
<
Integer
,
Object
>
batchReadAgingCabinet
(
ModbusMaster
master
,
List
<
Integer
>
registerOffsets
)
throws
ModbusTransportException
,
ErrorResponseException
{
public
static
Map
<
Integer
,
Object
>
batchReadAgingCabinet
Status
(
ModbusMaster
master
,
List
<
Integer
>
registerOffsets
)
throws
ModbusInitException
,
ModbusTransportException
,
ErrorResponseException
{
BatchRead
<
Integer
>
batch
=
new
BatchRead
<
Integer
>();
for
(
Integer
registerOffset
:
registerOffsets
)
{
batch
.
addLocator
(
registerOffset
,
BaseLocator
.
holdingRegister
(
1
,
registerOffset
,
DataType
.
FOUR_BYTE_FLOAT
));
batch
.
addLocator
(
registerOffset
,
BaseLocator
.
inputStatus
(
1
,
registerOffset
));
}
// 非连续地址也支持
batch
.
setContiguousRequests
(
fals
e
);
batch
.
setContiguousRequests
(
tru
e
);
BatchResults
<
Integer
>
send
=
master
.
send
(
batch
);
//
Map
<
Integer
,
Object
>
result
=
new
HashMap
<>();
for
(
Integer
registerOffset
:
registerOffsets
)
{
result
.
put
(
registerOffset
,
send
.
getValue
(
registerOffset
));
...
...
@@ -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
*
...
...
zhmes-agecal-framework/src/main/java/com/zehong/framework/modbus4j/ModbusTcpTask.java
View file @
bc2729d0
...
...
@@ -29,7 +29,7 @@ public class ModbusTcpTask implements Callable<Map<Integer, Object>> {
ModbusMaster
master
=
null
;
try
{
master
=
Modbus4jUtils
.
getMaster
(
equipmentInfo
.
getfIp
(),
equipmentInfo
.
getfPort
());
return
Modbus4jUtils
.
batchReadAgingCabinet
(
master
,
registerOffsets
);
return
Modbus4jUtils
.
batchReadAgingCabinet
Status
(
master
,
registerOffsets
);
}
catch
(
ModbusInitException
e
)
{
Map
<
Integer
,
Object
>
errorMap
=
new
HashMap
<>();
errorMap
.
put
(
1
,-
1
);
...
...
zhmes-agecal-system/src/main/java/com/zehong/system/domain/modbus/ModbusDeviceData.java
View file @
bc2729d0
...
...
@@ -5,18 +5,35 @@ import java.util.Map;
/**
* @author lenovo
* @date 2025/6/9
* @description
TODO
* @description
modbus设备数据
*/
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: 读取结果
public
String
getDevice
Id
()
{
return
device
Id
;
public
String
getDevice
Code
()
{
return
device
Code
;
}
public
void
setDevice
Id
(
String
deviceId
)
{
this
.
device
Id
=
deviceId
;
public
void
setDevice
Code
(
String
deviceCode
)
{
this
.
device
Code
=
deviceCode
;
}
public
Map
<
Integer
,
String
>
getRegisterValues
()
{
...
...
@@ -26,4 +43,36 @@ public class ModbusDeviceData {
public
void
setRegisterValues
(
Map
<
Integer
,
String
>
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
;
}
}
zhmes-agecal-web/src/api/testScheduledTasks/testTasks.js
0 → 100644
View file @
bc2729d0
import
request
from
'@/utils/request'
// 查询用户列表
export
function
getAgingCabinetAndPowerCheck
()
{
return
request
({
url
:
'/testTaskController/getAgingCabinetAndPowerCheck'
,
method
:
'get'
})
}
zhmes-agecal-web/src/views/testScheduledTasks/index.vue
0 → 100644
View file @
bc2729d0
<
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
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment