| | |
| | | |
| | | // 出库第一步,从库位到堆垛机出库站 |
| | | // @Select("select top 1 * from dbo.asr_wrk_mast where crn_no=#{crnNo} and wrk_sts=11 and io_type>100 order by io_pri desc,io_time,wrk_no asc") |
| | | WrkMast selectPakOutStep11(@Param("crnNo")Integer crnNO, @Param("sourceStaNo")Integer sourceStaNo); |
| | | WrkMast selectPakOutStep111215(@Param("crnNo")Integer crnNO, @Param("sourceStaNo")Integer sourceStaNo); |
| | | |
| | | // 出库第二步,从堆垛机出库站到目标出库站,堆垛机出库站有物时执行 |
| | | // @Select("select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=12 and io_type>100 order by io_pri desc,io_time desc,wrk_no ASC") |
| | |
| | | // 获取工作状态为 2,3,4,5,6 的入库工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep23456(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo()); |
| | | if(null == wrkMast) { |
| | | log.error("{}站点查询无待入库数据 工作号={}", crnStn.getStaNo(), staProtocol.getWorkNo()); |
| | | // log.error("{}站点查询无待入库数据 工作号={}", crnStn.getStaNo(), staProtocol.getWorkNo()); |
| | | continue; |
| | | } |
| | | if (wrkMast.getWrkSts() < 3) { |
| | |
| | | public boolean locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ |
| | | for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { |
| | | // 获取工作状态为11(生成出库ID)的出库工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); |
| | | WrkMast wrkMast = wrkMastMapper.selectPakOutStep111215(slave.getId(), crnStn.getStaNo()); |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | |
| | | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 |
| | | steCommand.setTaskMode(SteTaskModeType.findOutByLoc(wrkMast.getSourceLocNo())); // 任务模式: 去近点 等待堆垛机叉取 |
| | | |
| | | steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); |
| | | steCommand.setBay(steProtocol.getBay()); |
| | | steCommand.setLev(steProtocol.getLev()); |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { |
| | | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); |
| | | } else { |
| | |
| | | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(sourceSta.getRow1().shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosX(Utils.getGroupRow(sourceSta.getRow1()).shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY(sourceSta.getBay1().shortValue()); // 源库位列 |
| | | crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue()); // 源库位层 |
| | | crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 |
| | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | SteCommand steCommand = new SteCommand(); |
| | | steCommand.setSteNo(steNo); // 穿梭车编号 |
| | | steCommand.setTaskNo(9999); // 工作号 |
| | | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 |
| | | steCommand.setTaskMode(SteTaskModeType.findWaiting(steProtocol.getRow().intValue())); // 任务模式: 去近点 等待堆垛机叉取 |
| | | |
| | | steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); |
| | |
| | | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); |
| | | SteProtocol steProtocol = steThread.getSteProtocol(); |
| | | if (steProtocol == null) { continue; } |
| | | if (steProtocol.isIdle()) { |
| | | // if (steProtocol.isIdle()) { |
| | | // 穿梭车重新定位排列层 |
| | | if (!steThread.confirmPos()) { |
| | | log.error("{}号穿梭车重新定位失败!作业工作档任务号:{}", wrkMast.getSteNo(), wrkMast.getWrkNo()); |
| | | } |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | SteCommand steCommand = new SteCommand(); |
| | | steCommand.setSteNo(steNo); // 穿梭车编号 |
| | | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 |
| | | steCommand.setTaskMode(SteTaskModeType.findOutByLoc(wrkMast.getSourceLocNo())); // 任务模式: 搬出库 |
| | | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { |
| | | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); |
| | | if (!steThread.confirmPos()) { |
| | | log.error("{}号穿梭车重新定位失败!作业工作档任务号:{}", wrkMast.getSteNo(), wrkMast.getWrkNo()); |
| | | } |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | SteCommand steCommand = new SteCommand(); |
| | | steCommand.setSteNo(steNo); // 穿梭车编号 |
| | | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 |
| | | steCommand.setTaskMode(SteTaskModeType.findOutByLoc(wrkMast.getSourceLocNo())); // 任务模式: 搬出库 |
| | | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { |
| | | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); |
| | | } else { |
| | | // 13.迁入小车 ==> 14.小车搬出库 |
| | | wrkMast.setWrkSts(14L); |
| | | Date now = new Date(); |
| | | wrkMast.setCrnEndTime(now); |
| | | wrkMast.setModiTime(now); |
| | | // 修改成功后复位堆垛机 |
| | | if (wrkMastMapper.updateById(wrkMast) > 0) { |
| | | // 堆垛机复位 |
| | | crnThread.setResetFlag(true); |
| | | } else { |
| | | // 13.迁入小车 ==> 14.小车搬出库 |
| | | wrkMast.setWrkSts(14L); |
| | | Date now = new Date(); |
| | | wrkMast.setCrnEndTime(now); |
| | | wrkMast.setModiTime(now); |
| | | // 修改成功后复位堆垛机 |
| | | if (wrkMastMapper.updateById(wrkMast) > 0) { |
| | | // 堆垛机复位 |
| | | crnThread.setResetFlag(true); |
| | | } else { |
| | | log.error("修改工作档状态 13.迁入小车 ==> 14.小车搬出库 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | log.error("修改工作档状态 13.迁入小车 ==> 14.小车搬出库 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | | // } |
| | | } |
| | | } |
| | | } |
| | |
| | | OUT_RIGHT(2, "右出库"), // 右出库 |
| | | IN_LEFT(3, "左入库"), // 左入库 |
| | | IN_RIGHT(4, "右入库"), // 右入库 |
| | | // MOVE_LEFT(5, "左移库"), // 左移库 |
| | | // MOVE_RIGHT(6, "右移库"), // 右移库 |
| | | MOVE_LEFT(5, "左移库"), // 左移库 |
| | | MOVE_RIGHT(6, "右移库"), // 右移库 |
| | | GO_ORIGIN(7, "去右端"), // 回原点 |
| | | BACK_ORIGIN(8, "去左端"), // 回反原点 |
| | | WAITING_RIGHT(9, "右待机"), // A点 |
| | |
| | | |
| | | // 是否处于报警状态 |
| | | public Boolean isAlarm() { |
| | | return this.alarm > 0; |
| | | return this.alarm > 1; |
| | | } |
| | | |
| | | } |
| | |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.io.DataInputStream; |
| | | import java.io.DataOutputStream; |
| | | import java.io.IOException; |
| | | import java.net.InetSocketAddress; |
| | | import java.net.Socket; |
| | | import java.net.SocketAddress; |
| | | import java.net.SocketTimeoutException; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | |
| | | public class BarcodeThread implements Runnable, ThreadHandler { |
| | | |
| | | private Slave slave; |
| | | private String barcode; |
| | | private Socket socket; |
| | | private DataOutputStream dataOutputStream; |
| | | private DataInputStream dataInputStream; |
| | | private StringBuffer barcode = new StringBuffer(); |
| | | |
| | | public BarcodeThread(Slave slave) { |
| | | this.slave = slave; |
| | | } |
| | | |
| | | @Override |
| | | @SuppressWarnings("InfiniteLoopStatement") |
| | | public void run() { |
| | | connect(); |
| | | while (true) { |
| | | try { |
| | | byte[] read = read(8, 100); |
| | | if (null != read) { |
| | | String s = new String(read); |
| | | if (!Cools.isEmpty(s)) { |
| | | barcode = new String(read); |
| | | log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); |
| | | jsonObject.put("barcode", barcode); |
| | | OutputQueue.BARCODE.offer(jsonObject); |
| | | } |
| | | } |
| | | Thread.sleep(100); |
| | | } catch (SocketTimeoutException ignore) { |
| | | } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | public String getBarcode() { |
| | | return barcode.toString(); |
| | | } |
| | | |
| | | public void setBarcode(String barcode) { |
| | | this.barcode.delete(0, this.barcode.length()); |
| | | this.barcode.append(barcode); |
| | | if(!Cools.isEmpty(barcode)) { |
| | | log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); |
| | | jsonObject.put("barcode", barcode); |
| | | if (OutputQueue.BARCODE.size() >= 32) { |
| | | OutputQueue.BARCODE.poll(); |
| | | } |
| | | OutputQueue.BARCODE.offer(jsonObject); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean connect() { |
| | | try { |
| | | close(); //1.主动释放连接 //2.某些服务器对指定ip有链路数限制 |
| | | socket = new Socket(); |
| | | //socket.setKeepAlive(true); |
| | | SocketAddress socketAddress = new InetSocketAddress(slave.getIp(), slave.getPort()); |
| | | socket.connect(socketAddress, 1000); //某些服务器ping延迟高时要增加,否则会报错connect timeout |
| | | dataOutputStream = new DataOutputStream(socket.getOutputStream()); |
| | | dataInputStream = new DataInputStream(socket.getInputStream()); |
| | | // log.info("条码扫描仪连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | } catch (Exception e) { |
| | | socket = null; |
| | | // log.error("条码扫描仪连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | return false; |
| | | } |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public void close() { |
| | | try { |
| | | if (null != dataOutputStream) { |
| | | dataOutputStream.close(); |
| | | } |
| | | if (null != dataInputStream) { |
| | | dataInputStream.close(); |
| | | } |
| | | // if (null != socket && !socket.isClosed()) { |
| | | // socket.close(); |
| | | // } |
| | | if (null != socket){ |
| | | socket.close(); |
| | | } |
| | | socket = null; |
| | | } catch (IOException e) { |
| | | log.error("SocketClient close Exception:" + e.getMessage()); |
| | | } |
| | | |
| | | } |
| | | |
| | | public void write(byte[] msg, int len) throws IOException { |
| | | if (null != dataInputStream) |
| | | { |
| | | dataOutputStream.write(msg, 0, len); |
| | | dataOutputStream.flush(); |
| | | } |
| | | } |
| | | @Override |
| | | public void run() { |
| | | |
| | | public byte[] read(int bufferSize, int timeOut) throws IOException { |
| | | // if (socket == null) { |
| | | // connect(); |
| | | // } |
| | | connect(); |
| | | socket.setSoTimeout(timeOut); |
| | | byte[] bytes = new byte[bufferSize]; |
| | | int len = dataInputStream.read(bytes); |
| | | byte[] tempBytes = null; |
| | | if (len > 0) { |
| | | tempBytes = new byte[len]; |
| | | System.arraycopy(bytes, 0, tempBytes, 0, len); |
| | | } |
| | | return tempBytes; |
| | | } |
| | | |
| | | public boolean valid() throws Exception { |
| | | if (null == socket || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { |
| | | if (dataInputStream != null) { |
| | | dataInputStream.close(); |
| | | } |
| | | if (dataOutputStream != null) { |
| | | dataOutputStream.close(); |
| | | } |
| | | if (socket != null) { |
| | | socket.close(); |
| | | } |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | } |
| | |
| | | } else { |
| | | initCrn(); |
| | | 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())); |
| | | log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); |
| | | // log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | // e.printStackTrace(); |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | // log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | initCrn(); |
| | | } |
| | | } |
| | |
| | | throw new CoolException(MessageFormat.format( "穿梭车plc状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort())); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | // e.printStackTrace(); |
| | | OutputQueue.STE.offer(MessageFormat.format("【{0}】读取穿梭车plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | log.error("读取穿梭车plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | // log.error("读取穿梭车plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | initSte(); |
| | | } |
| | | |
| | |
| | | |
| | | // 任务完成 |
| | | } else { |
| | | siemensS7Net.Write("V1000",(short) 0); |
| | | siemensS7Net.Write("V998", (short) 0); |
| | | siemensS7Net.Write("V1000", (short) 0); |
| | | result = siemensS7Net.Write("V2000.1", true); |
| | | } |
| | | |
| | |
| | | select top 1 * from asr_wrk_mast where barcode=#{barcode} and wrk_sts=17 and (io_type=103 or io_type=107 or io_type=104) |
| | | </select> |
| | | |
| | | <select id="selectPakOutStep11" resultMap="BaseResultMap"> |
| | | select top 1 * from dbo.asr_wrk_mast where crn_no=#{crnNo} and source_sta_no=#{sourceStaNo} and wrk_sts=11 and io_type>100 order by io_pri desc,io_time,wrk_no asc |
| | | <select id="selectPakOutStep111215" resultMap="BaseResultMap"> |
| | | select top 1 * from dbo.asr_wrk_mast where crn_no=#{crnNo} and source_sta_no=#{sourceStaNo} and wrk_sts in (11,12,15) and io_type>100 order by io_pri desc,io_time,wrk_no asc |
| | | </select> |
| | | |
| | | <select id="selectPakOutStep16" resultMap="BaseResultMap"> |
| | |
| | | <button class="item" onclick="steOperator(2)">向右出库</button> |
| | | <button class="item" onclick="steOperator(3)">从左入库</button> |
| | | <button class="item" onclick="steOperator(4)">从右入库</button> |
| | | <!-- <button class="item" onclick="steOperator(5)">左移库</button>--> |
| | | <!-- <button class="item" onclick="steOperator(6)">右移库</button>--> |
| | | <button class="item" onclick="steOperator(5)">左移库</button> |
| | | <button class="item" onclick="steOperator(6)">右移库</button> |
| | | <button class="item" onclick="steOperator(8)">去左端</button> |
| | | <button class="item" onclick="steOperator(7)">去右端</button> |
| | | <button class="item" onclick="steOperator(10)">左待机</button> |