111
cjs
2025-07-04 5a8af645c7e36595e218d8ffc36d4f74eab63a32
ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs
@@ -24,6 +24,7 @@
using System.Net.Configuration;
using static System.Runtime.CompilerServices.RuntimeHelpers;
using System.Reflection.Emit;
using System.Text.RegularExpressions;
namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
{
@@ -1068,7 +1069,6 @@
                    WriteCacheStackingData(plc, task, machine);
                    var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                    {
                        addr = plc.writeAddr + 1,
@@ -1094,11 +1094,12 @@
                //读取通道1里面参数是否为1,判断叠盘机是否需要上料
                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                {
                    dataNum = 1,
                    dataNum = 2,
                    addr = pmInfo.readAddr + 1,
                    host = pmInfo.ip,
                    port = pmInfo.port
                });
                CMMLog.Info($"获取碟盘入口信息:{JsonConvert.SerializeObject(result)}");
                if (result != null && result.errCode == 0)
                {
                    //参数1表示叠托点申请入料
@@ -1114,6 +1115,66 @@
                            else CMMLog.Debug($"调用WMS获取碟盘出库生成任务失败!");
                        }
                        else CMMLog.Debug($"检查当前叠托点是否有任务占用,或者MST主表中有缓存架入叠盘机的任务!");
                    }
                    if (pmInfo.deviceType == "23" && result.result[1] == 1)
                    {
                        //四钴车间,人工上料模式
                        result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                        {
                            dataNum = 21,
                            addr = pmInfo.readAddr + 120,
                            host = pmInfo.ip,
                            port = pmInfo.port
                        });
                        CMMLog.Info($"获取碟盘人工上料写入信息:{JsonConvert.SerializeObject(result)}");
                        if (result != null && result.errCode == 0)
                        {
                            string lotNo = RemoveNull(GetTrayCode(result.result.Skip(0).Take(20).ToArray()).Trim().ToString()); //批次号
                            string bagNumber = Convert.ToInt32(Completion(result.result[20]), 2).ToString();
                            var machinInfo = MongoDBSingleton.Instance.FindOne<MachineInfoTwoTetracobalt>(Query.And(Query.EQ("lotNo", lotNo), Query.EQ("packageCode", bagNumber)), "MachineInfoTwoTetracobalt");
                            if(machinInfo != null)
                            {
                                TN_I_TASK_MST task = new TN_I_TASK_MST
                                {
                                    CN_S_BATCH_NO = machinInfo.trayCode
                                };
                                WMSInfo machine = new WMSInfo
                                {
                                    location = machinInfo.location,
                                    productWeight = machinInfo.productWeight,
                                    oneTrayWeight = machinInfo.oneTrayWeight,
                                    addState = machinInfo.addState,
                                    packageCode = machinInfo.packageCode,
                                    itemCode = machinInfo.materialCode
                                };
                                PLCControl.WriteCacheStackingData(pmInfo, task,machine);
                                machinInfo = MongoDBSingleton.Instance.FindOne<MachineInfoTwoTetracobalt>(Query.And(Query.EQ("lotNo", lotNo), Query.EQ("packageCode", bagNumber)), "MachineInfoTwoTetracobalt");
                                if(machinInfo == null)
                                {
                                    //信息写入成功
                                    var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                                    {
                                        addr = pmInfo.writeAddr + 2,
                                        host = pmInfo.ip,
                                        port = pmInfo.port,
                                        data = 1
                                    });
                                    CMMLog.Info("人工叠包信息查询成功,写入1");
                                }
                            }
                            else
                            {
                                var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                                {
                                    addr = pmInfo.writeAddr + 2,
                                    host = pmInfo.ip,
                                    port = pmInfo.port,
                                    data = 2
                                });
                                CMMLog.Info("人工叠包信息查询失败,写入2");
                            }
                        }
                    }
                }
                else CMMLog.Debug($"缓存入叠盘机,创建任务,result={result.errMsg}");
@@ -1249,17 +1310,17 @@
            num[8] = int.Parse(AsciiToTen(machine.location));//包装机号
            for (int b = 9; b <= 10; b++)
            {
                int k = b % 2 == 0 ? 0 : 16;
                int k = b % 2 == 0 ? 16 : 0;
                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
            }
            for (int b = 11; b <= 12; b++)
            {
                int k = b % 2 == 0 ? 0 : 16;
                int k = b % 2 == 0 ? 16 : 0;
                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machineInfoTwo.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
            }
            for (int b = 13; b <= 14; b++)
            {
                int k = b % 2 == 0 ? 0 : 16;
                int k = b % 2 == 0 ? 16 : 0;
                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
            }
            for (int b = 15; b <= 16; b++)
@@ -1284,7 +1345,9 @@
            #endregion
            string pcHead = "";
            string pcTail = "";
            string cpHead = "";
            string cpTail = "";
            string mtHead = "";// 设备的真实物料编码
            #region  35~54 => 41~60 产品批次号
@@ -1293,12 +1356,17 @@
            CMMLog.Info($"41~60data1_1:{data}");
            if (data.Length % 2 != 0)
            {
                data = "0" + machineInfoTwo.lotNo;
                pcHead = "" + machineInfoTwo.lotNo.Substring(0, 1);
                //data = "0" + machineInfoTwo.lotNo;
                //pcHead = "" + machineInfoTwo.lotNo.Substring(0, 1);
                pcTail = machineInfoTwo.lotNo.Substring(data.Length - 1, 1) + "";
                CMMLog.Info($"pcTail:{pcTail}");
                data = machineInfoTwo.lotNo + " ";
            }
            CMMLog.Info($"41~60data1_2:{data}");
            //字符串长度 / 2 = 写入通道数量(两位一转) 列: 3L0050 写入三个通道
            int maxLength = 34 + (data.Length / 2);// data.Length / 2 至少为 1
            int maxLength2 = maxLength;
            int aa = 0;
            for (int i = 35; i <= maxLength; i++)
            {
@@ -1306,11 +1374,45 @@
                aa = aa + 2;
            }
            for (int x = maxLength + 1; x <= 54; x++) num[x] = 0;//将产品批次号无数据的通道全部置为 0
            CMMLog.Info($"num:{JsonConvert.SerializeObject(num)}");
            #endregion
            #region   55~64 => 61~70 产品型号
            #region   55~64 => 61~70 产品型号(四钴产品型号有中文和英文)
            ERPService.HandleItemInfoChina(machine.itemCode, 55, 64, num);// 中文处理 55~64 61~70
            int maxLength3 = 0;
            if (Regex.IsMatch(ErpItemInfo.item_spec, @"[\u4e00-\u9fff]"))
            {
                ERPService.HandleItemInfoChina(ErpItemInfo.item_spec, 55, 64, num);// 中文处理 55~64 61~70
            }
            else
            {
                data = ErpItemInfo.item_spec;
                CMMLog.Info($"61~70data1_1:{data}");
                if (data.Length % 2 != 0)
                {
                    //data = "0" + machineInfoTwo.lotNo;
                    //pcHead = "" + machineInfoTwo.lotNo.Substring(0, 1);
                    cpTail = ErpItemInfo.item_spec.Substring(data.Length - 1, 1) + "";
                    CMMLog.Info($"cpTail:{cpTail}");
                    data = ErpItemInfo.item_spec + " ";
                }
                CMMLog.Info($"61~70data1_2:{data}");
                //字符串长度 / 2 = 写入通道数量(两位一转) 列: 3L0050 写入三个通道
                maxLength = 54 + (data.Length / 2);// data.Length / 2 至少为 1
                maxLength3 = maxLength;
                aa = 0;
                for (int i = 55; i <= maxLength; i++)
                {
                    num[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
                    aa = aa + 2;
                }
                for (int x = maxLength3 + 1; x <= 64; x++) num[x] = 0;//将产品批次号无数据的通道全部置为 0
                CMMLog.Info($"num:{JsonConvert.SerializeObject(num)}");
                //ERPService.HandleItemInfo(ErpItemInfo.item_spec, 55, 64, num);
            }
            //string data2 = machine.itemCode;
            //CMMLog.Info($"51~50data2_1:{data2}");
@@ -1354,14 +1456,28 @@
            ERPService.HandleItemInfo(ErpItemInfo.item_uom, 100, 104, num);// 100~104 106~110
            // 如果 产品批次号 或者 产品型号 位数 为 奇数,则将提前取出的 首字符 重新转码 写入 其所对应通道区域的 首通道
            if (pcHead != "") num[35] = int.Parse(AsciiToTen(pcHead));
            if (cpHead != "") num[55] = int.Parse(AsciiToTen(cpHead));
            //if (pcHead != "") num[35] = int.Parse(AsciiToTen(pcHead));
            if (pcTail != "") num[maxLength2] = tailToTen(pcTail);
            //if (cpHead != "") num[55] = int.Parse(AsciiToTen(cpHead));
            if (cpHead != "") num[maxLength3] = int.Parse(AsciiToTen(cpTail));
            if (mtHead != "") num[65] = int.Parse(AsciiToTen(mtHead));
            if (pcHead != "" || cpHead != "") CMMLog.Info($"产品型号或批次号数量为奇数,特将首位取出单独处理,以下为批次号和产品型号的十进制数值{num[35]},{num[55]}");
            CMMLog.Info($"叠盘机数据处理完毕:{JsonConvert.SerializeObject(num)}");
            return num;
        }
        private static int tailToTen(string Tail)
        {
            char inputChar = Tail[0]; // 获取字符串的第一个字符
            int asciiValue = (int)inputChar; // 转换为ASCII码
            string hexValue = asciiValue.ToString("X2"); // 转换为16进制
            string binaryValue = Convert.ToString(asciiValue, 2).PadLeft(8, '0'); // 转换为8位二进制
            string finalBinaryValue = binaryValue + "00000000"; // 补8个二进制0
            int finalDecimalValue = Convert.ToInt32(finalBinaryValue, 2); // 转换为10进制
            return finalDecimalValue;
        }
        /// <summary>
@@ -1760,7 +1876,7 @@
                    if (result.result[0] == 1)
                    {
                        //判断3楼叠盘起点是否有任务占用,没有则生成任务
                        if (ProcessHelper.CheckStartFree(plc.location))
                        if (ProcessHelper.CheckStartFree(plc.location))
                        {
                            string wmstaskno = "";
                            string traycode = "";
@@ -2806,11 +2922,11 @@
                        //info.productType = RemoveNull(GetTrayCode(result.Skip(50).Take(10).ToArray()).Trim().ToString());
                        //info.materialCode = RemoveNull(GetTrayCode(result.Skip(60).Take(20).ToArray()).Trim().ToString());
                        info.lotNo = RemoveNull(GetTrayCode(result.Skip(35).Take(20).ToArray()).Trim().ToString());
                        info.productType = RemoveNull(GetTrayCode(result.Skip(55).Take(10).ToArray()).Trim().ToString());
                        info.materialCode = RemoveNull(GetTrayCode(result.Skip(65).Take(15).ToArray()).Trim().ToString());
                        info.materialName = RemoveNull(GetTrayCode(result.Skip(80).Take(20).ToArray()).Trim().ToString());
                        info.measurementUnit = RemoveNull(GetTrayCode(result.Skip(100).Take(5).ToArray()).Trim().ToString());
                        info.lotNo =RemoveNull(GetTrayCode(result.Skip(35).Take(20).ToArray()).Trim().ToString()).TrimStart();
                        info.productType = RemoveNull(GetTrayCode(result.Skip(55).Take(10).ToArray()).Trim().ToString()).TrimStart();
                        info.materialCode = RemoveNull(GetTrayCode(result.Skip(65).Take(15).ToArray()).Trim().ToString()).TrimStart();
                        info.materialName = RemoveNull(GetTrayCode(result.Skip(80).Take(20).ToArray()).Trim().ToString()).TrimStart();
                        info.measurementUnit = RemoveNull(GetTrayCode(result.Skip(100).Take(5).ToArray()).Trim().ToString()).TrimStart();
                        CMMLog.Info($"数据处理流程:包装机无MES情况下,获取以往MES传输的数据,新获得数据,lotNo:{info.lotNo},productType:{info.productType},materialCode:{info.materialCode},materialName:{info.materialName},measurementUnit:{info.measurementUnit}");
                        
@@ -3655,7 +3771,7 @@
                            if (result != null && result.errCode == 0 && result.result.Count() > 0)
                            {
                                //1:取料
                                if (result.result[0] == 1)
                                if (result.result[0] == 1 || result.result[0] == 5)
                                {
                                    string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "22").FirstOrDefault().location;
                                    //包装下线任务,终点为复称位置(这里判断包装机起点,复称起点终点均无任务,则推送任务)
@@ -3712,7 +3828,7 @@
                                                                port = pmInfo.port,
                                                                data = 4
                                                            });
                                                            CMMLog.Debug($"(四钴车间)包装下线流程-{pmInfo.location}:ip:{pmInfo.ip},port:{pmInfo.port},addr:{pmInfo.writeAddr},写入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);
@@ -3726,22 +3842,57 @@
                                                            }
                                                            else if (tray.trayCode != "0" && !string.IsNullOrEmpty(tray.trayCode))
                                                            {
                                                                HHAmsExecuteResult req = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, PlcBit02, "3楼包装取料(四钴)", 0, tray.trayCode, timeStamp);
                                                                if (req.success)
                                                                if (result.result[0] == 1)
                                                                {
                                                                    string weight = (double.Parse(tray.oneTrayWeight) / 100).ToString();
                                                                    ERPService.packageInfo(tray.machineNo, tray.trayCode, tray.lotNo, weight);
                                                                    //记录托盘类型
                                                                    var trayTypeInfo = MongoDBSingleton.Instance.FindOne<trayTypeTable>(Query.EQ("locCode", pmInfo.location), "trayTypeTable");
                                                                    if(trayTypeInfo == null)
                                                                    HHAmsExecuteResult req = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, PlcBit02, "3楼包装取料(四钴)", 0, tray.trayCode, timeStamp);
                                                                    if (req.success)
                                                                    {
                                                                        MongoDBSingleton.Instance.Insert<trayTypeTable>(new trayTypeTable
                                                                        string weight = (double.Parse(tray.oneTrayWeight) / 100).ToString();
                                                                        ERPService.packageInfo(tray.machineNo, tray.trayCode, tray.lotNo, weight);
                                                                        //记录托盘类型
                                                                        var trayTypeInfo = MongoDBSingleton.Instance.FindOne<trayTypeTable>(Query.EQ("locCode", pmInfo.location), "trayTypeTable");
                                                                        if (trayTypeInfo == null)
                                                                        {
                                                                            locCode = pmInfo.location,
                                                                            trayType = tray.trayType
                                                                        });
                                                                            MongoDBSingleton.Instance.Insert<trayTypeTable>(new trayTypeTable
                                                                            {
                                                                                locCode = pmInfo.location,
                                                                                trayType = tray.trayType
                                                                            });
                                                                        }
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    //var writeRes0 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
                                                                    //{
                                                                    //    host = pmInfo.ip,
                                                                    //    addr = pmInfo.writeAddr,
                                                                    //    data = 5,//原先是1,单个写入
                                                                    //    port = pmInfo.port
                                                                    //});
                                                                    //人工模式,无需生成任务
                                                                    //删除MachineInfoTetracobalt表中的数据
                                                                    MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.And(Query.EQ("machineNo", pmInfo.location), Query.EQ("trayCode", tray.trayCode)), "MachineInfoTetracobalt", RemoveFlags.None);
                                                                    //删除 MachineInfoTwoTetracobalt 重复的数据
                                                                    var twoInfo = MongoDBSingleton.Instance.Find<MachineInfoTwoTetracobalt>(Query.And(Query.EQ("lotNo", tray.lotNo), Query.EQ("packageCode",tray.packageCode)), "MachineInfoTwoTetracobalt");
                                                                    if(twoInfo.Count > 1)
                                                                    {
                                                                        foreach(var a in twoInfo)
                                                                        {
                                                                            MongoDBSingleton.Instance.Remove<MachineInfoTwoTetracobalt>(Query.EQ("_id", a._id),RemoveFlags.None);
                                                                            if (MongoDBSingleton.Instance.Find<MachineInfoTwoTetracobalt>(Query.And(Query.EQ("lotNo", tray.lotNo), Query.EQ("packageCode", tray.packageCode)), "MachineInfoTwoTetracobalt").Count == 1)
                                                                            {
                                                                                break;
                                                                            }
                                                                        }
                                                                    }
                                                                    //记录包装间下料信息
                                                                    string Weight = (decimal.Parse(tray.oneTrayWeight) / 100).ToString("F2");
                                                                    MongoDBSingleton.Instance.Insert<packageInfoModel>(new packageInfoModel { machineNo = tray.machineNo, trayCode = tray.trayCode, batchNo = tray.lotNo, time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), weight = Weight });
                                                                }
                                                            }
                                                        }
@@ -4182,14 +4333,14 @@
                        result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
                        {
                            dataNum = 15,
                            addr = plc.readAddr + 140,
                            dataNum = 70,
                            addr = plc.readAddr + 110,
                            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());
                        string lotNo = RemoveNull(GetTrayCode(result.result.Skip(0).Take(20).ToArray()).Trim().ToString());
                        string materialCode = RemoveNull(GetTrayCode(result.result.Skip(30).Take(15).ToArray()).Trim().ToString());
                        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");
@@ -4209,6 +4360,7 @@
                                bagNumber = bagNumber,
                                productData = productTime.ToString(),
                                TimeCuo = timeCuoData,
                                lotNo = lotNo,
                                materialCode = materialCode
                            }, "TimeCuoInfoComTwo");
                        }