package com.mes.plcTaskThread;
|
|
import com.mes.md.entity.LineConfiguration;
|
import com.mes.md.entity.Machine;
|
import com.mes.md.entity.PrimitiveTask;
|
import com.mes.md.mapper.MachineMapper;
|
import com.mes.md.mapper.PrimitiveTaskMapper;
|
import com.mes.md.mapper.TaskingMapper;
|
import com.mes.md.service.LineConfigurationService;
|
import com.mes.md.service.PrimitiveTaskService;
|
import com.mes.md.service.TaskingService;
|
import com.mes.service.ModbusTcp;
|
import com.mes.service.PlcAgreement;
|
import com.mes.service.PlcParameter;
|
import com.mes.utils.HexUtil;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
@Slf4j
|
public class MachineLoad extends Thread {
|
|
TaskingMapper taskingMapper;
|
|
MachineMapper machineMapper;
|
|
TaskingService taskingService;
|
|
PrimitiveTaskService primitiveTaskService;
|
|
PrimitiveTaskMapper primitiveTaskMapper;
|
|
LineConfigurationService lineConfigurationService;
|
public Machine thisMachine;
|
//public Long machineId = 2L;
|
public List<Map> sendRecords = new ArrayList<>();
|
|
public MachineLoad(Machine machine, PrimitiveTaskMapper primitiveTaskMapper, TaskingMapper taskingMapper, MachineMapper machineMapper, TaskingService taskingService, PrimitiveTaskService primitiveTaskService, LineConfigurationService lineConfigurationService) {
|
this.thisMachine = machine;
|
this.primitiveTaskMapper = primitiveTaskMapper;
|
this.taskingMapper = taskingMapper;
|
this.machineMapper = machineMapper;
|
this.taskingService = taskingService;
|
this.primitiveTaskService = primitiveTaskService;
|
this.lineConfigurationService = lineConfigurationService;
|
}
|
|
public void plcStart() throws Exception{
|
ModbusTcp modbusTcp1 = null;
|
try {
|
Machine machine = machineMapper.selectById(thisMachine.getId());
|
modbusTcp1 = new ModbusTcp(machine.getIp(), machine.getPort(), machine.getFileName());
|
if (!modbusTcp1.connect()) {
|
log.error("连接PLC失败,退出本次操作");
|
return;
|
}
|
PlcAgreement plcAgreement = modbusTcp1.getPlcAgreement(machine.getFileName());
|
|
if (!modbusTcp1.read(plcAgreement)) {
|
log.info("通讯读取新数据失败");
|
if (!"关机".equals(machine.getStatePowerOn())) {
|
machine.setStatePowerOn("关机");
|
machineMapper.updateById(machine);
|
}
|
modbusTcp1.close();
|
return;
|
}
|
if (!"开机".equals(machine.getStatePowerOn())) {
|
machine.setStatePowerOn("开机");
|
machineMapper.updateById(machine);
|
}
|
PlcParameter plcRequest = plcAgreement.getPlcParameter("plcRequest");//请求字
|
PlcParameter mesSend = plcAgreement.getPlcParameter("mesSend");//发送字
|
PlcParameter mesSendCount = plcAgreement.getPlcParameter("mesSendCount");//发送数量
|
|
PlcParameter plcReport = plcAgreement.getPlcParameter("plcReport");//汇报字
|
PlcParameter plcReportID = plcAgreement.getPlcParameter("plcReportID");//汇报ID
|
PlcParameter mesConfirm = plcAgreement.getPlcParameter("mesConfirm");//确认字
|
PlcParameter mesConfirmID = plcAgreement.getPlcParameter("mesConfirmID");//确认ID
|
if (machine.getIsLog() > 0) {
|
modbusTcp1.consoleLogInfo(plcAgreement);
|
}
|
if (0 == plcRequest.getValueInt() && 1 == mesSend.getValueInt()) {
|
//发送字置0
|
String send = HexUtil.intTo2ByteHex(0);
|
modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesSend.getAddressStart() / 2));
|
log.info("1.发送字置零 发送字 清空成功;内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesSend.getAddressStart()));
|
modbusTcp1.close();
|
return;
|
}
|
if (0 == plcReport.getValueInt() && 0 != mesConfirm.getValueInt()) {
|
//确认字置零
|
String send = HexUtil.intTo2ByteHex(0);
|
modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2));
|
log.info("2.确认字置零 任务完成 清空成功;内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()));
|
modbusTcp1.close();
|
return;
|
}
|
if (1 == plcReport.getValueInt() && 0 == mesConfirm.getValueInt()) {
|
int finishCount = plcReportID.getValueInt();
|
if (finishCount > 0) {//有任务
|
if (machine.getMode() == 1) {
|
//标准模式 找已领取未完成的第一条任务
|
LineConfiguration lineConfiguration = lineConfigurationService.machineLineConfiguration(machine);
|
List<PrimitiveTask> findPrimitiveTasking = primitiveTaskService.findPrimitiveTasking(machine, lineConfiguration.getLineId());
|
for (PrimitiveTask primitiveTask : findPrimitiveTasking) {
|
primitiveTask.setLoadCount(primitiveTask.getLoadCount() + 1);
|
primitiveTaskMapper.updateById(primitiveTask);
|
break;
|
}
|
} else if (machine.getMode() == 3) {
|
machine.setFinshCount(machine.getFinshCount() + plcReportID.getValueInt());
|
machineMapper.updateById(machine);
|
}
|
String send = HexUtil.intTo2ByteHex(1);
|
modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2));
|
log.info("任务完成 成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()));
|
modbusTcp1.close();
|
return;
|
}
|
String send = HexUtil.intTo2ByteHex(1);
|
modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2));
|
log.info("任务完成 异常成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()));
|
modbusTcp1.close();
|
return;
|
}
|
if ((1 == plcRequest.getValueInt() && 0 == mesSend.getValueInt())
|
&& "开工".equals(machine.getState())) {
|
int loadCount = 0;
|
if (machine.getMode() == 1) {
|
//标准模式 找已领取未完成的第一条任务
|
LineConfiguration lineConfiguration = lineConfigurationService.machineLineConfiguration(machine);
|
List<PrimitiveTask> findPrimitiveTasking = primitiveTaskService.findPrimitiveTasking(machine, lineConfiguration.getLineId());
|
for (PrimitiveTask primitiveTask : findPrimitiveTasking) {
|
//任务数-已上数量>0 返回1
|
if ((primitiveTask.getTaskQuantity() - primitiveTask.getLoadCount()) > 0) {
|
loadCount = 1;
|
}
|
break;
|
}
|
} else if (machine.getMode() == 2) {
|
//定制模式
|
loadCount = 1;
|
} else if (machine.getMode() == 3) {
|
loadCount = machine.getTaskCount() - machine.getFinshCount();
|
loadCount = (loadCount > 0 ? 1 : 0);
|
}
|
if (loadCount > 0) {
|
log.info("4、发送任务 任务数据:{}, 设备状态:{}, ", loadCount, machine);
|
String send = HexUtil.intTo2ByteHex(1) + HexUtil.intTo2ByteHex(loadCount);
|
modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesSend.getAddressStart() / 2));
|
log.info("发送任务发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesSend.getAddressStart() / 2));
|
modbusTcp1.close();
|
return;
|
}
|
}
|
} catch (Exception e) {
|
log.info("交互逻辑错误");
|
} finally {
|
// 确保连接关闭
|
if (modbusTcp1 != null) {
|
modbusTcp1.close();
|
}
|
}
|
}
|
|
@Override
|
public void run() {
|
while (true) {
|
try {
|
Thread.sleep(1000);
|
plcStart();
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
}
|
}
|
}
|