Esempio n. 1
0
 /// <summary>
 /// 发送小车任务,行:1.打标  2.坡口短缓存架  3.坡口长缓存架 4.坡口短缓存架  5.坡口机   6.组队输送架
 /// </summary>
 /// <param name="car"></param>
 /// <param name="plc"></param>
 /// <param name="task"></param>
 /// <returns></returns>
 public BllResult SendTaskToCar(Equipment car, CarTask task, IPLC plc)
 {
     try
     {
         List <EquipmentProp> propsToWriter = new List <EquipmentProp>();
         var props = car.EquipmentProps;
         var wcsConfirmTaskFinish = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsConfirmTaskFinish.ToString());
         wcsConfirmTaskFinish.Value = "0";
         var wcsActionType = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsActionType.ToString());
         wcsActionType.Value = task.Type.ToString();
         var wcsStartRow = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsStartRow.ToString());
         wcsStartRow.Value = task.FromLocation.ToString();
         var wcsDestinationRow = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsDestinationRow.ToString());
         wcsDestinationRow.Value = task.ToLocation.ToString();
         var wcsTaskHeaderId = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsTaskHeaderId.ToString());
         wcsTaskHeaderId.Value = task.StepTraceId.ToString();
         var wcsTaskCarId = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsTaskCarId.ToString());
         wcsTaskCarId.Value = task.Id.ToString();
         var wcsSwitch = props.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsSwitch.ToString());
         wcsSwitch.Value = "1";
         propsToWriter.AddRange(new List <EquipmentProp>()
         {
             wcsConfirmTaskFinish, wcsStartRow, wcsDestinationRow, wcsTaskHeaderId, wcsTaskCarId, wcsActionType, wcsSwitch
         });
         //return S7Helper.PlcSplitWrite(plc, propsToWriter, 20);
         return(plc.Writes(propsToWriter));
     }
     catch (Exception ex)
     {
         return(BllResultFactory.Error(ex.Message));
     }
 }
        public frmCarsTasksEdit(int?_nCarTaskID, bool _isCopy)
        {
            isCopy = _isCopy;

            nUserID = ((RFMFormMain)Application.OpenForms[0]).UserInfo.UserID;

            if (_nCarTaskID.HasValue)
            {
                nCarTaskID = (int)_nCarTaskID;
            }

            oCarTask = new CarTask();
            if (oCarTask.ErrorNumber != 0)
            {
                IsValid = false;
            }

            if (IsValid)
            {
                oPartner     = new Partner();
                oZone        = new Zone();
                oCarTaskUnit = new CarTaskUnit();
                if (oPartner.ErrorNumber != 0 || oZone.ErrorNumber != 0 || oCarTaskUnit.ErrorNumber != 0)
                {
                    IsValid = false;
                }
            }

            if (IsValid)
            {
                InitializeComponent();
            }
        }
Esempio n. 3
0
 public BllResult SendCleanTaskToCar(Equipment car, CarTask task, IPLC plc)
 {
     try
     {
         List <EquipmentProp> propsToWriter = new List <EquipmentProp>();
         var props  = car.EquipmentProps;
         var action = props.Find(t => t.EquipmentTypeTemplateCode == "wcsActionType");
         action.Value = "0";
         var taskRow = props.Find(t => t.EquipmentTypeTemplateCode == "wcsTaskRow");
         taskRow.Value = "0";
         //var taskLine = props.Find(t => t.EquipmentTypeTemplateCode == "wcsTaskLine");
         //taskLine.Value = "0";
         //var taskLayer = props.Find(t => t.EquipmentTypeTemplateCode == "wcsTaskLayer");
         //taskLayer.Value = "0";
         var taskHeader = props.Find(t => t.EquipmentTypeTemplateCode == "wcsTaskHeaderId");
         taskHeader.Value = "0";
         var taskCar = props.Find(t => t.EquipmentTypeTemplateCode == "wcsTaskCarId");
         taskCar.Value = "0";
         var switchEnable = props.Find(t => t.EquipmentTypeTemplateCode == "wcsSwitch");
         switchEnable.Value = "0";
         var hasPallet = props.Find(t => t.EquipmentTypeTemplateCode == "hasPallet");
         hasPallet.Value = "1";
         propsToWriter.AddRange(new List <EquipmentProp>()
         {
             action, taskRow, taskHeader, taskCar, switchEnable, hasPallet
         });
         //return S7Helper.PlcSplitWrite(plc, propsToWriter, 20);
         return(plc.Writes(propsToWriter));
     }
     catch (Exception ex)
     {
         return(BllResultFactory.Error(ex.Message));
     }
 }
Esempio n. 4
0
 /// <summary>
 /// 处理翻转请求
 /// </summary>
 /// <param name="bevel"></param>
 /// <param name="allEquipments"></param>
 /// <param name="stepTraceList"></param>
 /// <param name="plc"></param>
 /// <returns></returns>
 public override BllResult ExcuteFlip(Equipment bevel, List <Equipment> allEquipments, List <StepTrace> stepTraceList, IPLC plc)
 {
     try
     {
         var Step_Trace_Id = bevel.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestTaskId.ToString());
         var convertResult = int.TryParse(Step_Trace_Id.Value, out int stepTraceId);
         if (!convertResult)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,工序任务的id[{Step_Trace_Id.Value}]转化为整数失败!", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         if (stepTraceId == 0)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,工序跟踪ID为0", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         var stepTrace = stepTraceList.FirstOrDefault(t => t.Id == Convert.ToInt32(Step_Trace_Id.Value));
         if (stepTrace == null)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,找不到未完成的工序任务id[{Step_Trace_Id.Value}]", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
         CarTask taskCar = new CarTask();
         taskCar.StepTraceId  = stepTrace.Id;
         taskCar.CarNo        = 0;
         taskCar.Type         = CarTaskType.取货和放货.GetIndexInt();
         taskCar.FromLocation = bevel.SelfAddress.ToString();
         taskCar.ToLocation   = bevel.GoAddress.ToString();
         taskCar.ReSend       = 0;
         taskCar.Status       = TaskCarStatus.Init.GetIndexInt();
         //taskCar.IsFlip = Convert.ToInt32(Allow_Flip);
         var updateResult = AppSession.Dal.InsertCommonModel <CarTask>(taskCar);
         if (updateResult.Success)
         {
             return(SendFlipToPlc(bevel, true, plc));
         }
     }
     catch (Exception ex)
     {
         Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号时候,发生异常:{ex.Message}", LogLevel.Exception, ex);
         return(BllResultFactory.Error());
     }
     return(BllResultFactory.Sucess());
 }
Esempio n. 5
0
        public frmCarsTasks()
        {
            oCarTaskList = new CarTask();
            oCarTaskCur  = new CarTask();
            if (oCarTaskList.ErrorNumber != 0 || oCarTaskCur.ErrorNumber != 0)
            {
                IsValid = false;
            }

            oCarTaskTemp = new CarTask();
            if (oCarTaskTemp.ErrorNumber != 0)
            {
                IsValid = false;
            }

            if (IsValid)
            {
                InitializeComponent();
            }
        }
        /// <summary>
        /// 执行下料请求
        /// 注意:allEquipments引用所有设备,此为共享应用
        /// </summary>
        /// <param name="cutter"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public override BllResult ExcuteRequest(Equipment cutter, List <Equipment> allEquipments, List <StepTrace> stepTraceList, IPLC plc)
        {
            try
            {
                var RequestTaskId = cutter.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestTaskId.ToString());
                var convertResult = int.TryParse(RequestTaskId.Value, out int stepTraceId);
                if (!convertResult)
                {
                    Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求失败,工序任务的id[{RequestTaskId.Value}]转化为整数失败!", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                if (stepTraceId > 0)
                {
                    var stepTrace = stepTraceList.FirstOrDefault(t => t.Id == stepTraceId);
                    if (stepTrace != null)
                    {
                        if (stepTrace.Status == StepTraceStatus.设备开始生产.GetIndexInt() || stepTrace.Status == StepTraceStatus.设备请求下料.GetIndexInt())
                        {
                            ////当前工序
                            Step step;
                            //下个工序
                            Step nextStep;
                            //所有的下个站台
                            List <StepStation> stepStations;
                            //下个站台对应的设备
                            Equipment nextEquipment = null;

                            using (IDbConnection connection = AppSession.Dal.GetConnection())
                            {
                                connection.Open();
                                // NextStepId为0,表示没有下到工序id,就需要去工序表查询下道工序
                                if (stepTrace.NextStepId == 0)
                                {
                                    step     = connection.Get <Step>(stepTrace.StepId);
                                    nextStep = connection.QueryFirstOrDefault <Step>($"select top 1 * from step where and sequence > {step.Sequence} order by sequence");
                                    //更新下个工序
                                    stepTrace.NextStepId = nextStep.Id.Value;
                                    stepTrace.UpdateTime = DateTime.Now;
                                    stepTrace.UpdateBy   = App.User.UserCode;
                                    connection.Update <StepTrace>(stepTrace);
                                    return(BllResultFactory.Error());
                                }
                                else
                                {
                                    nextStep = connection.Get <Step>(stepTrace.NextStepId);
                                }
                                if (nextStep == null)
                                {
                                    Logger.Log($"桁车处理站台【{stepTrace.StationId}】下料请求时候,数据错误:不存在产品[{stepTrace.ProductCode}]对应的下个工序!", LogLevel.Error);
                                    return(BllResultFactory.Error());
                                }
                                stepStations = connection.Query <StepStation>($"select * from step_station where stepId = '{nextStep.Id}'").ToList();
                            }
                            if (stepStations.Count < 1)
                            {
                                Logger.Log($"桁车处理站台【{stepTrace.StationId}】下料请求时候,数据错误:不存在工序[{nextStep.Id}][{nextStep.Code}]对应的站台!", LogLevel.Error);
                                return(BllResultFactory.Error());
                            }
                            //找到工序对应的所有站台
                            var stationList = cutter.StationList.Where(t => stepStations.Exists(x => x.StationId == t.Id)).ToList();
                            // 排除已经被预定的站台
                            stationList.RemoveAll(t => stepTraceList.Exists(x => x.NextStationId == t.Id));
                            if (stationList.Count() == 0)
                            {
                                return(BllResultFactory.Error());
                            }

                            // 根据站台找到所有对应的设备
                            var tempEquipments = allEquipments.Where(t => stationList.Exists(x => x.Id == t.StationId)).ToList();
                            if (tempEquipments.Count() == 0)
                            {
                                return(BllResultFactory.Error());
                            }
                            foreach (var item in tempEquipments)
                            {
                                //如果站台请求上料,才可以用
                                var ArriveResult = item.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == MachineProps.ArriveResult.ToString());
                                if (ArriveResult?.Value == MachineMessageFlag.自动请求上料.GetIndexString())
                                {
                                    //增加任务判断
                                    var countResult = AppSession.Dal.GetCommonModelCount <StepTrace>($"where status >{StepTraceStatus.设备开始生产.GetIndexInt()} and status < {StepTraceStatus.任务完成.GetIndexInt()} and nextStationId = {item.StationId}");
                                    if (countResult.Success && countResult.Data < 1)
                                    {
                                        nextEquipment = item;
                                        break;
                                    }
                                }
                            }
                            if (nextEquipment != null && nextEquipment.StationId != 0)
                            {
                                //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
                                CarTask taskCar = new CarTask();
                                //taskCar.StepTraceId = Convert.ToInt32(Step_Trace_Id);
                                taskCar.StepTraceId  = stepTrace.Id;
                                taskCar.CarNo        = 0;
                                taskCar.Type         = CarTaskType.取货和放货.GetIndexInt();
                                taskCar.FromLocation = cutter.SelfAddress.ToString();
                                taskCar.ToLocation   = cutter.GoAddress.ToString();
                                taskCar.ReSend       = 0;
                                taskCar.Status       = TaskCarStatus.Executing.GetIndexInt();
                                //taskCar.IsFlip = Convert.ToInt32(Allow_Flip);

                                //修改工序监控
                                stepTrace.NextStepId    = nextStep.Id.Value;
                                stepTrace.NextStationId = nextEquipment.StationId;
                                stepTrace.Status        = StepTraceStatus.等待任务执行.GetIndexInt();
                                stepTrace.UpdateTime    = DateTime.Now;
                                stepTrace.UpdateBy      = App.User.UserCode;

                                using (IDbConnection connection = AppSession.Dal.GetConnection())
                                {
                                    IDbTransaction tran = null;
                                    try
                                    {
                                        connection.Open();
                                        tran = connection.BeginTransaction();
                                        connection.Insert <CarTask>(taskCar, transaction: tran);
                                        connection.Update <StepTrace>(stepTrace, transaction: tran);

                                        var sendResult = SendRequestToPlc(plc, cutter, true);
                                        if (sendResult.Success)
                                        {
                                            tran.Commit();
                                            Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求 成功,任务:{stepTrace.Id}", LogLevel.Success);
                                            return(BllResultFactory.Sucess());
                                        }
                                        else
                                        {
                                            tran?.Rollback();
                                            Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求的时候,写入PLC失败,任务:{stepTrace.Id},原因:{sendResult.Msg}", LogLevel.Error);
                                            return(BllResultFactory.Error());
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        tran?.Rollback();
                                        Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求的时候,发生异常,任务:{stepTrace.Id},原因:{ex.Message}", LogLevel.Exception, ex);
                                        return(BllResultFactory.Error());
                                    }
                                }
                            }
                            return(BllResultFactory.Sucess());
                        }
                        //if (stepTrace.Status > StepTraceStatus.设备请求下料.GetIndexInt())
                        //{
                        //    var WCS_Step_Trace_Id = cutter.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.WCSReplyTaskId.ToString());
                        //    WCS_Step_Trace_Id.Value = "0";
                        //    BllResult plcResult = plc.Write(WCS_Step_Trace_Id);
                        //    if (plcResult.Success)
                        //    {
                        //        Logger.Log($"清除工位[{cutter.StationId}]设备[{cutter.Name}]的任务号{stepTrace.Id}成功", LogLevel.Success);
                        //        return BllResultFactory.Sucess();
                        //    }
                        //    else
                        //    {
                        //        Logger.Log($"清除工位[{cutter.StationId}]设备[{cutter.Name}]的任务号{stepTrace.Id}失败,写入PLC失败:{plcResult.Msg}", LogLevel.Error);
                        //        return BllResultFactory.Error();
                        //    }
                        //}
                    }
                    else
                    {
                        Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求失败,找不到未完成的工序任务id[{RequestTaskId.Value}]", LogLevel.Error);
                        return(BllResultFactory.Error());
                    }
                }
                else
                {
                    // 如果不存在 已经处理过的任务,但是还在请求下线,说明是手动上的,或是id丢了
                    if (!stepTraceList.Exists(t => t.StationId == cutter.StationId && t.Status >= StepTraceStatus.设备请求下料.GetIndexInt()))
                    {
                        Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求失败,工序跟踪ID为0", LogLevel.Error);
                        return(BllResultFactory.Error());
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求时候,发生异常:{ex.Message}", LogLevel.Exception, ex);
                return(BllResultFactory.Error());
            }
            return(BllResultFactory.Sucess());
        }
Esempio n. 7
0
        private BllResult ExcuteRequest(Equipment bevelCcache, Equipment bevel, StepTrace stepTrace, IPLC plc)
        {
            //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
            CarTask taskCar = new CarTask();

            taskCar.StepTraceId  = stepTrace.Id;
            taskCar.CarNo        = 1;
            taskCar.Type         = CarTaskType.取货和放货.GetIndexInt();
            taskCar.FromLocation = bevelCcache.Station.TrussTakeStationId.ToString();
            taskCar.ToLocation   = bevel.Station.TrussPutStationId.ToString();
            taskCar.ReSend       = 0;
            taskCar.Status       = TaskCarStatus.Init.GetIndexInt();
            //taskCar.IsFlip = CarTaskType.取货和放货.GetIndexInt();
            taskCar.CreateTime = DateTime.Now;
            taskCar.EndTime    = DateTime.Now;
            taskCar.StartTime  = DateTime.Now;
            taskCar.UpdateTime = DateTime.Now;

            //修改工序跟踪
            stepTrace.NextStationId  = bevel.StationId;
            stepTrace.Status         = StepTraceStatus.等待任务执行.GetIndexInt();
            stepTrace.UpdateTime     = DateTime.Now;
            stepTrace.UpdateBy       = App.User.UserCode;
            stepTrace.CreateTime     = DateTime.Now;
            stepTrace.LineInTime     = DateTime.Now; //
            stepTrace.LineOutTime    = DateTime.Now; //
            stepTrace.StationInTime  = DateTime.Now;
            stepTrace.StationOutTime = DateTime.Now;

            var requestNumber = bevelCcache.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == PipeLineProps.RequestNumber.ToString());

            using (IDbConnection connection = AppSession.Dal.GetConnection())
            {
                IDbTransaction tran = null;
                try
                {
                    connection.Open();
                    tran = connection.BeginTransaction();

                    connection.Insert <CarTask>(taskCar, transaction: tran);
                    connection.Update <StepTrace>(stepTrace, transaction: tran);

                    var sendResult = SendAddressReplyToPlc(bevelCcache, plc, StationMessageFlag.地址回复, StationLoadStatus.默认, requestNumber.Value, stepTrace.Id.ToString(), "", stepTrace.WcsProductType.ToString(), stepTrace.PipeLength.ToString(), stepTrace.PipeDiameter.ToString(), stepTrace.PipeThickness.ToString(), bevelCcache.GoAddress);
                    if (sendResult.Success)
                    {
                        tran.Commit();
                        Logger.Log($"处理工位[{bevelCcache.StationCode}]的设备[{bevelCcache.Name}] 地址请求 成功,任务:{stepTrace.Id}", LogLevel.Success);
                        return(BllResultFactory.Sucess());
                    }
                    else
                    {
                        tran?.Rollback();
                        Logger.Log($"处理工位[{bevelCcache.StationCode}]的设备[{bevelCcache.Name}] 地址请求的时候,写入PLC失败,任务:{stepTrace.Id},原因:{sendResult.Msg}", LogLevel.Error);
                        return(BllResultFactory.Error());
                    }
                }
                catch (Exception ex)
                {
                    tran?.Rollback();
                    Logger.Log($"处理工位[{bevelCcache.StationCode}]的设备[{bevelCcache.Name}] 地址请求的时候,发生异常,任务:{stepTrace.Id},原因:{ex.Message}", LogLevel.Exception, ex);
                    return(BllResultFactory.Error());
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 执行下料请求
        /// 注意:allEquipments引用所有设备,此为共享应用
        /// </summary>
        /// <param name="bevel"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public override BllResult ExcuteRequest(Equipment bevel, List <Equipment> allEquipments, List <StepTrace> stepTraceList, IPLC plc)
        {
            try
            {
                var Step_Trace_Id = bevel.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestTaskId.ToString());
                var convertResult = int.TryParse(Step_Trace_Id.Value, out int stepTraceId);
                if (!convertResult)
                {
                    Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求失败,工序任务的id[{Step_Trace_Id.Value}]转化为整数失败!", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                if (stepTraceId == 0)
                {
                    Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求失败,工序跟踪ID为0", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                var stepTrace = stepTraceList.FirstOrDefault(t => t.Id == Convert.ToInt32(Step_Trace_Id.Value));
                if (stepTrace == null)
                {
                    Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求失败,找不到未完成的工序任务id[{Step_Trace_Id.Value}]", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                if (stepTrace.Status == StepTraceStatus.设备开始生产.GetIndexInt())
                {
                    using (IDbConnection connection = AppSession.Dal.GetConnection())
                    {
                        connection.Open();
                        // NextStepId为0,表示没有下到工序id,就需要去工序表查询下道工序
                        if (stepTrace.NextStepId == 0)
                        {
                            var step     = connection.Get <Step>(stepTrace.StepId);
                            var nextStep = connection.QueryFirstOrDefault <Step>($"select top 1 * from step where and sequence > {step.Sequence} order by sequence");
                            //更新下个工序
                            stepTrace.NextStepId = nextStep.Id.Value;
                            stepTrace.Status     = StepTraceStatus.设备请求下料.GetIndexInt();
                            stepTrace.UpdateTime = DateTime.Now;
                            stepTrace.UpdateBy   = App.User.UserCode;
                            connection.Update <StepTrace>(stepTrace);
                            return(BllResultFactory.Error());
                        }
                    }
                }
                if (stepTrace.Status == StepTraceStatus.设备请求下料.GetIndexInt())
                {
                    var nextEquipment = allEquipments.FirstOrDefault(t => t.SelfAddress == bevel.GoAddress.ToString());
                    //判断是否有上料请求  响应下料
                    if (nextEquipment == null)
                    {
                        Logger.Log($"工位[{bevel.StationCode}]的设备[{bevel.Name}] 响应地址请求失败,原因:组队缓存位没有设置对应的下个设备", LogLevel.Error);
                        return(BllResultFactory.Error());
                    }
                    //组队区输送线没货才能去
                    var HasGoods = nextEquipment.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == PipeLineProps.HasGoods.ToString());
                    if (HasGoods.Value != PipeLineGoods.无货.GetIndexString())
                    {
                        return(BllResultFactory.Error());
                    }
                    //如果已经有了去下个设备的任务,那么就不能去,需要等待
                    if (stepTraceList.Exists(t => t.NextStationId == nextEquipment.StationId))
                    {
                        return(BllResultFactory.Error());
                    }
                    //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
                    CarTask taskCar = new CarTask();
                    //taskCar.StepTraceId = Convert.ToInt32(Step_Trace_Id);
                    taskCar.StepTraceId  = stepTrace.Id;
                    taskCar.CarNo        = 0;
                    taskCar.Type         = CarTaskType.取货和放货.GetIndexInt();
                    taskCar.FromLocation = bevel.SelfAddress.ToString();
                    taskCar.ToLocation   = bevel.GoAddress.ToString();
                    taskCar.ReSend       = 0;
                    taskCar.Status       = TaskCarStatus.Executing.GetIndexInt();

                    //修改工序监控
                    stepTrace.NextStationId = nextEquipment.StationId;
                    stepTrace.Status        = StepTraceStatus.等待任务执行.GetIndexInt();
                    stepTrace.UpdateTime    = DateTime.Now;
                    stepTrace.UpdateBy      = App.User.UserCode;

                    var requestNumber = bevel.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == PipeLineProps.RequestNumber.ToString());

                    using (IDbConnection connection = AppSession.Dal.GetConnection())
                    {
                        IDbTransaction tran = null;
                        try
                        {
                            connection.Open();
                            tran = connection.BeginTransaction();
                            connection.Insert <CarTask>(taskCar, transaction: tran);
                            connection.Update <StepTrace>(stepTrace, transaction: tran);

                            var sendResult = SendAddressReplyToPlc(bevel, plc, MachineMessageFlag.回复允许下料, requestNumber.Value, stepTrace.Id.ToString(), "", "0", stepTrace.WcsProductType.ToString(), stepTrace.PipeLength.ToString(), stepTrace.PipeDiameter.ToString(), stepTrace.PipeThickness.ToString(), bevel.GoAddress);
                            if (sendResult.Success)
                            {
                                tran.Commit();
                                Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求 成功,任务:{stepTrace.Id}", LogLevel.Success);
                                return(BllResultFactory.Sucess());
                            }
                            else
                            {
                                tran?.Rollback();
                                Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求的时候,写入PLC失败,任务:{stepTrace.Id},原因:{sendResult.Msg}", LogLevel.Error);
                                return(BllResultFactory.Error());
                            }
                        }
                        catch (Exception ex)
                        {
                            tran?.Rollback();
                            Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 下料请求的时候,发生异常,任务:{stepTrace.Id},原因:{ex.Message}", LogLevel.Exception, ex);
                            return(BllResultFactory.Error());
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log($"处理设备【{bevel.Name}】下料请求时候,发生异常:{ex.Message}", LogLevel.Exception, ex);
                return(BllResultFactory.Error());
            }
            return(BllResultFactory.Sucess());
        }
        private void frmCarsTasksEdit_Load(object sender, EventArgs e)
        {
            bool bResult = true;

            oCarTask.ID = nCarTaskID;

            // классификаторы
            bResult = cboPartner_Restore() &&
                      cboZone_Restore() &&
                      cboCarTaskUnit_Restore();

            if (bResult)
            {
                if (nCarTaskID.HasValue && (int)nCarTaskID != 0)
                {
                    // существующее или копируемое задание
                    bResult = oCarTask.ReFillOne((int)nCarTaskID) && (oCarTask.ErrorNumber == 0);
                    if (bResult)
                    {
                        #region Поля, заполняемые одинаково в режимах редактирования и копирования
                        cboPartner.SelectedValue = oCarTask.PartnerID;
                        txtDeliveryAddress.Text  = oCarTask.DeliveryAddress;

                        if (oCarTask.ZoneID.HasValue)
                        {
                            cboZone.SelectedValue = oCarTask.ZoneID;
                        }
                        else
                        {
                            cboZone.SelectedValue = -1;
                        }

                        if (oCarTask.Longitude.HasValue)
                        {
                            txtLongitude.Text = oCarTask.Longitude.ToString();
                        }
                        if (oCarTask.Latitude.HasValue)
                        {
                            txtLatitude.Text = oCarTask.Latitude.ToString();
                        }

                        numDistance.Value = oCarTask.Distance;
                        #endregion

                        #region Поля, заполняемые по-разному в режимах редактирования и копирования
                        if (isCopy)
                        {
                            // пересоздаем задание (очищаем данные)
                            oCarTask = new CarTask();

                            Text += " (копирование с " + nCarTaskID.ToString() + ")";

                            dtpDateTask.Value = DateTime.Today.AddDays(1);

                            cboUnit.SelectedValue = -1;
                        }
                        else
                        {
                            Text += " (" + nCarTaskID.ToString() + ")";

                            dtpDateTask.Value = oCarTask.DateTask;

                            if (oCarTask.CarTaskUnitID.HasValue)
                            {
                                cboUnit.SelectedValue = oCarTask.CarTaskUnitID;
                            }
                            else
                            {
                                cboUnit.SelectedValue = -1;
                            }

                            numNetto.Value      = oCarTask.Netto;
                            numBrutto.Value     = oCarTask.Brutto;
                            numPalletsQnt.Value = oCarTask.PalletsQnt;

                            numTaskInnerCost.Value = oCarTask.TaskInnerCost;
                            numTaskOuterCost.Value = oCarTask.TaskOuterCost;

                            numUnitsQnt.Value   = oCarTask.UnitsQnt;
                            numPrice.Value      = oCarTask.Price;
                            numTaskAmount.Value = oCarTask.TaskAmount;

                            txtNote.Text = oCarTask.Note;
                        }
                        #endregion
                    }
                }
                else
                {
                    // новое задание
                    cboPartner.SelectedValue      =
                        cboZone.SelectedValue     =
                            cboUnit.SelectedValue =
                                -1;

                    dtpDateTask.Value = DateTime.Today.AddDays(1);
                }
            }

            if (!bResult)
            {
                Dispose();
            }
        }
        /// <summary>
        /// 执行下料请求
        /// 注意:allEquipments引用所有设备,此为共享应用
        /// </summary>
        /// <param name="cutter"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public override BllResult ExcuteRequest(Equipment cutter, List <Equipment> allEquipments, List <StepTrace> stepTraceList, IPLC plc)
        {
            try
            {
                var RequestTaskId = cutter.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestTaskId.ToString());
                var convertResult = int.TryParse(RequestTaskId.Value, out int stepTraceId);
                if (!convertResult)
                {
                    Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求失败,工序任务的id[{RequestTaskId.Value}]转化为整数失败!", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                var stepTrace = stepTraceList.FirstOrDefault(t => t.Id == stepTraceId);
                if (stepTrace == null)
                {
                    Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求失败,找不到未完成的工序任务id[{RequestTaskId.Value}]", LogLevel.Error);
                    return(BllResultFactory.Error());
                }

                //下个站台对应的设备
                Equipment nextEquipment = null;

                var stepStationsResult = AppSession.Dal.GetCommonModelByCondition <StepStation>($" where stepId = {stepTrace.NextStepId}");
                if (!stepStationsResult.Success)
                {
                    Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求时候,数据错误:不存在工序[{stepTrace.NextStepId}]对应的站台!,原因:{stepStationsResult.Msg}", LogLevel.Error);
                    return(BllResultFactory.Error());
                }
                //找到工序对应的所有站台
                var stationList = cutter.StationList.Where(t => stepStationsResult.Data.Exists(x => x.StationId == t.Id)).ToList();
                // 排除已经被预定的站台
                stationList.RemoveAll(t => stepTraceList.Exists(x => x.NextStationId == t.Id));
                if (stationList.Count() == 0)
                {
                    return(BllResultFactory.Error());
                }

                // 根据站台找到所有对应的设备
                var tempEquipments = allEquipments.Where(t => stationList.Exists(x => x.Id == t.StationId)).ToList();
                // 缓存位不能放长度超过自己的管子
                tempEquipments = tempEquipments.Where(t => t.ColumnIndex >= stepTrace.PipeLength).OrderBy(t => t.ColumnIndex).ToList();
                //如果管子长度小于1800,就不能放到中间的坡口缓存位,因为间隙大,管子会掉下来
                if (stepTrace.PipeLength < 1800)
                {
                    tempEquipments.RemoveAll(t => t.Code == "BevelCache2");
                }

                if (tempEquipments.Count() == 0)
                {
                    return(BllResultFactory.Error());
                }

                foreach (var item in tempEquipments)
                {
                    var OperationModel = item.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == MachineProps.OperationModel.ToString());
                    var TotalError     = item.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == MachineProps.TotalError.ToString());
                    if (OperationModel?.Value != OperationModelFlag.联机.GetIndexString() || TotalError?.Value != TotalErrorFlag.无故障.GetIndexString())
                    {
                        continue;
                    }
                    var ArriveMessage = item.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == MachineProps.ArriveMessage.ToString());
                    //如果站台请求上料 或者 输送线为空,才可以用
                    var HasGoods = item.EquipmentProps.FirstOrDefault(t => t.EquipmentTypeTemplateCode == PipeLineProps.HasGoods.ToString());
                    if (ArriveMessage?.Value == MachineMessageFlag.PLC自动请求上料.GetIndexString() || HasGoods?.Value == PipeLineGoods.无货.GetIndexString())
                    {
                        //增加任务判断
                        var countResult = AppSession.Dal.GetCommonModelCount <StepTrace>($"where status >{StepTraceStatus.设备开始生产.GetIndexInt()} and status < {StepTraceStatus.任务完成.GetIndexInt()} and nextStationId = {item.StationId}");
                        if (countResult.Success && countResult.Data < 1)
                        {
                            nextEquipment = item;
                            break;
                        }
                    }
                }
                if (nextEquipment != null && nextEquipment.StationId != 0)
                {
                    var requestNumber = cutter.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestNumber.ToString());

                    //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
                    CarTask taskCar = new CarTask();
                    //taskCar.StepTraceId = Convert.ToInt32(Step_Trace_Id);
                    taskCar.StepTraceId  = stepTrace.Id;
                    taskCar.CarNo        = 1;
                    taskCar.Type         = CarTaskType.取货和放货.GetIndexInt();
                    taskCar.FromLocation = cutter.Station.TrussTakeStationId.ToString();
                    taskCar.ToLocation   = nextEquipment.Station.TrussPutStationId.ToString();
                    taskCar.ReSend       = 0;
                    taskCar.Status       = TaskCarStatus.Init.GetIndexInt();
                    taskCar.StartTime    = DateTime.Now;
                    taskCar.EndTime      = DateTime.Now;
                    taskCar.CreateTime   = DateTime.Now;
                    taskCar.UpdateTime   = DateTime.Now;

                    //taskCar.IsFlip = Convert.ToInt32(Allow_Flip);

                    //修改工序监控
                    stepTrace.NextStationId = nextEquipment.StationId;
                    stepTrace.Status        = StepTraceStatus.等待任务执行.GetIndexInt();
                    stepTrace.UpdateTime    = DateTime.Now;
                    stepTrace.UpdateBy      = App.User.UserCode;

                    using (IDbConnection connection = AppSession.Dal.GetConnection())
                    {
                        IDbTransaction tran = null;
                        try
                        {
                            connection.Open();
                            tran = connection.BeginTransaction();
                            connection.Insert <CarTask>(taskCar, transaction: tran);
                            connection.Update <StepTrace>(stepTrace, transaction: tran);
                            //connection.Execute($"delete from step_trace where id < {stepTrace.Id} and stationId = {cutter.StationId} and status = {StepTraceStatus.设备开始生产.GetIndexInt()}");
                            var sendResult = SendAddressReplyToPlc(cutter, plc, MachineMessageFlag.WCS回复允许下料, requestNumber.Value, stepTrace.Id.ToString(), "", "0", stepTrace.WcsProductType.ToString(), stepTrace.PipeLength.ToString(), stepTrace.PipeDiameter.ToString(), stepTrace.PipeThickness.ToString(), cutter.GoAddress);
                            if (sendResult.Success)
                            {
                                tran.Commit();
                                Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求 成功,任务:{stepTrace.Id}", LogLevel.Success);
                                return(BllResultFactory.Sucess());
                            }
                            else
                            {
                                tran?.Rollback();
                                Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求的时候,写入PLC失败,任务:{stepTrace.Id},原因:{sendResult.Msg}", LogLevel.Error);
                                return(BllResultFactory.Error());
                            }
                        }
                        catch (Exception ex)
                        {
                            tran?.Rollback();
                            Logger.Log($"处理工位[{cutter.StationCode}]的设备[{cutter.Name}] 下料请求的时候,发生异常,任务:{stepTrace.Id},原因:{ex.Message}", LogLevel.Exception, ex);
                            return(BllResultFactory.Error());
                        }
                    }
                }
                return(BllResultFactory.Sucess());
            }
            catch (Exception ex)
            {
                Logger.Log($"处理工位[{cutter.StationId}]设备[{cutter.Name}]下料请求时候,发生异常:{ex.Message}", LogLevel.Exception, ex);
            }
            return(BllResultFactory.Error());
        }
Esempio n. 11
0
 /// <summary>
 /// 处理翻转请求
 /// </summary>
 /// <param name="bevel"></param>
 /// <param name="allEquipments"></param>
 /// <param name="stepTraceList"></param>
 /// <param name="plc"></param>
 /// <returns></returns>
 public override BllResult ExcuteFlip(Equipment bevel, List <Equipment> allEquipments, List <StepTrace> stepTraceList, IPLC plc)
 {
     try
     {
         var RequestTaskId = bevel.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == MachineProps.RequestTaskId.ToString());
         var convertResult = int.TryParse(RequestTaskId.Value, out int stepTraceId);
         if (!convertResult)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,工序任务的id[{RequestTaskId.Value}]转化为整数失败!", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         if (stepTraceId == 0)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,工序跟踪ID为0", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         var stepTrace = stepTraceList.FirstOrDefault(t => t.Id == stepTraceId);
         if (stepTrace == null)
         {
             Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号失败,找不到未完成的工序任务id[{stepTraceId}]", LogLevel.Error);
             return(BllResultFactory.Error());
         }
         //就生成AGV任务并且插入数据库   小车任务的状态和类型需要重新定义?
         CarTask taskCar = new CarTask();
         taskCar.StepTraceId  = stepTrace.Id;
         taskCar.CarNo        = 1;
         taskCar.Type         = CarTaskType.翻转.GetIndexInt();
         taskCar.FromLocation = bevel.Station.TrussTakeStationId.ToString();
         taskCar.ToLocation   = bevel.Station.TrussTakeStationId.ToString();
         taskCar.ReSend       = 0;
         taskCar.Status       = TaskCarStatus.Init.GetIndexInt();
         taskCar.CreateTime   = DateTime.Now;
         taskCar.EndTime      = DateTime.Now;
         taskCar.StartTime    = DateTime.Now;
         taskCar.UpdateTime   = DateTime.Now;
         //taskCar.IsFlip = Convert.ToInt32(Allow_Flip);
         var updateResult = AppSession.Dal.InsertCommonModel <CarTask>(taskCar);
         if (updateResult.Success)
         {
             var sendResult = SendFlipToPlc(bevel, plc, FlipFlag.WCS回复允许翻转);
             if (sendResult.Success)
             {
                 Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转请求成功,对应的任务[{stepTrace.Id}]信息写入设备", LogLevel.Success);
             }
             else
             {
                 //PLC写入失败,就把数据改回来
                 AppSession.Dal.DeleteCommonModelByIds <CarTask>(new List <int>()
                 {
                     taskCar.Id.Value
                 });
                 Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转请求失败,对应的任务[{stepTrace.Id}]信息写入PLC失败,原因:{sendResult.Msg}", LogLevel.Error);
             }
             return(sendResult);
         }
     }
     catch (Exception ex)
     {
         Logger.Log($"处理工位[{bevel.StationCode}]的设备[{bevel.Name}] 翻转信号时候,发生异常:{ex.Message}", LogLevel.Exception, ex);
         return(BllResultFactory.Error());
     }
     return(BllResultFactory.Sucess());
 }
Esempio n. 12
0
        /// <summary>
        /// 执行小车任务
        /// </summary>
        /// <param name="car"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public BllResult ExcuteTDR(Equipment car, IPLC plc)
        {
            //子任务号
            int taskCarId = int.Parse(car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "TaskCarId").Value);
            //主任务号
            int taskheaderId = int.Parse(car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "TaskHeaderID").Value);
            //小车任务类型
            string actionType = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "actionType").Value;
            //小车行
            string row = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "row").Value;
            ////小车位置
            //var position = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "position").Value;
            //小车状态
            string carStatus = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "carStatus").Value;
            //小车错误状态
            string carError = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "carError").Value;
            //小车编码
            int carNo = int.Parse(car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "carNo").Value);
            //小车到达
            string arriveMessage = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "arriveMessage").Value;
            //输出穿梭板上是否有货
            string hasPallet = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "hasPallet").Value;
            //AGV控制模式
            string controlMode = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == "controlMode").Value;

            if (controlMode != CarControlMode.自动.GetIndexString() || carError != CarError.Normal.GetIndexString())
            {
                return(BllResultFactory.Error());
            }

            var TaskCarResult = AppSession.Dal.GetCommonModelByCondition <CarTask>($"where status < {TaskCarStatus.Executed.GetIndexInt()} and carNo={carNo}");

            if (TaskCarResult.Success)
            {
                List <CarTask> tasks = TaskCarResult.Data.OrderBy(t => t.Id).ToList();

                // 如果小车反馈完成,就修改任务状态为“完成”,然后回复小车确认完成
                if (carStatus == CarStatus.Finish.GetIndexString())
                {
                    CarTask carTask = tasks.FirstOrDefault(t => t.Id == taskCarId);
                    if (carTask != null)
                    {
                        //保存旧数据
                        var carTaskClone = (CarTask)carTask.DeepClone();
                        //修改状态和完成时间
                        carTask.EndTime = DateTime.Now;
                        carTask.Status  = TaskCarStatus.Waiting.GetIndexInt();
                        if (AppSession.Dal.UpdateCommonModel <CarTask>(carTask).Success)
                        {
                            //确定过账任务完成
                            var sendResult = sendConfirmTaskFinish(car, plc);
                            if (sendResult.Success)
                            {
                                Logger.Log($"小车[car{carNo}]完成[{taskCarId}]号任务,ECS给PLC确认完成信号成功!", LogLevel.Warning);
                            }
                            else
                            {
                                AppSession.Dal.UpdateCommonModel <CarTask>(carTaskClone);
                                Logger.Log($"小车[car{carNo}]完成[{taskCarId}]号任务,但是ECS给PLC确认完成信号失败,原因:{sendResult.Msg}!", LogLevel.Warning);
                            }
                        }
                        return(BllResultFactory.Sucess());
                    }
                    else
                    {
                        Logger.Log($"小车[car{carNo}]任务已经完成ID为[{taskCarId}]的任务,但是该任务不存在!", LogLevel.Warning);
                        return(BllResultFactory.Error());
                    }
                }

                // 如果小车是执行中,就清除小车开启信号
                if (carStatus == CarStatus.Executing.GetIndexString())
                {
                    CarTask carTask = tasks.FirstOrDefault(t => t.Id == taskCarId);
                    if (carTask != null)
                    {
                        if (carTask.Status == TaskCarStatus.Init.GetIndexInt())
                        {
                            var sendResult = sendWcsSwitch(car, plc, "0");
                            if (sendResult.Success)
                            {
                                // 更新小车任务状态
                                carTask.Status    = TaskCarStatus.Executing.GetIndexInt();
                                carTask.StartTime = DateTime.Now;
                                AppSession.Dal.UpdateCommonModel <CarTask>(carTask);
                            }
                        }
                    }
                    ////小车到达一个地方后,如果需要ECS确认后才能走,就发出到达信号,然后等待ECS回复后,清除到达信号,最后ECS也清除回复信号
                    //var arrive = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == CarProps.arriveMessage.GetIndexString());
                    //var replyArrive = car.EquipmentProps.Find(t => t.EquipmentTypeTemplateCode == CarProps.wcsArriveMessage.GetIndexString());

                    //if (arrive?.Value == ArriveMessage.到达.GetIndexString() && replyArrive?.Value == ArriveMessage.默认.GetIndexString())
                    //{
                    //    //回复到达
                    //    ExcuteArrive(car, ArriveMessage.回复到达, plc);
                    //}
                    //if (arrive?.Value == ArriveMessage.默认.GetIndexString() && replyArrive?.Value == ArriveMessage.回复到达.GetIndexString())
                    //{
                    //    ExcuteArrive(car, ArriveMessage.默认, plc);
                    //}
                    return(BllResultFactory.Sucess());
                }

                //如果小车是准备就绪,并且状态是WCS模式就可以运行
                if (carStatus == CarStatus.idle.GetIndexString())
                {
                    CarTask carTask = tasks.FirstOrDefault();
                    // 如果有初始化的任务,并且任务id不是刚完成的任务id
                    if (carTask != null && carTask.Status == TaskCarStatus.Init.GetIndexInt())
                    {
                        var result = SendTaskToCar(car, carTask, plc);
                        if (result.Success)
                        {
                            Logger.Log($"给小车[{car.Code}]下发ID为[{carTask.Id}]的[{((CarTaskType)carTask.Type).ToDescriptionString()}]任务成功!", LogLevel.Info);
                            return(BllResultFactory.Sucess());
                        }
                        else
                        {
                            Logger.Log($"给小车[{car.Code}]下发ID为[{carTask.Id}]的[{((CarTaskType)carTask.Type).ToDescriptionString()}]任务失败!原因:{result.Msg}", LogLevel.Error);
                            return(BllResultFactory.Error());
                        }
                    }
                }
            }
            return(BllResultFactory.Sucess());
        }