Commit 533cce1e authored by wanghao's avatar wanghao

1 开始标检后 时间设置及 状态 和 数据 记录;

parent 858fc493
......@@ -51,8 +51,36 @@ public class PalletDeviceBinding extends BaseEntity
@Excel(name = "解绑时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date unbindingTime;
/**
* 状态
*/
private String status;
/**
* modbus 通信设置时间 年
*/
private String recordYear;
/**
* modbus 通信设置时间 月
*/
private String recordMonth;
/**
* modbus 通信设置时间 日
*/
private String recordDate;
/**
* modbus 通信设置时间 时
*/
private String recordHour;
/**
* modbus 通信设置时间 分
*/
private String recordMinute;
public String getStatus() {
return status;
}
......@@ -133,6 +161,46 @@ public class PalletDeviceBinding extends BaseEntity
return unbindingTime;
}
public String getRecordYear() {
return recordYear;
}
public void setRecordYear(String recordYear) {
this.recordYear = recordYear;
}
public String getRecordMonth() {
return recordMonth;
}
public void setRecordMonth(String recordMonth) {
this.recordMonth = recordMonth;
}
public String getRecordDate() {
return recordDate;
}
public void setRecordDate(String recordDate) {
this.recordDate = recordDate;
}
public String getRecordHour() {
return recordHour;
}
public void setRecordHour(String recordHour) {
this.recordHour = recordHour;
}
public String getRecordMinute() {
return recordMinute;
}
public void setRecordMinute(String recordMinute) {
this.recordMinute = recordMinute;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
......
......@@ -20,6 +20,14 @@ public interface PalletDeviceBindingMapper
*/
public PalletDeviceBinding selectPalletDeviceBindingById(Long palletDeviceBindingId);
/**
* 根据 老化柜 层 ip 和 index 查询
* @param ip ip
* @param index index
* @return r
*/
public PalletDeviceBinding selectByTrayIdAndIndex(@Param("ip") String ip, @Param("index") Integer index);
/**
* 查询托盘绑定的设备列列表
*
......
......@@ -9,7 +9,7 @@ import com.serotonin.modbus4j.msg.ModbusResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
import com.zehong.system.domain.TEquipmentAlarmData;
import com.zehong.system.modbus.dto.DeviceStatusReaderDto;
import com.zehong.system.modbus.handler.dto.DeviceStatusReaderDto;
import com.zehong.system.modbus.util.Modbus4jUtils;
import com.zehong.system.service.ITEquipmentAlarmDataService;
import org.springframework.stereotype.Component;
......
package com.zehong.system.modbus.handler;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.zehong.system.domain.PalletDeviceBinding;
import com.zehong.system.domain.TEquipmentAlarmData;
import com.zehong.system.mapper.PalletDeviceBindingMapper;
import com.zehong.system.modbus.business.DeviceStatusReaderAndTimeSetter;
import com.zehong.system.modbus.dto.DeviceStatusReaderDto;
import com.zehong.system.modbus.handler.dto.DeviceStatusReaderDto;
import com.zehong.system.modbus.util.Modbus4jUtils;
import com.zehong.system.service.ITEquipmentAlarmDataService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* @author lenovo
* @date 2025/6/27
* @description TODO
* @description 读取数据后根据状态判断设置时间
*/
@Component
public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
@Resource
private ITEquipmentAlarmDataService alarmDataService;
@Resource
private PalletDeviceBindingMapper palletDeviceBindingMapper;
// 创建固定大小的线程池(根据实际情况调整大小)
private static final ExecutorService executorService = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors() * 2
);
@Override
public void accept(DeviceStatusReaderDto deviceStatusReaderDto) {
// 提交任务到线程池异步执行
executorService.submit(() -> handleData(deviceStatusReaderDto));
}
// 实际的数据处理方法(线程安全)
private void handleData(DeviceStatusReaderDto dto) {
int deviceId = dto.getDeviceId();
int[] data = dto.getRegisterData();
String ip = dto.getIp();
int port = dto.getPort();
int deviceId = deviceStatusReaderDto.getDeviceId();
int[] data = deviceStatusReaderDto.getRegisterData();
String ip = deviceStatusReaderDto.getIp();
int port = deviceStatusReaderDto.getPort();
// 根据 层ip 查找 层 code 根据层code 查 托盘id 根据托盘id 和 deviceId 查 绑定的点位数据
PalletDeviceBinding palletDeviceBinding = palletDeviceBindingMapper.selectByTrayIdAndIndex(ip, deviceId);
System.out.println(">>> 回调处理: 接收到新数据");
TEquipmentAlarmData alarmData;
// 1 获取 线程专有的Modbus连接
try {
ModbusMaster master = Modbus4jUtils.getMaster(ip, port);
System.out.println(">>> 回调处理[" + Thread.currentThread().getName() + "]: 接收到新数据");
System.out.println(" 数据: " + Arrays.toString(data));
if (data.length >= 2 && data[1] == DeviceStatusReaderAndTimeSetter.TARGET_VALUE) {
System.out.println(" >>> 注意: 第二个寄存器值为1!");
if (data.length >= 2) {
// 给点位设置状态
palletDeviceBinding.setStatus(data[1] + "");
System.out.println(" >>> 注意: 第二个寄存器值为1 或者 3 或者 4 允许写时间!");
if(data[1] == 1 || data[1] == 3 || data[1] == 4) {
Calendar cal = Calendar.getInstance();
// 当前年
int y = cal.get(Calendar.YEAR);
// 当前月
int m = cal.get(Calendar.MONTH) + 1;
// 当前日
int d = cal.get(Calendar.DATE);
// 当前小时
int h = cal.get(Calendar.HOUR_OF_DAY);
// 当前分钟
int mm = cal.get(Calendar.MINUTE);
boolean yearResult = Modbus4jUtils.writeRegister(master,deviceId, 4, (short) y);
if(!yearResult) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("年-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(y + "");
}
boolean mResult = Modbus4jUtils.writeRegister(master,deviceId, 5, (short) m);
if(!mResult) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("月-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(m + "");
}
boolean dResult = Modbus4jUtils.writeRegister(master,deviceId, 6, (short) d);
if(!dResult) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("天-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(h + "");
}
boolean hResult = Modbus4jUtils.writeRegister(master,deviceId, 7, (short) h);
if(!hResult) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("时-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(d + "");
}
boolean mmResult = Modbus4jUtils.writeRegister(master,deviceId, 8, (short) mm);
if(!mmResult) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("分-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
} else {
palletDeviceBinding.setRecordYear(mm + "");
}
// 更新
palletDeviceBindingMapper.updatePalletDeviceBinding(palletDeviceBinding);
} else {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("三次读取后 状态不是为 1 或 3 或 4");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}
} else {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04");
alarmData.setCreateTime(new Date());
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("三次读取后 状态不是为 1 或 3 或 4");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}
} catch (ModbusInitException e) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04"); //01.老化柜 02.机械臂 03.老化层 04.点位
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port );
alarmData.setfAlarmData("Modbus初始化失败");
alarmData.setCreateTime(new Date());
alarmDataService.insertTEquipmentAlarmData(alarmData);
} catch (ModbusTransportException e) {
alarmData = new TEquipmentAlarmData();
alarmData.setfAlarmType("04"); //01.老化柜 02.机械臂 03.老化层 04.点位
alarmData.setfEquipmentCode("ip:" + ip + ",port:" + port + "deviceId:" + deviceId);
alarmData.setfAlarmData("日期写入失败");
alarmData.setCreateTime(new Date());
alarmDataService.insertTEquipmentAlarmData(alarmData);
}
}
// 创建通用的停止条件(可选)
public static Predicate<int[]> createDefaultStopCondition() {
return values -> values.length >= 2 && values[1] == DeviceStatusReaderAndTimeSetter.TARGET_VALUE;
......
......@@ -62,10 +62,12 @@ public class Modbus4jUtils {
// modbusFactory.createRtuMaster(wapper); //RTU 协议
// modbusFactory.createUdpMaster(params);//UDP 协议
// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议
if(master == null || !master.isConnected()) {
master = modbusFactory.createTcpMaster(params, false);// TCP 协议
master.setTimeout(3000); // 设置超时时间
master.setTimeout(5000); // 设置超时时间
master.setRetries(3); // 设置重试次数
master.init();
}
return master;
}
......@@ -457,32 +459,102 @@ public class Modbus4jUtils {
}
}
/**
* 写入单个 Holding Register(功能码 6)
*
* @param slaveId 从站ID
* @param writeOffset 寄存器偏移地址(如 0 表示地址 40001)
* @param writeValue 要写入的值(short 类型)
* @return 是否写入成功
* @throws ModbusTransportException 如果传输失败
* @throws ModbusInitException 如果初始化失败
*/
public static boolean writeRegister(ModbusMaster master ,int slaveId, int writeOffset, short writeValue)
throws ModbusTransportException, ModbusInitException {
/***
* 写[03 Holding Register(4x)] 写一个 function ID = 6
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
log.info("发送写入请求:从站={}, 地址={}, 值={}", slaveId, writeOffset, writeValue);
WriteRegisterResponse response = null;
synchronized (master) { // 多线程下保护主站资源
response = (WriteRegisterResponse) master.send(request);
}
if (response == null) {
log.error("未收到 Modbus 响应");
return false;
}
if (response.isException()) {
log.error("Modbus 异常响应: {}", response.getExceptionMessage());
return false;
}
log.info("写入成功,响应确认");
return true;
}
/**
* 写入单个 Holding Register(功能码 6)
*
* @param slaveId s
* @param writeOffset w
* @param writeValue w
* @return
* @throws ModbusTransportException m
* @throws ModbusInitException m
* @param slaveId 从站ID
* @param writeOffset 寄存器偏移地址(如 0 表示地址 40001)
* @param writeValue 要写入的值(short 类型)
* @return 是否写入成功
* @throws ModbusTransportException 如果传输失败
* @throws ModbusInitException 如果初始化失败
*/
public static boolean writeRegister(int slaveId, int writeOffset, short writeValue)
throws ModbusTransportException, ModbusInitException {
// 获取master
ModbusMaster tcpMaster = getMaster();
// 创建请求对象
ModbusMaster master = getMaster();
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
log.info("发送写入请求:从站={}, 地址={}, 值={}", slaveId, writeOffset, writeValue);
WriteRegisterResponse response = null;
synchronized (master) { // 多线程下保护主站资源
response = (WriteRegisterResponse) master.send(request);
}
if (response == null) {
log.error("未收到 Modbus 响应");
return false;
}
if (response.isException()) {
log.error(response.getExceptionMessage());
log.error("Modbus 异常响应: {}", response.getExceptionMessage());
return false;
} else {
return true;
}
log.info("写入成功,响应确认");
return true;
}
/***
* 写[03 Holding Register(4x)] 写一个 function ID = 6
*
* @param slaveId s
* @param writeOffset w
* @param writeValue w
* @return
* @throws ModbusTransportException m
* @throws ModbusInitException m
*/
// public static boolean writeRegister(int slaveId, int writeOffset, short writeValue)
// throws ModbusTransportException, ModbusInitException {
// // 获取master
// ModbusMaster tcpMaster = getMaster();
// // 创建请求对象
// WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
// WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
// if (response.isException()) {
// log.error(response.getExceptionMessage());
// return false;
// } else {
// return true;
// }
//
// }
/**
*
......@@ -514,6 +586,8 @@ public class Modbus4jUtils {
}
}
/**
* 写入数字类型的模拟量(如:写入Float类型的模拟量、Double类型模拟量、整数类型Short、Integer、Long)
*
......@@ -588,6 +662,9 @@ public class Modbus4jUtils {
return unsignedValues;
}
/**
* 测试
*
......@@ -610,18 +687,23 @@ public class Modbus4jUtils {
// 当前分钟
int mm = cal.get(Calendar.MINUTE);
boolean yearResult = writeRegister(1, 0, (short) y);
boolean mResult = writeRegister(1, 0, (short) m);
boolean dResult = writeRegister(1, 0, (short) d);
boolean hResult = writeRegister(1, 0, (short) h);
boolean mmResult = writeRegister(1, 0, (short) mm);
ModbusMaster master1 = getMaster();
boolean yearResult = writeRegister(1, 4, (short) y);
System.out.println(yearResult ? "写入成功" : "写入失败");
boolean mResult = writeRegister(1, 5, (short) m);
System.out.println(mResult ? "写入成功" : "写入失败");
boolean dResult = writeRegister(1, 6, (short) d);
System.out.println(dResult ? "写入成功" : "写入失败");
boolean hResult = writeRegister(1, 7, (short) h);
System.out.println(hResult ? "写入成功" : "写入失败");
boolean mmResult = writeRegister(1, 8, (short) mm);
System.out.println(mmResult ? "写入成功" : "写入失败");
int[] ints = readDeviceRegisters(1);
for (int i = 0; i < ints.length; i++) {
System.out.println(ints[i]);
}
//// 01测试
// Boolean v011 = readCoilStatus(1, 0);
// Boolean v012 = readCoilStatus(1, 1);
......
......@@ -15,10 +15,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="unbindingTime" column="f_unbinding_time" />
<result property="createTime" column="f_create_time" />
<result property="status" column="f_status" />
<result property="recordYear" column="f_record_year" />
<result property="recordMonth" column="f_record_month" />
<result property="recordDate" column="f_record_date" />
<result property="recordHour" column="f_record_hour" />
<result property="recordMinute" column="f_record_minute" />
</resultMap>
<sql id="selectPalletDeviceBindingVo">
select f_pallet_device_binding_id, f_tray_id, f_device_code, f_row, f_col, f_index,f_binding_time, f_unbinding_time, f_create_time,f_status from t_pallet_device_binding
select f_pallet_device_binding_id, f_tray_id, f_device_code, f_row, f_col, f_index,f_binding_time,
f_unbinding_time, f_create_time,f_status,f_record_year,f_record_month,f_record_date,f_record_hour,f_record_minute from t_pallet_device_binding
</sql>
<select id="selectPalletDeviceBindingList" parameterType="PalletDeviceBinding" resultMap="PalletDeviceBindingResult">
......@@ -40,6 +46,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectPalletDeviceBindingVo"/>
where f_pallet_device_binding_id = #{palletDeviceBindingId}
</select>
<select id="selectByTrayIdAndIndex" resultMap="PalletDeviceBindingResult">
select f_pallet_device_binding_id,
f_tray_id,
f_device_code,
f_row,
f_col,
f_index,
f_binding_time,
f_unbinding_time,
f_create_time,
f_status,
f_record_year,
f_record_month,
f_record_date,
f_record_hour,
f_record_minute from t_pallet_device_binding palDeviceBinding where palDeviceBinding.f_tray_id = (
SELECT
trayInfo.f_tray_id
FROM
t_tray_info trayInfo
LEFT JOIN t_storey_info storeyInfo ON trayInfo.f_storey_code = storeyInfo.f_storey_code
where storeyInfo.f_ip = #{ip}
) and palDeviceBinding.f_index = #{index}
</select>
<insert id="batchInsertPalletDeviceBinding" parameterType="list">
insert into t_pallet_device_binding (f_tray_id, f_device_code,f_row,f_col,f_index,f_binding_time,f_unbinding_time,
......@@ -90,6 +121,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="unbindingTime != null">f_unbinding_time = #{unbindingTime},</if>
<if test="createTime != null">f_create_time = #{createTime},</if>
<if test="status != null">f_status = #{status},</if>
<if test="recordYear != null">f_record_year = #{recordYear},</if>
<if test="recordMonth != null">f_record_month = #{recordMonth},</if>
<if test="recordDate != null">f_record_date = #{recordDate},</if>
<if test="recordHour != null">f_record_hour = #{recordHour},</if>
<if test="recordMinute != null">f_record_minute = #{recordMinute},</if>
</trim>
where f_pallet_device_binding_id = #{palletDeviceBindingId}
</update>
......
......@@ -95,7 +95,7 @@ export default {
{ id: 34, deviceStatus: '0' },
{ id: 35, deviceStatus: '0' },
{ id: 36, deviceStatus: '0' },
//...共36个
// //...共36个
],
// 状态对应的颜色类名
statusMap: {
......
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