wankeda
2025-05-26 0864509e1eb593c3dedb66196ec19fe51437922b
´úÂë¹ÜÀí/NEWCode/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGVJob/SendTaskAGV.cs
@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.Text;
using Microsoft.Data.SqlClient;
using WIDESEAWCS_Common.AGVEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_ITaskInfoRepository;
@@ -14,157 +15,46 @@
        private static bool isTrue1 = false;
        private static string name1 = "";
        public static void SendAGVTask1(AGV agv, ITaskRepository _taskRepository)
        public static void SendAGVTask1(ITaskRepository _taskRepository)
        {
            //TODO: Implement sending task to AGV
            try
            {
                if (agv == 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;
            // è¿žæŽ¥å­—符串 - æ ¹æ®ä½ çš„æœåŠ¡å™¨ä¿¡æ¯ä¿®æ”¹
            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)";
                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)
                try
                {
                    if (TaskInteractiveW != 0 || resetTaskInteractiveW != 0 || TaskInteractive != 0)
                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        agv.Communicator.Write(resetTaskW, 1);
                        Task.Delay(2000).Wait();
                        resetTaskInteractiveW = agv.Communicator.Read<int>(resetTaskW);
                        if (resetTaskInteractiveW == 1)
                        connection.Open();
                        using (SqlCommand command = new SqlCommand(insertSql, connection))
                        {
                            agv.Communicator.Write(resetTaskW, 0);
                            agv.Communicator.Write(taskInteractiveW, 0);
                            Task.Delay(2000).Wait();
                        }
                        return;
                    }
                    else
                    {
                        isTrue1 = false;
                        name1 = "";
                    }
                }
                if (resetTaskInteractiver == 1)
                {
                    agv.Communicator.Write(taskInteractiveW, 0);
                    for (int i = 0; i < 5; i++)
                    {
                        Thread.Sleep(300);
                        var agvnumber = Convert.ToInt32(agv.Communicator.Read<int>(taskInteractiveW));
                        if (agvnumber != 0)
                        {
                            agv.Communicator.Write(taskInteractiveW, 0);
                        }
                        else
                        {
                            break;
                            // æ·»åŠ å‚æ•°é˜²æ­¢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} è¡Œæ•°æ®");
                        }
                    }
                }
                if (0 == TaskInteractive && TaskInteractiveW == 0)
                catch (Exception ex)
                {
                    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)
                    {
                        //写入任务信息
                        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));
                        }
                    }
                    Console.WriteLine($"发生错误: {ex.Message}");
                }
            }
            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)