Пример #1
0
Файл: Form1.cs Проект: aijam/MGT
        //定时更新station状态的显示,通过读取station表中的occupiedstatus,来设置背景图片或取消图片。
        private void updateGUIStationStautus(Control cc)
        {
            using (var ctx = new AMSContext())
            {
                foreach (System.Windows.Forms.Control control in cc.Controls)
                {
                    if (control is System.Windows.Forms.Button)
                    {
                        System.Windows.Forms.Button btn = (System.Windows.Forms.Button)control;
                        if (btn.Text != "清空")
                        {
                            int       stationNo  = int.Parse(btn.Text);
                            t_Station agvStation = ctx.t_Station
                                                   .Where(b => b.StationNo == stationNo)
                                                   .SingleOrDefault();

                            if (agvStation.AvailableStatus == 0)
                            {
                                btn.BackgroundImageLayout = ImageLayout.Stretch;
                                btn.BackgroundImage       = Properties.Resources.gray_x;
                            }
                            else
                            {
                                if (agvStation.OccupiedStatus == 0)
                                {
                                    btn.BackColor = Color.WhiteSmoke;
                                    //btn.BackgroundImageLayout = ImageLayout.Stretch;
                                    btn.BackgroundImage = Properties.Resources.empty;
                                }
                                else if (agvStation.OccupiedStatus == 1)
                                {
                                    btn.BackgroundImageLayout = ImageLayout.Stretch;
                                    btn.BackgroundImage       = Properties.Resources.pallet_gray;
                                }
                                else if (agvStation.OccupiedStatus == 2)
                                {
                                    btn.BackgroundImageLayout = ImageLayout.Stretch;
                                    btn.BackgroundImage       = Properties.Resources.pallet;
                                }
                                else if (agvStation.OccupiedStatus == 3)
                                {
                                    btn.BackgroundImageLayout = ImageLayout.Stretch;
                                    btn.BackgroundImage       = Properties.Resources.doubt;
                                }
                            }
                        }

                        if (control.Controls.Count > 0)
                        {
                            updateGUIStationStautus(control);
                        }
                    }
                }
            }
        }
Пример #2
0
Файл: Form1.cs Проект: aijam/MGT
        //ProgId: 104
        private void button_Handler(object sender)
        {
            Button button = (Button)sender;

            //检查对应站台是否有任务,如果有,则不允许修改;如果没有,则将有货修改为无货,反之亦然,同时修改站台状态
            using (var ctx = new AMSContext())
            {
                int stationNo             = int.Parse(button.Text);
                List <t_AGVWork> agvWorks = ctx.t_AGVWork
                                            .Where(b => b.Destination == stationNo || b.Origination == stationNo)
                                            .ToList();

                if (agvWorks != null && agvWorks.Count > 0)
                {
                    Console.WriteLine(DateTime.Now + " button_Handler: 站台:" + button.Text + "有作业任务,无法修改站台状态");
                    toolStripStatusLabel1.Text = DateTime.Now + " button_Handler: 站台:" + button.Text + "有作业任务,无法修改站台状态";
                }
                else
                {
                    t_Station tStation7 = ctx.t_Station
                                          .Where(b => b.StationNo == stationNo)
                                          .SingleOrDefault();

                    if (tStation7.OccupiedStatus == 0)
                    {
                        tStation7.OccupiedStatus = 2;
                    }
                    else if (tStation7.OccupiedStatus == 2)
                    {
                        tStation7.OccupiedStatus = 0;
                    }
                    else if (tStation7.OccupiedStatus == 1)
                    {
                        Console.WriteLine(DateTime.Now.ToString() + " button_Handler: 货位 " + tStation7.StationNo + "的状态为: 预约,无法修改");
                        toolStripStatusLabel1.Text = DateTime.Now.ToString() + " button_Handler: 货位 " + tStation7.StationNo + "的状态为: 预约,无法修改";
                        return;
                    }

                    tStation7.ModifyProgID = 104;
                    tStation7.ModifyTime   = DateTime.Now;
                    var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(tStation7);
                    setEntry.SetModifiedProperty("OccupiedStatus");
                    setEntry.SetModifiedProperty("ModifyProgID");
                    setEntry.SetModifiedProperty("ModifyTime");
                    ctx.SaveChanges();

                    updateGUIStationStautus(button); //根据控件名称找到控件,并修改颜色

                    Console.WriteLine(DateTime.Now.ToString() + " button_Handler: 修改货位 " + tStation7.StationNo + "的状态为" + stationStuatus(tStation7));
                    toolStripStatusLabel1.Text = DateTime.Now.ToString() + " button_Handler: 修改货位 " + tStation7.StationNo + "的状态为" + stationStuatus(tStation7);
                }
            }
        }
Пример #3
0
Файл: Form1.cs Проект: aijam/MGT
        //计算可用路径-业务相关-根据起点找到所有可用路径
        private t_AGVPath getPath(t_Station originalStation, int callButtonSignal)
        {
            t_AGVPath agvPath1;

            using (var ctx = new AMSContext())
            {
                //read
                agvPath1 = ctx.t_AGVPath
                           .Where(b => b.AvailableStatus == 1 && b.Origination == originalStation.StationNo && b.ChannelType == callButtonSignal)
                           .First();
                Console.WriteLine(DateTime.Now.ToString() + " 找到对应的通道 " + agvPath1.Destination);
            }
            return(agvPath1);
        }
Пример #4
0
Файл: Form1.cs Проект: aijam/MGT
        //计算可用货位
        private t_Station getAvailabeStation(t_AGVPath agvPath1)
        {
            t_Station agvStation1;

            using (var ctx = new AMSContext())
            {
                //read
                List <t_Station> agvStations = ctx.t_Station
                                               .Where(b => b.AvailableStatus == 1 && b.ChannelNo == agvPath1.Destination && b.OccupiedStatus == 0)
                                               .OrderBy(b => b.Sequence)
                                               .ToList();
                //Console.WriteLine(agvWork1);

                if (agvStations != null && agvStations.Count > 0)
                {
                    agvStation1 = agvStations.First();

                    //对于FIFO,需要考虑AGV是否能进这个站台,通过查看此站台前面几个站台是否有托盘,或者预约了托盘
                    if (agvStation1.ChannelType == 0 || agvStation1.ChannelType == 1)
                    {
                        List <t_Station> agvStations1 = ctx.t_Station
                                                        .Where(b => b.Sequence > agvStation1.Sequence && b.OccupiedStatus != 0 && b.ChannelNo == agvPath1.Destination)
                                                        .ToList();

                        if (agvStations1 == null || agvStations1.Count > 0)
                        {
                            toolStripStatusLabel1.Text = "找到空的站台 " + agvStation1.StationNo + " ,但是前面站台" + agvStations1.First().StationNo + "有托盘";
                            Console.WriteLine(DateTime.Now.ToString() + "getAvailabeStation 找到空的站台 " + agvStation1.StationNo + " ,但是前面站台" + agvStations1.First().StationNo + "有托盘");
                            return(null);
                        }
                    }

                    Console.WriteLine(agvStation1.StationNo);
                    return(agvStation1);
                }
                else
                {
                    toolStripStatusLabel1.Text = "通道 " + agvPath1.Destination + " 没有空的站台";
                    return(null);
                }
            }
        }
Пример #5
0
Файл: Form1.cs Проект: aijam/MGT
 //定时任务-按照t_AGVWork 表在界面状态栏显示任务执行状态
 private void timer2_updateAGVWorkStatus(object sender)
 {
     if (false) //autoUpdateJobStatus
     {
         using (var ctx = new AMSContext())
         {
             //read
             List <t_AGVWork> agvWorks = ctx.t_AGVWork.ToList();
             if (agvWorks != null && agvWorks.Count > 0)
             {
                 foreach (t_AGVWork tAGVWork5 in agvWorks)
                 {
                     String jobStatus     = tAGVWork5.JobStatus.ToString();
                     String jobStatusName = ctx.t_Code
                                            .Where(b => b.codetype == jobStatus && b.code == "jobstatus").First().name;
                     toolStripStatusLabel1.Text = "从 " + tAGVWork5.Origination + " 到 " + tAGVWork5.Destination + " 的任务 " + jobStatusName;
                 }
             }
         }
     }
 }
Пример #6
0
Файл: Form1.cs Проект: aijam/MGT
 //定时任务-显示当前是否可以接收conveyor的搬送请求,调试时可以禁用;
 //当存在启动是当前站台的任务,并且任务状态小于9的,就不允许接收
 private void enable_opc_read(object sender)
 {
     using (var ctx = new AMSContext())
     {
         //read
         List <t_AGVWork> agvWorks = ctx.t_AGVWork
                                     .Where(b => b.Origination == 301 && b.JobStatus < 9)
                                     .ToList();
         if (agvWorks != null && agvWorks.Count > 0)
         {
             checkbox_stationRelease.Checked = false;
             checkbox_stationRelease.Enabled = false;
             stationRelease = false;
         }
         else
         {
             checkbox_stationRelease.Checked = true;
             checkbox_stationRelease.Enabled = true;
             stationRelease = true;
         }
     }
 }
Пример #7
0
Файл: Form1.cs Проект: aijam/MGT
        //ProgID 103
        private Boolean Reset_Channel(int channelNo)
        {
            String channelName;

            if (channelNo == 10000)
            {
                channelName = "A";
            }
            else
            {
                channelName = "B";
            }
            //reset前,检查针对这个channel的执行中的任务,如果有,Messagebox报错,不能reset,请先删除指令
            using (var ctx = new AMSContext())
            {
                List <t_Station> agvStations = ctx.t_Station
                                               .Where(b => b.AvailableStatus == 1 && b.ChannelNo == channelNo)
                                               .OrderBy(b => b.Sequence)
                                               .ToList();
                //Console.WriteLine(agvWork1);

                if (agvStations != null && agvStations.Count > 0)
                {
                    var transaction = ctx.Database.BeginTransaction(); //事务开始
                    try
                    {
                        foreach (t_Station tStation6 in agvStations)
                        {
                            List <t_AGVWork> agvWorks1 = ctx.t_AGVWork
                                                         .Where(b => b.Destination == tStation6.StationNo)
                                                         .ToList();

                            if (agvWorks1.Count > 0)
                            {
                                toolStripStatusLabel1.Text = "通道 " + channelName + " 无法重置,搬送ID: " + agvWorks1.First().ID + "正在驶往站台 " + agvWorks1.First().Destination;
                                Console.WriteLine(DateTime.Now.ToString() + "Reset_Channel 通道 " + channelName + " 无法重置,搬送ID: " + agvWorks1.First().ID + "正在驶往站台 " + agvWorks1.First().Destination);
                                throw new Exception("站台有任务,无法重置");
                            }
                            else
                            {
                                tStation6.OccupiedStatus = 0;
                                tStation6.ModifyProgID   = 103;
                                tStation6.ModifyTime     = DateTime.Now;
                                var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(tStation6);
                                setEntry.SetModifiedProperty("OccupiedStatus");
                                setEntry.SetModifiedProperty("ModifyProgID");
                                setEntry.SetModifiedProperty("ModifyTime");
                                ctx.SaveChanges();
                            }
                        }

                        transaction.Commit();

                        Console.WriteLine(DateTime.Now.ToString() + " Reset_Channel:通道" + channelName + " 已重置");
                        toolStripStatusLabel1.Text = DateTime.Now.ToString() + " Reset_Channel:通道" + channelName + " 已重置";
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        Console.WriteLine(DateTime.Now.ToString() + " Reset_Channel:失败了,事务回滚");
                    }
                    finally
                    {
                        transaction.Dispose();
                    }
                }
                else
                {
                    toolStripStatusLabel1.Text = "通道 " + channelNo + " 内没有站台,请确认通道号是否正确";
                    Console.WriteLine(DateTime.Now.ToString() + "Reset_Channel 通道 " + channelNo + " 内没有站台,请确认通道号是否正确");
                    return(false);
                }

                return(true);
            }
        }
Пример #8
0
Файл: Form1.cs Проект: aijam/MGT
        private void timer1_updateJobStatus(object sender)
        {
            t_AGVWork agvWork1 = null;

            if (autoUpdateJobStatus)
            {
                using (var ctx = new AMSContext())
                {
                    var transaction = ctx.Database.BeginTransaction();
                    try
                    {
                        //read
                        List <t_AGVWork> agvWorks = ctx.t_AGVWork
                                                    //.OrderBy(b => b.BlogId)
                                                    .Where(b => b.JobStatus == 5 || b.JobStatus == 8 || b.JobStatus == 11 || b.JobStatus == 14 || b.JobStatus == 100)
                                                    .ToList();
                        //Console.WriteLine(agvWork1);

                        if (agvWorks != null && agvWorks.Count > 0)
                        {
                            //按照任务状态 5,8,11,14更新不同的数值
                            agvWork1 = agvWorks.First();
                            if (agvWork1.JobStatus == 5)
                            {
                                agvWork1.JobStatus = 6;
                            }
                            else if (agvWork1.JobStatus == 8)
                            {
                                agvWork1.JobStatus = 9;
                                //stationRelease = true; //取货完成确认后才允许接收新的搬送请求
                            }
                            else if (agvWork1.JobStatus == 11)
                            {
                                //检查站台状态,如果发现站台不可卸货,则修改目的地
                                if (checkDestinationStation())
                                {
                                    agvWork1.JobStatus = 12;
                                }
                                else
                                {
                                    updateTask2Clearing(agvWork1);
                                }
                            }
                            else if (agvWork1.JobStatus == 14)
                            {
                                agvWork1.JobStatus = 15;
                            }

                            ctx.t_AGVWork.Attach(agvWork1);

                            if (agvWork1.JobStatus == 100) //删除
                            {
                                ctx.t_AGVWork.Remove(agvWork1);
                                ctx.SaveChanges();

                                t_Station tStation5 = ctx.t_Station
                                                      .Where(b => b.StationNo == agvWork1.Destination).SingleOrDefault();

                                ctx.t_Station.Attach(tStation5);
                                tStation5.OccupiedStatus = 2;
                                tStation5.ModifyProgID   = 201;
                                tStation5.ModifyTime     = DateTime.Now;
                                var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(tStation5);
                                setEntry.SetModifiedProperty("OccupiedStatus");
                                setEntry.SetModifiedProperty("ModifyProgID");
                                setEntry.SetModifiedProperty("ModifyTime");
                                ctx.SaveChanges();

                                //updateGUIStationStautus(tStation5, 2);
                                toolStripStatusLabel1.Text = "任务从 " + agvWork1.Origination + " 到 " + agvWork1.Destination + " 已经正常完成,站台 " + tStation5.StationNo + " 当前已有托盘";
                            }
                            else
                            {
                                agvWork1.ModifyProgID = 201;

                                var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(agvWork1);
                                //只修改实体的Name属性和Age属性
                                setEntry.SetModifiedProperty("JobStatus");
                                setEntry.SetModifiedProperty("ModifyProgID");
                                ctx.SaveChanges();
                            }

                            //Console.WriteLine("update status:", updateFlag);
                            transaction.Commit();

                            String jobStatus     = agvWork1.JobStatus.ToString();
                            String jobStatusName = ctx.t_Code
                                                   .Where(b => b.codetype == jobStatus && b.code == "jobstatus").First().name;
                            toolStripStatusLabel1.Text = "从 " + agvWork1.Origination + " 到 " + agvWork1.Destination + " 的任务 " + jobStatusName;
                        }
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        Console.WriteLine(DateTime.Now.ToString() + " timer1_updateJobStatus 更新任务状态失败" + agvWork1.ID);
                        MessageBox.Show(ex.ToString());
                    }
                    finally
                    {
                        transaction.Dispose();
                    }
                }
            }

            //System.Threading.Thread.Sleep(2000); //用一个线程控制,睡2秒后重新开始
        }
Пример #9
0
Файл: Form1.cs Проект: aijam/MGT
        //更新任务,将AGV送到clearing station ProgID 105
        private Boolean updateTask2Clearing(t_AGVWork agvWork2)
        {
            t_Station agvStation1;

            //更新任务
            using (var ctx = new AMSContext())
            {
                var transaction = ctx.Database.BeginTransaction();
                try
                {
                    agvWork2.ModifyProgID     = 105;
                    agvWork2.ModifyTime       = DateTime.Now;
                    agvWork2.RedirectFlag     = 1;
                    agvWork2.RedirectPosition = 9999;
                    agvWork2.JobStatus        = 61;
                    ctx.t_AGVWork.Attach(agvWork2);
                    var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(agvWork2);
                    setEntry.SetModifiedProperty("ModifyProgID");
                    setEntry.SetModifiedProperty("ModifyTime");
                    setEntry.SetModifiedProperty("RedirectFlag");
                    setEntry.SetModifiedProperty("RedirectPosition");
                    setEntry.SetModifiedProperty("JobStatus");
                    ctx.SaveChanges();

                    //更新新的站台为预约


                    //更新站台状态为疑问
                    agvStation1 = ctx.t_Station
                                  .Where(b => b.StationNo == agvWork2.Destination)
                                  .SingleOrDefault();
                    agvStation1.OccupiedStatus = 3; //空满状态 0: 空 1:预约中 2:满 3: 存疑
                    agvStation1.ModifyProgID   = 105;
                    agvStation1.ModifyTime     = DateTime.Now;
                    ctx.t_Station.Attach(agvStation1);
                    var setEntry1 = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(agvStation1);
                    setEntry1.SetModifiedProperty("OccupiedStatus");
                    setEntry1.SetModifiedProperty("ModifyProgID");
                    setEntry1.SetModifiedProperty("ModifyTime");
                    ctx.SaveChanges();

                    transaction.Commit();

                    Console.WriteLine(DateTime.Now.ToString() + " updateTask:任务" + agvWork2.ID + " 已更新,站台 " + agvWork2.Destination + " 状态更新为(存疑)");
                    toolStripStatusLabel1.Text = " 从 " + agvWork2.Origination + " 到 " + agvWork2.Destination + " 的搬运任务已更新";

                    return(true);
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    Console.WriteLine(DateTime.Now.ToString() + " createTask:失败了,事务回滚");
                }
                finally
                {
                    transaction.Dispose();
                }
            }

            return(false);
        }
Пример #10
0
Файл: Form1.cs Проект: aijam/MGT
        //创建任务-事务,插入作业任务agvwork数据和更新站台状态agvstation在同一个事务内完成
        private Boolean createTask(t_AGVWork agvWork2)
        {
            t_Station agvStation1;

            //创建任务
            using (var ctx = new AMSContext())
            {
                //检查是否有目的地为同一个站台的任务还在执行中
                List <t_AGVWork> agvWorks = ctx.t_AGVWork
                                            .Where(b => b.Destination == agvWork2.Destination)
                                            .ToList();
                //Console.WriteLine(agvWork1);

                if (agvWorks.Count > 0)
                {
                    toolStripStatusLabel1.Text = DateTime.Now.ToString() + " 已经存在一条目的地为" + agvWork2.Destination + "的任务了,不能重复创建";
                    Console.WriteLine(DateTime.Now.ToString() + " createTask:已经存在一条目的地为" + agvWork2.Destination + "的任务了,不能重复创建");
                    return(false);
                }

                var transaction = ctx.Database.BeginTransaction();
                try
                {
                    agvWork2.ModifyProgID = 101;
                    agvWork2.ModifyTime   = DateTime.Now;
                    ctx.t_AGVWork.Add(agvWork2); //插入agv作业任务
                    ctx.SaveChanges();

                    agvWork2.JobId = agvWork2.ID;
                    var setEntry = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(agvWork2);
                    setEntry.SetModifiedProperty("JobId");
                    ctx.SaveChanges();

                    //更新站台状态为预约
                    agvStation1 = ctx.t_Station
                                  .Where(b => b.StationNo == agvWork2.Destination)
                                  .First();
                    agvStation1.OccupiedStatus = 1; //空满状态 0: 空 1:预约中 2:满
                    agvStation1.ModifyProgID   = 101;
                    agvStation1.ModifyTime     = DateTime.Now;
                    ctx.t_Station.Attach(agvStation1);
                    var setEntry1 = ((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(agvStation1);
                    setEntry1.SetModifiedProperty("OccupiedStatus");
                    setEntry1.SetModifiedProperty("ModifyProgID");
                    setEntry1.SetModifiedProperty("ModifyTime");
                    ctx.SaveChanges();

                    transaction.Commit();

                    Console.WriteLine(DateTime.Now.ToString() + " createTask:任务" + agvWork2.ID + " 已创建,站台 " + agvWork2.Destination + " 状态更新为(预约中)");
                    toolStripStatusLabel1.Text = " 从 " + agvWork2.Origination + " 到 " + agvWork2.Destination + " 的搬运任务已创建";

                    return(true);
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    Console.WriteLine(DateTime.Now.ToString() + " createTask:失败了,事务回滚");
                }
                finally
                {
                    transaction.Dispose();
                }
            }

            return(false);
        }
Пример #11
0
Файл: Form1.cs Проект: aijam/MGT
        //触发任务
        private Boolean triggerTask(int materialType, int stationNo)
        {
            t_AGVPath agvPath1;
            t_Station agvStation1;

            //根据规则找到找路径,一般只能找到一条,如果找到多条,按照规则选一条
            using (var ctx = new AMSContext())
            {
                //read
                agvStation1 = ctx.t_Station
                              .Where(b => b.StationNo == stationNo)
                              .SingleOrDefault();

                agvPath1 = getPath(agvStation1, materialType);
            }

            if (agvPath1 == null)
            {
                Console.WriteLine(DateTime.Now.ToString() + " triggerTask:根据" + agvStation1.StationNo + " 和拉动信号类型 " + materialType + " 找不到对应的路径");
                return(false);
            }

            //如果路径下有多个站台,按照策略选一个站台
            t_Station agvStation2 = getAvailabeStation(agvPath1);

            //构建任务实体
            if (agvStation2 != null)
            {
                t_AGVWork agvWork1 = new t_AGVWork
                {
                    JobType     = 0,
                    Origination = agvStation1.StationNo,
                    Destination = agvStation2.StationNo,
                    //JobId = 10000,
                    Priority      = 0,
                    JobStatus     = 0,
                    TUType        = 0,
                    AGVCancelFlag = 0,
                    CancelFlag    = 0,
                    WMSCancelFlag = 0,
                    RedirectFlag  = 0
                };
                //创建任务并更新货位状态(货位预约,空满状态 0: 空 1:预约中 2:满)
                if (createTask(agvWork1))
                {
                    //更新界面颜色,将对应货位的颜色改为黄色(预约中)
                    //updateGUIStationStautus(agvStation1, 1);

                    stationRelease = false;
                    checkbox_stationRelease.Checked = false; //站台不可再接收其他的搬运指令
                    checkbox_stationRelease.Enabled = false; //而且不允许更改
                }
                else
                {
                    toolStripStatusLabel1.Text = "创建任务失败";
                    Console.WriteLine(DateTime.Now.ToString() + " triggerTask:根据起始站台: " + agvStation1.StationNo + " 和目的站台 " + agvStation2.StationNo + " 创建任务失败");
                    return(false);
                }
                //更新路径上任务数量-本次不实现(控制一条路径上的流量)
            }
            else
            {
                //toolStripStatusLabel1.Text = "无可用站台";
                Console.WriteLine(DateTime.Now.ToString() + " triggerTask:根据起始站台: " + stationNo + " 和目的通道 " + agvPath1.Destination + " 找不到可用的站台");
                return(false);
            }

            return(true);
        }