wxw
2024-08-28 ec899ee7e9ead5152bd9b4c2dedd75c79cab6fb0
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -1,12 +1,19 @@

using Furion.Logging;
using IoTClient;
using Microsoft.AspNetCore.SignalR;
using System.Data;
namespace WCS.Application;
public static class PLCService
{
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static readonly IHubContext<TaskLogHub, ITaskLogHub> _taskLogHubContext;
    static PLCService()
    {
        _taskLogHubContext = App.GetService<IHubContext<TaskLogHub, ITaskLogHub>>();
    }
    public static void OnChangeEvent(object sender, EventArgs e)
    {
@@ -107,12 +114,8 @@
                                    modTaskMonitor.InteractiveMsg = "起始储位为空!";
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    // 通知任务界面任务已存在更新 请更新界面
                                    //if (TaskAction.refresh)
                                    //{
                                    //    wSChat.AlarmInformation("1");
                                    //}
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    break;
                                }
                                //给PLC写入任务数据
@@ -144,7 +147,7 @@
                                if (listResult.All(s => s.IsSucceed))
                                {
                                    // 写入跺机任务下发完成
                                    plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "10");
                                    plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "10");
                                    // 将出库任务待执行改为正在执行
                                    _db.Updateable<WcsTask>()
@@ -165,11 +168,8 @@
                                        EndLocat = outStationNum,
                                    };
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                    // 通知任务界面任务已存在更新 请更新界面
                                    //if (TaskAction.refresh)
                                    //{
                                    //    wSChat.AlarmInformation("1");
                                    //}
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    //修改led屏信息
                                    //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                                }
@@ -236,11 +236,8 @@
                            Status = TaskStatusEnum.Complete
                        };
                        _db.Insertable(modTaskMonitor).ExecuteCommand();
                        //通知任务界面任务已存在更新 请更新界面
                        //if (TaskAction.refresh)
                        //{
                        //    wSChat.AlarmInformation("1");
                        //}
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                    }
                    else if (modTask.TaskType.Value == TaskTypeEnum.Out)
@@ -249,7 +246,7 @@
                        var res = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, taskNo);
                        if (!res.IsSucceed)
                            break;
                        res = plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "20");
                        res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20");
                        if (!res.IsSucceed)
                            break;
                        // 根据跺机号确认取货工位
@@ -277,11 +274,8 @@
                            Status = TaskStatusEnum.Complete
                        };
                        _db.Insertable(modTaskMonitor).ExecuteCommand();
                        //通知任务界面任务已存在更新 请更新界面
                        //if (TaskAction.refresh)
                        //{
                        //    wSChat.AlarmInformation("1");
                        //}
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                    }
                }
                break;
@@ -310,7 +304,7 @@
                                var res = plcConn.SetPlcDBValue(modStation.PosType, modDevice.DbNumber, modStation.PlcPos, taskNo);
                                if (!res.IsSucceed)
                                    break;
                                res = plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "30");
                                res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30");
                                if (!res.IsSucceed)
                                    break;
                                //修改任务状态
@@ -344,11 +338,8 @@
                                        Status = TaskStatusEnum.Complete
                                    };
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    // 通知任务界面任务已存在更新 请更新界面
                                    //if (TaskAction.refresh)
                                    //{
                                    //    wSChat.AlarmInformation("1");
                                    //}
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                }
                                else
                                {
@@ -363,6 +354,7 @@
                            }
                            break;
                        case TaskTypeEnum.Out://出库
                            {
                            // 从出库任务获取巷道号
                            string num = ""; // 放货工位号
                            if (modTask.StartRoadway == "R01")
@@ -410,7 +402,7 @@
                                if (!res.IsSucceed)
                                    break;
                                //写入跺机wcs控制字流程30 返回垛机执行完成
                                res = plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "30");
                                    res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30");
                                if (!res.IsSucceed)
                                    break;
                                //记录任务明细
@@ -427,16 +419,64 @@
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                // 通知任务界面任务已存在更新 请更新界面
                                //if (TaskAction.refresh)
                                //{
                                //    wSChat.AlarmInformation("1");
                                //}
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                //todo:垛机出库不空跑
                            }
                            }
                            break;
                        case TaskTypeEnum.Move:
                            {
                                //移库任务
                                var modStation = modDevice.listStation.FirstOrDefault(s => s.Text == "TaskNo");
                                // 写入plc任务号
                                var res = plcConn.SetPlcDBValue(modStation.PosType, modDevice.DbNumber, modStation.PlcPos, taskNo);
                                if (!res.IsSucceed)
                                    break;
                                //写入plc控制字
                                res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30");
                                if (!res.IsSucceed)
                                    break;
                                modTask.Status = TaskStatusEnum.Complete;
                                _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand();
                                var modTaskRequest = modTask.Adapt<TaskRequest>();
                                HttpService httpService = new HttpService();
                                var modResponseTask = httpService.RequestTask(modTaskRequest).Result;
                                if (modResponseTask.StatusCode == "0")
                                {
                                    //请求成功
                                    modTask.IsSuccess = TaskSuccessEnum.Success;
                                    _db.Updateable(modTask).UpdateColumns(s => s.IsSuccess).ExecuteCommand();
                                    //todo:修改储位信息 任务类型 执行状态 起始位置 目标位置
                                    //
                                    //记录任务明细
                                    var modTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
                                        PlcId = modDevice.PlcId,
                                        PlcName = modDevice.Text,
                                        InteractiveMsg = "任务完成,返回给WMS任务完成",
                                        StartLocat = modTask.StartLocate,
                                        EndLocat = modTask.EndLocate,
                                        PalletNo = modTask.PalletNo,
                                        Status = TaskStatusEnum.Complete
                                    };
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                }
                                else
                                {
                                    //请求失败
                                    modTask.IsSuccess = TaskSuccessEnum.Fail;
                                    modTask.Information = modResponseTask.Message;
                                    _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand();
                                }
                                //todo:LED屏
                            }
                            break;
                        default:
@@ -444,6 +484,99 @@
                    }
                }
                break;
            case "100":
                {
                    //空取货异常
                    var modPosPlcTask = modDevice.listStation.FirstOrDefault(s => s.Text == "PlcTaskNo");
                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "TaskNo");
                    var (result, TaskNo) = plcConn.GetPlcDBValue(modPosPlcTask.PosType, modDevice.DbNumber, modPosPlcTask.PlcPos);
                    if (!result.IsSucceed)
                        break;
                    string taskNo = Convert.ToString(TaskNo);
                    var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing);
                    if (modTask == null)
                    {
                        Log.Error($"【跺机】当前任务号不存在对应的任务,任务号:{modTask.TaskNo}");
                        break;
                    }
                    var res = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, taskNo);
                    if (!res.IsSucceed)
                        break;
                    res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "100");
                    if (!res.IsSucceed)
                        break;
                    modTask.Status = TaskStatusEnum.Exception;
                    _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand();
                    Log.Information($"【跺机】wcs任务变更空取异常,任务号:{modTask.TaskNo}");
                    var modTaskRequest = modTask.Adapt<TaskRequest>();
                    HttpService httpService = new HttpService();
                    var modResponseTask = httpService.RequestEmptyException(modTaskRequest).Result;
                    if (modResponseTask.StatusCode == "0")
                    {
                        //请求成功
                        modTask.IsSuccess = TaskSuccessEnum.Success;
                        _db.Updateable(modTask).UpdateColumns(s => s.IsSuccess).ExecuteCommand();
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    }
                    else
                    {
                        //请求失败
                        modTask.IsSuccess = TaskSuccessEnum.Fail;
                        modTask.Information = modResponseTask.Message;
                        _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand();
                    }
                    //todo:LED屏
                }
                break;
            case "101":
                {
                    //满放货异常
                    var modPosPlcTask = modDevice.listStation.FirstOrDefault(s => s.Text == "PlcTaskNo");
                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "TaskNo");
                    var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "PalletNo");
                    var (result, TaskNo) = plcConn.GetPlcDBValue(modPosPlcTask.PosType, modDevice.DbNumber, modPosPlcTask.PlcPos);
                    if (!result.IsSucceed)
                        break;
                    string taskNo = Convert.ToString(TaskNo);
                    var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing);
                    if (modTask == null)
                    {
                        Log.Error($"【跺机】当前任务号不存在对应的任务,任务号:{modTask.TaskNo}");
                        break;
                    }
                    modTask.Status = TaskStatusEnum.Exception;
                    _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand();
                    Log.Information($"【跺机】wcs任务变更满取异常,任务号:{modTask.TaskNo}");
                    var modTaskRequest = modTask.Adapt<TaskRequest>();
                    HttpService httpService = new HttpService();
                    var modResponseTask = httpService.RequestEmptyException(modTaskRequest).Result;
                    if (modResponseTask.StatusCode == "0")
                    {
                        //请求成功
                        modTask.IsSuccess = TaskSuccessEnum.Success;
                        _db.Updateable(modTask).UpdateColumns(s => s.IsSuccess).ExecuteCommand();
                        var modInsertTask = modResponseTask.TaskList;
                        modInsertTask.TaskType = TaskTypeEnum.In;
                        modInsertTask.Origin = "WMS";
                        modInsertTask.StartLocate = modTask.StartLocate;
                        modInsertTask.Levels = 1;
                        _db.Insertable(modInsertTask);
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTask(modInsertTask.Adapt<WcsTaskOutput>());
                    }
                    else
                    {
                        //请求失败
                        modTask.IsSuccess = TaskSuccessEnum.Fail;
                        modTask.Information = modResponseTask.Message;
                        _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand();
                    }
                    //todo:LED屏
                }
                break;
            default:
                break;
        }