Commit 4ce12856 authored by wanghao's avatar wanghao

1 换了新程序后 写时间 失效问题测试

parent 2a225540
......@@ -17,7 +17,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* modbus通讯工具类,采用modbus4j实现
......@@ -43,6 +46,7 @@ public class Modbus4jUtils {
// 监控控制标志
private static final AtomicBoolean monitoring = new AtomicBoolean(false);
private static final Lock masterLock = new ReentrantLock();
/**
* 工厂。
*/
......@@ -525,7 +529,6 @@ public class Modbus4jUtils {
return true;
}
}
/**
* 写[01 Coil Status(0x)] 写一个 function ID = 5
* @param master
......@@ -587,7 +590,6 @@ public class Modbus4jUtils {
*/
public static boolean writeRegister(ModbusMaster master ,int slaveId, int writeOffset, short writeValue)
throws ModbusTransportException, ModbusInitException {
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
log.info("发送写入请求:从站={}, 地址={}, 值={}", slaveId, writeOffset, writeValue);
......@@ -651,6 +653,108 @@ public class Modbus4jUtils {
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写入多个保持寄存器(更稳定,支持批量)
*/
......@@ -850,8 +954,8 @@ public class Modbus4jUtils {
try {
// 读取 第1个 pcba 板子的数据
modbusMaster = createModbusMaster("192.168.2.1", 501);
// writeCurrentTimeToDeviceEnhanced(modbusMaster, 1);
writeTimeRegisters(modbusMaster, 1);
writeCurrentTimeUseWriteRegisters(modbusMaster, 1);
// writeTimeRegisters(modbusMaster, 1);
} catch (Exception e) {
e.printStackTrace();
} finally {
......@@ -985,6 +1089,26 @@ public class Modbus4jUtils {
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);
}
}
/**
* 增强版:写入并实时验证每个字段
......
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