| | |
| | | |
| | | private static List<ModbusUtil> listModbusUtil = new List<ModbusUtil>(); |
| | | |
| | | |
| | | public static List<ModbusUtil> modbusUtilConn |
| | | { |
| | | get { return listModbusUtil; } |
| | |
| | | boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result; |
| | | boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result; |
| | | boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result; |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 初始化PLC连接 |
| | |
| | | var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | if (result.IsSucceed) |
| | | { |
| | | ////如果是穿梭车,这里发送心跳 |
| | | //if (modPlc.Type == PLCTypeEnum.ShuttleCar) |
| | | //{ |
| | | // var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "心跳").FirstOrDefault(); |
| | | // if (modHeart != null) |
| | | // { |
| | | // modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1"); |
| | | // } |
| | | //} |
| | | //无流程跳出 |
| | | if (Convert.ToInt32(value) == 0) |
| | | continue; |
| | |
| | | |
| | | |
| | | |
| | | Thread.Sleep(3000); |
| | | Thread.Sleep(2000); |
| | | } |
| | | catch (OperationCanceledException) |
| | | { |
| | |
| | | { |
| | | while (true) |
| | | { |
| | | Console.WriteLine("开启四向车任务自分配"); |
| | | //Console.WriteLine("开启四向车任务自分配"); |
| | | //取消线程 关闭PLC连接 |
| | | if (cts.Token.IsCancellationRequested) |
| | | { |
| | |
| | | } |
| | | try |
| | | { |
| | | |
| | | |
| | | // 获取密集库未执行任务 根据创建时间排序 |
| | | var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => new {s.Levels, s.CreateTime}).First(); |
| | | if (waitTask == null) |
| | | { |
| | | continue; |
| | | } |
| | | var starLocate = ""; |
| | | var endLocate = ""; |
| | | var taskceng = 0; |
| | | //01010101: 01排 01列 01层 01深度-此项目不做判断 |
| | | var taskpai = int.Parse(waitTask.StartLocate.Substring(0, 2)); |
| | | var tasklie = int.Parse(waitTask.StartLocate.Substring(2, 2)); |
| | | var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | |
| | | if (waitTask.TaskType == TaskTypeEnum.In ) |
| | | { |
| | | //入库任务起始巷道就是起始工位 |
| | | if (string.IsNullOrWhiteSpace(waitTask.StartRoadway) || string.IsNullOrWhiteSpace(waitTask.EndLocate)) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | taskceng = int.Parse(waitTask.StartRoadway.Substring(4, 2)); |
| | | starLocate = waitTask.StartRoadway; |
| | | endLocate = waitTask.EndLocate; |
| | | } |
| | | else if (waitTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | starLocate = waitTask.StartLocate; |
| | | endLocate = waitTask.EndRoadway; |
| | | |
| | | #region 添加输送线与任务验证 |
| | | |
| | | |
| | | |
| | | var text = ""; |
| | | var devStation = ""; |
| | | var ip = ""; |
| | | var carcon = new carConverModel(); |
| | | if (carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | ip = "10.26.254.10"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | ip = "10.26.254.11"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | //var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | //var modConn = new PLCUtil(modPlc); |
| | | var modConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == ip); |
| | | var modDevice = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720) |
| | | { |
| | | continue;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | |
| | | var gongwei = carcon.conveyorRuKu[endLocate]; |
| | | //判断任务 |
| | | var convarTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.StartLocate == gongwei |
| | | && m.Type == PLCTypeEnum.ConveyorLine && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)); |
| | | if (convarTask != null) |
| | | { |
| | | continue;//放货工位有任务 |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | else if (waitTask.TaskType == TaskTypeEnum.Move) |
| | | { |
| | | taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | starLocate = waitTask.StartLocate; |
| | | endLocate = waitTask.EndLocate; |
| | | } |
| | | else |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | #region 获取当前任务所在层所有空闲小车 |
| | | |
| | | // 获取有任务的小车编号 |
| | |
| | | { |
| | | var modCarDl = plcPosition.FirstOrDefault(s => s.Text == "电池电量"); |
| | | var (resultDl, valueDl) = modbusUtil.GetDBValue(modCarDl.PosType, modCarDl.PlcPos); |
| | | if (resultDl.IsSucceed && valueDl> (int)FourWayCarDLEnum.Dl3) |
| | | if (resultDl.IsSucceed && valueDl> (int)FourWayCarDLEnum.Dl) |
| | | { |
| | | //写入结束充电命令 |
| | | var modCdEnd = plcPosition.FirstOrDefault(s => s.Text == "充电命令"); |
| | |
| | | carErr = true; |
| | | break; //暂缓分配,防止同层小车关机或失联导致阻挡路径 |
| | | } |
| | | } |
| | | var modCarPall = plcPosition.FirstOrDefault(s => s.Text == "托盘检测"); |
| | | var (resultPall, valuePall) = modbusUtil.GetDBValue(modCarPall.PosType, modCarPall.PlcPos); |
| | | //var modCarju = plcPosition.FirstOrDefault(s => s.Text == "举升位置"); |
| | | //var (resultju, valueju) = modbusUtil.GetDBValue(modCarju.PosType, modCarju.PlcPos); |
| | | //if (resultPall.IsSucceed && valuePall == 1 && resultPall.IsSucceed && valuePall != 1) //1顶货 2子通道 3主通道 |
| | | //{ |
| | | // break; //暂缓分配 |
| | | //} |
| | | if (resultPall.IsSucceed && valuePall == 1) //1有托盘 2无托盘 |
| | | { |
| | | break; //暂缓分配 |
| | | } |
| | | //小车空闲加入集合 |
| | | if (value == 1) |
| | |
| | | { |
| | | var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0'); |
| | | //小车到取货储位路径 |
| | | var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate); |
| | | var d = FourWayCarUtil.GetCarPath(carVal, starLocate); |
| | | kXCarList.Add(new CarInfo() |
| | | { |
| | | CarPlcIp = modbusUtil.PlcIP, |
| | |
| | | //判断小车位置是否与任务的起始储位相同,不相同:获取小车到取货储位路径 |
| | | var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0'); |
| | | //获取小车去取货储位任务路径 |
| | | var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate); |
| | | var data1 = FourWayCarUtil.GetCarPath(carLocate, starLocate); |
| | | var datas1 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | if (datas1 == null) |
| | | { |
| | |
| | | typeStr2 = 0; |
| | | } |
| | | //获取小车去放货储位任务路径 |
| | | var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, typeStr); |
| | | var data2 = FourWayCarUtil.GetCarPath(starLocate, endLocate, typeStr); |
| | | var datas2 = FourWayCarUtil.GetCarPathUp(data2, typeStr2); |
| | | |
| | | if (datas2 == null) |