xiaojiao
4 天以前 5ce21dbcd0849adc3afcf28fffc8933ce717c380
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Back1_Job.cs
@@ -1,15 +1,23 @@
using Quartz;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using SixLabors.ImageSharp;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_Tasks.TaskAcquisition;
namespace WIDESEAWCS_Tasks
{
@@ -24,36 +32,108 @@
        private readonly ITaskService _taskService;
        private readonly ISys_ConfigService _sys_ConfigService;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        public TaskAcquisition_Back1_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository)
        private readonly IDt_MaterialInfoRepository _IDt_MaterialInfoRepository;
        public TaskAcquisition_Back1_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository, IDt_MaterialInfoRepository IDt_MaterialInfoRepository)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _sys_ConfigService = configService;
            _stationManagerRepository = stationManagerRepository;
            _IDt_MaterialInfoRepository = IDt_MaterialInfoRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            string ip = "127.0.0.1";
            int port = 502;
            string name = "后底板1";
            ModbusTcp modbusTcp = new ModbusTcp(ip, port, name);
            string Region = "后底板1";
            ModbusTcp modbusTcp = new ModbusTcp(ip, port, Region);
            Baseconversion baseconversion = new Baseconversion();
            modbusTcp.Connect();
            //var a = modbusTcp.Read("40002", 20);
            //string barcode = Encoding.UTF8.GetString(a).Replace("\0", "").Replace("\\0", "");
            // è¯»å–指定的地址读到10进制的ascii码转成16进制
            byte[] rawBytes = modbusTcp.Read("10", 20);
            string originalDecimalStr = Encoding.ASCII.GetString(rawBytes).TrimEnd('\0');
            Console.WriteLine($"读取到的原始十进制字符串:{originalDecimalStr}");
            // ä¸‹é¢è¿™ä¸€æ®µå°±æ˜¯ä½ è¦çš„:转 16 è¿›åˆ¶
            ulong number = ulong.Parse(originalDecimalStr);  // è½¬æˆæ•°å­—
            string hexStr = number.ToString("X");            // è½¬å¤§å†™16进制
            Console.WriteLine("转换成16进制:" + hexStr);
            Dictionary<int, int> Signal = new Dictionary<int, int>() { [10] = 2, [30] = 3, [50] = 4, [70] = 5 };
            Dictionary<int, int> FeedingPoint = new Dictionary<int, int>() { [10] = 2001, [30] = 2002, [50] = 2003, [70] = 2004 }; // å«æ–™çš„点位 ç»ˆç‚¹ä½ç½®
            try
            {
                for (int i = 10; i < 90; i += 20)
                {
                    byte[] SignalNumber = modbusTcp.Read(Signal[i].ToString(), 1); // ä¿¡å· 1:叫料 2:拉出空框
                    if (SignalNumber[1] == 1)
                    {
                        byte[] PartNumber = modbusTcp.Read(i.ToString(), 20); // è¯»å–零件号
                        if (PartNumber[1] == 0) continue;
                        string Ku1_Value = baseconversion.TenthTurn16(PartNumber);
                        if (Ku1_Value != "" && Ku1_Value != null)
                        {
                            // ç­‰åŠŸèƒ½æµ‹è¯•å®Œï¼Œè¿™é‡Œè¦åšæ—¥å¿—è®°å½•
                            Console.WriteLine(Ku1_Value);
                            // æ‰¾å¯¹åº”的零件号是否已经绑定(组盘)
                            Dt_MaterialInfo dt_MaterialInfo = _IDt_MaterialInfoRepository.QueryFirst(x => x.MaterialName == Ku1_Value);
                            if (dt_MaterialInfo != null && dt_MaterialInfo.IsBind && dt_MaterialInfo.EndPosition == null)
                            {
                                Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.PalletCode == dt_MaterialInfo.ContainerCode);
                                if (dt_Task != null) continue; //证明有当前任务
                                dt_Task = new Dt_Task();
                                dt_Task.PalletCode = dt_MaterialInfo.ContainerCode;
                                dt_Task.SourceAddress = dt_MaterialInfo.Position; // å½“前位置
                                dt_Task.TargetAddress = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                dt_Task.Grade = 2;
                                dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt();
                                dt_Task.TaskType = TaskAGVCarryTypeEnum.Carry.ObjToInt();
                                dt_Task.Roadway = (Signal[i] - 1).ToString(); // åº“1 å«æ–™é‚£å°±æ˜¯1巷道
                                dt_Task.CurrentAddress = dt_MaterialInfo.Position; // å½“前位置
                                dt_Task.NextAddress = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                dt_MaterialInfo.EndPosition = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                _taskRepository.AddData(dt_Task);
                                _IDt_MaterialInfoRepository.UpdateData(dt_MaterialInfo);
                            }
                            // å¦‚果没绑定则不生成任务 å¦‚果查找到对应的零件号绑定了 åˆ™ç”Ÿæˆä¸€æ¡ä»»åŠ¡æ•°æ®
                        }
                    }
                    if (SignalNumber[1] == 2) // è¡¨ç¤ºæ‹‰å‡ºç©ºæ¡†
                    {
                        Dictionary<int, int> Endpointposition = new Dictionary<int, int>() { [10] = 3001, [20] = 3002, [30] = 3003, [40] = 3004 }; // å«æ–™çš„点位 ç»ˆç‚¹ä½ç½®
                        Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.SourceAddress == FeedingPoint[i].ToString() && x.TaskType == (int)TaskAGVCarryTypeEnum.CarryEmpty);
                        if (dt_Task != null) continue;
                        dt_Task = new Dt_Task();
                        dt_Task.PalletCode = "空框子";
                        dt_Task.SourceAddress = FeedingPoint[i].ToString();
                        dt_Task.TargetAddress = Endpointposition[i].ToString();
                        dt_Task.Grade = 2;
                        dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt();
                        dt_Task.TaskType = TaskAGVCarryTypeEnum.CarryEmpty.ObjToInt();
                        dt_Task.Roadway = (Signal[i] - 1).ToString(); // åº“1 å«æ–™é‚£å°±æ˜¯1巷道
                        dt_Task.CurrentAddress = FeedingPoint[i].ToString(); // å½“前位置
                        dt_Task.NextAddress = Endpointposition[i].ToString(); // ç»ˆç‚¹ä½ç½®
                        _taskRepository.AddData(dt_Task);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            // 16进制转成10进制
            // 2. 16进制 â†’ è½¬å›žåè¿›åˆ¶ï¼ˆä½ è¦çš„功能)
            ulong decimalResult = Convert.ToUInt64(hexStr, 16);
            ulong decimalResult = Convert.ToUInt64("123", 16);
            Console.WriteLine("16进制转回十进制:" + decimalResult);
            // å†™å…¥
            bool flag = modbusTcp.Write("30", decimalResult.ToString());
            modbusTcp.Disconnect();