| | |
| | | using RazorEngine.Compilation.ImpromptuInterface.Dynamic; |
| | | using SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global.Models; |
| | | using System.Data; |
| | | using System.Reflection.Emit; |
| | | |
| | | namespace WCS.Application; |
| | | public static class PLCService |
| | |
| | | /// 跺机业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |
| | | private static async void StackingMachine(WcsDeviceDto modDevice) |
| | | private static void StackingMachine(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | switch (modDevice.Value.ToString()) |
| | |
| | | if (startStationRes.IsSucceed) |
| | | { |
| | | // 根据工位号获取对应的输送线IP |
| | | PlcTaskInfo taskInfo = PLCCommon.GetPlcIp(startStationVal); |
| | | var plcConveyorConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == taskInfo.Ip); |
| | | var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal); |
| | | if (plcConveyorConn.Connected) |
| | | { |
| | | // 向取货工位写入流程字640 取货已完成 |
| | |
| | | modTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | InteractiveMsg = $"任务完成" |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | // 反馈WMS |
| | |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = "1", |
| | | TaskType = TaskTypeEnum.In, |
| | | TaskStatus = TaskStatusEnum.Complete |
| | | }; |
| | | |
| | | // 此处添加调用WMS接口 liudl |
| | | HttpService httpService = new HttpService(); |
| | | var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | if (modResponseTask.StatusCode == "0") |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成"; |
| | | } |
| | | } |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 此处添加不空跑业务 |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Out: // 出库任务 |
| | | { |
| | | string roadway = modTask.StartRoadway; |
| | | // 从出库任务获取放货工位 |
| | | string outCode = modTask.EndLocate; |
| | | // 根据工位号获取对应的输送线IP |
| | | var plcConveyorConn = PLCCommon.GetPlcIp(outCode); |
| | | if (plcConveyorConn.Connected) |
| | | { |
| | | // 根据目标地址和巷道获取放货工位对应的排列层 |
| | | PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, modTask.TaskType.ToString(), |
| | | modTask.StartRoadway, modTask.EndRoadway); |
| | | // 根据工位号获取工位信息 |
| | | var wcsDevice = PLCTaskAction.plcDevices.First(s => s.PlcId == plcConveyorConn.PlcId && s.Level == DeviceLevelEnum.Station && s.StationNum == taskInfo.EndStation); |
| | | // 读取当前工位各偏移量值 |
| | | var listPos = PLCTaskAction.plcPositions.Where(s => s.DeviceId == wcsDevice.Id).ToList(); |
| | | |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | //任务号 |
| | | var modPosTask = listPos.FirstOrDefault(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | //任务类型 |
| | | var modPosTaskType = listPos.FirstOrDefault(s => s.Text == "任务类型"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString())); |
| | | //托盘号 |
| | | var modPosPalletNo = listPos.FirstOrDefault(s => s.Text == "托盘码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | //起始工位 |
| | | var modPosLocatNo = listPos.FirstOrDefault(s => s.Text == "起始工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosLocatNo.PosType, modDevice.DbNumber, modPosLocatNo.PlcPos, taskInfo.EndStation)); |
| | | // 目标工位 |
| | | var modPosEndLocatNo = listPos.FirstOrDefault(s => s.Text == "目的工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndLocatNo.PosType, modDevice.DbNumber, modPosEndLocatNo.PlcPos, outCode)); |
| | | |
| | | // 是否写入成功 |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | var result = plcConveyorConn.SetPlcDBValue(wcsDevice.PosType, wcsDevice.DbNumber, wcsDevice.WcsPos, "740"); |
| | | |
| | | if (result.IsSucceed) |
| | | { |
| | | // 写入跺机wcs控制字 返回垛机执行完成 |
| | | result = modDevice.PLCUtil.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); |
| | | if (result.IsSucceed) |
| | | { |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = wcsDevice.Id, |
| | | PlcName = wcsDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = taskInfo.EndStation, |
| | | EndLocat = outCode, |
| | | InteractiveMsg = $"写入指令:收到跺机放货完成;放货{taskInfo.EndStation}工位===》{outCode}出库口" |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | //此处添加不空跑业务 |
| | | } |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Move: // 移库任务 |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | var result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo); |
| | | if (!result.IsSucceed) |
| | | { |
| | | Log.Error($"{modDevice.Text}写入任务号失败"); |
| | | break; |
| | | } |
| | | result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30"); |
| | | if (!result.IsSucceed) |
| | | { |
| | | Log.Error($"{modDevice.Text}控制字写入30失败"); |
| | | break; |
| | | } |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | InteractiveMsg = $"任务完成" |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequest() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = TaskTypeEnum.Move, |
| | | TaskStatus = TaskStatusEnum.Complete |
| | | }; |
| | | HttpService httpService = new HttpService(); |
| | | var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | if (modResponseTask.StatusCode == "0") |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成"; |
| | | //修改储位信息 任务类型 执行状态 起始位置 目标位置 |
| | | |
| | | } |
| | | } |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 此处添加不空跑业务 |
| | | } |
| | | break; |
| | | default: break; |