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