package com.zy.core.thread.impl; import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.DeviceConfig; import com.zy.asrs.entity.DeviceDataLog; import com.zy.asrs.service.BasRgvService; import com.zy.common.utils.RedisUtil; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.RedisKeyType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CommandResponse; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.network.DeviceConnectPool; import com.zy.core.network.ZyRgvConnectDriver; import com.zy.core.network.entity.ZyRgvStatusEntity; import com.zy.core.thread.RgvThread; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.Date; @Data @Slf4j public class ZyRgvThread implements Runnable, RgvThread { private DeviceConfig deviceConfig; private RedisUtil redisUtil; private ZyRgvConnectDriver zyRgvConnectDriver; private RgvProtocol rgvProtocol; public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { this.deviceConfig = deviceConfig; this.redisUtil = redisUtil; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { connect(); initRgv(); while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo()); if (task != null) { step = task.getStep(); } switch (step) { case 1: readStatus(); break; case 2: sendCommand((RgvCommand) task.getData()); break; default: break; } Thread.sleep(200); } catch (Exception e) { e.printStackTrace(); } } } private void initRgv() { if (rgvProtocol == null) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(deviceConfig.getDeviceNo()); } rgvProtocol.setMode(0); rgvProtocol.setTaskNo(0); rgvProtocol.setStatus(-1); rgvProtocol.setRgvPos(0); rgvProtocol.setLoaded(0); rgvProtocol.setAlarm(0); } @Override public boolean connect() { zyRgvConnectDriver = new ZyRgvConnectDriver(deviceConfig); new Thread(zyRgvConnectDriver).start(); DeviceConnectPool.put(SlaveType.Rgv, deviceConfig.getDeviceNo(), zyRgvConnectDriver); return true; } private void readStatus() { ZyRgvStatusEntity s = zyRgvConnectDriver.getStatus(); if (s == null) { OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV状态失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); return; } rgvProtocol.setMode(s.getMode()); rgvProtocol.setTaskNo(s.getTaskNo()); rgvProtocol.setStatus(s.getStatus()); rgvProtocol.setRgvPos(s.getRgvPos()); rgvProtocol.setLoaded(s.getLoaded()); rgvProtocol.setAlarm(s.getAlarm()); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< RGV实时数据更新成功", DateUtils.convert(new Date()), deviceConfig.getDeviceNo())); if (rgvProtocol.getAlarm() > 0) { rgvProtocol.setLastCommandTime(-1L); } if (rgvProtocol.getAlarm() == 0 && rgvProtocol.getLastCommandTime() == -1) { rgvProtocol.setLastCommandTime(System.currentTimeMillis()); } if (System.currentTimeMillis() - rgvProtocol.getDeviceDataLog() > 200) { DeviceDataLog deviceDataLog = new DeviceDataLog(); deviceDataLog.setOriginData(JSON.toJSONString(s)); deviceDataLog.setWcsData(JSON.toJSONString(rgvProtocol)); deviceDataLog.setType(String.valueOf(SlaveType.Rgv)); deviceDataLog.setDeviceNo(rgvProtocol.getRgvNo()); deviceDataLog.setCreateTime(new Date()); redisUtil.set(RedisKeyType.DEVICE_LOG_KEY.key + System.currentTimeMillis(), deviceDataLog, 60 * 60 * 24); rgvProtocol.setDeviceDataLog(System.currentTimeMillis()); } BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); if (basRgvService != null) { BasRgv basRgv = basRgvService.selectOne(new EntityWrapper().eq("rgv_no", deviceConfig.getDeviceNo())); if(basRgv == null) { basRgv = new BasRgv(); basRgv.setRgvNo(deviceConfig.getDeviceNo()); basRgv.setStatus(1); basRgv.setCreateTime(new Date()); basRgvService.insert(basRgv); } } } @Override public void close() { zyRgvConnectDriver.close(); } @Override public RgvProtocol getStatus() { return rgvProtocol; } @Override public RgvCommand getTransportCommand(Integer taskNo, Integer rgvNo, Integer sourcePos, Integer targetPos) { RgvCommand cmd = new RgvCommand(); cmd.setRgvNo(rgvNo); cmd.setTaskNo(taskNo); cmd.setTaskMode(RgvTaskModeType.FETCH_PUT.id); cmd.setSourcePos(sourcePos); cmd.setTargetPos(targetPos); cmd.setCommand(1); return cmd; } @Override public RgvCommand getMoveCommand(Integer taskNo, Integer rgvNo, Integer targetPos) { RgvCommand cmd = new RgvCommand(); cmd.setRgvNo(rgvNo); cmd.setTaskNo(taskNo); cmd.setTaskMode(RgvTaskModeType.X_MOVE.id); cmd.setTargetPos(targetPos); cmd.setCommand(1); return cmd; } @Override public RgvCommand getResetCommand(Integer rgvNo) { RgvCommand cmd = new RgvCommand(); cmd.setRgvNo(rgvNo); cmd.setTaskNo(0); cmd.setAckFinish(1); cmd.setTaskMode(0); cmd.setCommand(1); return cmd; } @Override public synchronized CommandResponse sendCommand(RgvCommand command) { rgvProtocol.setLastCommandTime(System.currentTimeMillis()); return zyRgvConnectDriver.sendCommand(command); } }