using WcsMain.Common; using WcsMain.DataBase.TableEntity; using WcsMain.Enum.Stacker; using WcsMain.PlcOperation.Entity; using WcsMain.PlcOperation.Entity.Stacker; using WcsMain.WcsAttribute.AutoFacAttribute; namespace WcsMain.PlcOperation.Stacker; /// /// 堆垛机操作 /// [Component] public class StackerOperation { /********************************** 总结方法 *******************************************/ /// /// 判断堆垛机状态,若是等待(二次申请)状态则带出当前的PlcId /// /// /// /// /// public StackerUseStatusEnum StackerCanUse(int? stackerId, out int plcId1, out int spare1) { plcId1 = 0; spare1 = 0; if (stackerId == default) return StackerUseStatusEnum.BusyOrErr; /* 获取堆垛机状态 */ var (errMsg, stackerInfo) = GetStackerInfo((int)stackerId!); if(!string.IsNullOrEmpty(errMsg) || stackerInfo == default) return StackerUseStatusEnum.BusyOrErr; /* 堆垛机空闲条件 */ var canUse = stackerInfo.PlcId == 0 && stackerInfo.ControlModel == StackerControlModeEnum.online && stackerInfo.StackerStatus == StackerStatusEnum.free && stackerInfo.ErrCode == 0; if (canUse) return StackerUseStatusEnum.Free; /* 堆垛机等待任务条件(二次申请) */ var waitTask = stackerInfo.ControlModel == StackerControlModeEnum.online && stackerInfo.StackerStatus == StackerStatusEnum.applyTask && stackerInfo.ErrCode == 0; if(waitTask) { plcId1 = stackerInfo.PlcId; spare1 = stackerInfo.Spare1; return StackerUseStatusEnum.waitTask; } return StackerUseStatusEnum.BusyOrErr; } /********************************** 子方法 *******************************************/ /// /// 读取堆垛机反馈信息 /// /// /// public (string? errText, StackerInfo? stackerInfo) GetStackerInfo(int stackerId) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return ("设备尚未连接", default); // 未连接PLC } var readResult = CommonTool.Siemens.ReadByteWithName($"堆垛机状态反馈{stackerId}", 50); if (!readResult.Success || readResult.Value == default) { return (readResult.Message, default); // 读取失败 } var data = readResult.Value; StackerInfo stackerInfo = new() { PlcId = Convert.ToInt32(CommonTool.Siemens.Trans(data, 0)), // 当前运行任务号 ControlModel = (StackerControlModeEnum)Convert.ToInt16(CommonTool.Siemens.Trans(data, 4)), // 控制方式 StackerStatus = (StackerStatusEnum)Convert.ToInt16(CommonTool.Siemens.Trans(data, 6)), // 堆垛机状态 TunnelId = Convert.ToInt16(CommonTool.Siemens.Trans(data, 8)), // 当前巷道 Row = Convert.ToInt16(CommonTool.Siemens.Trans(data, 10)), // 当前排 Line = Convert.ToInt16(CommonTool.Siemens.Trans(data, 12)), // 当前列 Layer = Convert.ToInt16(CommonTool.Siemens.Trans(data, 14)), // 当前层 Depth = Convert.ToInt16(CommonTool.Siemens.Trans(data, 16)), // 当前深度 Code = Convert.ToInt32(CommonTool.Siemens.Trans(data, 18)), // 料箱码 ErrCode = Convert.ToInt16(CommonTool.Siemens.Trans(data, 22)), // 错误码 // WorkLength = Convert.ToSingle(CommonTool.Siemens.Trans(data, 24)), // 行走距离 // UpLength = Convert.ToSingle(CommonTool.Siemens.Trans(data, 28)), // 提升距离 // ForkCount = Convert.ToInt32(CommonTool.Siemens.Trans(data, 32)), // 货叉动作次数 // SubmitPlcId = Convert.ToInt32(CommonTool.Siemens.Trans(data, 36)), // 提交的任务 // DeletePlcId = Convert.ToInt32(CommonTool.Siemens.Trans(data, 40)), // 删除的任务 Spare1 = Convert.ToInt32(CommonTool.Siemens.Trans(data, 44)), // 备用1 // Spare2 = Convert.ToInt16(CommonTool.Siemens.Trans(data, 48)), // 备用2 }; return (string.Empty, stackerInfo); } /// /// 读取所有故障 /// /// /// public bool[]? GetStackerErrInfo(int stackerId) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return default; // 未连接PLC } var readResult = CommonTool.Siemens.ReadBoolWithName($"堆垛机当前报警{stackerId}", 96); if (!readResult.Success || readResult.Value == default) { return default; } var data = readResult.Value; return [.. data]; } /// /// 复位堆垛机 /// /// /// public string ResetStacker(string? stackerId) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { // 未连接PLC return "PLC尚未连接"; } var (readResult, _) = CommonTool.Siemens.WritePlcWhithName($"堆垛机复位{stackerId}", (short)1); if (readResult.Success) { return string.Empty; } return readResult.Message ?? "请求失败,请检查网络"; } /// /// 堆垛机继续运行 /// /// /// public string StackerContinue(string? stackerId) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { // 未连接PLC return "PLC尚未连接"; } var (readResult, _) = CommonTool.Siemens.WritePlcWhithName($"堆垛机继续运行{stackerId}", (short)1); if (readResult.Success) { return string.Empty; } return readResult.Message ?? "请求失败,请检查网络"; } /// /// 获取报警编号 /// /// /// public int GetErrCode(int? stackerNo) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return -1; // 未连接PLC } var readResult = CommonTool.Siemens.ReadInt16WithName($"报警编号{stackerNo}"); return readResult.Success ? readResult.Value : -1; } /// /// 堆垛机任务写入确认 /// /// /// public string WriteTaskConfirm(int? stackerId) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return "PLC尚未连接。"; var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName($"堆垛机写任务确认{stackerId}", (short)1); return writeResult.Success ? string.Empty : writeResult.Message ?? "写入失败"; } /// /// 写入堆垛机任务,返回错误信息 /// /// 任务数据 /// 货叉编号 /// public string WriteTask(StackerPlcTask task, int forkId = 0) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return "PLC尚未连接。"; // 未连接PLC var dbAddressName = $"堆垛机写任务{task.StackerId}"; if(forkId != 0) { dbAddressName += $"-{forkId}"; } var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName(dbAddressName, task.PlcId!, task.TaskType!, task.GetStand!, task.InTunnelId!, task.OutTunnelId!, task.SetStand!, task.GetQueue!, task.GetLine!, task.GetLayer!, task.SetQueue!, task.SetLine!, task.SetLayer!, task.GetDeep!, task.SetDeep!, task.Size!, task.Weight!, task.Code ); return writeResult.Success ? string.Empty : writeResult.Message ?? "写入失败,未知原因"; } /// /// 获取过账数据 /// /// /// /// public List? GetTaskFeedBackData(int dataNum, List stackerList) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return default; // 未连接PLC } List taskFeedBackEntities = []; foreach (var stacker in stackerList) { var readResult = CommonTool.Siemens.ReadByteWithName($"过账区{stacker.StackerId}", (ushort)(6 * dataNum)); if (!readResult.Success) { continue; } var readData = readResult.Value; if (readData == default) { continue; } for (var i = 0; i < dataNum; i++) { TaskFeedBackEntity taskFeedBackEntity = new() { StackerId = stacker.StackerId ?? 0, PlcId = Convert.ToInt32(CommonTool.Siemens.Trans(readData, 0 + i * 6)), FeedBackType = Convert.ToInt16(CommonTool.Siemens.Trans(readData, 4 + i * 6)), CountNo = i }; taskFeedBackEntities.Add(taskFeedBackEntity); } } return taskFeedBackEntities; } /// /// 重置过账缓冲区 --- 写反馈区间接清除 /// /// public string? ResetFeedBackData(TaskFeedBackEntity taskFeedBackData) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return "PLC 未连接"; // 未连接PLC } var dbAddress = CommonTool.Siemens.GetAddressWithNameAndBit($"过账区反馈区{taskFeedBackData.StackerId}", 4 * taskFeedBackData.CountNo); if (string.IsNullOrEmpty(dbAddress)) { return "无法计算偏移量"; } var plcNo = taskFeedBackData.StackerId; var writeResult = CommonTool.Siemens.WritePlcWhithAddress(plcNo, dbAddress, taskFeedBackData.PlcId); return writeResult.Success ? default : $"清除过账失败,异常信息:{writeResult.Message}"; } /// /// 重置过账缓冲区 --- 直接清除 /// /// public string? ClearFeedBackData(TaskFeedBackEntity taskFeedBackData) { if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) { return "PLC 未连接"; // 未连接PLC } var dbAddress = CommonTool.Siemens.GetAddressWithNameAndBit($"过账区{taskFeedBackData.StackerId}", 6 * taskFeedBackData.CountNo); if (string.IsNullOrEmpty(dbAddress)) { return "无法计算偏移量"; } var writeResult = CommonTool.Siemens.WritePlcWhithAddress(1, dbAddress, 0); return !writeResult.Success ? $"清除过账失败,异常信息:{writeResult.Message}" : default; } }