/// <summary> /// 更新停靠区号 /// </summary> /// <param name="AGVStatus">AGV车辆类,指针类型</param> public void UpdateDock(ref AGV_WPF.DLL.AGV.AGVCar AGVStatus) { if (!AGVStatus.wlLink) { AGVStatus.dockNum = 0; } //当前AGV不在线 for (int i = 0; i < dockCount; i++) { //不在停靠区时判断是否进入停靠区 if (AGVStatus.dockNum == 0) { if (IsIntoDockArea(AGVStatus.worklineNum, AGVStatus.markNum)) { AGVStatus.dockNum = dockNum; break; } } //在停靠区时判断是否出停靠区 else { if (IsOutDockArea(AGVStatus.worklineNum, AGVStatus.markNum)) { AGVStatus.dockNum = 0; break; } } } }
/// <summary> /// 单台AGV更新运行参数,使用了管制区号TrafficNum和无线状态WlLink,需要更新管制区号 /// | 0:正在占用路口的AGV编号 | 1:等待排队AGV的编号,优先级-1 | 2:等待排队AGV的编号,优先级-2 |....... /// </summary> /// <param name="AGVStatus">AGV运行状态结构体,指针类型</param> /// <returns>返回AGV运行or停止</returns> public bool DrvWlConUpdateRunPar(ref AGV_WPF.DLL.AGV.AGVCar AGVStatus) { int trafficnum = 0; int lasttrafficnum = AGVStatus.trafficNum; byte agvnum = AGVStatus.agvNum; if (AGVStatus.wlLink)//当前AGV在线 { //trafficnum为当前AGV所在交通管制区编号 trafficnum = GetTrafficNum(AGVStatus.worklineNum, AGVStatus.markNum); } else//当前AGV不在线,直接返回不在管制区,假如上一次在管制区的话,直接清除上次的记录 { //如果无线连接断开,清除该小车所在管制区的数据 trafficnum = 0; } if (trafficnum == 0) //不是在管制区 { if (lasttrafficnum == 0) //上一次地标不在管制区 { return AGVMODERUN; } else //上一次小车是在管制区中,现在是清除管制状态,清除该路口该车辆排队信息 { //移除排队队列中 agvTrafficList[lasttrafficnum - 1].waitAGVList.Remove(agvnum); AGVStatus.trafficNum = 0; return AGVMODERUN; } } else //是在管制区 { if ((lasttrafficnum != 0) && (trafficnum != lasttrafficnum)) //与上一次的管制区不同,更新上一路口参数 { //移除在上一管制区中的排队信息 agvTrafficList[lasttrafficnum - 1].waitAGVList.Remove(agvnum); } if (lasttrafficnum != trafficnum)//上次的管制区号与这次的管制区号不同 { //加入排队队列中 agvTrafficList[trafficnum - 1].waitAGVList.Add(agvnum); } AGVStatus.trafficNum = trafficnum;//更新AGV状态中现在所在管制区号 if (agvTrafficList[trafficnum - 1].waitAGVList[0] == agvnum)//在第一的排队位置 { return AGVMODERUN; //启动 } else//非第一的排队位置,即等待队列 { return AGVMODESTOP; //停止,排队等待 } } }