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
4ce12856
Commit
4ce12856
authored
Dec 25, 2025
by
wanghao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1 换了新程序后 写时间 失效问题测试
parent
2a225540
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
128 additions
and
4 deletions
+128
-4
Modbus4jUtils.java
...ain/java/com/zehong/system/modbus/util/Modbus4jUtils.java
+128
-4
No files found.
zhmes-agecal-system/src/main/java/com/zehong/system/modbus/util/Modbus4jUtils.java
View file @
4ce12856
...
@@ -17,7 +17,10 @@ import org.slf4j.Logger;
...
@@ -17,7 +17,10 @@ import org.slf4j.Logger;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.concurrent.locks.Lock
;
import
java.util.concurrent.locks.ReentrantLock
;
/**
/**
* modbus通讯工具类,采用modbus4j实现
* modbus通讯工具类,采用modbus4j实现
...
@@ -43,6 +46,7 @@ public class Modbus4jUtils {
...
@@ -43,6 +46,7 @@ public class Modbus4jUtils {
// 监控控制标志
// 监控控制标志
private
static
final
AtomicBoolean
monitoring
=
new
AtomicBoolean
(
false
);
private
static
final
AtomicBoolean
monitoring
=
new
AtomicBoolean
(
false
);
private
static
final
Lock
masterLock
=
new
ReentrantLock
();
/**
/**
* 工厂。
* 工厂。
*/
*/
...
@@ -525,7 +529,6 @@ public class Modbus4jUtils {
...
@@ -525,7 +529,6 @@ public class Modbus4jUtils {
return
true
;
return
true
;
}
}
}
}
/**
/**
* 写[01 Coil Status(0x)] 写一个 function ID = 5
* 写[01 Coil Status(0x)] 写一个 function ID = 5
* @param master
* @param master
...
@@ -587,7 +590,6 @@ public class Modbus4jUtils {
...
@@ -587,7 +590,6 @@ public class Modbus4jUtils {
*/
*/
public
static
boolean
writeRegister
(
ModbusMaster
master
,
int
slaveId
,
int
writeOffset
,
short
writeValue
)
public
static
boolean
writeRegister
(
ModbusMaster
master
,
int
slaveId
,
int
writeOffset
,
short
writeValue
)
throws
ModbusTransportException
,
ModbusInitException
{
throws
ModbusTransportException
,
ModbusInitException
{
WriteRegisterRequest
request
=
new
WriteRegisterRequest
(
slaveId
,
writeOffset
,
writeValue
);
WriteRegisterRequest
request
=
new
WriteRegisterRequest
(
slaveId
,
writeOffset
,
writeValue
);
log
.
info
(
"发送写入请求:从站={}, 地址={}, 值={}"
,
slaveId
,
writeOffset
,
writeValue
);
log
.
info
(
"发送写入请求:从站={}, 地址={}, 值={}"
,
slaveId
,
writeOffset
,
writeValue
);
...
@@ -651,6 +653,108 @@ public class Modbus4jUtils {
...
@@ -651,6 +653,108 @@ public class Modbus4jUtils {
return
true
;
return
true
;
}
}
/**
* 批量写入保持寄存器(功能码16)
*
* @param master Modbus主站实例
* @param slaveId 从站ID
* @param startOffset 起始寄存器偏移地址
* @param values 要写入的值数组
* @return 写入是否成功
* @throws ModbusTransportException 传输异常
* @throws ModbusInitException 初始化异常
*/
public
static
boolean
writeRegisters
(
ModbusMaster
master
,
int
slaveId
,
int
startOffset
,
short
[]
values
)
throws
ModbusTransportException
,
ModbusInitException
{
if
(
values
==
null
||
values
.
length
==
0
)
{
log
.
warn
(
"写入值为空,不执行写入操作"
);
return
false
;
}
if
(
values
.
length
>
123
)
{
// Modbus协议限制
log
.
error
(
"批量写入数量超出限制:{} > 123"
,
values
.
length
);
return
false
;
}
WriteRegistersRequest
request
=
new
WriteRegistersRequest
(
slaveId
,
startOffset
,
values
);
log
.
info
(
"发送批量写入请求:从站={}, 起始地址={}, 数量={}"
,
slaveId
,
startOffset
,
values
.
length
);
WriteRegistersResponse
response
=
null
;
boolean
lockAcquired
=
false
;
try
{
// 尝试获取锁,最多等待500ms
lockAcquired
=
masterLock
.
tryLock
(
500
,
TimeUnit
.
MILLISECONDS
);
if
(!
lockAcquired
)
{
log
.
warn
(
"获取Modbus主站锁超时,从站={}"
,
slaveId
);
return
false
;
}
// 发送请求
response
=
(
WriteRegistersResponse
)
master
.
send
(
request
);
}
catch
(
InterruptedException
e
)
{
Thread
.
currentThread
().
interrupt
();
log
.
error
(
"获取锁时被中断"
,
e
);
return
false
;
}
finally
{
if
(
lockAcquired
)
{
masterLock
.
unlock
();
}
}
return
processBatchResponse
(
response
,
slaveId
,
startOffset
,
values
);
}
/**
* 处理批量写入响应
*/
private
static
boolean
processBatchResponse
(
WriteRegistersResponse
response
,
int
slaveId
,
int
startOffset
,
short
[]
values
)
{
if
(
response
==
null
)
{
log
.
error
(
"未收到Modbus批量写入响应,从站={}, 起始地址={}"
,
slaveId
,
startOffset
);
return
false
;
}
if
(
response
.
isException
())
{
log
.
error
(
"Modbus批量写入异常响应,从站={}, 起始地址={}, 异常码={}"
,
slaveId
,
startOffset
,
response
.
getExceptionCode
());
return
false
;
}
log
.
info
(
"批量写入成功:从站={}, 起始地址={}, 数量={}"
,
slaveId
,
startOffset
,
values
.
length
);
return
true
;
}
/**
* 批量写入整型数组
*/
public
static
boolean
writeIntRegisters
(
ModbusMaster
master
,
int
slaveId
,
int
startOffset
,
int
[]
intValues
)
throws
ModbusTransportException
,
ModbusInitException
{
if
(
intValues
==
null
||
intValues
.
length
==
0
)
{
return
false
;
}
// 将int转换为short(每个int占2个寄存器)
short
[]
values
=
new
short
[
intValues
.
length
*
2
];
for
(
int
i
=
0
;
i
<
intValues
.
length
;
i
++)
{
// 高位在前
values
[
i
*
2
]
=
(
short
)
((
intValues
[
i
]
>>
16
)
&
0xFFFF
);
values
[
i
*
2
+
1
]
=
(
short
)
(
intValues
[
i
]
&
0xFFFF
);
}
return
writeRegisters
(
master
,
slaveId
,
startOffset
,
values
);
}
/**
/**
* 使用功能码16写入多个保持寄存器(更稳定,支持批量)
* 使用功能码16写入多个保持寄存器(更稳定,支持批量)
*/
*/
...
@@ -850,8 +954,8 @@ public class Modbus4jUtils {
...
@@ -850,8 +954,8 @@ public class Modbus4jUtils {
try
{
try
{
// 读取 第1个 pcba 板子的数据
// 读取 第1个 pcba 板子的数据
modbusMaster
=
createModbusMaster
(
"192.168.2.1"
,
501
);
modbusMaster
=
createModbusMaster
(
"192.168.2.1"
,
501
);
// writeCurrentTimeToDeviceEnhanced
(modbusMaster, 1);
writeCurrentTimeUseWriteRegisters
(
modbusMaster
,
1
);
writeTimeRegisters
(
modbusMaster
,
1
);
//
writeTimeRegisters(modbusMaster, 1);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
finally
{
}
finally
{
...
@@ -985,6 +1089,26 @@ public class Modbus4jUtils {
...
@@ -985,6 +1089,26 @@ public class Modbus4jUtils {
return
unsignedValues
;
return
unsignedValues
;
}
}
public
static
void
writeCurrentTimeUseWriteRegisters
(
ModbusMaster
master
,
int
deviceId
)
{
long
timestamp
=
System
.
currentTimeMillis
();
try
{
Calendar
cal
=
Calendar
.
getInstance
();
int
year
=
cal
.
get
(
Calendar
.
YEAR
);
int
month
=
cal
.
get
(
Calendar
.
MONTH
)
+
1
;
int
day
=
cal
.
get
(
Calendar
.
DATE
);
int
hour
=
cal
.
get
(
Calendar
.
HOUR_OF_DAY
);
int
minute
=
cal
.
get
(
Calendar
.
MINUTE
);
writeRegisters
(
master
,
deviceId
,
START_ADDRESS
,
new
short
[]{
(
short
)
year
,
(
short
)
month
,
(
short
)
day
,
(
short
)
hour
,
(
short
)
minute
});
log
.
info
(
"设备{}时间写入成功"
,
deviceId
);
long
endTime
=
System
.
currentTimeMillis
();
log
.
info
(
"设备{}时间写入耗时: {}ms"
,
deviceId
,
endTime
-
timestamp
);
}
catch
(
Exception
e
)
{
log
.
error
(
"设备{}时间写入异常"
,
deviceId
,
e
);
}
}
/**
/**
* 增强版:写入并实时验证每个字段
* 增强版:写入并实时验证每个字段
...
...
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