111
cjs
2025-06-18 8ab19ae17dc98d3c79f87ca54aa4cdc75d174b12
ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs
@@ -503,8 +503,8 @@
                data = num,//原先是1,单个写入
                port = plc.port
            });
            CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr}里面数据为1.");
            Console.WriteLine($"写入设备{plc.location}通道{plc.writeAddr}里面数据为1.");
            CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr}里面数据为{JsonConvert.SerializeObject(num)}.");
            Console.WriteLine($"写入设备{plc.location}通道{plc.writeAddr}里面数据为{JsonConvert.SerializeObject(num)}.");
            ///小车和复称位对接
            //小车请求进料,并且查询设备是否允许AGV进入
            var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
@@ -766,6 +766,7 @@
                    }
                    if (result.result[0] == 3 && result.result[2] == 1)
                    //if (result.result[2] == 1)
                    {
                        CMMLog.Info($"SecondWeightActionOne:准备生成复称入缓存架任务,开始确定托盘号:{model.ext2}");
                        if(plc.deviceType == "22")
@@ -958,17 +959,18 @@
                var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                {
                    host = plc.ip,
                    addr = plc.writeAddr + 3,// + 4
                    addr = plc.writeAddr,
                    data = 0,
                    port = plc.port
                });
                writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                {
                    host = plc.ip,
                    addr = plc.writeAddr + 3,
                    data = 1,
                    port = plc.port
                });
                //var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                //{
                //    host = plc.ip,
                //    addr = plc.writeAddr + 3,
                //    data = 1,
                //    port = plc.port
                //});
            }
        }
@@ -1468,19 +1470,25 @@
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="taskNo"></param>
        internal static void CacheStackingMouth6(Settings.PlcInfo plc)
        internal static void CacheStackingMouth6(Settings.PlcInfo plc, string taskNo)
        {
            //var readres = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            //{
            //    dataNum = 2,
            //    addr = plc.readAddr + 1,
            //    host = plc.ip,
            //    port = plc.port
            //});
            //if (readres != null)
            //{
            //}
            var taskInfo = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
            MongoDBSingleton.Instance.Remove<WMSInfo>(Query.EQ("trayCode", taskInfo.CN_S_BATCH_NO), RemoveFlags.Single);
            var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
            {
                addr = plc.writeAddr + 1,
                data = 3,
                host = plc.ip,
                port = plc.port
            });
            Thread.Sleep(2000);
            wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
            {
                addr = plc.writeAddr + 1,
                data = 0,
                host = plc.ip,
                port = plc.port
            });
        }
        /// <summary>
@@ -1743,6 +1751,7 @@
                    host = plc.ip,
                    port = plc.port
                });
                CMMLog.Info($"叠盘下线读取通道{plc.ip},port:{plc.port},地址:{plc.readAddr + 1}的值为{JsonConvert.SerializeObject(result)}");
                if (result != null && result.errCode == 0)
                {
                    //1.满托下线
@@ -1754,7 +1763,14 @@
                            string wmstaskno = "";
                            string traycode = "";
                            string trayType = "";
                            if(plc.deviceType == "25") trayType = result.result[1] == 1 ? "川字托" : "田字托";
                            if (plc.deviceType == "25")
                            {
                                trayType = result.result[1] == 1 ? "川字托" : result.result[1] == 2 ? "田字托" : "";
                                if (string.IsNullOrEmpty(trayType))
                                {
                                    return;
                                }
                            }
                            bool req = WMSHelper.WMSIn(plc.location, "", ref wmstaskno, ref traycode,"","",false, trayType);
                            if (req)
                            {
@@ -2010,62 +2026,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交互(开始取料,取料完成)
@@ -2074,9 +2034,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
@@ -2125,11 +2085,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
@@ -3731,12 +3691,26 @@
                                                            CMMLog.Debug($"(四钴车间)包装下线流程-{pmInfo.location}:员工编码:{employeeId}");
                                                            // 判断当前【员工编号】通道信息读出来的员工编号是否已经存在于我们的员工信息表-ERPEmployeeTable(查询字段-employee_id)
                                                            var erpEmployeeInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(Query.EQ("employee_id", employeeId), "ERPEmployeeTable");
                                                            if (erpEmployeeInfo == null) IsContLaterCode = false;
                                                            var erpItemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_code", tray.materialCode), "ERPItemTable");
                                                            if (string.IsNullOrEmpty(tray.empCode) || string.IsNullOrEmpty(tray.materialCode) || erpEmployeeInfo == null || erpEmployeeInfo == null)
                                                            {
                                                                CMMLog.Debug($"(四钴车间)包装下线流程-{pmInfo.location}:人员表或者物料表未找到该数据,员工编号:{employeeId},物料编码:{tray.materialCode}!");
                                                                IsContLaterCode = false;
                                                            }
                                                            else CMMLog.Debug($"(四钴车间)包装下线流程-{pmInfo.location}:员工编码查询成功");
                                                        }
                                                        if (IsContLaterCode)
                                                        {
                                                            //检索员工信息成功
                                                            var wirteall01 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                                                            {
                                                                addr = pmInfo.writeAddr,
                                                                host = pmInfo.ip,
                                                                port = pmInfo.port,
                                                                data = 4
                                                            });
                                                            //string timeStamp = ProcessHelper.GetTimeStamp(31, 1, 1);
                                                            //tray.trayCode = "VW" + timeStamp;
                                                            //MongoDBSingleton.Instance.Update<MachineInfoTetracobalt>(Query.EQ("_id", tray._id), Update.Set("trayCode", tray.trayCode), UpdateFlags.None);
@@ -3955,7 +3929,7 @@
                if (result != null && result.errCode == 0)
                {
                    //3:人工叫空托盘(川字)  4:人工叫空托盘(田字)
                    if (result.result[0] == 3 || result.result[0] == 4)
                    if ((pmInfo.deviceType == "1" && result.result[0] == 3)|| (pmInfo.deviceType == "21" &&(result.result[0] == 3 || result.result[0] == 4)))
                    {
                        //包装线补空流程
                        //判断空托缓存点(5 对 2)是否有空托,有空托判断是否有任务,有任务则判断另一个点位
@@ -3968,9 +3942,9 @@
                            {
                                CMMLog.Info($"周转托盘位:{a}");
                                var ddInfo = Settings.GetDDSiteList().Where(b => b.ddLoc == a && b.Enable == 1).FirstOrDefault();
                                if(ddInfo != null)
                                if (ddInfo != null)
                                {
                                    if(ddInfo.trayType == result.result[0] - 2)
                                    if (ddInfo.trayType == result.result[0] - 2)
                                    {
                                        if (ProcessHelper.PickUpEndFree(pmInfo.location) && ProcessHelper.PickUpStartFree(a))
                                        {
@@ -3995,21 +3969,6 @@
                            CMMLog.Info("配置文件未配置包装机空托缓存点");
                        }
                    }
                    //流程未对接好,是否这样使用 待定
                    //if (result.result[0] == 4)
                    //{
                    //    //调用wms出库接口
                    //    var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_END_BIT", pmInfo.location), "TN_I_TASK_MST");
                    //    //判断一下当前叠托点是否有任务占用
                    //    if (ProcessHelper.CheckEndFree(pmInfo.location) && tasks.Count == 0)
                    //    {
                    //        //可以生成任务,调WMS接口获取任务信息
                    //        bool req = WMSHelper.WMSOut(pmInfo.location, "");
                    //        if (req) CMMLog.Debug($"调用WMS获取辅材出库生成任务成功!");//现在任务由WMS自己下发,AMS做拦截处理(查询ext1里面对应的任务类型,并更改任务类型)
                    //        else CMMLog.Debug($"调用WMS获取辅材出库生成任务失败!");
                    //    }
                    //    else CMMLog.Debug($"检查当前叠托点是否有任务占用,或者MST主表中有缓存架入叠盘机的任务!");
                    //}
                }
                else
                {
@@ -4025,7 +3984,7 @@
            {
                if (action)
                {
                    int[] num = new int[3] {1,1,1};
                    int[] num = new int[3] {1,0,1};
                    var writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
                    {
                        host = plc.ip,
@@ -4049,14 +4008,24 @@
                        {
                            //推送小车进入
                            TSHelper.GoToAGV(taskNo, 10, 3);
                            writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                            int[] num1 = new int[2] { 1, 2};
                            writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
                            {
                                host = plc.ip,
                                addr = plc.writeAddr + 2,
                                data = 2,
                                addr = plc.writeAddr + 1,
                                data = num1,
                                port = plc.port
                            });
                            CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr + 2}里面数据为2.");
                            //writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                            //{
                            //    host = plc.ip,
                            //    addr = plc.writeAddr + 2,
                            //    data = 2,
                            //    port = plc.port
                            //});
                            CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr + 1}里面数据为{JsonConvert.SerializeObject(num1)}.");
                        }
                    }
                }
@@ -4081,17 +4050,28 @@
            {
                if (action)
                {
                    int[] num = new int[4] { 2, 0, 0, 1 };
                    var writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                    {
                        dataNum = 1,
                        addr = plc.readAddr + 3,
                        host = plc.ip,
                        addr = plc.writeAddr,
                        data = num,
                        port = plc.port
                    });
                    CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr}里面数据为{JsonConvert.SerializeObject(num)}.");
                    CMMLog.Debug($"查询设备{plc.location}通道{plc.readAddr + 3}里面数据为{result.result[0]}.");
                    if (result.result[0] == 1)
                    {
                        int[] num = new int[4] { 2, 0, 0, 1 };
                        var writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
                        {
                            host = plc.ip,
                            addr = plc.writeAddr,
                            data = num,
                            port = plc.port
                        });
                        CMMLog.Debug($"写入设备{plc.location}通道{plc.writeAddr}里面数据为{JsonConvert.SerializeObject(num)}.");
                    }
                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                    result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                    {
                        dataNum = 4,
                        addr = plc.readAddr,
@@ -4104,8 +4084,8 @@
                        if (result.result[0] == 2 && result.result[1] == 2 && result.result[3] == 2)
                        {
                            //推送小车进入
                            TSHelper.GoToAGV(taskNo, 10, 3);
                            writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                            TSHelper.GoToAGV(taskNo, 10, 1);
                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                            {
                                host = plc.ip,
                                addr = plc.writeAddr + 3,
@@ -4161,6 +4141,112 @@
            }
            Thread.Sleep(100000);
        }
        internal static void CheckPackingLineFullThree(Settings.PlcInfo plc)
        {
            string trayCode = "";
            var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
            {
                dataNum = 25,
                addr = plc.readAddr,
                host = plc.ip,
                port = plc.port
            });
            if(result != null && result.errCode == 0)
            {
                if (result.result[0] == 1)
                {
                    //获取物料信息 根据托盘码区分
                    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)
                    {
                        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
                        });
                        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($"写入设备{plc.location}通道{plc.writeAddr}里面数据为1.");
                    }
                }
            }
            var xxPlc = Settings.GetPlcInfo().Where(a => a.deviceType == "27" && a.enable == 1).FirstOrDefault();
            if(xxPlc != null)
            {
                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)
                    {
                        var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                        {
                            dataNum = 2,
                            addr = plc.readAddr + 8,
                            host = plc.ip,
                            port = plc.port
                        });
                        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
    }
}