| | |
| | | import com.zy.core.CrnThread; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.OutputQueue; |
| | | import com.zy.core.enums.*; |
| | | import com.zy.core.enums.CommandStatusType; |
| | | import com.zy.core.enums.CrnTaskModeType; |
| | | import com.zy.core.enums.SlaveType; |
| | | import com.zy.core.model.CrnSlave; |
| | | import com.zy.core.model.Task; |
| | | import com.zy.core.model.command.CommandPackage; |
| | | import com.zy.core.model.command.CrnCommand; |
| | | import com.zy.core.model.protocol.CrnProtocol; |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | |
| | | import java.text.MessageFormat; |
| | |
| | | @Slf4j |
| | | public class SiemensCrnThread implements Runnable, CrnThread { |
| | | |
| | | public static final List<Short> rowOne = new ArrayList<Short>() {{ |
| | | add((short) 1); |
| | | add((short) 5); |
| | | add((short) 7); |
| | | add((short) 11); |
| | | add((short) 15); |
| | | add((short) 19); |
| | | }}; |
| | | public static final List<Short> rowTwo = new ArrayList<Short>() {{ |
| | | add((short) 2); |
| | | add((short) 6); |
| | | add((short) 8); |
| | | add((short) 12); |
| | | add((short) 16); |
| | | add((short) 20); |
| | | }}; |
| | | public static final List<Short> rowThree = new ArrayList<Short>() {{ |
| | | add((short) 3); |
| | | add((short) 9); |
| | | add((short) 13); |
| | | add((short) 17); |
| | | add((short) 21); |
| | | }}; |
| | | public static final List<Short> rowFour = new ArrayList<Short>() {{ |
| | | add((short) 4); |
| | | add((short) 10); |
| | | add((short) 14); |
| | | add((short) 18); |
| | | }}; |
| | | private SiemensS7Net siemensNet; |
| | | private CrnSlave slave; |
| | | private CrnProtocol crnProtocol; |
| | | private boolean resetFlag = false; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | | public static final List<Short> rowOne = new ArrayList<Short>() {{ |
| | | add((short) 1);add((short) 5);add((short) 7);add((short) 11);add((short) 15);add((short) 19); |
| | | }}; |
| | | public static final List<Short> rowTwo = new ArrayList<Short>() {{ |
| | | add((short) 2);add((short) 6);add((short) 8);add((short) 12);add((short) 16);add((short) 20); |
| | | }}; |
| | | public static final List<Short> rowThree = new ArrayList<Short>() {{ |
| | | add((short) 3);add((short) 9);add((short) 13);add((short) 17);add((short) 21); |
| | | }}; |
| | | public static final List<Short> rowFour = new ArrayList<Short>() {{ |
| | | add((short) 4);add((short) 10);add((short) 14);add((short) 18); |
| | | }}; |
| | | |
| | | |
| | | public SiemensCrnThread(CrnSlave slave) { |
| | | this.slave = slave; |
| | | } |
| | | |
| | | /*****************************************************************************************/ |
| | | public static void main(String[] args) throws InterruptedException { |
| | | CrnSlave slave = new CrnSlave(); |
| | | slave.setId(1); |
| | | slave.setIp("192.168.6.9"); |
| | | slave.setRack(0); |
| | | slave.setSlot(0); |
| | | SiemensCrnThread crnThread = new SiemensCrnThread(slave); |
| | | crnThread.connect(); |
| | | crnThread.readStatus(); |
| | | System.out.println(JSON.toJSONString(crnThread.crnProtocol)); |
| | | Thread.sleep(3000L); |
| | | |
| | | // 1.入库 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 |
| | | // command.setSourcePosX((short) 1); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 1); // 源库位层 |
| | | // command.setDestinationPosX((short) 2); // 目标库位排 |
| | | // command.setDestinationPosY((short) 3); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 2.出库 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.PAKOUT); // 任务模式 |
| | | // command.setSourcePosX((short) 2); // 源库位排 |
| | | // command.setSourcePosY((short) 4); // 源库位列 |
| | | // command.setSourcePosZ((short) 3); // 源库位层 |
| | | // command.setDestinationPosX((short) 1); // 目标库位排 |
| | | // command.setDestinationPosY((short) 0); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | |
| | | // // 3.库位移转 源和目标都发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | // command.setSourcePosX((short)2); // 源库位排 |
| | | // command.setSourcePosY((short)2); // 源库位列 |
| | | // command.setSourcePosZ((short)3); // 源库位层 |
| | | // command.setDestinationPosX((short)2); // 目标库位排 |
| | | // command.setDestinationPosY((short)4); // 目标库位列 |
| | | // command.setDestinationPosZ((short)4); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 4.站位移转 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.SITE_MOVE); // 任务模式: 库位移转 |
| | | // command.setSourcePosX((short)1); // 源库位排 |
| | | // command.setSourcePosY((short)0); // 源库位列 |
| | | // command.setSourcePosZ((short)1); // 源库位层 |
| | | // command.setDestinationPosX((short)2); // 目标库位排 |
| | | // command.setDestinationPosY((short)0); // 目标库位列 |
| | | // command.setDestinationPosZ((short)1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // // 5.回原点 不用发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式 |
| | | // command.setSourcePosX((short) 0); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 0); // 源库位层 |
| | | // command.setDestinationPosX((short) 0); // 目标库位排 |
| | | // command.setDestinationPosY((short) 0); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 0); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // // 7.坐标移行 目标发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.OFFSET_MOVE); // 任务模式 |
| | | // command.setSourcePosX((short) 0); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 0); // 源库位层 |
| | | // command.setDestinationPosX((short) 2); // 目标库位排 |
| | | // command.setDestinationPosY((short) 1); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 只有出现指定异常才进行复位 |
| | | // if (crnThread.crnProtocol.getCrnError2().leftTakeNoneErr |
| | | // || crnThread.crnProtocol.getCrnError2().rightTakeNoneErr |
| | | // || crnThread.crnProtocol.getCrnError2().leftPutLoadErr |
| | | // || crnThread.crnProtocol.getCrnError2().rightPutLoadErr) { |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setAckFinish((short) 1); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.NONE); // 任务模式 |
| | | // Thread.sleep(3000L); |
| | | // crnThread.write(command); |
| | | // } |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | crnProtocol.setYDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52)); |
| | | |
| | | |
| | | |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); |
| | | |
| | | // 复位信号 |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){ |
| | | log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); |
| | | } |
| | | } catch (Exception ignore){} |
| | | } catch (Exception ignore) { |
| | | } |
| | | |
| | | DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); |
| | | deviceErrorService.deleteDeviceError("crn", slave.getId()); |
| | |
| | | null // 修改人员 |
| | | ); |
| | | bean.insert(basCrnOpt); |
| | | } catch (Exception ignore) {} |
| | | } catch (Exception ignore) { |
| | | } |
| | | |
| | | if (result != null && result.IsSuccess) { |
| | | Thread.sleep(200); |
| | |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); |
| | | |
| | | |
| | | |
| | | return true; |
| | | } else { |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); |
| | |
| | | } |
| | | } |
| | | |
| | | /******************************************************************************************/ |
| | | /**************************************** 测试专用 *****************************************/ |
| | | |
| | | @Override |
| | | public void close() { |
| | | siemensNet.ConnectClose(); |
| | | } |
| | | |
| | | /******************************************************************************************/ |
| | | /**************************************** 测试专用 *****************************************/ |
| | | /*****************************************************************************************/ |
| | | public static void main(String[] args) throws InterruptedException { |
| | | CrnSlave slave = new CrnSlave(); |
| | | slave.setId(1); |
| | | slave.setIp("192.168.6.9"); |
| | | slave.setRack(0); |
| | | slave.setSlot(0); |
| | | SiemensCrnThread crnThread = new SiemensCrnThread(slave); |
| | | crnThread.connect(); |
| | | crnThread.readStatus(); |
| | | System.out.println(JSON.toJSONString(crnThread.crnProtocol)); |
| | | Thread.sleep(3000L); |
| | | |
| | | // 1.入库 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 |
| | | // command.setSourcePosX((short) 1); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 1); // 源库位层 |
| | | // command.setDestinationPosX((short) 2); // 目标库位排 |
| | | // command.setDestinationPosY((short) 3); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 2.出库 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.PAKOUT); // 任务模式 |
| | | // command.setSourcePosX((short) 2); // 源库位排 |
| | | // command.setSourcePosY((short) 4); // 源库位列 |
| | | // command.setSourcePosZ((short) 3); // 源库位层 |
| | | // command.setDestinationPosX((short) 1); // 目标库位排 |
| | | // command.setDestinationPosY((short) 0); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | |
| | | // // 3.库位移转 源和目标都发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | // command.setSourcePosX((short)2); // 源库位排 |
| | | // command.setSourcePosY((short)2); // 源库位列 |
| | | // command.setSourcePosZ((short)3); // 源库位层 |
| | | // command.setDestinationPosX((short)2); // 目标库位排 |
| | | // command.setDestinationPosY((short)4); // 目标库位列 |
| | | // command.setDestinationPosZ((short)4); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 4.站位移转 源和目标都发 |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.SITE_MOVE); // 任务模式: 库位移转 |
| | | // command.setSourcePosX((short)1); // 源库位排 |
| | | // command.setSourcePosY((short)0); // 源库位列 |
| | | // command.setSourcePosZ((short)1); // 源库位层 |
| | | // command.setDestinationPosX((short)2); // 目标库位排 |
| | | // command.setDestinationPosY((short)0); // 目标库位列 |
| | | // command.setDestinationPosZ((short)1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // // 5.回原点 不用发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式 |
| | | // command.setSourcePosX((short) 0); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 0); // 源库位层 |
| | | // command.setDestinationPosX((short) 0); // 目标库位排 |
| | | // command.setDestinationPosY((short) 0); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 0); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // // 7.坐标移行 目标发 pass |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setTaskNo((short) 0); // 工作号 |
| | | // command.setAckFinish((short) 0); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.OFFSET_MOVE); // 任务模式 |
| | | // command.setSourcePosX((short) 0); // 源库位排 |
| | | // command.setSourcePosY((short) 0); // 源库位列 |
| | | // command.setSourcePosZ((short) 0); // 源库位层 |
| | | // command.setDestinationPosX((short) 2); // 目标库位排 |
| | | // command.setDestinationPosY((short) 1); // 目标库位列 |
| | | // command.setDestinationPosZ((short) 1); // 目标库位层 |
| | | // crnThread.write(command); |
| | | |
| | | // 只有出现指定异常才进行复位 |
| | | // if (crnThread.crnProtocol.getCrnError2().leftTakeNoneErr |
| | | // || crnThread.crnProtocol.getCrnError2().rightTakeNoneErr |
| | | // || crnThread.crnProtocol.getCrnError2().leftPutLoadErr |
| | | // || crnThread.crnProtocol.getCrnError2().rightPutLoadErr) { |
| | | // CrnCommand command = new CrnCommand(); |
| | | // command.setCrnNo(1); // 堆垛机编号 |
| | | // command.setAckFinish((short) 1); // 任务完成确认位 |
| | | // command.setTaskMode(CrnTaskModeType.NONE); // 任务模式 |
| | | // Thread.sleep(3000L); |
| | | // crnThread.write(command); |
| | | // } |
| | | |
| | | } |
| | | |
| | | } |