lss
20 小时以前 1319cb7072623dff12369a889af766db2d166def
HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/process/DeviceProcess.cs
@@ -4,11 +4,16 @@
using HH.WCS.JiaTong.util;
using HH.WCS.JiaTong.wms;
using Newtonsoft.Json;
using S7.Net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Services.Description;
using static HH.WCS.JiaTong.LISTA.process.HttpModel;
using static System.Collections.Specialized.BitVector32;
namespace HH.WCS.JiaTong.process
{
@@ -31,7 +36,7 @@
                    {
                        if (data == "")
                        {
                            Traystacker(plc);
                            // Traystacker(plc);
                        }
                    }
                }
@@ -45,42 +50,52 @@
        /// <summary>
        /// 叠盘机空托返回
        /// </summary>    
        internal static void Traystacker(Settings.deviceInfo device)
        internal static void Traystacker(string loc, int qty, int type, string cntrcode = "")
        {
            try
            {
                //上传数据
                Result<Traystacker> result1 = new Result<Traystacker>();
                Traystacker traystacker = new Traystacker() { station = device.TN_Location[0], taskSource = 1, Qty = 7 };
                result1.data.Add(traystacker);
                Traystacker result1 = new Traystacker() { station = loc, taskSource = 1, Qty = qty, dpType = type };
                HttpHelper httpHelper = new HttpHelper();
                Result result = new Result();
                string date = JsonConvert.SerializeObject(result1);
                string url = Settings.tableUrls.Find(a => a.id == 2).url;
                LogHelper.Info($"叠盘机空托返回:地址:{url},内容:{date}");
                var r = httpHelper.WebPost(url, date);
                result = JsonConvert.DeserializeObject<Result>(r);
                if (result.code == "0")
                var url = Settings.tableUrls.Find(a => a.id == 3);
                if (url != null)
                {
                    LogHelper.Info($"叠盘机空托返回:地址:{url.url},内容:{date}");
                    var r = httpHelper.WebPost(url.url, date);
                    result = JsonConvert.DeserializeObject<Result>(r);
                    if (result.code == "0")
                    {
                    LogHelper.Info($"叠盘机空托返回请求成功");
                        LogHelper.Info($"叠盘机空托返回请求成功");
                    }
                    else
                    {
                        LogHelper.Info($"叠盘机空托返回请求失败=>msg:{result.msg}");
                    }
                }
                else
                {
                    LogHelper.Info($"叠盘机空托返回请求失败=>msg:{result.msg}");
                    LogHelper.Info($"叠盘机空托:根据id=3,未找到配置链接,请检查配置文件");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"叠盘机空托返回  Error=>{ex.ToString()}");
                LogHelper.Error($"叠盘机空托返回  Error=>{ex.ToString()}", ex);
            }
        }
        /// <summary>
        /// 原材料库agv叠盘回库
        /// </summary>
        internal static void Traffic()
        {
            Console.WriteLine("开始原材料叠盘位置判断");
            var db = new SqlHelper<object>().GetInstance();
            List<string> locs = new List<string>() { "LCDP-001" };
            List<string> locs = new List<string>() { "LCDP-001", "BADPW-01" };
            var location = db.Queryable<Location>().Where(a => locs.Contains(a.S_CODE)).ToList();
            if (location.Count > 0)
            {
@@ -93,8 +108,8 @@
                        var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
                        if (cntr.Count > 0)
                        {
                            var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
                            cntrcode = string.Join(",", cntrcodes);
                            cntrcode = cntr.OrderBy(a => a.T_CREATE).First().S_CNTR_CODE;
                            // cntrcode = string.Join(",", cntrcodes);
                        }
                        //创建过未完成的任务不发起请求
@@ -106,15 +121,349 @@
                    }
                }
            }
        }
        /// <summary>
        /// 井松agv叠盘回库
        /// </summary>
        internal static void KjTraffic()
        {
            Console.WriteLine("开始井松agv叠盘回库位置判断");
            var db = new SqlHelper<object>().GetInstance();
            List<string> locs = new List<string>() { "AGV12DP-001", "AGV01DP-001", "AGV05DP-001" };
            var location = db.Queryable<Location>().Where(a => locs.Contains(a.S_CODE)).ToList();
            if (location.Count > 0)
            {
                // string cntrcode = "";
                foreach (var item in location)
                {
                    if (item.N_CURRENT_NUM >= 6)
                    {
                        //var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
                        //if (cntr.Count > 0)
                        //{
                        //    var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
                        //    cntrcode = string.Join(",", cntrcodes);
                        //}
                        string cntrcode = "";
                        var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
                        if (cntr.Count > 0)
                        {
                            cntrcode = cntr.OrderBy(a => a.T_CREATE).First().S_CNTR_CODE;
                            // cntrcode = string.Join(",", cntrcodes);
                        }
                        LogHelper.Info($"货位{item.S_CODE}叠满6个开始回调接口");
                        //创建过未完成的任务不发起请求
                        var mst = WCSHelper.GetTaskByStartloc(item.S_CODE);
                        if (mst == null)
                        {
                            Traystacker(item.S_CODE, item.N_CURRENT_NUM, 2, cntrcode);
                        }
                        else
                        {
                            LogHelper.Info($"有执行中的叠盘回库任务{mst.S_CODE},不触发叠盘任务");
                        }
                    }
                }
            }
        }
        //public static Dictionary<string, DpjErrorInfo> DpjInfoDirectory = new Dictionary<string, DpjErrorInfo>();
        public static Dictionary<string, DpjInfo> DpjInfoDirectory = new Dictionary<string, DpjInfo>();
        /// <summary>
        /// 井松叠盘机叠盘回库
        /// </summary>
        internal static void DpjTraffic()
        {
            var devices = Settings.deviceInfos.Where(a => a.deviceType == 1).ToList();
            //var db = new SqlHelper<object>().GetInstance();
            //var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0  && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
            try
            {
                if (devices.Count > 0)
                {
                    foreach (var device in devices)
                    {
                        try
                        {
                            // 为每个设备创建独立处理区
                            Task.Run(() =>
                            {
                                DpjTraffic1(device);
                            });
                        }
                        catch (Exception ex)
                        {
                            // 捕获单个设备异常,不影响其他设备
                            LogHelper.Error($"叠盘机{device.deviceName}({device.address})处理失败: {ex.Message}", ex);
                        }
                        Thread.Sleep(100);
                    }
                }
                //Thread.Sleep(5000);
            }
            catch (Exception ex)
            {
                LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
            }
        }
        /// <summary>
        /// 叠盘机线程读取
        /// </summary>
        internal static void DpjTrafficRead()
        {
            var devices = Settings.deviceInfos.Where(a => a.deviceType == 1).ToList();
            //var db = new SqlHelper<object>().GetInstance();
            //var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0  && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
            try
            {
                if (devices.Count > 0)
                {
                    foreach (var device in devices)
                    {
                        try
                        {
                            // 为每个设备创建独立处理区
                            Task.Run(() =>
                            {
                                DpjTrafficRead(device);
                            });
                        }
                        catch (Exception ex)
                        {
                            // 捕获单个设备异常,不影响其他设备
                            LogHelper.Error($"叠盘机{device.deviceName}({device.address})处理失败: {ex.Message}", ex);
                        }
                        Thread.Sleep(100);
                    }
                }
                //Thread.Sleep(5000);
            }
            catch (Exception ex)
            {
                LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
            }
        }
        internal static void DpjCreateTask()
        {
            var devices = DpjInfoDirectory;
            //var db = new SqlHelper<object>().GetInstance();
            //var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0  && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
            try
            {
                if (devices.Count > 0)
                {
                    foreach (var device in devices.Values)
                    {
                        try
                        {
                            // 为每个设备创建独立处理区
                            Task.Run(() =>
                            {
                                DpjTraffic2(device);
                            });
                        }
                        catch (Exception ex)
                        {
                            // 捕获单个设备异常,不影响其他设备
                            LogHelper.Error($"叠盘机{device.Address}处理失败: {ex.Message}", ex);
                        }
                        Thread.Sleep(100);
                    }
                }
                //Thread.Sleep(5000);
            }
            catch (Exception ex)
            {
                LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
            }
        }
        internal static void DpjTrafficRead(Settings.deviceInfo device)
        {
            while (true)
            {
                try
                {
                    var IsDp = S7Helper.ReadDpj(device.address, 2001, S7.Net.VarType.Byte);
                    var value = S7Helper.ReadDpj(device.address, 2014, S7.Net.VarType.Int);
                    int value2004 = S7Helper.ReadDpj(device.address, 2004, S7.Net.VarType.Byte);
                    LogHelper.Info($"读取叠盘机{device.address},叠盘信号{IsDp},数量{value},安全交互信号{value2004}");
                    if (DpjInfoDirectory.ContainsKey(device.address))
                    {
                        DpjInfoDirectory[device.address].Address = device.address;
                        DpjInfoDirectory[device.address].Loc = device.TN_Location;
                        DpjInfoDirectory[device.address].PickUp = IsDp;
                        DpjInfoDirectory[device.address].qty = value;
                        DpjInfoDirectory[device.address].value2004 = value2004;
                    }
                    else
                    {
                        DpjInfoDirectory.Add(device.address, new DpjInfo() { Address = device.address, Loc = device.TN_Location, PickUp = IsDp, qty = value, value2004 = value2004 });
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
                }
            }
        }
        internal static void DpjTraffic1(Settings.deviceInfo device)
        {
            try
            {
                var IsDp = S7Helper.ReadDpj(device.address, 2001, S7.Net.VarType.Byte);
                var value = S7Helper.ReadDpj(device.address, 2014, S7.Net.VarType.Int);
               // int value2004 = S7Helper.ReadDpj(device.address, 2004, S7.Net.VarType.Byte);
                //var ErrorCode = S7Helper.ReadDpj(device.address, 2016, S7.Net.VarType.Int);
                ////记录叠盘机报错信息
                //if (DpjInfoDirectory.ContainsKey(device.address))
                //{
                //    DpjInfoDirectory[device.address].Address = device.address;
                //    DpjInfoDirectory[device.address].DeviceName = device.deviceName;
                //    var ErrorInfo = Settings.dpjErrorInfos.Where(a => a.ErrorCode == ErrorCode).First();
                //    if (ErrorInfo != null)
                //    {
                //        DpjInfoDirectory[device.address].ErrorInfo = ErrorInfo.ErrorInfo;
                //    }
                //}
                //else
                //{
                //    string errorinfo = "";
                //    var ErrorInfo = Settings.dpjErrorInfos.Where(a => a.ErrorCode == ErrorCode).First();
                //    if (ErrorInfo != null)
                //    {
                //        errorinfo = ErrorInfo.ErrorInfo;
                //    }
                //    DpjInfoDirectory.Add(device.address, new DpjErrorInfo() { Address = device.address, DeviceName = device.deviceName, ErrorInfo = errorinfo });
                //}
                if (value >= 1 && IsDp == 1)
                {
                    //var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
                    //if (cntr.Count > 0)
                    //{
                    //    var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
                    //    cntrcode = string.Join(",", cntrcodes);
                    //}
                    //创建过未完成的任务不发起请求
                    var mst = WCSHelper.GetTaskByStartloc(device.TN_Location);
                    if (mst == null)
                    {
                        Traystacker(device.TN_Location, value, 2);
                    }
                    else
                    {
                        LogHelper.Info($"有执行中的叠盘回库任务{mst.S_CODE},不触发叠盘任务");
                    }
                    //var loc = LocationHelper.GetLocByLoc(device.TN_Location);
                    //if (loc != null)
                    //{
                    //    if (loc.N_LOCK_STATE == 0) {
                    //        Traystacker(device.TN_Location, value, 2);
                    //    }
                    //    else
                    //    {
                    //        LogHelper.Info($"设备起点:{device.TN_Location}有锁,不生成任务");
                    //    }
                    //}
                    //else
                    //{
                    //    LogHelper.Info($"根据设备:{device.deviceName},起点:{device.TN_Location},未找到货位");
                    //}
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
            }
        }
        internal static void DpjTraffic2(DpjInfo dpj)
        {
            try
            {
                LogHelper.Info($"叠盘机{dpj.Address},叠盘信号{dpj.PickUp},数量{dpj.qty}");
                if (dpj.qty >= 1 && dpj.PickUp == 1)
                {
                    //var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
                    //if (cntr.Count > 0)
                    //{
                    //    var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
                    //    cntrcode = string.Join(",", cntrcodes);
                    //}
                    //创建过未完成的任务不发起请求
                    var mst = WCSHelper.GetTaskByStartloc(dpj.Loc);
                    if (mst == null)
                    {
                        Traystacker(dpj.Loc, dpj.qty, 2);
                    }
                    else
                    {
                        LogHelper.Info($"有执行中的叠盘回库任务{mst.S_CODE},不触发叠盘任务");
                    }
                    //var loc = LocationHelper.GetLocByLoc(device.TN_Location);
                    //if (loc != null)
                    //{
                    //    if (loc.N_LOCK_STATE == 0) {
                    //        Traystacker(device.TN_Location, value, 2);
                    //    }
                    //    else
                    //    {
                    //        LogHelper.Info($"设备起点:{device.TN_Location}有锁,不生成任务");
                    //    }
                    //}
                    //else
                    //{
                    //    LogHelper.Info($"根据设备:{device.deviceName},起点:{device.TN_Location},未找到货位");
                    //}
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
            }
        }
        /// <summary>
        /// 原材料库接口访问
        /// </summary>    
        internal static void AgvEmptyBack(string loc, string cntrcode)
        internal static Resultmobox AgvEmptyBack(string loc, string cntrcode)
        {
            Resultmobox result = new Resultmobox();
            try
            {
                string partNumber = "";
@@ -124,7 +473,7 @@
                result1.data = traystacker;
                HttpHelper httpHelper = new HttpHelper();
                //调用接口
                Resultmobox result = new Resultmobox();
                string date = JsonConvert.SerializeObject(result1);
                string url = Settings.tableUrls.Find(a => a.id == 11).url;
                LogHelper.Info($"空托返回:地址:{url},内容:{date}");
@@ -139,12 +488,31 @@
                {
                    LogHelper.Info($"空托返回请求失败=>msg:{result.err_msg}");
                }
                return result;
            }
            catch (Exception ex)
            {
                LogHelper.Info($"空托返回  Error=>{ex.ToString()}");
                return result;
            }
        }
        public class DpjErrorInfo
        {
            public string Address { get; set; }
            public string DeviceName { get; set; }
            public string ErrorInfo { get; set; }
        }
        public class DpjInfo
        {
            public string Address { get; set; }
            public string Loc { get; set; }
            public int PickUp { get; set; }
            public int qty { get; set; }
            public int value2004 { get; set; }
        }
    }
}