| | |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.domain.enums.RgvStatusType; |
| | | import com.zy.asrs.domain.param.*; |
| | | import com.zy.asrs.domain.vo.*; |
| | | import com.zy.asrs.domain.vo.RgvMsgTableVo; |
| | | import com.zy.asrs.domain.vo.RgvStateTableVo; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.mapper.BasRgvErrMapper; |
| | | import com.zy.asrs.service.BasCircularShuttleService; |
| | |
| | | import com.zy.asrs.service.BasRgvService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.impl.MainServiceImpl; |
| | | import com.zy.asrs.utils.NumUtils; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.OutputQueue; |
| | |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import javax.rmi.CORBA.Util; |
| | | import java.util.*; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * RGV接口 |
| | |
| | | // @ManagerAuth(memo = "作业信息") |
| | | public R ringThroughTaskWrkMast(){ |
| | | List<RgvWrkMastParam> result = new ArrayList<>(); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10)); |
| | | for (WrkMast wrkMast : wrkMasts){ |
| | | RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast); |
| | | if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){ |
| | |
| | | */ |
| | | public synchronized void updateStePositionNearby() { |
| | | try { |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 2L)); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 9L).eq("rgv_no",0)); |
| | | if (wrkMasts.isEmpty()) { |
| | | return; |
| | | } |
| | |
| | | */ |
| | | public synchronized void DevpTaskNoRun() { |
| | | try { |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).orderBy("modi_time", true)); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).eq("wrk_sts",9).orderBy("modi_time", true)); |
| | | if (wrkMasts.isEmpty()) { |
| | | return; |
| | | } |
| | |
| | | List<WrkMast> wrkMastlistA = new ArrayList<>(); |
| | | List<WrkMast> wrkMastlistB = new ArrayList<>(); |
| | | for (BasDevpPosition basDevpPosition : basDevpPositionsListUN) { |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("sta_no", basDevpPosition.getDevNo()).eq("rgv_no", 0).orderBy("modi_time", true)); |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_ssta_no", basDevpPosition.getDevNo()).eq("rgv_no", 0).orderBy("modi_time", true)); |
| | | for (WrkMast wrkMast : wrkMastList) { |
| | | if (!Cools.isEmpty(wrkMast)) { |
| | | if (SortTheExecutionOfTheCarUtil.devpNoSortbj(basDevpPositionsListUN, wrkMast.getSourceStaNo(), wrkMast.getStaNo())) { |
| | |
| | | continue; |
| | | } |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo())); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts",9)); |
| | | if (!wrkMasts.isEmpty()) { |
| | | continue; |
| | | } |
| | |
| | | && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) |
| | | && rgvProtocol.getTaskNo1() == 0 |
| | | && rgvProtocol.getAlarm() == 0) { |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.ROAM) { |
| | | double finalVelocity = 0.0; // 最终速度 (m/s) |
| | | double distance = (Math.pow(finalVelocity, 2) - Math.pow(rgvProtocol.instantaneousSpeed / 60, 2)) / (2 * acceleration); |
| | | BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getSourceStaNo())); |
| | | if ((distance * proportion + (rgvProtocol.instantaneousSpeed / 60) * proportion * rgvDate) > (SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPosition.getPlcPosition(), rgvProtocol.getRgvPos(), perimeter) )) { |
| | | // if (rgvProtocol.getStatusType() == RgvStatusType.ROAM) { |
| | | // double finalVelocity = 0.0; // 最终速度 (m/s) |
| | | // double distance = (Math.pow(finalVelocity, 2) - Math.pow(rgvProtocol.instantaneousSpeed / 60, 2)) / (2 * acceleration); |
| | | // BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getSourceStaNo())); |
| | | // if ((distance * proportion + (rgvProtocol.instantaneousSpeed / 60) * proportion * rgvDate) > (SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPosition.getPlcPosition(), rgvProtocol.getRgvPos(), perimeter) )) { |
| | | // List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true)); |
| | | // if (basDevpPositions.isEmpty()) { |
| | | // log.error("获取所有站点信息异常,RGV任务下发失败,请联系管理员!!!"); |
| | |
| | | // List<Integer> devpList = SortTheExecutionOfTheCarUtil.BasDevpPositionExtractSites(basDevpPositions); |
| | | // |
| | | // if (!SortTheExecutionOfTheCarUtil.calculateShortestDistanceDirection(devpList,rgvProtocol.getEndStaM(),wrkMast.getSourceStaNo())){ |
| | | continue; |
| | | // continue; |
| | | // } |
| | | } |
| | | } |
| | | // } |
| | | // } |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); |
| | | rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 |
| | |
| | | log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); |
| | | |
| | | wrkMast.setRgvNo(rgvProtocol.getRgvNo()); |
| | | wrkMast.setWrkSts(10L); |
| | | wrkMast.setAppeTime(new Date()); |
| | | try { |
| | | wrkMastService.updateById(wrkMast); |
| | |
| | | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); |
| | | continue; |
| | | } |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.WAITING) { |
| | | log.info("{}号小车等待wcs确认,状态{},参数{}", rgvProtocol.getRgvNo(), rgvProtocol.getStatusType(), rgvProtocol); |
| | | } |
| | | |
| | | // 只有当RGV等待WCS确认、自动 |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.WAITING |
| | | && rgvProtocol.getModeType() == RgvModeType.AUTO |
| | |
| | | ) { |
| | | log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue())); |
| | | if (Cools.isEmpty(wrkMast) && (wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && (wrkMast.getRgvNo() == 0 || wrkMast.getRgvNo() > 10)) { |
| | | log.error("未查到小车执行任务或者执行任务状态不符合!" + rgvProtocol.getTaskNo1()); |
| | | if (Cools.isEmpty(wrkMast)) { |
| | | log.error("未查到小车执行任务!" + rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } else if(wrkMast.getWrkSts() != 10) { |
| | | log.error("执行任务状态不符合!" + rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } |
| | | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); |
| | |
| | | log.error("小车复位失败,小车号{}!", rgvProtocol.getRgvNo()); |
| | | break; |
| | | } |
| | | wrkMast.setRgvNo(10+rgvProtocol.getRgvNo()); |
| | | wrkMast.setWrkSts(2L); |
| | | Date now = new Date(); |
| | | wrkMast.setModiTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | |
| | | try { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvNo, new Task(3, new RgvCommand()))) { |
| | | log.error("RGV命令下发失败,RGV号={}", rgvNo); |
| | | log.error("小车复位RGV命令下发失败,RGV号={}", rgvNo); |
| | | return false; |
| | | } else { |
| | | log.info("RGV命令下发成功,RGV号={}", rgvNo); |
| | |
| | | |
| | | import com.zy.asrs.entity.BasDevpPosition; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.core.enums.RouteCollectCountType; |
| | | |
| | | import java.util.*; |
| | | import java.util.ArrayList; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | public class SortTheExecutionOfTheCarUtil { |
| | | //排序 |
| | |
| | | |
| | | import com.core.common.Arith; |
| | | import com.core.common.Cools; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | |
| | | import java.text.DecimalFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * Created by vincent on 2020/8/27 |
| | |
| | | // 类型说明:0-直线,1-圆弧(需要圆心坐标) |
| | | Object[][] intervals = { |
| | | // 直线区间(0-134400) |
| | | {0.0, 134400.0, 0, 390.0, 775.0, 25.0, 775.0}, |
| | | {0.0, 296680.0, 0, 350.0, 700.0, 1200.0, 700.0}, |
| | | |
| | | // 弧线区间(拐点-转弯-133)保持贝塞尔曲线 |
| | | {134400.0, 134900.0, 1, 25.0, 775.0, 65.0, 882.0, 25.0, 882.0}, |
| | | {296680.0, 450865.0, 2, 1200.0, 700.0, 1200.0, 800.0, 1150.0, 650.0}, |
| | | |
| | | // 直线区间 |
| | | {134900.0, 680103.0,0, 65.0, 885.0, 1115.0, 882.0}, |
| | | |
| | | // // 弧线区间(拐点116-115),控制点假设为(1125, 882) |
| | | // {680103, 731550, 1115, 882, 1215, 775, 1125, 882}, |
| | | |
| | | // 圆弧区间(拐点116-115)新参数:圆心(1115,775) |
| | | {680103.0, 731550.0, 2, 1115.0, 882.0, 1215.0, 775.0, 1115.0, 775.0}, // 修正终点坐标 |
| | | {450865.0, 945407.0,0, 100.0, 800.0, 1200.0, 800.0}, |
| | | |
| | | // 直线区间 |
| | | {731550.0, 972950.0,0, 1215.0, 775.0, 1215.0, 125.0}, |
| | | {450865.0, 1473370.0,0, 100.0, 800.0, 100.0, 100.0}, |
| | | // 弧线区间(拐点112-顶点),控制点假设为(1215, 80) |
| | | {972950.0, 1016193.0,0, 1215.0, 125.0, 1164.0, 80.0}, |
| | | {1473370.0, 1550588.0,2, 0.0, 0.0, 100.0, 100.0,50.0,50.0}, |
| | | // 弧线区间(拐点-顶点-111),控制点假设为(1164, 125) |
| | | {1016193.0, 1063563.0,0, 1164.0, 80.0, 1115.0, 125.0}, |
| | | // {1016193.0, 1063563.0,0, 1164.0, 80.0, 1115.0, 125.0}, |
| | | // 直线区间 |
| | | {1063563.0, 1315250.0,0, 1115.0, 150.0, 1115.0, 720.0}, |
| | | {1550588.0, 2068254.0,0, 0.0, 0.0, 0.0, 700.0}, |
| | | // 弧线区间(拐点101-转弯),控制点假设为(1115, 750) |
| | | {1315250.0, 1322829.0,0, 1115.0, 720.0, 1100.0, 750.0}, |
| | | // {2068254.0, 2110201.0,2, 1115.0, 720.0, 1100.0, 750.0,0.0,0.0}, |
| | | // 直线区间 |
| | | {1322829.0, 1737000.0,0, 1090.0, 775.0, 390.0, 775.0}, |
| | | {2110201.0, 2318250.0,0, 0.0, 700.0, 350.0, 700.0}, |
| | | }; |
| | | |
| | | for (Object[] interval : intervals) { |
| | |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.PreDestroy; |
| | | import java.util.ArrayList; |
| | | |
| | | /** |
| | | * WCS主流程 |
| | |
| | | Thread.sleep(200); |
| | | |
| | | // 系统运行状态判断 |
| | | if (!SystemProperties.WCS_RUNNING_STATUS.get()) { |
| | | continue; |
| | | } |
| | | // if (!SystemProperties.WCS_RUNNING_STATUS.get()) { |
| | | // continue; |
| | | // } |
| | | |
| | | //更新位置信息 |
| | | //更新小车排序 |
| | | mainService.updateStePositionNearby(); |
| | | //更新位置信息 |
| | | mainService.updateStePosition(); |
| | |
| | | import com.zy.asrs.entity.BasRgvOpt; |
| | | import com.zy.asrs.service.BasRgvOptService; |
| | | import com.zy.asrs.service.BasRgvService; |
| | | import com.zy.asrs.utils.NumUtils; |
| | | import com.zy.asrs.utils.RouteUtils; |
| | | import com.zy.core.ThreadHandler; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.OutputQueue; |
| | | import com.zy.core.enums.RgvStatusType; |
| | | import com.zy.core.enums.RgvTaskModeType; |
| | | import com.zy.core.enums.SlaveType; |
| | | import com.zy.core.model.RgvSlave; |
| | |
| | | private void readStatus(){ |
| | | try { |
| | | OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) 20); |
| | | OperateResultExOne<byte[]> resultV = siemensNet.Read("DB20.16", (short) 2); |
| | | OperateResultExOne<byte[]> resultE = siemensNet.Read("DB20.26", (short) 2); |
| | | // OperateResultExOne<byte[]> resultV = siemensNet.Read("DB20.16", (short) 2); |
| | | // OperateResultExOne<byte[]> resultE = siemensNet.Read("DB20.26", (short) 2); |
| | | if (result.IsSuccess) { |
| | | if (null == rgvProtocol) { |
| | | rgvProtocol = new RgvProtocol(); |
| | |
| | | rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 12)); |
| | | rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 14)); |
| | | rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransUInt32(result.Content, 16)); |
| | | rgvProtocol.setInstantaneousSpeed(Double.valueOf(siemensNet.getByteTransform().TransInt16(resultV.Content, 0))); |
| | | rgvProtocol.setEndStaM(siemensNet.getByteTransform().TransInt16(resultE.Content, 0)); |
| | | // rgvProtocol.setInstantaneousSpeed((double) siemensNet.getByteTransform().TransInt16(resultV.Content, 0)); |
| | | // rgvProtocol.setEndStaM(siemensNet.getByteTransform().TransInt16(resultE.Content, 0)); |
| | | // rgvProtocol.setRgvPos((long)NumUtils.GetRandomIntInRange(1737000)); |
| | | OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); |
| | | |
| | |
| | | result = siemensNet.Write("DB24.10.0", true); |
| | | } else { |
| | | siemensNet.Write("DB24.10.1", true); |
| | | log.info("任务完成后复位清除rgv信息:小车号:{},ack:{}", command.getRgvNo(),command.getAckFinish1()); |
| | | } |
| | | |
| | | try { |
| | |
| | | name: @pom.build.finalName@ |
| | | datasource: |
| | | driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver |
| | | # url: jdbc:sqlserver://192.168.4.191:50948;databasename=gdhmasrs |
| | | url: jdbc:sqlserver://127.0.0.1:1433;databasename=mdqzasrs |
| | | url: jdbc:sqlserver://192.168.2.201:1433;databasename=mdqzasrs |
| | | # url: jdbc:sqlserver://127.0.0.1:1433;databasename=mdqzasrs |
| | | username: sa |
| | | password: sa@123 |
| | | mvc: |
| | |
| | | |
| | | constant-parameters: |
| | | # 轨道总长 |
| | | perimeter: 1737000 |
| | | perimeter: 2318250 |
| | | # 轨道转换为米比例 |
| | | proportion: 10000 |
| | | # 加速度 m/s^2 |
| | |
| | | # RGV穿梭车1 |
| | | rgv[0]: |
| | | id: 1 |
| | | ip: 172.17.196.3 |
| | | ip: 192.168.2.43 |
| | | port: 502 |
| | | rack: 0 |
| | | slot: 0 |
| | |
| | | # RGV穿梭车2 |
| | | rgv[1]: |
| | | id: 2 |
| | | ip: 172.17.196.6 |
| | | ip: 192.168.2.46 |
| | | port: 502 |
| | | rack: 0 |
| | | slot: 0 |
| | |
| | | # RGV穿梭车3 |
| | | rgv[2]: |
| | | id: 3 |
| | | ip: 172.17.196.9 |
| | | ip: 192.168.2.49 |
| | | port: 502 |
| | | rack: 0 |
| | | slot: 0 |
| | |
| | | # RGV穿梭车4 |
| | | rgv[3]: |
| | | id: 4 |
| | | ip: 172.17.196.12 |
| | | ip: 192.168.2.52 |
| | | port: 502 |
| | | rack: 0 |
| | | slot: 0 |
| | |
| | | # RGV穿梭车5 |
| | | rgv[4]: |
| | | id: 5 |
| | | ip: 172.17.196.15 |
| | | ip: 192.168.2.55 |
| | | port: 502 |
| | | rack: 0 |
| | | slot: 0 |