| | |
| | | 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.BasRgvOpt; |
| | | import com.zy.asrs.entity.DeviceConfig; |
| | | import com.zy.asrs.entity.DeviceDataLog; |
| | | import com.zy.asrs.service.BasRgvService; |
| | | import com.zy.asrs.service.BasRgvOptService; |
| | | import com.zy.asrs.utils.Utils; |
| | | 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 java.text.MessageFormat; |
| | | import java.util.Date; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ThreadFactory; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | @Data |
| | | @Slf4j |
| | | public class ZyRgvThread implements Runnable, RgvThread { |
| | | |
| | | private DeviceConfig deviceConfig; |
| | | private RedisUtil redisUtil; |
| | | private ZyRgvConnectDriver zyRgvConnectDriver; |
| | | private RgvProtocol rgvProtocol; |
| | | private int deviceLogCollectTime = 200; |
| | | private volatile boolean closed = false; |
| | | private ScheduledExecutorService readExecutor; |
| | | private ScheduledExecutorService processExecutor; |
| | | |
| | | public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | public void run() { |
| | | connect(); |
| | | initRgv(); |
| | | while (true) { |
| | | readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("RgvReader-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | readExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | try { |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | readStatus(); |
| | | } catch (Exception e) { |
| | | log.error("RgvThread Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("RgvWriter-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | processExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | 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; |
| | | if (step == 2 && task != null) { |
| | | sendCommand((RgvCommand) task.getData()); |
| | | } |
| | | Thread.sleep(200); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | } |
| | | |
| | | private void initRgv() { |
| | |
| | | rgvProtocol = new RgvProtocol(); |
| | | rgvProtocol.setRgvNo(deviceConfig.getDeviceNo()); |
| | | } |
| | | rgvProtocol.setMode(-1); |
| | | rgvProtocol.setMode(0); |
| | | rgvProtocol.setTaskNo(0); |
| | | rgvProtocol.setStatus(-1); |
| | | rgvProtocol.setRgvPos(0); |
| | |
| | | |
| | | @Override |
| | | public boolean connect() { |
| | | SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp()); |
| | | zyRgvConnectDriver = new ZyRgvConnectDriver(siemensS7Net, deviceConfig); |
| | | new Thread(zyRgvConnectDriver).start(); |
| | | zyRgvConnectDriver = new ZyRgvConnectDriver(deviceConfig); |
| | | zyRgvConnectDriver.start(); |
| | | DeviceConnectPool.put(SlaveType.Rgv, deviceConfig.getDeviceNo(), zyRgvConnectDriver); |
| | | return true; |
| | | } |
| | |
| | | rgvProtocol.setLastCommandTime(System.currentTimeMillis()); |
| | | } |
| | | |
| | | if (System.currentTimeMillis() - rgvProtocol.getDeviceDataLog() > 200) { |
| | | if (System.currentTimeMillis() - rgvProtocol.getDeviceDataLog() > deviceLogCollectTime) { |
| | | DeviceDataLog deviceDataLog = new DeviceDataLog(); |
| | | deviceDataLog.setOriginData(JSON.toJSONString(s)); |
| | | deviceDataLog.setWcsData(JSON.toJSONString(rgvProtocol)); |
| | |
| | | redisUtil.set(RedisKeyType.DEVICE_LOG_KEY.key + System.currentTimeMillis(), deviceDataLog, 60 * 60 * 24); |
| | | rgvProtocol.setDeviceDataLog(System.currentTimeMillis()); |
| | | } |
| | | |
| | | BasRgvService basRgvService = null; |
| | | try { |
| | | basRgvService = SpringUtils.getBean(BasRgvService.class); |
| | | } catch (Exception e) { |
| | | |
| | | } |
| | | if (basRgvService != null) { |
| | | BasRgv basRgv = basRgvService.selectOne(new EntityWrapper<BasRgv>().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(); |
| | | closed = true; |
| | | if (zyRgvConnectDriver != null) { |
| | | zyRgvConnectDriver.close(); |
| | | } |
| | | ScheduledExecutorService ex = readExecutor; |
| | | if (ex != null) { |
| | | try { ex.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | ScheduledExecutorService px = processExecutor; |
| | | if (px != null) { |
| | | try { px.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @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.shortValue()); |
| | | cmd.setTaskMode((short) 1); |
| | | cmd.setTargetPos(targetPos.shortValue()); |
| | | cmd.setCommand((short) 1); |
| | | cmd.setTaskNo(taskNo); |
| | | cmd.setTaskMode(RgvTaskModeType.X_MOVE.id); |
| | | cmd.setTargetPos(targetPos); |
| | | cmd.setCommand(1); |
| | | return cmd; |
| | | } |
| | | |
| | |
| | | public RgvCommand getResetCommand(Integer rgvNo) { |
| | | RgvCommand cmd = new RgvCommand(); |
| | | cmd.setRgvNo(rgvNo); |
| | | cmd.setTaskNo((short) 0); |
| | | cmd.setAckFinish((short) 1); |
| | | cmd.setTaskMode((short) 0); |
| | | cmd.setCommand((short) 1); |
| | | 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); |
| | | CommandResponse response = null; |
| | | try { |
| | | response = zyRgvConnectDriver.sendCommand(command); |
| | | return response; |
| | | } finally { |
| | | BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); |
| | | ZyRgvStatusEntity statusEntity = zyRgvConnectDriver.getStatus(); |
| | | BasRgvOpt basRgvOpt = new BasRgvOpt( |
| | | command.getTaskNo(), |
| | | command.getRgvNo(), |
| | | new Date(), |
| | | String.valueOf(command.getTaskMode()), |
| | | String.valueOf(command.getSourcePos()), |
| | | String.valueOf(command.getTargetPos()), |
| | | null, |
| | | null, |
| | | null, |
| | | JSON.toJSONString(command), |
| | | JSON.toJSONString(statusEntity), |
| | | 1, |
| | | JSON.toJSONString(response) |
| | | ); |
| | | if (bean != null) { |
| | | bean.insert(basRgvOpt); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |