Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 /// <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;
 }