Example #1
0
 /// <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;
             }
         }
     }
 }
Example #2
0
 /// <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;  //停止,排队等待
         }
     }
 }