wankeda
3 天以前 6cc35000a6e138cfad96e7b02f8aeddcdb4ba6bf
´úÂë¹ÜÀí/NEWCode/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGVJob/SendTaskAGV.cs
@@ -1,174 +1,157 @@
using System.Diagnostics;
using System.Text;
using Microsoft.Data.SqlClient;
using Newtonsoft.Json;
using WIDESEA_Core.Enums;
using WIDESEAWCS_Common.AGVEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Tool;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ISystemRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks.AGVJob
namespace WIDESEAWCS_Tasks
{
    public class SendTaskAGV
    {
        private static int _readSendAGVTaskSignalso = 0;
        private static bool isTrue1 = false;
        private static string name1 = "";
        public static void SendAGVTask1(AGV agv, ITaskRepository _taskRepository)
        public static string url = AppSettings.Configuration["AGVTaskGeneration"];
        public static void SendAGVTask1(ITaskRepository _taskRepository, IDt_StationinfoRepository _stationinfoRepository)
        {
            //TODO: Implement sending task to AGV
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (agv == null)
                Dt_Task task = _taskRepository.QueryData(x => x.TaskState == (int)TaskInStatusEnum.InNew).OrderBy(r => r.CreateDate).FirstOrDefault(); //.ThenByDescending(r => r.Grade)
                if (task != null)
                {
                    return;
                }
                var taskInteractiveR = agv.DeviceProDTOs.Where(r => r.DeviceProParamName == TaskDBName.taskInteractiveR.ToString()).FirstOrDefault().DeviceProAddress;
                var taskInteractiveW = agv.DeviceProDTOs.Where(r => r.DeviceProParamName == TaskDBName.taskInteractiveW.ToString()).FirstOrDefault().DeviceProAddress;
                var resetTaskW = agv.DeviceProDTOs.Where(r => r.DeviceProParamName == TaskDBName.resetTaskInteractiveW.ToString()).FirstOrDefault().DeviceProAddress;
                var resetTaskInteractiveR = agv.DeviceProDTOs.Where(r => r.DeviceProParamName == TaskDBName.resetTaskInteractiveR.ToString()).FirstOrDefault().DeviceProAddress;
                var taskID = agv.DeviceProDTOs.Where(r => r.DeviceProParamName == TaskDBName.taskID.ToString()).FirstOrDefault().DeviceProAddress;
                int TaskInteractive = agv.Communicator.Read<int>(taskInteractiveR);//1收到
                int TaskInteractiveW = agv.Communicator.Read<int>(taskInteractiveW);//0初始/1下发/2取消/3更改
                int resetTaskInteractiveW = agv.Communicator.Read<int>(resetTaskW);
                int resetTaskInteractiver = agv.Communicator.Read<int>(resetTaskInteractiveR);
                if (isTrue1 && name1 == agv.DeviceName)
                {
                    if (TaskInteractiveW != 0 || resetTaskInteractiveW != 0 || TaskInteractive != 0)
                    TaskGenerationDto taskGenerationDto = new TaskGenerationDto();
                    {
                        agv.Communicator.Write(resetTaskW, 1);
                        Task.Delay(2000).Wait();
                        resetTaskInteractiveW = agv.Communicator.Read<int>(resetTaskW);
                        if (resetTaskInteractiveW == 1)
                        {
                            agv.Communicator.Write(resetTaskW, 0);
                            agv.Communicator.Write(taskInteractiveW, 0);
                            Task.Delay(2000).Wait();
                        }
                        return;
                        taskGenerationDto.taskid = task.TaskNum.ToString();
                        taskGenerationDto.taskType = task.TaskType.ToString();
                        taskGenerationDto.floor = task.Floor.ToString();
                        taskGenerationDto.param1 = task.SourceAddress.ToString();
                        taskGenerationDto.param2 = task.TargetAddress.ToString();
                        taskGenerationDto.param3 = "";
                        taskGenerationDto.param4 = "";
                        taskGenerationDto.param5 = "";
                        taskGenerationDto.param6 = "";
                        taskGenerationDto.param7 = "";
                        taskGenerationDto.param8 = "";
                        taskGenerationDto.param9 = "";
                    }
                    var ResultData = HttpHelper.Post(url, taskGenerationDto.ToJson(), headers: new Dictionary<string, string>());
                    var res = JsonConvert.DeserializeObject<WebResponseContent>(ResultData);
                    if (res.code == 200)
                    {
                        WriteLog.Info("任务下发成功").Write($"任务号{task.TaskNum}", "任务下发成功");
                        int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
                        task.TaskState = nextStatus;
                        task.Dispatchertime = DateTime.Now;
                        _taskRepository.UpdateData(task);
                    }
                    else
                    {
                        isTrue1 = false;
                        name1 = "";
                        WriteLog.Info("任务下发失败").Write($"任务号{task.TaskNum},信息{res.Message}", "任务下发失败");
                        //_unitOfWorkManage.RollbackTran();
                        content = WebResponseContent.Instance.Error($"{res.Message}");
                    }
                }
                if (resetTaskInteractiver == 1)
                Thread.Sleep(100);
                Dt_Task dt_Task = _taskRepository.QueryData(x => x.TaskState == (int)TaskInStatusEnum.AGV_Queue).OrderBy(r => r.CreateDate).FirstOrDefault();
                if (dt_Task != null)
                {
                    agv.Communicator.Write(taskInteractiveW, 0);
                    for (int i = 0; i < 5; i++)
                    var station = _stationinfoRepository.QueryFirst(x => x.StationCode == dt_Task.SourceAddress);
                    // æŸ¥æ‰¾ä¸¤ä¸ªå¯ç”¨çš„空缓存架
                    var freeStations = _stationinfoRepository
                        .QueryData(x => x.Location_state == LocationStatusEnum.Free.ObjToInt() && x.Enable && x.Remark == station.Remark && x.Area == station.Area)//  && x.Stationtype == station.Stationtype
                        .Take(2) // åªå–前两个
                        .ToList();
                    int floor = 0;
                    if (station.Area.Contains("A区"))
                    {
                        Thread.Sleep(300);
                        var agvnumber = Convert.ToInt32(agv.Communicator.Read<int>(taskInteractiveW));
                        if (agvnumber != 0)
                        {
                            agv.Communicator.Write(taskInteractiveW, 0);
                        }
                        else
                        {
                            break;
                        }
                        floor = 32;
                    }
                }
                if (0 == TaskInteractive && TaskInteractiveW == 0)
                {
                    Dt_Task agvTask = _taskRepository.QueryData(r => r.TaskState == (int)TaskInStatusEnum.InNew && r.Roadway == agv.DeviceName && r.TaskType == (int)TaskOutboundTypeEnum.Outbound).OrderBy(r => r.CreateDate).OrderByDescending(r => r.Grade).FirstOrDefault();
                    if (null != agvTask)
                    else
                    {
                        //写入任务信息
                        string rel = TaskWrite(agv, agvTask, AGVJobEnum.newTaskEnum);
                        Thread.Sleep(1000);
                        string taskId = agv.Communicator.Read<string>(taskID).ToString();
                        if (taskId != agvTask.TaskNum.ToString())
                        {
                            isTrue1 = true;
                            name1 = agv.DeviceName;
                            //WriteLog.Info("SendAGVTask").Write("给AGV写入任务失败," + agvTask.agv_tasknum + DateTime.Now, "SendAGVTask");
                            throw new Exception(string.Format("给AGV写入任务失败,任务号{0}", agvTask.TaskNum));
                        }
                        if (string.IsNullOrEmpty(rel))
                        {
                            //写入任务确认1
                            agv.Communicator.Write(taskInteractiveW, 1);
                            Thread.Sleep(1000);
                            //读取AGV信号
                            int ReadTask_1_OK = agv.Communicator.Read<int>(taskInteractiveR);
                            if (ReadTask_1_OK == 1)
                            {
                                //写入WCS确认信号0
                                agv.Communicator.Write(taskInteractiveW, 0);
                                Thread.Sleep(2000);
                                //读取AGV信号是否为0
                                int ReadTask_0_OK = agv.Communicator.Read<int>(taskInteractiveR);
                                if (ReadTask_0_OK == 0)
                                {
                                    int nextStatus = agvTask.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
                                    agvTask.TaskState = nextStatus;
                                    agvTask.Dispatchertime = DateTime.Now;
                                    _taskRepository.UpdateData(agvTask);
                                    // ä¸Šä¼ AGV运行数据 by xiaoyang
                                    //SendMESTask.SendMesTask(agvTask, 0);
                                }
                                else
                                {
                                    isTrue1 = true;
                                    name1 = agv.DeviceName;
                                    throw new Exception(string.Format("给AGV写入任务确认0失败,任务号{0}", agvTask.TaskNum));
                                }
                            }
                            else if (ReadTask_1_OK == 11)
                            {
                                agv.Communicator.Write(taskInteractiveW, 0);
                                Thread.Sleep(2000);
                                int ReadTask_0_Error = agv.Communicator.Read<int>(taskInteractiveR);
                                if (ReadTask_0_Error == 0)
                                {
                                    int nextStatus = agvTask.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
                                    agvTask.TaskState = nextStatus;
                                    agvTask.Dispatchertime = DateTime.Now;
                                    _taskRepository.UpdateData(agvTask);
                                }
                                else
                                {
                                    isTrue1 = true;
                                    name1 = agv.DeviceName;
                                    throw new Exception(string.Format("给AGV写入任务异常确认0失败,任务号{0}", agvTask.TaskNum));
                                }
                            }
                            else
                            {
                                isTrue1 = true;
                                name1 = agv.DeviceName;
                                throw new Exception(string.Format("给AGV写入任务确认1失败,任务号{0}", agvTask.TaskNum));
                            }
                        }
                        else
                        {
                            isTrue1 = true;
                            name1 = agv.DeviceName;
                            throw new Exception(string.Format("给AGV写入任务失败,任务号{0}" + rel, agvTask.TaskNum));
                        }
                        floor = 128;
                    }
                    if (freeStations.Count < 2)
                    {
                        throw new Exception("未找到两个可用的空缓存架");
                    }
                    // æ£€æŸ¥è¿™ä¸¤ä¸ªç¼“存架是否被任务占用
                    var stationCodes = freeStations.Select(s => s.StationCode).ToList();
                    freeStations[0].Location_state = LocationStatusEnum.Lock.ObjToInt();
                    _stationinfoRepository.UpdateData(freeStations[0]);
                    freeStations[1].Location_state = LocationStatusEnum.Lock.ObjToInt();
                    _stationinfoRepository.UpdateData(freeStations[1]);
                    //stationCodes.
                    var tasks = _taskRepository.QueryData(x => stationCodes.Contains(x.SourceAddress) || stationCodes.Contains(x.TargetAddress)).ToList();
                    if (tasks.Any())
                    {
                        throw new Exception("缓存架已有任务");
                    }
                    dt_Task.TargetAddress = string.Join("||", freeStations.Select(s => s.StationCode));
                    dt_Task.NextAddress = string.Join("||", freeStations.Select(s => s.StationCode));
                    dt_Task.TaskState = (int)TaskInStatusEnum.InNew;
                    dt_Task.TaskType = floor;
                    _taskRepository.UpdateData(dt_Task);
                }
            }
            catch (Exception ex)
            {
                StackTrace sta = new StackTrace(ex, true);
                StackTrace st = new StackTrace(new StackFrame(true));
                StackFrame sf = sta.GetFrame(0);
                //WriteLog.Info("SendAGVTask").Write(ex.Message + "行号" + sf.GetFileLineNumber(), "SendAGVTask");
            }
            finally
            {
                // WriteLog.Info("SendAGVTask").Write(agv.PLCName+"\t"+DateTime.Now, "SendAGVTask");
                Interlocked.Exchange(ref _readSendAGVTaskSignalso, 0);
            }
        }
        public static void SendAGVTask(AGV agv, ITaskRepository _taskRepository)
        {
            // è¿žæŽ¥å­—符串 - æ ¹æ®ä½ çš„æœåŠ¡å™¨ä¿¡æ¯ä¿®æ”¹
            string connectionString = "Data Source=.;Initial Catalog=WIDESEAWCS_GanFengLiYeNew;User ID=sa;Password=sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
            List<Dt_Task> dt_Tasks = _taskRepository.QueryData(x => x.TaskState == (int)TaskInStatusEnum.InNew);
            foreach (Dt_Task task in dt_Tasks)
            {
                // è¦æ’入的SQL语句
                string insertSql = "INSERT INTO Dt_Stationinfo (StationCode, Location_state,Area,Enable,LastUpdateTime,Remark) VALUES (@StationCode, @Location_state,@Area,@Enable,@LastUpdateTime,@Remark)";
                try
                {
                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        connection.Open();
                        using (SqlCommand command = new SqlCommand(insertSql, connection))
                        {
                            // æ·»åŠ å‚æ•°é˜²æ­¢SQL注入
                            command.Parameters.AddWithValue("StationCode", task.TaskNum);
                            command.Parameters.AddWithValue("Location_state", task.TaskNum);
                            command.Parameters.AddWithValue("Area", task.Roadway);
                            command.Parameters.AddWithValue("Enable", task.TaskNum);
                            command.Parameters.AddWithValue("LastUpdateTime", DateTime.Now);
                            command.Parameters.AddWithValue("Remark", task.Roadway);
                            command.Parameters.AddWithValue("Creater", "WCS");
                            command.Parameters.AddWithValue("CreateDate", DateTime.Now);
                            int rowsAffected = command.ExecuteNonQuery();
                            Console.WriteLine($"成功插入 {rowsAffected} è¡Œæ•°æ®");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"发生错误: {ex.Message}");
                }
            }
            // æ£€æŸ¥AGV是否为空
            if (agv == null)
            {
@@ -191,24 +174,24 @@
            try
            {
                // è¯»å–任务交互和重置交互的状态
                int taskInteractive = agv.Communicator.Read<int>(taskInteractiveR); // 1表示收到
                int taskInteractiveW = agv.Communicator.Read<int>(taskInteractiveW1); // 0初始/1下发/2取消/3更改
                int resetTaskInteractiveW = agv.Communicator.Read<int>(resetTaskW);
                int resetTaskInteractiver = agv.Communicator.Read<int>(resetTaskInteractiveR);
                int taskInteractive = agv.Communicator.Read<Int16>(taskInteractiveR); // 1表示收到
                int taskInteractiveW = agv.Communicator.Read<Int16>(taskInteractiveW1); // 0初始/1下发/2取消/3更改
                int resetTaskInteractiveW = agv.Communicator.Read<Int16>(resetTaskW);
                int resetTaskInteractiver = agv.Communicator.Read<Int16>(resetTaskInteractiveR);
                // å¤„理任务交互W和重置交互W不为0的情况
                if (isTrue1 && name1 == agv.DeviceName)
                {
                    if (taskInteractiveW != 0 || resetTaskInteractiveW != 0 || taskInteractive != 0)
                    {
                        agv.Communicator.Write(resetTaskW, 1);
                        agv.Communicator.Write<UInt16>(resetTaskW, 1);
                        Task.Delay(2000).Wait();
                        resetTaskInteractiveW = agv.Communicator.Read<int>(resetTaskW);
                        resetTaskInteractiveW = agv.Communicator.Read<Int16>(resetTaskW);
                        if (resetTaskInteractiveW == 1)
                        {
                            agv.Communicator.Write(resetTaskW, 0);
                            agv.Communicator.Write(taskInteractiveW1, 0);
                            agv.Communicator.Write<UInt16>(resetTaskW, 0);
                            agv.Communicator.Write<UInt16>(taskInteractiveW1, 0);
                            Task.Delay(2000).Wait();
                        }
                        return;
@@ -220,14 +203,14 @@
                // å¦‚果重置交互R为1,则重置任务交互W
                if (resetTaskInteractiver == 1)
                {
                    agv.Communicator.Write(taskInteractiveW1, 0);
                    agv.Communicator.Write<UInt16>(taskInteractiveW1, 0);
                    for (int i = 0; i < 5; i++)
                    {
                        Task.Delay(300).Wait(); // ç”¨Task.Delay代替Thread.Sleep,以避免线程阻塞
                        int agvNumber = agv.Communicator.Read<int>(taskInteractiveW1);
                        int agvNumber = agv.Communicator.Read<Int16>(taskInteractiveW1);
                        if (agvNumber != 0)
                        {
                            agv.Communicator.Write(taskInteractiveW1, 0);
                            agv.Communicator.Write<UInt16>(taskInteractiveW1, 0);
                        }
                        else
                        {
@@ -251,7 +234,8 @@
                        // æ£€æŸ¥ä»»åŠ¡ID是否写入正确
                        string taskId = agv.Communicator.Read<string>(taskID);
                        if (taskId != agvTask.TaskNum.ToString())
                        string numberPart = taskId.Split('-')[1];
                        if (numberPart != agvTask.TaskNum.ToString())
                        {
                            throw new Exception($"给AGV写入任务失败,任务号{agvTask.TaskNum}");
                        }
@@ -260,19 +244,19 @@
                        if (string.IsNullOrEmpty(rel))
                        {
                            // å†™å…¥ä»»åŠ¡ç¡®è®¤ä¿¡å·1
                            agv.Communicator.Write(taskInteractiveW1, 1);
                            agv.Communicator.Write<UInt16>(taskInteractiveW1, 1);
                            Task.Delay(1000).Wait();
                            // è¯»å–AGV的确认信号
                            int readTask1Ok = agv.Communicator.Read<int>(taskInteractiveR);
                            int readTask1Ok = agv.Communicator.Read<Int16>(taskInteractiveR);
                            if (readTask1Ok == 1)
                            {
                                // å†™å…¥WCS的确认信号0
                                agv.Communicator.Write(taskInteractiveW1, 0);
                                agv.Communicator.Write<UInt16>(taskInteractiveW1, 0);
                                Task.Delay(2000).Wait();
                                // å†æ¬¡è¯»å–AGV的确认信号
                                int readTask0Ok = agv.Communicator.Read<int>(taskInteractiveR);
                                int readTask0Ok = agv.Communicator.Read<Int16>(taskInteractiveR);
                                if (readTask0Ok == 0)
                                {
                                    // æ›´æ–°ä»»åŠ¡çŠ¶æ€å¹¶ä¿å­˜
@@ -292,7 +276,7 @@
                            else if (readTask1Ok == 11)
                            {
                                // å¤„理任务异常情况
                                agv.Communicator.Write(taskInteractiveW1, 0);
                                agv.Communicator.Write<UInt16>(taskInteractiveW1, 0);
                                Task.Delay(2000).Wait();
                                int readTask0Error = agv.Communicator.Read<int>(taskInteractiveR);
@@ -342,7 +326,7 @@
        public static string TaskWrite(AGV client, Dt_Task agvTask, AGVJobEnum jobEnum)
        {
            List<byte> sendData = new List<byte>();
            string tmp = agvTask.TaskNum.ToString();
            string tmp = "KH-" + agvTask.TaskNum.ToString();
            List<byte> taskID = Encoding.Default.GetBytes(tmp).ToList();//任务ID
            taskID.Insert(0, 30);
            taskID.Insert(1, Convert.ToByte(tmp.Length));
@@ -377,11 +361,11 @@
            Array.Reverse(taskType);
            sendData.AddRange(taskType);
            List<byte> containerType = Encoding.Default.GetBytes(agvTask.PalletCode).ToList();
            List<byte> containerType = Encoding.Default.GetBytes(agvTask.Barcode).ToList();
            containerType.Insert(0, 30);
            containerType.Insert(1, Convert.ToByte(agvTask.PalletCode.Length));
            containerType.Insert(1, Convert.ToByte(agvTask.Barcode.Length));
            for (int i = 0; i < 30 - agvTask.PalletCode.Length; i++)
            for (int i = 0; i < 30 - agvTask.Barcode.Length; i++)
            {
                containerType.Add(0);
            }