Ejemplo n.º 1
0
 //将装配区的状态赋给上述属性
 public static void Get_A_State(DTURequestInfo requestinfo)
 {
     //状态
     A_System_State     = requestinfo.SystemState;
     A_Assembly_Area1   = (requestinfo.PartState & 1) == 1 ? 1 : 0;
     A_Assembly_Area2   = (requestinfo.PartState & 2) == 2 ? 1 : 0;
     A_Robot_State      = (requestinfo.PartState & 4) == 4 ? 1 : 0;
     A_Cor_State        = (requestinfo.PartState & 8) == 8 ? 1 : 0;
     A_Assembly_InArea1 = (requestinfo.PartState & 16) == 16 ? 1 : 0;
     A_Assembly_InArea2 = (requestinfo.PartState & 32) == 32 ? 1 : 0;
     if (A_System_State != 2)   //如果不是系统正常,已启动这个状态的话,就退出
     {
         return;
     }
     //动作
     A_AGV_Assembly1 = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0;
     A_AGV_Assembly2 = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0;
     //RFID
     A_Assembly1_RFID = requestinfo.Assembly_Area1_RFID;
     if (A_Assembly1_RFID == ConfigClass.Tray_B2 && A_OnlyOnce3 == false)
     {
         SqlConnection  con = new SqlConnection();
         DataBaseHandle db  = new DataBaseHandle();
         db.SaveData(con, "拧螺丝订单", ConfigClass.GetTrayString(A_Assembly1_RFID));
         A_OnlyOnce3 = true;
     }
     if (A_Assembly1_RFID != ConfigClass.Tray_B2)
     {
         A_OnlyOnce3 = false;
     }
     A_Assembly2_RFID = requestinfo.Assembly_Area2_RFID;
     if (A_Assembly2_RFID == ConfigClass.Tray_B2 && A_OnlyOnce4 == false)
     {
         SqlConnection  con = new SqlConnection();
         DataBaseHandle db  = new DataBaseHandle();
         db.SaveData(con, "拧螺丝订单", "缺省", ConfigClass.GetTrayString(A_Assembly1_RFID));
         A_OnlyOnce4 = true;
     }
     if (A_Assembly2_RFID != ConfigClass.Tray_B2)
     {
         A_OnlyOnce4 = false;
     }
     //如果动作值为1,则通知AGV(向AGV表中插入命令)且不能重复插入
     if (A_AGV_Assembly1 == 1 && A_OnlyOnce1 == false)
     {
         InformAGV(ConfigClass.AssemblyArea1);
         A_OnlyOnce1 = true;
     }
     if (A_AGV_Assembly1 == 0)
     {
         A_OnlyOnce1 = false;
     }
     if (A_AGV_Assembly2 == 1 && A_OnlyOnce2 == false)
     {
         InformAGV(ConfigClass.AssemblyArea2);
         A_OnlyOnce2 = true;
     }
     if (A_AGV_Assembly2 == 0)
     {
         A_OnlyOnce2 = false;
     }
 }
Ejemplo n.º 2
0
        }                                                           //人工下料AGV对接台RFID识别托盘工件相关参数5

        //将加工区的状态赋给上述属性
        public static void Get_P_State(DTURequestInfo requestinfo)
        {
            //状态
            P_System_State     = requestinfo.SystemState;
            P_Manual_Up_Area   = (requestinfo.PartState & 1) == 1 ? 1 : 0;
            P_Manual_Down_Area = (requestinfo.PartState & 2) == 2 ? 1 : 0;
            P_Process_Area1    = (requestinfo.PartState & 4) == 4 ? 1 : 0;
            P_Process_Area2    = (requestinfo.PartState & 8) == 8 ? 1 : 0;
            P_Mazak1_State     = (requestinfo.PartState & 16) == 16 ? 1 : 0;
            P_Mazak2_State     = (requestinfo.PartState & 32) == 32 ? 1 : 0;
            P_Big_State        = (requestinfo.PartState & 64) == 64 ? 1 : 0;
            P_Robot_State      = (requestinfo.PartState & 128) == 128 ? 1 : 0;
            //系统控制
            P_System_Control = requestinfo.SystemControl;
            if (P_System_State != 2)   //如果不是系统正常,已启动这个状态的话,就退出
            {
                return;
            }

            //动作
            P_Raw_Tray_Empty = (requestinfo.Raw_Tray_Empty & 1) == 1 ? 1 : 0;

            P_AGV_Manual_Up   = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0;
            P_AGV_Manual_Down = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0;
            P_AGV_Process1    = (requestinfo.AGVExecuteCmd & 4) == 4 ? 1 : 0;
            P_AGV_Process2    = (requestinfo.AGVExecuteCmd & 8) == 8 ? 1 : 0;
            //RFID
            P_Manual_Up_RFID   = requestinfo.Manual_Up_RFID;
            P_Manual_Down_RFID = requestinfo.Manual_Down_RFID;
            P_Process1_RFID    = requestinfo.Process_Area1_RFID;
            if (P_Process1_RFID == ConfigClass.Tray_A2 && P_OnlyOnce5 == false)
            {
                SqlConnection  con = new SqlConnection();
                DataBaseHandle db  = new DataBaseHandle();
                db.SaveData(con, "加工订单", ConfigClass.GetTrayString(P_Process1_RFID));
                P_OnlyOnce5 = true;
            }
            if (P_Process1_RFID != ConfigClass.Tray_A2)
            {
                P_OnlyOnce5 = false;
            }
            P_Process2_RFID = requestinfo.Process_Area2_RFID;
            if (P_Process2_RFID == ConfigClass.Tray_A2 && P_OnlyOnce6 == false)
            {
                SqlConnection  con = new SqlConnection();
                DataBaseHandle db  = new DataBaseHandle();
                db.SaveData(con, "加工订单", "缺省", ConfigClass.GetTrayString(P_Process2_RFID));
                P_OnlyOnce6 = true;
            }
            if (P_Process2_RFID != ConfigClass.Tray_A2)
            {
                P_OnlyOnce6 = false;
            }

            //数据
            UP_C_D_Number   = (int)requestinfo.Manual_Up_CD_Number;
            Down_C_D_Number = (int)requestinfo.Manual_Down_CD_Number;
            Down_RFID_Para1 = requestinfo.Manual_Down_Para1;
            Down_RFID_Para2 = requestinfo.Manual_Down_Para2;
            Down_RFID_Para3 = requestinfo.Manual_Down_Para3;
            Down_RFID_Para4 = requestinfo.Manual_Down_Para4;
            Down_RFID_Para5 = requestinfo.Manual_Down_Para5;

            //如果动作值为1,则通知AGV(向AGV表中插入命令),且不能重复插入
            if (P_Raw_Tray_Empty == 1 && P_OnlyOnce1 == false)
            {
                WHSendPackage package = new WHSendPackage();
                package.Head         = 29000;
                package.TrayID       = 0;
                package.WHPostion    = 0;
                package.SerialNumber = 0;
                if (MainWindow.WHDISCONNECTED == false)
                {
                    sendWHMsgDel(package);
                    P_OnlyOnce1 = true;
                }
            }
            if (P_Raw_Tray_Empty == 0)
            {
                P_OnlyOnce1 = false;
            }
            if (P_AGV_Process1 == 1 && P_OnlyOnce2 == false)
            {
                InformAGV(ConfigClass.ProcessArea1);
                P_OnlyOnce2 = true;
            }
            if (P_AGV_Process1 == 0)
            {
                P_OnlyOnce2 = false;
            }
            if (P_AGV_Process2 == 1 && P_OnlyOnce3 == false)
            {
                InformAGV(ConfigClass.ProcessArea2);
                P_OnlyOnce3 = true;
            }
            if (P_AGV_Process2 == 0)
            {
                P_OnlyOnce3 = false;
            }
            if (P_AGV_Manual_Up == 1 && P_OnlyOnce4 == false)
            {
                InformAGV(ConfigClass.HandUpArea, P_Manual_Up_RFID);
                P_OnlyOnce4 = true;
            }
            if (P_AGV_Manual_Up == 0)
            {
                P_OnlyOnce4 = false;
            }
        }
Ejemplo n.º 3
0
 //将检测区的状态赋给上述属性
 public static void Get_D_State(DTURequestInfo requestinfo)
 {
     //状态
     D_System_State    = requestinfo.SystemState;
     D_Detection_Area1 = (requestinfo.PartState & 1) == 1 ? 1 : 0;
     D_Detection_Area2 = (requestinfo.PartState & 2) == 2 ? 1 : 0;
     D_Marking_State   = (requestinfo.PartState & 4) == 4 ? 1 : 0;
     D_Robot_State     = (requestinfo.PartState & 8) == 8 ? 1 : 0;
     if (D_System_State != 2)   //如果不是系统正常,已启动这个状态的话,就退出
     {
         return;
     }
     //动作
     D_AGV_Detection1 = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0;
     D_AGV_Detection2 = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0;
     //RFID
     D_Detection1_RFID = requestinfo.Detection_Area1_RFID;
     if (D_Detection1_RFID == ConfigClass.Tray_A3 && D_OnlyOnce3 == false)
     {
         D_AGV_Detection1_Para1 = requestinfo.Detection_Area1_Parameter1;
         D_AGV_Detection1_Para2 = requestinfo.Detection_Area1_Parameter2;
         D_AGV_Detection1_Para3 = requestinfo.Detection_Area1_Parameter3;
         D_AGV_Detection1_Para4 = requestinfo.Detection_Area1_Parameter4;
         D_AGV_Detection1_Para5 = requestinfo.Detection_Area1_Parameter5;
         SqlConnection  con = new SqlConnection();
         DataBaseHandle db  = new DataBaseHandle();
         db.SaveData(con, "检测订单", ConfigClass.GetTrayString(D_Detection1_RFID),
                     ConfigClass.GetTrayString(D_Detection2_RFID), D_AGV_Detection1_Para1, D_AGV_Detection1_Para2,
                     D_AGV_Detection1_Para3, D_AGV_Detection1_Para4, D_AGV_Detection1_Para5);
         D_OnlyOnce3 = true;
     }
     if (D_Detection1_RFID != ConfigClass.Tray_A3)
     {
         D_OnlyOnce3 = false;
     }
     D_Detection2_RFID = requestinfo.Detection_Area2_RFID;
     if (D_Detection2_RFID == ConfigClass.Tray_A3 && D_OnlyOnce4 == false)
     {
         D_AGV_Detection2_Para1 = requestinfo.Detection_Area2_Parameter1;
         D_AGV_Detection2_Para2 = requestinfo.Detection_Area2_Parameter2;
         D_AGV_Detection2_Para3 = requestinfo.Detection_Area2_Parameter3;
         D_AGV_Detection2_Para4 = requestinfo.Detection_Area2_Parameter4;
         D_AGV_Detection2_Para5 = requestinfo.Detection_Area2_Parameter5;
         SqlConnection  con = new SqlConnection();
         DataBaseHandle db  = new DataBaseHandle();
         db.SaveData(con, "检测订单", ConfigClass.GetTrayString(D_Detection1_RFID),
                     ConfigClass.GetTrayString(D_Detection2_RFID), D_AGV_Detection1_Para1, D_AGV_Detection1_Para2,
                     D_AGV_Detection1_Para3, D_AGV_Detection1_Para4, D_AGV_Detection1_Para5);
         D_OnlyOnce4 = true;
     }
     if (D_Detection2_RFID != ConfigClass.Tray_A3)
     {
         D_OnlyOnce4 = false;
     }
     //如果动作值为1,则通知AGV(向AGV表中插入命令)且不能重复插入
     if (D_AGV_Detection1 == 1 && D_OnlyOnce1 == false)
     {
         InformAGV(ConfigClass.DetectionArea1);
         D_OnlyOnce1 = true;
     }
     if (D_AGV_Detection1 == 0)
     {
         D_OnlyOnce1 = false;
     }
     if (D_AGV_Detection2 == 1 && D_OnlyOnce2 == false)
     {
         InformAGV(ConfigClass.DetectionArea2);
         D_OnlyOnce2 = true;
     }
     if (D_AGV_Detection2 == 0)
     {
         D_OnlyOnce2 = false;
     }
 }
Ejemplo n.º 4
0
        //执行订单(自动操作)AGV时收到消息的处理方法
        private void AutoOperate()
        {
            if (package.Head == 10003)   //收到消息
            {
                ExecuteOrder.SendAGVCmdEnable         = false;
                MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV已收到消息";
                LogInfoHelp.GetInstance().WriteInfoToLogFile("AGV已收到消息", LogInfoHelp.LOG_TYPE.LOG_INFO);
                DataBaseHandle db  = new DataBaseHandle();
                SqlConnection  con = new SqlConnection();
                db.UpdateAGVComState(con, package.TaskID);   //更新AGV指令表中的通讯状态为【已收到】
                return;
            }
            if (package.Head == 10005)       //执行指令完成
            {
                if (package.TaskStepID == 0) //执行取货任务完成
                {
                    //得到AGV的起点和终点
                    int            StartPoint, EndPoint = 0;
                    DataBaseHandle db  = new DataBaseHandle();
                    SqlConnection  con = new SqlConnection();
                    StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint);
                    MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(StartPoint) + "取货完毕";
                    LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO);
                    //如过是送往立库入库区来的,向加工PLC  装配PLC  检测PLC发布当前状态
                    //AGV在各个机构区域取托盘完毕
                    if (EndPoint == ConfigClass.WHInlibArea)
                    {
                        PublishAGVState(StartPoint, EndPoint);
                        Thread t = new Thread(delegate()
                        {
                            Thread.Sleep(new TimeSpan(0, 0, 5));
                            SetNull();
                        });
                        t.Start();
                        t.Priority     = ThreadPriority.AboveNormal;
                        t.IsBackground = true;
                        //判断立库表指令是否超过两条,如果超过两条则挂起,否则不挂起
                        Thread th = new Thread(delegate()
                        {
                            SendPackage pac = new SendPackage();
                            while (true)
                            {
                                bool IsNoPause = db.SelectWHCmdNum(con); //查询立库指令表是否具备AGV挂起的条件
                                if (IsNoPause == false)                  //如果指令没超过一条
                                {
                                    pac.Head     = 10012;
                                    pac.ESSignal = 6;       //解急停
                                    sendESDelegate(pac);
                                    break;
                                }
                                //如果超过两条
                                pac.Head     = 10012;
                                pac.ESSignal = 5;      //急停
                                sendESDelegate(pac);
                                Thread.Sleep(TimeSpan.FromSeconds(3));
                            }
                        });
                        th.Start();
                        th.Priority     = ThreadPriority.AboveNormal;
                        th.IsBackground = true;
                    }
                    return;
                }
                if (package.TaskStepID == 1)  //执行卸货任务完成
                {
                    DataBaseHandle db  = new DataBaseHandle();
                    SqlConnection  con = new SqlConnection();
                    //得到AGV的起点和终点
                    int StartPoint, EndPoint = 0;
                    StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint);
                    MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(EndPoint) + "卸货完毕";
                    LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO);
                    db.UpdateAGVWorkState(con, package.TaskID);   //更新AGV指令表中的通讯状态为【完成】
                    ExecuteOrder.SendAGVCmdEnable = true;
                    //如果是从立库出库区来的,向加工PLC  装配PLC  检测PLC发布当前状态

                    //AGV在各个机构区域放托盘完毕
                    if (StartPoint == ConfigClass.WHOutlibArea1)
                    {
                        //发布AGV的状态给各个PLC
                        PublishAGVState(StartPoint, EndPoint);
                        //AGV在各工作区卸货完成后,检查是否还有订单,并且检查每个工作区是否有空闲,
                        //如果两个条件都满足,我们就通知立库继续出库(向立库指令表中插入出库信息)
                        //这里用线程,是为了防止接收到多次一样的消息从而重复通知立库的bug。
                        if (InformWHThreadState == false)  //防止线程重复创建
                        {
                            InformWHThread = new Thread(new ParameterizedThreadStart(CheckAndInformWH));
                            InformWHThread.IsBackground = true;
                            InformWHThreadState         = true;
                            InformWHThread.Start(EndPoint);
                            InformWHThread.Priority = ThreadPriority.AboveNormal;
                        }
                        return;
                    }
                    //如过是送往立库入库区来的,则向立库表中插入入库指令信息
                    if (EndPoint == ConfigClass.WHInlibArea)
                    {
                        //AGV在立库入库区卸货完成,然后向立库表中插入入库指令信息
                        if (InformWHThreadState == false)  //防止线程重复创建
                        {
                            InformWHThread = new Thread(new ParameterizedThreadStart(InformWHInlib));
                            InformWHThread.IsBackground = true;
                            InformWHThreadState         = true;
                            InformWHThread.Start(StartPoint);
                            InformWHThread.Priority = ThreadPriority.AboveNormal;
                        }
                        return;
                    }
                }
            }
        }