111
cjs
2025-06-20 c248264e3bc150d145fd38f76f468f938270782a
ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs
@@ -22,6 +22,8 @@
using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProtocolAnalysis;
using log4net.Appender;
using System.Net.Configuration;
using static System.Runtime.CompilerServices.RuntimeHelpers;
using System.Reflection.Emit;
namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
{
@@ -2026,62 +2028,6 @@
                }
            }
        }
        /// <summary>
        /// 3楼打包机下线,判断打包机是否由生成打包下线的任务(四钴车间)
        /// </summary>
        /// <param name="plc"></param>
        internal static void CheckPackingLineFullTwo(Settings.PlcInfo plc)
        {
            //读plc信号,看有没有下线请求,判断是否已经有任务
            //没有任务,继续plc,包装下线的物料信号
            //检查打包机通道1是否有出料任务信号,如果有生成取料任务。
            if (CheckStartFree(plc.location))
            {
                try
                {
                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                    {
                        dataNum = 1,
                        addr = plc.readAddr + 1,
                        host = plc.ip,
                        port = plc.port
                    });
                    if (result != null && result.errCode == 0)
                    {
                        if (result.result[0] == 1)
                        {
                            //获取MODBUS通道里面存放的时间戳
                            var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                            {
                                addr = plc.readAddr + 10,
                                host = plc.ip,
                                port = plc.port,
                                dataNum = 170
                            });
                            if (resultTime.errCode == 0)
                            {
                                string wmstaskno = "";
                                TimeCuoInfoComTwo timecuo = TimeCuoTwo(resultTime.result);
                                if (timecuo != null)
                                {
                                    string timeStamp = timecuo.TimeCuo;
                                    //string employeeId = timecuo.employeeId1;
                                    //// ERP变更-调用ERP接口传输相关数据
                                    //WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeStamp, timeStamp, employeeId,true);
                                }
                                else CMMLog.Info($"时间戳接口返回值为空!");
                            }
                            else CMMLog.Info($"MODBUS时间戳数据返回值错误:返回值解析:{JsonConvert.SerializeObject(result)}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    CMMLog.Error(ex.Message);
                }
            }
        }
        #endregion
        #region   打包机出口MODBUS交互(开始取料,取料完成)
@@ -2090,9 +2036,9 @@
        /// 设备允许出料   1   PLC写,AMS读   1-设备请求出料;2-允许进入;3-确认货物取走,送出物料;
        ///打包线下线——小车开始取货
        internal static void PackingLineUnload1012(string ip, string taskNo)
        internal static void PackingLineUnload1012(string ip, string taskNo, int port)
        {
            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "4").FirstOrDefault();
            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip && a.port == port).FirstOrDefault();
            if (plc != null)
            {
                try
@@ -2141,11 +2087,11 @@
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="taskNo"></param>
        internal static void PackingLineComplete4(string ip, string taskNo)
        internal static void PackingLineComplete4(string ip, string taskNo, int port)
        {
            //取货完成后需要读取设备时间戳里面的数据,并将其暂存至中间表等到入库任务完成传输给WMS
            
            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "4").FirstOrDefault();
            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip && a.port == port).FirstOrDefault();
            if (plc != null)
            {
                try
@@ -4202,53 +4148,197 @@
        {
            var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            {
                dataNum = 25,
                addr = plc.readAddr,
                dataNum = 1,
                addr = plc.readAddr + 1,
                host = plc.ip,
                port = plc.port
            });
            CMMLog.Info($"下线口 ip:{plc.ip},port:{plc.port},addr:{plc.writeAddr + 1},reuslt:{JsonConvert.SerializeObject(result)}.");
            if(result != null && result.errCode == 0)
            {
                if (result.result[0] == 1)
                {
                    //获取物料信息 根据托盘码区分
                    string trayCode = RemoveNull(GetTrayCode(result.result.Skip(6).Take(3).ToArray()));//托盘码
                    var infoPack = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.And(Query.EQ("trayCode", trayCode)), "TimeCuoInfoComTwo");
                    if (infoPack != null)
                    var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                    {
                        string empCode = RemoveNull(GetTrayCode(result.result.Skip(1).Take(5).ToArray()));//员工编码
                        string machineCode = RemoveNull(GetTrayCode(result.result.Skip(9).Take(1).ToArray()));//包装机号
                        int needWeight = Convert.ToInt32(Completion(result.result[10]) + Completion(result.result[11]), 2);//产品需求重量
                        int oneWeight = Convert.ToInt32(Completion(result.result[12]) + Completion(result.result[13]), 2);//单托毛重
                        int readWeight = Convert.ToInt32(Completion(result.result[14]) + Completion(result.result[15]), 2);//单托净重
                        int fcWeight = Convert.ToInt32(Completion(result.result[16]) + Completion(result.result[17]), 2);//单托复称重量
                        int trayType = Convert.ToInt32(Completion(result.result[18]), 2);//托盘类型
                        int addState = Convert.ToInt32(Completion(result.result[19]), 2);//叠包层数
                        int bagNumber = Convert.ToInt32(Completion(result.result[20]), 2);//袋号
                        int productTime = Convert.ToInt32(Completion(result.result[21]) + Completion(result.result[22]), 2);//生产日期
                        string timeCuoTwo = Convert.ToInt32(Completion(result.result[23]) + Completion(result.result[24]), 2).ToString(); //时间戳
                        UpdateBuilder updateBuilder = Update.Set("employeeId", empCode).Set("trayCode", trayCode).Set("packingMachineNumber", machineCode).Set("needWeight", needWeight)
                                                .Set("oneWeight", oneWeight).Set("realWeight", readWeight).Set("FCWeight", fcWeight).Set("trayType", trayType)
                                                .Set("isFold", addState).Set("bagNumber", bagNumber).Set("productData", productTime);
                        //产品批次号  产品型号 物料名称 计量单位均可在erp表中根据物料编码获取
                        dataNum = 26,
                        addr = plc.readAddr + 8,
                        host = plc.ip,
                        port = plc.port
                    });
                    CMMLog.Info($"下线口 ip:{plc.ip},port:{plc.port},addr:{plc.writeAddr + 8},reuslt:{JsonConvert.SerializeObject(resultTime)}.");
                    if (resultTime.errCode == 0)
                    {
                        string timeCuoData = (resultTime.result[0] * 65536 + resultTime.result[1]).ToString();
                        string empCode = RemoveNull(GetTrayCode(resultTime.result.Skip(2).Take(5).ToArray()));//员工编码
                        string machineCode = RemoveNull(GetTrayCode(resultTime.result.Skip(10).Take(1).ToArray()));//包装机号
                        int needWeight = Convert.ToInt32(Completion(resultTime.result[11]) + Completion(resultTime.result[12]), 2);//产品需求重量
                        int oneWeight = Convert.ToInt32(Completion(resultTime.result[13]) + Completion(resultTime.result[14]), 2);//单托毛重
                        int readWeight = Convert.ToInt32(Completion(resultTime.result[15]) + Completion(resultTime.result[16]), 2);//单托净重
                        int fcWeight = Convert.ToInt32(Completion(resultTime.result[17]) + Completion(resultTime.result[18]), 2);//单托复称重量
                        int trayType = Convert.ToInt32(Completion(resultTime.result[19]), 2);//托盘类型
                        int addState = Convert.ToInt32(Completion(resultTime.result[20]), 2);//叠包层数
                        int bagNumber = Convert.ToInt32(Completion(resultTime.result[21]), 2);//袋号
                        int productTime = Convert.ToInt32(Completion(resultTime.result[22]) + Completion(resultTime.result[23]), 2);//生产日期
                        result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                        {
                            dataNum = 15,
                            addr = plc.readAddr + 131,
                            addr = plc.readAddr + 140,
                            host = plc.ip,
                            port = plc.port
                        });
                        CMMLog.Info($"下线口,ip:{plc.ip},port:{plc.port},addr:{plc.readAddr + 140},result:{JsonConvert.SerializeObject(result)}");
                        string materialCode = RemoveNull(GetTrayCode(result.result.Skip(0).Take(15).ToArray()).Trim().ToString());
                        UpdateBuilder update = Update.Set("materialCode", materialCode);
                        MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(Query.EQ("trayCode", trayCode), update, UpdateFlags.None);
                        CMMLog.Info($"下线口:timeCuoData:{timeCuoData},empCode:{empCode},machineCode:{machineCode},needWeight:{needWeight},oneWeight:{oneWeight},readWeight:{readWeight}" +
                            $",fcWeight:{fcWeight},trayType:{trayType},addState:{addState},bagNumber:{bagNumber},productTime:{productTime},TimeCuo:{timeCuoData}");
                        var timeTwo = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.EQ("TimeCuo", timeCuoData), "TimeCuoInfoComTwo");
                        if (timeTwo == null)
                        {
                            MongoDBSingleton.Instance.Insert<TimeCuoInfoComTwo>(new TimeCuoInfoComTwo
                            {
                                timeCuo = timeCuoData,
                                employeeId = empCode,
                                packingMachineNumber = machineCode,
                                needWeight = needWeight,
                                oneWeight = oneWeight,
                                realWeight = readWeight,
                                FCWeight = fcWeight,
                                trayType = trayType.ToString(),
                                isFold = addState,
                                bagNumber = bagNumber,
                                productData = productTime.ToString(),
                                TimeCuo = timeCuoData,
                                materialCode = materialCode
                            }, "TimeCuoInfoComTwo");
                        }
                        else
                        {
                            var query1 = Query.EQ("TimeCuo", timeCuoData);
                            UpdateBuilder updateBuilder = Update.Set("employeeId", empCode).Set("packingMachineNumber", machineCode).Set("needWeight", needWeight)
                                                    .Set("oneWeight", oneWeight).Set("realWeight", readWeight).Set("FCWeight", fcWeight).Set("trayType", trayType.ToString())
                                                    .Set("isFold", addState).Set("bagNumber", bagNumber).Set("productData", productTime.ToString()).Set("TimeCuo", timeCuoData)
                                                    .Set("materialCode", materialCode);
                            MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(query1, updateBuilder, "TimeCuoInfoComTwo", UpdateFlags.None);
                        }
                        string wmstaskno = "";
                        WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeCuoData, timeCuoData, empCode, true);
                    }
                }
            }
            //string trayCode = "";
            //var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            //{
            //    dataNum = 25,
            //    addr = plc.readAddr,
            //    host = plc.ip,
            //    port = plc.port
            //});
            //CMMLog.Info($"贴标机获取信息,ip:{plc.ip},port:{plc.port},addr:{plc.readAddr},result:{JsonConvert.SerializeObject(result)}");
            //if(result != null && result.errCode == 0)
            //{
            //    if (result.result[0] == 1)
            //    {
            //        //获取物料信息 根据托盘码区分
            //        trayCode = RemoveNull(GetTrayCode(result.result.Skip(6).Take(3).ToArray()));//托盘码
            //
            //        if (!string.IsNullOrEmpty(trayCode))
            //        {
            //            var infoPack = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.And(Query.EQ("trayCode", trayCode)), "TimeCuoInfoComTwo");
            //            if (infoPack == null)
            //            {
            //                string empCode = RemoveNull(GetTrayCode(result.result.Skip(1).Take(5).ToArray()));//员工编码
            //                string machineCode = RemoveNull(GetTrayCode(result.result.Skip(9).Take(1).ToArray()));//包装机号
            //                int needWeight = Convert.ToInt32(Completion(result.result[10]) + Completion(result.result[11]), 2);//产品需求重量
            //                int oneWeight = Convert.ToInt32(Completion(result.result[12]) + Completion(result.result[13]), 2);//单托毛重
            //                int readWeight = Convert.ToInt32(Completion(result.result[14]) + Completion(result.result[15]), 2);//单托净重
            //                int fcWeight = Convert.ToInt32(Completion(result.result[16]) + Completion(result.result[17]), 2);//单托复称重量
            //                int trayType = Convert.ToInt32(Completion(result.result[18]), 2);//托盘类型
            //                int addState = Convert.ToInt32(Completion(result.result[19]), 2);//叠包层数
            //                int bagNumber = Convert.ToInt32(Completion(result.result[20]), 2);//袋号
            //                int productTime = Convert.ToInt32(Completion(result.result[21]) + Completion(result.result[22]), 2);//生产日期
            //                string timeCuoTwo = Convert.ToInt32(Completion(result.result[23]) + Completion(result.result[24]), 2).ToString(); //时间戳
            //
            //                UpdateBuilder updateBuilder = Update.Set("employeeId", empCode).Set("trayCode", trayCode).Set("packingMachineNumber", machineCode).Set("needWeight", needWeight)
            //                                        .Set("oneWeight", oneWeight).Set("realWeight", readWeight).Set("FCWeight", fcWeight).Set("trayType", trayType)
            //                                        .Set("isFold", addState).Set("bagNumber", bagNumber).Set("productData", productTime);
            //                //产品批次号  产品型号 物料名称 计量单位均可在erp表中根据物料编码获取
            //
            //                result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            //                {
            //                    dataNum = 15,
            //                    addr = plc.readAddr + 131,
            //                    host = plc.ip,
            //                    port = plc.port
            //                });
            //                CMMLog.Info($"贴标机,ip:{plc.ip},port:{plc.port},addr:{plc.readAddr + 131},result:{JsonConvert.SerializeObject(result)}");
            //                string materialCode = RemoveNull(GetTrayCode(result.result.Skip(0).Take(15).ToArray()).Trim().ToString());
            //                UpdateBuilder update = Update.Set("materialCode", materialCode).Set("createTime", DateTime.Now);
            //                MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(Query.EQ("trayCode", trayCode), update, UpdateFlags.None);
            //
            //                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
            //                {
            //                    host = plc.ip,
            //                    addr = plc.writeAddr,
            //                    data = 1,
            //                    port = plc.port
            //                });
            //                CMMLog.Debug($"贴标机,写入 ip:{plc.ip},port:{plc.port},addr:{plc.writeAddr}的数据为1.");
            //            }
            //        }
            //    }
            //}
            //
            //var xxPlc = Settings.GetPlcInfo().Where(a => a.deviceType == "27" && a.enable == 1).FirstOrDefault();
            //if(xxPlc != null)
            //{
            //    if (CheckStartFree(plc.location))
            //    {
            //        result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            //        {
            //            dataNum = 1,
            //            addr = plc.readAddr + 1,
            //            host = plc.ip,
            //            port = plc.port
            //        });
            //
            //        CMMLog.Debug($"下线口 ip:{plc.ip},port:{plc.port},addr:{plc.writeAddr + 1},reuslt:{JsonConvert.SerializeObject(result)}.");
            //        if (result != null && result.errCode == 0)
            //        {
            //            if (result.result[0] == 1)
            //            {
            //                var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            //                {
            //                    dataNum = 2,
            //                    addr = plc.readAddr + 8,
            //                    host = plc.ip,
            //                    port = plc.port
            //                });
            //                CMMLog.Debug($"下线口 ip:{plc.ip},port:{plc.port},addr:{plc.writeAddr + 8},reuslt:{JsonConvert.SerializeObject(result)}.");
            //                if (resultTime.errCode == 0)
            //                {
            //                    string timeCuoData = (resultTime.result[0] * 65536 + resultTime.result[1]).ToString();
            //                    TimeCuoInfoComTwo time = null;
            //                    var timeTwo = MongoDBSingleton.Instance.Find<TimeCuoInfoComTwo>(Query.EQ("trayCode", trayCode), "TimeCuoInfoComTwo");
            //                    if (timeTwo.Count > 0)
            //                    {
            //                        time = timeTwo.OrderBy(a => a.createTime).FirstOrDefault();
            //                        MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(Query.EQ("_id", time._id), Update.Set("TimeCuo", timeCuoData));
            //                    }
            //                    string wmstaskno = "";
            //                    WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeCuoData, timeCuoData, time.employeeId, true);
            //                }
            //            }
            //        }
            //    }
            //}
            //else
            //{
            //    CMMLog.Info("下线口设备未配置");
            //}
        }
        #endregion
    }