From ce3e24612cc9691af8e4d3b9550fc6cbd9f95edf Mon Sep 17 00:00:00 2001 From: liuwf Date: Sat, 2 Mar 2024 21:24:47 +0800 Subject: [PATCH] =?UTF-8?q?change-=E6=B3=A1=E5=89=8D=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E6=9D=A1=E7=A0=81=E7=BB=91=E5=AE=9A=EF=BC=8C=E6=88=90=E5=93=81?= =?UTF-8?q?=E4=B8=8B=E7=BA=BF=E4=BF=AE=E6=94=B9=E8=B0=83=E8=AF=95=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Api/Admin.Core.Model.xml | 10 + .../Model_New/CodeBindingRecord.cs | 6 + Admin.Core.Model/Model_New/RealTaskInfo.cs | 5 + .../Service_New/ProductOffLineServices.cs | 3 +- .../ReportQualityInspectionServices.cs | 15 +- Aucma.Core.BoxFoam/Aucma.Core.BoxFoam.csproj | 5 +- .../Business/CollectionFoamMachine.cs | 77 +-- .../Business/InStoreBusiness.cs | 14 +- Aucma.Core.BoxFoam/Business/MvCodeHelper.cs | 284 +++++++++++ .../ViewModels/BeforeFoamingPageModelView.cs | 6 +- .../ViewModels/MainWindowViewModel.cs | 31 +- .../ViewModels/SelectTypeViewModel.cs | 6 +- Aucma.Core.BoxFoam/appsettings.json | 2 +- .../Aucma.Core.CodeBinding.csproj | 8 +- .../Business/MvCodeHelper.cs | 464 ++++++++++++++++++ .../ViewModels/IndexPageViewModel.cs | 411 +++++++++++----- .../ViewModels/MainWindowViewModel.cs | 39 +- .../Views/IndexPageView.xaml | 19 +- .../Views/IndexPageView.xaml.cs | 37 ++ Aucma.Core.CodeBinding/appsettings.json | 12 +- .../Business/MvCodeHelper.cs | 37 +- .../Business/offLineBusiness.cs | 215 +++++--- .../ViewModels/MainWindowViewModel.cs | 37 +- Aucma.Core.ProductOffLine/appsettings.json | 4 +- Aucma.Core.RunPlc/RunPlcService.cs | 1 + Aucma.Core.Scanner/Helper/MvCodeHelper.cs | 38 +- 26 files changed, 1461 insertions(+), 325 deletions(-) create mode 100644 Aucma.Core.BoxFoam/Business/MvCodeHelper.cs create mode 100644 Aucma.Core.CodeBinding/Business/MvCodeHelper.cs diff --git a/Admin.Core.Api/Admin.Core.Model.xml b/Admin.Core.Api/Admin.Core.Model.xml index c1ae39b6..60b2ca09 100644 --- a/Admin.Core.Api/Admin.Core.Model.xml +++ b/Admin.Core.Api/Admin.Core.Model.xml @@ -2131,6 +2131,11 @@ plc放行标志,2为放行通过,1为pda提示需要放行记录 + + + 内胆码 + + 存储当班班组 @@ -2911,6 +2916,11 @@ 创建时间 + + + 箱体型号310 ,287这种,泡前库下发plc使用 + + 完成记录 diff --git a/Admin.Core.Model/Model_New/CodeBindingRecord.cs b/Admin.Core.Model/Model_New/CodeBindingRecord.cs index 47aa8fc9..71bbd1e2 100644 --- a/Admin.Core.Model/Model_New/CodeBindingRecord.cs +++ b/Admin.Core.Model/Model_New/CodeBindingRecord.cs @@ -55,5 +55,11 @@ namespace Admin.Core.Model /// [SugarColumn(ColumnName = "IS_PASS")] public int isPlcPass { get; set; } + + /// + /// 内胆码 + /// + [SugarColumn(ColumnName = "LINER_CODE")] + public string LinerCode { get; set; } } } diff --git a/Admin.Core.Model/Model_New/RealTaskInfo.cs b/Admin.Core.Model/Model_New/RealTaskInfo.cs index 59656ee0..61c00d74 100644 --- a/Admin.Core.Model/Model_New/RealTaskInfo.cs +++ b/Admin.Core.Model/Model_New/RealTaskInfo.cs @@ -112,5 +112,10 @@ namespace Admin.Core.Model /// [SugarColumn(ColumnName = "CREATED_TIME")] public DateTime? CreateTime { get; set; } + /// + /// 箱体型号310 ,287这种,泡前库下发plc使用 + /// + [SugarColumn(ColumnName = "BOX_TYPE")] + public string BoxType { get; set; } } } diff --git a/Admin.Core.Service/Service_New/ProductOffLineServices.cs b/Admin.Core.Service/Service_New/ProductOffLineServices.cs index f5f814c0..76442c24 100644 --- a/Admin.Core.Service/Service_New/ProductOffLineServices.cs +++ b/Admin.Core.Service/Service_New/ProductOffLineServices.cs @@ -58,8 +58,9 @@ namespace Admin.Core.Service { // 保存业务 var _db = baseRepository.Db; - var infos = _db.CopyNew().Ado.SqlQueryAsync($"SELECT ILS_TMPRD.ILS_SORT_BARCODE_PKG.SAVE_BARCODE_INFO({Barcode},{Created_By},{Order_number},{Order_type})").Result; + var infos = _db.CopyNew().Ado.SqlQueryAsync($"SELECT ILS_TMPRD.ILS_SORT_BARCODE_PKG.SAVE_BARCODE_INFO('{Barcode}','{Created_By}','{Order_number}',{Order_type}) as result FROM DUAL").Result; return infos.FirstOrDefault().result; + } catch (Exception ex) { diff --git a/Admin.Core.Service/Service_New/ReportQualityInspectionServices.cs b/Admin.Core.Service/Service_New/ReportQualityInspectionServices.cs index 0c556b04..d1f14dd2 100644 --- a/Admin.Core.Service/Service_New/ReportQualityInspectionServices.cs +++ b/Admin.Core.Service/Service_New/ReportQualityInspectionServices.cs @@ -34,16 +34,21 @@ namespace Admin.Core.Service { try { - string boxCode = _codeBindingRecordRepository.Query(s => s.ProductCode == SnCode).FirstOrDefault().BoxCode; - var list = _baseSpaceInfoRepository.Query(x=>x.BarCode.Equals(boxCode) && x.IsFlag!=1); - return list; - + List list = _codeBindingRecordRepository.Query(s => s.ProductCode == SnCode); + if(list!=null && list.Count > 0) + { + string boxCode = list.FirstOrDefault().BoxCode; + var list1 = _baseSpaceInfoRepository.Query(x => x.BarCode.Equals(boxCode) && x.IsFlag != 1); + return list1; + } + } catch (System.Exception ex) { Console.WriteLine(ex.Message); - return null; + } + return null; } } } \ No newline at end of file diff --git a/Aucma.Core.BoxFoam/Aucma.Core.BoxFoam.csproj b/Aucma.Core.BoxFoam/Aucma.Core.BoxFoam.csproj index afffdecb..ceb32918 100644 --- a/Aucma.Core.BoxFoam/Aucma.Core.BoxFoam.csproj +++ b/Aucma.Core.BoxFoam/Aucma.Core.BoxFoam.csproj @@ -1,7 +1,7 @@  - WinExe + Exe net6.0-windows enable true @@ -83,6 +83,9 @@ ..\dll\LiveCharts.Wpf.dll + + ..\dll\MvCodeReaderSDK.Net.dll + diff --git a/Aucma.Core.BoxFoam/Business/CollectionFoamMachine.cs b/Aucma.Core.BoxFoam/Business/CollectionFoamMachine.cs index 2bb029b6..9963d5fb 100644 --- a/Aucma.Core.BoxFoam/Business/CollectionFoamMachine.cs +++ b/Aucma.Core.BoxFoam/Business/CollectionFoamMachine.cs @@ -160,45 +160,52 @@ namespace Aucma.Core.BoxFoam.Business /// private void ReadFillingRecord(PlcModel obj_1) { - if (obj_1 != null && obj_1.plc.IsConnected) + try { - if (obj_1.plc.ReadBool("DB50.DBX983.0")) + if (obj_1 != null && obj_1.plc.IsConnected) { - logHelper.Info("读取到发泡机A1枪结束信号"); - ReadGunData(obj_1, "DB50.896", gunKeys, "A1"); //A1枪数据 - int a = _lastShotRecordServices.AddAsync(gunKeys["A1"]).Result; - RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["A1"]); - RefreshGunDataDelegateEvent?.Invoke(gunKeys); - Thread.Sleep(2000); - } - else if (obj_1.plc.ReadBool("DB50.DBX1171.0")) - { - logHelper.Info("读取到发泡机B1枪结束信号"); - ReadGunData(obj_1, "DB50.1084", gunKeys, "B1"); //B1枪数据 - int a = _lastShotRecordServices.AddAsync(gunKeys["B1"]).Result; - RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["B1"]); - RefreshGunDataDelegateEvent?.Invoke(gunKeys); - Thread.Sleep(2000); - } - else if (obj_1.plc.ReadBool("DB50.DBX1359.0")) - { - logHelper.Info("读取到发泡机A2枪结束信号"); - ReadGunData(obj_1, "DB50.1272", gunKeys, "A2"); //A2枪数据 - int a = _lastShotRecordServices.AddAsync(gunKeys["A2"]).Result; - RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["A2"]); - RefreshGunDataDelegateEvent?.Invoke(gunKeys); - Thread.Sleep(2000); - } - else if (obj_1.plc.ReadBool("DB50.DBX1547.0")) - { - logHelper.Info("读取到发泡机B2结束信号"); - ReadGunData(obj_1, "DB50.1460", gunKeys, "B2"); //A2枪数据 - int a = _lastShotRecordServices.AddAsync(gunKeys["B2"]).Result; - RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["B2"]); - RefreshGunDataDelegateEvent?.Invoke(gunKeys); - Thread.Sleep(2000); + if (obj_1.plc.ReadBool("DB50.DBX983.0")) + { + logHelper.Info("读取到发泡机A1枪结束信号"); + ReadGunData(obj_1, "DB50.896", gunKeys, "A1"); //A1枪数据 + int a = _lastShotRecordServices.AddAsync(gunKeys["A1"]).Result; + RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["A1"]); + RefreshGunDataDelegateEvent?.Invoke(gunKeys); + Thread.Sleep(2000); + } + else if (obj_1.plc.ReadBool("DB50.DBX1171.0")) + { + logHelper.Info("读取到发泡机B1枪结束信号"); + ReadGunData(obj_1, "DB50.1084", gunKeys, "B1"); //B1枪数据 + int a = _lastShotRecordServices.AddAsync(gunKeys["B1"]).Result; + RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["B1"]); + RefreshGunDataDelegateEvent?.Invoke(gunKeys); + Thread.Sleep(2000); + } + else if (obj_1.plc.ReadBool("DB50.DBX1359.0")) + { + logHelper.Info("读取到发泡机A2枪结束信号"); + ReadGunData(obj_1, "DB50.1272", gunKeys, "A2"); //A2枪数据 + int a = _lastShotRecordServices.AddAsync(gunKeys["A2"]).Result; + RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["A2"]); + RefreshGunDataDelegateEvent?.Invoke(gunKeys); + Thread.Sleep(2000); + } + else if (obj_1.plc.ReadBool("DB50.DBX1547.0")) + { + logHelper.Info("读取到发泡机B2结束信号"); + ReadGunData(obj_1, "DB50.1460", gunKeys, "B2"); //A2枪数据 + int a = _lastShotRecordServices.AddAsync(gunKeys["B2"]).Result; + RefreshLastShotDataDelegateEvent?.Invoke(gunKeys["B2"]); + RefreshGunDataDelegateEvent?.Invoke(gunKeys); + Thread.Sleep(2000); + } } } + catch (Exception ex) + { + logHelper.Error(ex.Message.ToString()); + } } diff --git a/Aucma.Core.BoxFoam/Business/InStoreBusiness.cs b/Aucma.Core.BoxFoam/Business/InStoreBusiness.cs index 91273922..fe9abf42 100644 --- a/Aucma.Core.BoxFoam/Business/InStoreBusiness.cs +++ b/Aucma.Core.BoxFoam/Business/InStoreBusiness.cs @@ -343,6 +343,7 @@ namespace Aucma.Core.BoxFoam.Business realTaskInfo.PlanAmount = 1; realTaskInfo.TaskStatus = 1; //任务状态:1 - 待执行;2 - 执行中;3 - 完成 realTaskInfo.CreateTime = DateTime.Now; + realTaskInfo.BoxType = spaceInfo.BoxType; int flag = await _realTaskInfoService.AddAsync(realTaskInfo); if (flag > 0) { @@ -381,7 +382,7 @@ namespace Aucma.Core.BoxFoam.Business BaseSpaceInfo result = null; try { - + List info = await _baseSpaceInfoServices.InStoreGetSpaceInfoByMaterialType(storeCode, materialType); if (info != null) { @@ -393,7 +394,7 @@ namespace Aucma.Core.BoxFoam.Business var spaceInfo = ReadSpaceInfoByPlc(item); item.SpaceStock = spaceInfo.SpaceStock; - if(item.typeCodeB.Equals(materialType) && (item.SpaceStock+item.OnRouteAmount)==0) + if(item.typeCodeB=="materialType" && (item.SpaceStock+item.OnRouteAmount)==0) { string str1 = item.typeCodeB; string str2 = item.typeNameB; @@ -403,7 +404,7 @@ namespace Aucma.Core.BoxFoam.Business item.typeNameA = str2; } // 对调C型号和主型号 - else if(spaceInfo.typeCodeC.Equals(materialType) && (item.SpaceStock + item.OnRouteAmount) == 0) + else if(spaceInfo.typeCodeC=="materialType" && (item.SpaceStock + item.OnRouteAmount) == 0) { string str1 = item.typeCodeC; string str2 = item.typeNameC; @@ -481,7 +482,7 @@ namespace Aucma.Core.BoxFoam.Business //写入应答字 obj.plc.WriteInt16("DB200.2", "1"); //写入货道物料类型 - obj.plc.WriteString(spaceAddress.materialType, taskInfo.MaterialType); + obj.plc.WriteString(spaceAddress.materialType, taskInfo.BoxType); //写入货道号,plc收到货道号开始入库,并非应答字,所以货道号最后下发 obj.plc.WriteInt16("DB200.0", taskInfo.SpaceCode.Substring(7,1)); //写入完成后读取反馈号进行复位 @@ -511,8 +512,7 @@ namespace Aucma.Core.BoxFoam.Business var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("泡前库Plc")); try { - Task.Run(() => - { + if (obj != null && obj.plc.IsConnected) { do @@ -542,7 +542,7 @@ namespace Aucma.Core.BoxFoam.Business { logHelper.Info("PLC未连接"); } - }); + } catch (Exception ex) { diff --git a/Aucma.Core.BoxFoam/Business/MvCodeHelper.cs b/Aucma.Core.BoxFoam/Business/MvCodeHelper.cs new file mode 100644 index 00000000..78f7d33c --- /dev/null +++ b/Aucma.Core.BoxFoam/Business/MvCodeHelper.cs @@ -0,0 +1,284 @@ +using Admin.Core.Common; +using Aucma.Core.Scanner; +using MvCodeReaderSDKNet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.BoxFoam.Business +{ + public class MvCodeHelper + { + + //private static AppConfig appConfig = AppConfig.Instance; + public static bool m_bGrabbing = true; + private static string lastCode; + private static List allScanners = Appsettings.app("ScannerServer").ToList(); + // 内胆扫码器ip + private static string LinerScannerIp = allScanners.First(x => x.Name == "扫码器1").Ip; + + + #region 委托事件 + + /// + /// 泡前库扫码 + /// + /// + public delegate Task PQKReceiveCode(string code1); + public static event PQKReceiveCode? PQKReceiveCodeEvent; + + /// + /// 日志信息刷新 + /// + /// + public delegate void RefreshLogMessage(string message); + public static event RefreshLogMessage RefreshLogMessageEvent; + #endregion + + + public static void LinerImageCallbackFunc(IntPtr pData, IntPtr pstFrameInfoEx2, IntPtr pUser) + { + var stFrameInfo = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)); + + MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2 stBcrResult = (MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)Marshal.PtrToStructure(stFrameInfo.UnparsedBcrList.pstCodeListEx2, typeof(MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)); + + // Console.WriteLine("CodeNum[" + Convert.ToString(stBcrResult.nCodeNum) + "]"); + if (stBcrResult.nCodeNum == 0) + { + Console.WriteLine("liner--->No Read 处理"); + } + for (Int32 i = 0; i < stBcrResult.nCodeNum; i++) + { + bool bIsValidUTF8 = IsTextUTF8(stBcrResult.stBcrInfoEx2[i].chCode); + if (bIsValidUTF8) + { + string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + } + else + { + string strCode = Encoding.GetEncoding("GB2312").GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp); + // 业务处理 + PQKReceiveCodeEvent?.Invoke(strCode.Trim().TrimEnd('\0')); + } + } + + MvCodeReader.MV_CODEREADER_OCR_INFO_LIST stOcrInfo = (MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)Marshal.PtrToStructure(stFrameInfo.UnparsedOcrList.pstOcrList, typeof(MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)); + + Console.WriteLine("ocrAllNum[" + Convert.ToString(stOcrInfo.nOCRAllNum) + "]"); + for (int i = 0; i < stOcrInfo.nOCRAllNum; i++) + { + string strOcrCharCode = Encoding.UTF8.GetString(stOcrInfo.stOcrRowInfo[i].chOcr); + Console.WriteLine("Get OcrInfo:" + "ocrNum[" + i.ToString() + "], ocrLen[" + Convert.ToString(stOcrInfo.stOcrRowInfo[i].nOcrLen) + "], ocrChar[" + strOcrCharCode.Trim().TrimEnd('\0') + "]"); + } + } + + + + public static void Liner() + { + + MvCodeReader.cbOutputEx2delegate ImageCallback; + + MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfo = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); + MvCodeReader device = new MvCodeReader(); + int nRet = MvCodeReader.MV_CODEREADER_OK; + + do + { + // ch:枚举设备 | en:Enum device + MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST stDevList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST(); + nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref stDevList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Enum device failed:{0:x8}", nRet); + break; + } + Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); + if (0 == stDevList.nDeviceNum) + { + break; + } + + MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo; // 通用设备信息 + Int32 nDevIndex = -1; + // ch:打印设备信息 | en:Print device info + for (Int32 i = 0; i < stDevList.nDeviceNum; i++) + { + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + if (MvCodeReader.MV_CODEREADER_GIGE_DEVICE == stDevInfo.nTLayerType) + { + MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO stGigEDeviceInfo = (MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)MvCodeReader.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)); + uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24); + uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16); + uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8); + uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff); + // Console.WriteLine("\n" + i.ToString() + ": [GigE] User Define Name : " + stGigEDeviceInfo.chUserDefinedName); + string ip = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8) + "." + (stGigEDeviceInfo.nCurrentIp & 0x000000ff); + string ipStr = nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4; + if (ipStr == LinerScannerIp) + { + Console.WriteLine("device IP :" + ipStr); + nDevIndex = i; + } + } + } + if (nDevIndex < 0) return; + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + // ch:创建设备 | en:Create device + nRet = device.MV_CODEREADER_CreateHandle_NET(ref stDevInfo); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Create device failed:{0:x8}", nRet); + break; + } + + // ch:打开设备 | en:Open device + nRet = device.MV_CODEREADER_OpenDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Open device failed:{0:x8}", nRet); + break; + } + + + // ch:注册回调函数 | en:Register image callback + ImageCallback = new MvCodeReader.cbOutputEx2delegate(LinerImageCallbackFunc); + nRet = device.MV_CODEREADER_RegisterImageCallBackEx2_NET(ImageCallback, IntPtr.Zero); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Register image callback failed!"); + break; + } + + // ch:开启抓图 || en: start grab image + nRet = device.MV_CODEREADER_StartGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Start grabbing failed:{0:x8}", nRet); + break; + } + + Console.WriteLine("Press enter to exit"); + Console.ReadLine(); + + // ch:停止抓图 | en:Stop grabbing + nRet = device.MV_CODEREADER_StopGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Stop grabbing failed{0:x8}", nRet); + break; + } + + // ch:关闭设备 | en:Close device + nRet = device.MV_CODEREADER_CloseDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Close device failed{0:x8}", nRet); + break; + } + + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + break; + } + } while (false); + + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + } + } + + } + + #region 判断字符编码 + /// + /// 判断字符编码 + /// + /// + /// + public static bool IsTextUTF8(byte[] inputStream) + { + int encodingBytesCount = 0; + bool allTextsAreASCIIChars = true; + + for (int i = 0; i < inputStream.Length; i++) + { + byte current = inputStream[i]; + + if ((current & 0x80) == 0x80) + { + allTextsAreASCIIChars = false; + } + // First byte + if (encodingBytesCount == 0) + { + if ((current & 0x80) == 0) + { + // ASCII chars, from 0x00-0x7F + continue; + } + + if ((current & 0xC0) == 0xC0) + { + encodingBytesCount = 1; + current <<= 2; + + // More than two bytes used to encoding a unicode char. + // Calculate the real length. + while ((current & 0x80) == 0x80) + { + current <<= 1; + encodingBytesCount++; + } + } + else + { + // Invalid bits structure for UTF8 encoding rule. + return false; + } + } + else + { + // Following bytes, must start with 10. + if ((current & 0xC0) == 0x80) + { + encodingBytesCount--; + } + else + { + // Invalid bits structure for UTF8 encoding rule. + return false; + } + } + } + if (encodingBytesCount != 0) + { + // Invalid bits structure for UTF8 encoding rule. + // Wrong following bytes count. + return false; + } + // Although UTF8 supports encoding for ASCII chars, we regard as a input stream, whose contents are all ASCII as default encoding. + return !allTextsAreASCIIChars; + } + + #endregion + + + } +} diff --git a/Aucma.Core.BoxFoam/ViewModels/BeforeFoamingPageModelView.cs b/Aucma.Core.BoxFoam/ViewModels/BeforeFoamingPageModelView.cs index d53a8e9e..d798d7d5 100644 --- a/Aucma.Core.BoxFoam/ViewModels/BeforeFoamingPageModelView.cs +++ b/Aucma.Core.BoxFoam/ViewModels/BeforeFoamingPageModelView.cs @@ -14,6 +14,7 @@ using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading.Tasks; using System.Windows; using static NPOI.SS.Formula.PTG.AttrPtg; @@ -99,7 +100,10 @@ namespace Aucma.Core.BoxFoam.ViewModels var baseSpaceInfolist = _baseSpaceInfoServices.QueryAsync(d => d.StoreCode==storeCode).Result;//仓库 if (baseSpaceInfolist == null) return; - + if (baseSpaceInfolist.Count > 0) + { + baseSpaceInfolist = baseSpaceInfolist.OrderBy(x => x.ObjId).ToList(); + } Shapes.Clear(); foreach (var item in baseSpaceInfolist) { diff --git a/Aucma.Core.BoxFoam/ViewModels/MainWindowViewModel.cs b/Aucma.Core.BoxFoam/ViewModels/MainWindowViewModel.cs index 81e02125..91725cac 100644 --- a/Aucma.Core.BoxFoam/ViewModels/MainWindowViewModel.cs +++ b/Aucma.Core.BoxFoam/ViewModels/MainWindowViewModel.cs @@ -10,6 +10,7 @@ using System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; +using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; @@ -40,7 +41,7 @@ namespace Aucma.Core.BoxFoam.ViewModels timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += Timer_Tick; timer.Start(); - + InitHikRobot(); Task.Run(() => { init(); @@ -62,6 +63,30 @@ namespace Aucma.Core.BoxFoam.ViewModels return Task.CompletedTask; } + #region 开启海康扫码器 + public void InitHikRobot() + { + try + { + + Task.Run(() => + { + Thread.Sleep(2000); + //MvCodeHelper1.DeviceListAcq();//获取创建设备 + // MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据 + Business.MvCodeHelper.Liner(); + }); + + } + catch (Exception ex) + { + //MvCodeHelper.CloseAllDevice(); + InitHikRobot(); + } + } + #endregion + + #region 设备状态刷新 /// /// 设备状态刷新 @@ -134,8 +159,8 @@ namespace Aucma.Core.BoxFoam.ViewModels public void RefreshScanner() { string ip1 = Appsettings.app("Middleware", "Scanner1", "Ip"); - bool flag1 = MvCodeHelper.ConnectionStatus(ip1); - Scanner1State(flag1); + // bool flag1 = MvCodeHelper.ConnectionStatus(ip1); + Scanner1State(true); } #endregion diff --git a/Aucma.Core.BoxFoam/ViewModels/SelectTypeViewModel.cs b/Aucma.Core.BoxFoam/ViewModels/SelectTypeViewModel.cs index 9a40b283..2ae22a27 100644 --- a/Aucma.Core.BoxFoam/ViewModels/SelectTypeViewModel.cs +++ b/Aucma.Core.BoxFoam/ViewModels/SelectTypeViewModel.cs @@ -118,7 +118,7 @@ namespace Aucma.Core.BoxFoam.ViewModels string station = Appsettings.app("StationInfo", "StationCode"); if (!string.IsNullOrEmpty(selectedOption)) { - var infos = await _baseMaterialInfoServices.QueryAsync(x => x.MaterialSubclass == "200" && x.MaterialName.Contains(selectedOption)); + var infos = await _baseMaterialInfoServices.QueryAsync(x => x.MaterialSubclass == "400" && x.MaterialName.Contains(selectedOption) || x.MaterialCode.Contains(selectedOption)); MaterialDataGrid.Clear(); Application.Current.Dispatcher.Invoke(() => { @@ -150,7 +150,7 @@ namespace Aucma.Core.BoxFoam.ViewModels public async void Load() { - var infos = await _baseMaterialInfoServices.QueryAsync(x=>x.MaterialSubclass=="200"); + var infos = await _baseMaterialInfoServices.QueryAsync(x=>x.MaterialSubclass=="400"); MaterialDataGrid.Clear(); Application.Current.Dispatcher.Invoke(() => { @@ -366,7 +366,7 @@ namespace Aucma.Core.BoxFoam.ViewModels { if (!string.IsNullOrEmpty(searchText)) { - var infos =await _baseMaterialInfoServices.QueryAsync(x=>x.MaterialSubclass=="200" && (x.MaterialName.Contains(searchText) || x.MaterialCode.Contains(searchText))); + var infos =await _baseMaterialInfoServices.QueryAsync(x=>x.MaterialSubclass=="400" && (x.MaterialName.Contains(searchText) || x.MaterialCode.Contains(searchText))); MaterialDataGrid.Clear(); Application.Current.Dispatcher.Invoke(() => { diff --git a/Aucma.Core.BoxFoam/appsettings.json b/Aucma.Core.BoxFoam/appsettings.json index 17b2dabd..5871f638 100644 --- a/Aucma.Core.BoxFoam/appsettings.json +++ b/Aucma.Core.BoxFoam/appsettings.json @@ -189,7 +189,7 @@ "Enabled": true }, "Scanner": { //扫码器 - "Enabled": true + "Enabled": false } }, "ScannerServer": [ diff --git a/Aucma.Core.CodeBinding/Aucma.Core.CodeBinding.csproj b/Aucma.Core.CodeBinding/Aucma.Core.CodeBinding.csproj index c4b1c69f..7edf5cca 100644 --- a/Aucma.Core.CodeBinding/Aucma.Core.CodeBinding.csproj +++ b/Aucma.Core.CodeBinding/Aucma.Core.CodeBinding.csproj @@ -36,7 +36,7 @@ - PreserveNewest + Always true PreserveNewest @@ -80,6 +80,12 @@ + + + ..\dll\MvCodeReaderSDK.Net.dll + + + Code diff --git a/Aucma.Core.CodeBinding/Business/MvCodeHelper.cs b/Aucma.Core.CodeBinding/Business/MvCodeHelper.cs new file mode 100644 index 00000000..609f7643 --- /dev/null +++ b/Aucma.Core.CodeBinding/Business/MvCodeHelper.cs @@ -0,0 +1,464 @@ +using Admin.Core.Common; +using Aucma.Core.Scanner; +using MvCodeReaderSDKNet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.CodeBinding.Business +{ + public class MvCodeHelper + { + //private static AppConfig appConfig = AppConfig.Instance; + public static bool m_bGrabbing = true; + private static string lastCode; + private static List allScanners = Appsettings.app("ScannerServer").ToList(); + // mes扫码器ip + private static string LinerScannerIp = allScanners.First(x => x.Name == "mes扫码器").Ip; + // sn扫码器ip + private static string ShellScannerIp = allScanners.First(x => x.Name == "sn扫码器").Ip; + + #region 委托事件 + + + #region 条码绑定上位机委托事件 + /// + /// code1扫码信息刷新 + /// + /// + public delegate void BindingReceiveCode(string code, string ip); + public static event BindingReceiveCode? BindingReceiveCodeEvent; + + /// + /// NoRead通知 + /// + /// + public delegate void NoRead(string ip); + public static event NoRead? NoReadEvent; + + + #endregion + + /// + /// 日志信息刷新 + /// + /// + public delegate void RefreshLogMessage(string message); + public static event RefreshLogMessage RefreshLogMessageEvent; + #endregion + + public static void ShellImageCallbackFunc(IntPtr pData, IntPtr pstFrameInfoEx2, IntPtr pUser) + { + var stFrameInfo = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)); + + MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2 stBcrResult = (MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)Marshal.PtrToStructure(stFrameInfo.UnparsedBcrList.pstCodeListEx2, typeof(MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)); + + // Console.WriteLine("CodeNum[" + Convert.ToString(stBcrResult.nCodeNum) + "]"); + if (stBcrResult.nCodeNum == 0) + { + Console.WriteLine("shell--->No Read 处理"); + NoReadEvent?.Invoke(ShellScannerIp); + } + for (Int32 i = 0; i < stBcrResult.nCodeNum; i++) + { + bool bIsValidUTF8 = IsTextUTF8(stBcrResult.stBcrInfoEx2[i].chCode); + if (bIsValidUTF8) + { + string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + } + else + { + string strCode = Encoding.GetEncoding("GB2312").GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp); + // 业务处理 + BindingReceiveCodeEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp); + } + } + + MvCodeReader.MV_CODEREADER_OCR_INFO_LIST stOcrInfo = (MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)Marshal.PtrToStructure(stFrameInfo.UnparsedOcrList.pstOcrList, typeof(MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)); + + for (int i = 0; i < stOcrInfo.nOCRAllNum; i++) + { + string strOcrCharCode = Encoding.UTF8.GetString(stOcrInfo.stOcrRowInfo[i].chOcr); + // Console.WriteLine("Get OcrInfo:" + "ocrNum[" + i.ToString() + "], ocrLen[" + Convert.ToString(stOcrInfo.stOcrRowInfo[i].nOcrLen) + "], ocrChar[" + strOcrCharCode.Trim().TrimEnd('\0') + "]"); + } + } + + + public static void LinerImageCallbackFunc(IntPtr pData, IntPtr pstFrameInfoEx2, IntPtr pUser) + { + var stFrameInfo = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)); + + MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2 stBcrResult = (MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)Marshal.PtrToStructure(stFrameInfo.UnparsedBcrList.pstCodeListEx2, typeof(MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)); + + // Console.WriteLine("CodeNum[" + Convert.ToString(stBcrResult.nCodeNum) + "]"); + if (stBcrResult.nCodeNum == 0) + { + Console.WriteLine("liner--->No Read 处理"); + NoReadEvent?.Invoke(LinerScannerIp); + } + for (Int32 i = 0; i < stBcrResult.nCodeNum; i++) + { + bool bIsValidUTF8 = IsTextUTF8(stBcrResult.stBcrInfoEx2[i].chCode); + if (bIsValidUTF8) + { + string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + } + else + { + string strCode = Encoding.GetEncoding("GB2312").GetString(stBcrResult.stBcrInfoEx2[i].chCode); + Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp); + // 业务处理 + BindingReceiveCodeEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp); + } + } + + MvCodeReader.MV_CODEREADER_OCR_INFO_LIST stOcrInfo = (MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)Marshal.PtrToStructure(stFrameInfo.UnparsedOcrList.pstOcrList, typeof(MvCodeReader.MV_CODEREADER_OCR_INFO_LIST)); + + Console.WriteLine("ocrAllNum[" + Convert.ToString(stOcrInfo.nOCRAllNum) + "]"); + for (int i = 0; i < stOcrInfo.nOCRAllNum; i++) + { + string strOcrCharCode = Encoding.UTF8.GetString(stOcrInfo.stOcrRowInfo[i].chOcr); + Console.WriteLine("Get OcrInfo:" + "ocrNum[" + i.ToString() + "], ocrLen[" + Convert.ToString(stOcrInfo.stOcrRowInfo[i].nOcrLen) + "], ocrChar[" + strOcrCharCode.Trim().TrimEnd('\0') + "]"); + } + } + + + public static void Shell() + { + string a1 = LinerScannerIp; + string a2 = ShellScannerIp; + MvCodeReader.cbOutputEx2delegate ImageCallback; + + MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfo = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); + MvCodeReader device = new MvCodeReader(); + int nRet = MvCodeReader.MV_CODEREADER_OK; + + do + { + // ch:枚举设备 | en:Enum device + MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST stDevList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST(); + nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref stDevList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Enum device failed:{0:x8}", nRet); + break; + } + Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); + if (0 == stDevList.nDeviceNum) + { + break; + } + + MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo; // 通用设备信息 + Int32 nDevIndex = -1; + // ch:打印设备信息 | en:Print device info + for (Int32 i = 0; i < stDevList.nDeviceNum; i++) + { + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + if (MvCodeReader.MV_CODEREADER_GIGE_DEVICE == stDevInfo.nTLayerType) + { + MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO stGigEDeviceInfo = (MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)MvCodeReader.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)); + uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24); + uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16); + uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8); + uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff); + // Console.WriteLine("\n" + i.ToString() + ": [GigE] User Define Name : " + stGigEDeviceInfo.chUserDefinedName); + // Console.WriteLine("device IP :" + nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4); + string ipStr = nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4; + if (ipStr == ShellScannerIp) + { + nDevIndex = i; + Console.WriteLine("device IP :" + ipStr); + } + } + } + if (nDevIndex < 0) return; + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + // ch:创建设备 | en:Create device + nRet = device.MV_CODEREADER_CreateHandle_NET(ref stDevInfo); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Create device failed:{0:x8}", nRet); + break; + } + + // ch:打开设备 | en:Open device + nRet = device.MV_CODEREADER_OpenDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Open device failed:{0:x8}", nRet); + break; + } + + + // ch:注册回调函数 | en:Register image callback + ImageCallback = new MvCodeReader.cbOutputEx2delegate(ShellImageCallbackFunc); + nRet = device.MV_CODEREADER_RegisterImageCallBackEx2_NET(ImageCallback, IntPtr.Zero); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Register image callback failed!"); + break; + } + + // ch:开启抓图 || en: start grab image + nRet = device.MV_CODEREADER_StartGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Start grabbing failed:{0:x8}", nRet); + break; + } + + Console.WriteLine("Press enter to exit"); + Console.ReadLine(); + + // ch:停止抓图 | en:Stop grabbing + nRet = device.MV_CODEREADER_StopGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Stop grabbing failed{0:x8}", nRet); + break; + } + + // ch:关闭设备 | en:Close device + nRet = device.MV_CODEREADER_CloseDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Close device failed{0:x8}", nRet); + break; + } + + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + break; + } + } while (false); + + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + } + } + + } + + + + public static void Liner() + { + + MvCodeReader.cbOutputEx2delegate ImageCallback; + + MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfo = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); + MvCodeReader device = new MvCodeReader(); + int nRet = MvCodeReader.MV_CODEREADER_OK; + + do + { + // ch:枚举设备 | en:Enum device + MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST stDevList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST(); + nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref stDevList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Enum device failed:{0:x8}", nRet); + break; + } + Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); + if (0 == stDevList.nDeviceNum) + { + break; + } + + MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo; // 通用设备信息 + Int32 nDevIndex = -1; + // ch:打印设备信息 | en:Print device info + for (Int32 i = 0; i < stDevList.nDeviceNum; i++) + { + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + if (MvCodeReader.MV_CODEREADER_GIGE_DEVICE == stDevInfo.nTLayerType) + { + MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO stGigEDeviceInfo = (MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)MvCodeReader.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)); + uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24); + uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16); + uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8); + uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff); + // Console.WriteLine("\n" + i.ToString() + ": [GigE] User Define Name : " + stGigEDeviceInfo.chUserDefinedName); + string ip = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8) + "." + (stGigEDeviceInfo.nCurrentIp & 0x000000ff); + string ipStr = nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4; + if (ipStr == LinerScannerIp) + { + Console.WriteLine("device IP :" + ipStr); + nDevIndex = i; + } + } + } + if (nDevIndex < 0) return; + stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); + + // ch:创建设备 | en:Create device + nRet = device.MV_CODEREADER_CreateHandle_NET(ref stDevInfo); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Create device failed:{0:x8}", nRet); + break; + } + + // ch:打开设备 | en:Open device + nRet = device.MV_CODEREADER_OpenDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Open device failed:{0:x8}", nRet); + break; + } + + + // ch:注册回调函数 | en:Register image callback + ImageCallback = new MvCodeReader.cbOutputEx2delegate(LinerImageCallbackFunc); + nRet = device.MV_CODEREADER_RegisterImageCallBackEx2_NET(ImageCallback, IntPtr.Zero); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Register image callback failed!"); + break; + } + + // ch:开启抓图 || en: start grab image + nRet = device.MV_CODEREADER_StartGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Start grabbing failed:{0:x8}", nRet); + break; + } + + Console.WriteLine("Press enter to exit"); + Console.ReadLine(); + + // ch:停止抓图 | en:Stop grabbing + nRet = device.MV_CODEREADER_StopGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Stop grabbing failed{0:x8}", nRet); + break; + } + + // ch:关闭设备 | en:Close device + nRet = device.MV_CODEREADER_CloseDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Close device failed{0:x8}", nRet); + break; + } + + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + break; + } + } while (false); + + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + } + } + + } + + #region 判断字符编码 + /// + /// 判断字符编码 + /// + /// + /// + public static bool IsTextUTF8(byte[] inputStream) + { + int encodingBytesCount = 0; + bool allTextsAreASCIIChars = true; + + for (int i = 0; i < inputStream.Length; i++) + { + byte current = inputStream[i]; + + if ((current & 0x80) == 0x80) + { + allTextsAreASCIIChars = false; + } + // First byte + if (encodingBytesCount == 0) + { + if ((current & 0x80) == 0) + { + // ASCII chars, from 0x00-0x7F + continue; + } + + if ((current & 0xC0) == 0xC0) + { + encodingBytesCount = 1; + current <<= 2; + + // More than two bytes used to encoding a unicode char. + // Calculate the real length. + while ((current & 0x80) == 0x80) + { + current <<= 1; + encodingBytesCount++; + } + } + else + { + // Invalid bits structure for UTF8 encoding rule. + return false; + } + } + else + { + // Following bytes, must start with 10. + if ((current & 0xC0) == 0x80) + { + encodingBytesCount--; + } + else + { + // Invalid bits structure for UTF8 encoding rule. + return false; + } + } + } + if (encodingBytesCount != 0) + { + // Invalid bits structure for UTF8 encoding rule. + // Wrong following bytes count. + return false; + } + // Although UTF8 supports encoding for ASCII chars, we regard as a input stream, whose contents are all ASCII as default encoding. + return !allTextsAreASCIIChars; + } + + #endregion + + + } +} diff --git a/Aucma.Core.CodeBinding/ViewModels/IndexPageViewModel.cs b/Aucma.Core.CodeBinding/ViewModels/IndexPageViewModel.cs index 96eb5ac6..cc12ccec 100644 --- a/Aucma.Core.CodeBinding/ViewModels/IndexPageViewModel.cs +++ b/Aucma.Core.CodeBinding/ViewModels/IndexPageViewModel.cs @@ -21,7 +21,6 @@ using static Admin.Core.Service.CodeBindingRecordServices; using System.Windows.Data; using System.Windows; using System.Linq; -using Aucma.Core.Scanner; using System.Collections.Generic; using NPOI.HSSF.Record; using SqlSugar; @@ -36,6 +35,8 @@ using static Npgsql.Replication.PgOutput.Messages.RelationMessage; using Aucma.Core.HwPLc; using System.Windows.Documents; using Admin.Core.Common; +using Aucma.Core.CodeBinding.Business; +using Aucma.Core.Scanner; /* * 首页信息 */ @@ -57,8 +58,7 @@ namespace Aucma.Core.CodeBinding.ViewModels // 静态变量存code2 private static string code2Str = string.Empty; //配置文件扫码器列表 - private readonly List allScanners = Appsettings.app("ScannerServer").ToList(); - + private static List allScanners = Appsettings.app("ScannerServer").ToList(); public IndexPageViewModel() { try @@ -69,10 +69,10 @@ namespace Aucma.Core.CodeBinding.ViewModels _printBarCodeServices = App.ServiceProvider.GetService(); _iMaterialCompletionServices = App.ServiceProvider.GetService(); - MvCodeHelper.BindingReceiveCodeEvent += receiveCode; - + Business.MvCodeHelper.BindingReceiveCodeEvent += ReceiveCode; + Business.MvCodeHelper.NoReadEvent += ReceiveNoRead; LoadData(); - add(); + //实时绑定条码和实时下发plc放行信号 realBindingAndSendPlc(); LoadCharts(); @@ -128,48 +128,73 @@ namespace Aucma.Core.CodeBinding.ViewModels Thread.Sleep(500); } }); - - // 实时下发plc放行信号 + + // 心跳线程 Task.Run(() => { try { - while (true) + Thread.Sleep(3000); + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc")); + if(obj != null) { - Thread.Sleep(3000); - var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc")); - if (obj != null && obj.plc.IsConnected) + while (true) { - CodeBindingRecord record = _codeBindingRecordServices.FirstAsync(x => x.isPlcPass == 1 && x.RecordTime2 >= System.DateTime.Now.AddDays(-1)).Result; - if (record != null) - { - // 下发plc放行信号 - RefreshAndWriteLog($"条码[{record.BoxCode}]下发plc放行信号,等待plc反馈..."); - if (SendPlcPass(obj)) - { - RefreshAndWriteLog($"条码[{record.BoxCode}]放行成功"); - record.isPlcPass = 2; - _ = _codeBindingRecordServices.UpdateAsync(record).Result; - LoadData(); - } - else - { - RefreshAndWriteLog("等待Plc反馈信号5秒超时!"); - } - } + SendHeart(obj, "0"); + Thread.Sleep(1000); + SendHeart(obj, "1"); + Thread.Sleep(1000); } - Thread.Sleep(1000); } + } catch (Exception ex) { log.Error(ex.ToString()); } }); - + #region 暂未启用 + // 实时下发plc放行信号 + //Task.Run(() => + //{ + // try + // { + // while (true) + // { + // Thread.Sleep(3000); + // var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc")); + // if (obj != null && obj.plc.IsConnected) + // { + // CodeBindingRecord record = _codeBindingRecordServices.FirstAsync(x => x.isPlcPass == 1 && x.RecordTime2 >= System.DateTime.Now.AddDays(-1)).Result; + // if (record != null) + // { + // // 下发plc放行信号 + // RefreshAndWriteLog($"条码[{record.BoxCode}]下发plc放行信号,等待plc反馈..."); + // if (SendPlcPass(obj)) + // { + // RefreshAndWriteLog($"条码[{record.BoxCode}]放行成功"); + // record.isPlcPass = 2; + // _ = _codeBindingRecordServices.UpdateAsync(record).Result; + // LoadData(); + // } + // else + // { + // RefreshAndWriteLog("等待Plc反馈信号5秒超时!"); + // } + // } + // } + // Thread.Sleep(1000); + // } + // } + // catch (Exception ex) + // { + // log.Error(ex.ToString()); + // } + //}); + #endregion } - - + + #region 加载DataGrid数据 private async void LoadData() { @@ -371,33 +396,58 @@ namespace Aucma.Core.CodeBinding.ViewModels } #endregion - - - /// - /// 接收扫码器传输的条码,扫码器ip + /// NoRead处理 /// - /// /// - private async void receiveCode(string code1,string scannerIp) + private async void ReceiveNoRead(string scannerIp) { - ScannerModel model = allScanners.FirstOrDefault(x => x.Ip == scannerIp); - if(model.Id==1) + if (model.Id == 1) { - log.Info("扫描到MES条码:" + code1); - // 全局变量赋值,SN码扫描后使用 - code1Str = code1; - RefreshCode1(code1); + log.Info("MES条码NoRead:"); + // 全局变量赋值 + code1Str = string.Empty ; + code2Str = string.Empty; + SendPlcStop(); + RefreshAndWriteLog("MES条码NoRead,线体停止"); } else { - log.Info("扫描到成品条码:" + code1); - // 1.刷新界面条码信息 - // 全局变量赋值,mes条码扫描后使用 - code2Str = code2; - RefreshCode2(code2); + log.Info("MES条码NoRead,线体停止"); + code1Str = string.Empty; + code2Str = string.Empty; + SendPlcStop(); } + } + + /// + /// 接收扫码器传输的条码,扫码器ip + /// + /// + /// + private void ReceiveCode(string codeStr,string scannerIp) + { + + Task.Run(() => + { + ScannerModel model = allScanners.FirstOrDefault(x => x.Ip == scannerIp); + if (model.Id == 1) + { + log.Info("扫描到MES条码:" + codeStr); + // 全局变量赋值,SN码扫描后使用 + code1Str = codeStr; + RefreshCode1(codeStr); + } + else + { + log.Info("扫描到成品条码:" + codeStr); + // 1.刷新界面条码信息 + // 全局变量赋值,mes条码扫描后使用 + code2Str = codeStr; + RefreshCode2(codeStr); + } + }); #region // 2.创建任务更新数据库条码1 @@ -465,65 +515,87 @@ namespace Aucma.Core.CodeBinding.ViewModels log.Info(BindingInfo); } - + /// + /// 条码绑定 + /// + /// + /// public void BindingCode(string code1,string code2) { try { RefreshAndWriteLog("开始绑定MES条码:" + code1 + " SN条码:" + code2); // 1.数据库查询各个工序质检结果,不合格报警 - Thread.Sleep(1000); - RefreshAndWriteLog("条码【" + code1 + "】与SN码【" + code2 + "】绑定成功"); - - Application.Current.Dispatcher.Invoke(() => - { - - ListItems.Insert(0,new ReaderInfo() { No = ListItems.Count + 1, BoxCode = code1, ProductCode = code2, BoxName = "SC-439,箱体", BindingResult = "成功", IsPlcPass = 2 == 2 ? "plc放行成功" : "待放行", RecordTime = DateTime.Now.ToString()}); - - }); - //// 2.查询条码绑定记录表(内胆箱壳绑定处就应该插入记录),绑定SN码 - //CodeBindingRecord record = _codeBindingRecordServices.FirstAsync(x => x.BoxCode == code1).Result; - //if (record == null) - //{ - // RefreshAndWriteLog("未查询到MES条码记录,集存库未绑定箱壳内胆"); - // return; - //} + CodeBindingRecord record = _codeBindingRecordServices.FirstAsync(x => x.BoxCode == code1).Result; + if (record == null) + { + RefreshAndWriteLog("未查询到MES条码记录,集存库未绑定箱壳内胆"); + //return; + // 没有记录重新插入一条 + record = new CodeBindingRecord(); + } - //BaseMaterialInfo materialInfo = _baseMaterialInfoServices.FirstAsync(x => x.MaterialCode == code1.Substring(7, 10)).Result; - //record.BoxName = materialInfo.MaterialName; - //record.ProductCode = code2; - //record.RecordTime1 = System.DateTime.Now; - //record.RecordTime2 = System.DateTime.Now; - //record.isPlcPass = 1; - //record.BindingResult = "成功"; - //bool result = _codeBindingRecordServices.UpdateAsync(record).Result; - //if (result) - //{ - // RefreshAndWriteLog("条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定成功"); - // #region 更新过点数据,插入记录到MATERIAL_COMPLETION表 - // //PrintBarCode print = _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == code1).Result; - // //if (print != null) return; - // //MaterialCompletion completion = new MaterialCompletion(); - // //completion.OrderCode = print.OrderCode; - // //completion.MaterialBarcode = code1; - // //completion.MaterialCode = print.MaterialCode; - // //completion.MaterialName = print.MaterialName; - // //completion.StationName = "1007"; - // //completion.CompleteDate = DateTime.Now; - // //completion.isDownLine = 0; - // //completion.ProductLineCode = "CX_02"; - // //_= _iMaterialCompletionServices.AddAsync(completion).Result; - - // #endregion - - //} + BaseMaterialInfo materialInfo = _baseMaterialInfoServices.FirstAsync(x => x.MaterialCode == code1.Substring(7, 10)).Result; + if(materialInfo == null) + { + record.BoxName = ""; + } + else + { + record.BoxName = materialInfo.MaterialName; + } + record.BoxCode = code1; + record.ProductCode = code2; + record.RecordTime1 = System.DateTime.Now; + record.RecordTime2 = System.DateTime.Now; + record.isPlcPass = 1; + record.BindingResult = "成功"; + bool result = false; + if (string.IsNullOrEmpty(record.LinerCode)) + { // 没有记录,新加 + result = _codeBindingRecordServices.AddAsync(record).Result >0? true: false; + } + else + { + result = _codeBindingRecordServices.UpdateAsync(record).Result; + } + + if (result) + { + RefreshAndWriteLog("条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定成功"); + #region 更新过点数据,插入记录到MATERIAL_COMPLETION表 + //PrintBarCode print = _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == code1).Result; + //if (print != null) return; + //MaterialCompletion completion = new MaterialCompletion(); + //completion.OrderCode = print.OrderCode; + //completion.MaterialBarcode = code1; + //completion.MaterialCode = print.MaterialCode; + //completion.MaterialName = print.MaterialName; + //completion.StationName = "1007"; + //completion.CompleteDate = DateTime.Now; + //completion.isDownLine = 0; + //completion.ProductLineCode = "CX_02"; + //_= _iMaterialCompletionServices.AddAsync(completion).Result; + + #endregion + + } + else + { + RefreshAndWriteLog("条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定失败"); + if (SendPlcStop()) + { + RefreshAndWriteLog("条码绑定失败,线体停止"); + } + } } catch (Exception ex) { RefreshAndWriteLog(ex.Message.ToString()); + SendPlcStop(); } finally { @@ -533,64 +605,145 @@ namespace Aucma.Core.CodeBinding.ViewModels } #region plc交互 - + /// - /// 下发plc放行信号 + /// 下发plc停止信号 /// - /// - private bool SendPlcPass(PlcModel obj) + /// + /// + private bool SendPlcStop() { bool result = false; try - { - - log.Info("D7100写1"); - // 往plc写入放行信号 - obj.plc.WriteInt16("D7100", "1"); - // 等待plc反馈信号 - result = waitPlcSignal(obj); + { + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc")); + if (obj != null) + { + log.Info("停止信号D7102写1"); + // 往plc写入停止信号 + obj.plc.WriteInt16("D7102", "1"); + // 报警信号 + obj.plc.WriteInt16("D7101","0"); + result = true; + } + } catch (Exception ex) { - log.Error("下发plc放行信号方法SendPlcPass()出现异常,ex:" + ex); + log.Error("下发plc停止信号方法出现异常,ex:" + ex); } return result; } + /// - /// 读取plc放行反馈 + /// 下发plc放行信号 /// - /// - private bool waitPlcSignal(PlcModel obj) + /// + /// + private bool SendPlcPass() { bool result = false; try { - DateTime startTime = DateTime.Now; - bool isFlag = true; - do - { - if (obj.plc.ReadInt16("D7200") == 2) - { - log.Info("D7100读2"); - - isFlag = false; - result = true; - } - TimeSpan elapsedTime = DateTime.Now - startTime; - if (elapsedTime.TotalSeconds >= 5) - { - isFlag = false; - } - Thread.Sleep(500); - } while (isFlag); + var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc")); + if (obj != null) + { + log.Info("停止信号D7102写1"); + // 停止信号复位 + obj.plc.WriteInt16("D7102", "0"); + // 报警信号复位 + obj.plc.WriteInt16("D7101", "0"); + result = true; + } + } catch (Exception ex) { - log.Error("读取plc放行反馈方法waitPlcSignal()出现异常,ex:" + ex); + log.Error("下发plc停止信号方法出现异常,ex:" + ex); } return result; } + + /// + /// 发送心跳 + /// + /// + /// + private void SendHeart(PlcModel obj,string flag) + { + try + { + // log.Info("心跳D7100写:"+flag); + // 往plc写入停止信号 + obj.plc.WriteInt16("D7100", flag); + // obj.plc.WriteInt32("D7102", 1); + } + catch (Exception ex) + { + log.Error("SendHeart异常,ex:" + ex); + } + + } + + + ///// + ///// 下发plc放行信号 + ///// + ///// + //private bool SendPlcPass(PlcModel obj) + //{ + // bool result = false; + // try + // { + + // log.Info("D7100写1"); + // // 往plc写入放行信号 + // obj.plc.WriteInt16("D7100", "1"); + // // 等待plc反馈信号 + // result = waitPlcSignal(obj); + // } + // catch (Exception ex) + // { + // log.Error("下发plc放行信号方法SendPlcPass()出现异常,ex:" + ex); + // } + // return result; + //} + ///// + ///// 读取plc放行反馈 + ///// + ///// + //private bool waitPlcSignal(PlcModel obj) + //{ + // bool result = false; + // try + // { + // DateTime startTime = DateTime.Now; + // bool isFlag = true; + // do + // { + // if (obj.plc.ReadInt16("D7200") == 2) + // { + // log.Info("D7100读2"); + + // isFlag = false; + // result = true; + // } + // TimeSpan elapsedTime = DateTime.Now - startTime; + // if (elapsedTime.TotalSeconds >= 5) + // { + // isFlag = false; + // } + // Thread.Sleep(500); + // } while (isFlag); + // } + // catch (Exception ex) + // { + // log.Error("读取plc放行反馈方法waitPlcSignal()出现异常,ex:" + ex); + // } + // return result; + //} + #endregion } diff --git a/Aucma.Core.CodeBinding/ViewModels/MainWindowViewModel.cs b/Aucma.Core.CodeBinding/ViewModels/MainWindowViewModel.cs index 829248cc..ba925fa8 100644 --- a/Aucma.Core.CodeBinding/ViewModels/MainWindowViewModel.cs +++ b/Aucma.Core.CodeBinding/ViewModels/MainWindowViewModel.cs @@ -51,8 +51,39 @@ namespace Aucma.Core.CodeBinding.ViewModels Job_AllState_Quartz.RefreshStateEvent += RefreshStatus; + InitHikRobot(); } + #region 开启海康扫码器 + public void InitHikRobot() + { + try + { + Task.Run(() => + { + Thread.Sleep(2000); + //MvCodeHelper1.DeviceListAcq();//获取创建设备 + // MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据 + Business.MvCodeHelper.Shell(); + }); + + Task.Run(() => + { + Thread.Sleep(2500); + //MvCodeHelper1.DeviceListAcq();//获取创建设备 + // MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据 + Business.MvCodeHelper.Liner(); + }); + + } + catch (Exception ex) + { + //MvCodeHelper.CloseAllDevice(); + InitHikRobot(); + } + } + #endregion + #region 设备状态刷新 /// @@ -76,10 +107,10 @@ namespace Aucma.Core.CodeBinding.ViewModels { string ip1 = Appsettings.app("Middleware", "Scanner1", "Ip"); string ip2 = Appsettings.app("Middleware", "Scanner2", "Ip"); - bool flag1 = MvCodeHelper.ConnectionStatus(ip1); - bool flag2 = MvCodeHelper.ConnectionStatus(ip2); - Scanner1State(flag1); - Scanner2State(flag2); + // bool flag1 = MvCodeHelper.ConnectionStatus(ip1); + // bool flag2 = MvCodeHelper.ConnectionStatus(ip2); + Scanner1State(true); + Scanner2State(true); } #endregion diff --git a/Aucma.Core.CodeBinding/Views/IndexPageView.xaml b/Aucma.Core.CodeBinding/Views/IndexPageView.xaml index 49b8b6fa..ac74f7b6 100644 --- a/Aucma.Core.CodeBinding/Views/IndexPageView.xaml +++ b/Aucma.Core.CodeBinding/Views/IndexPageView.xaml @@ -116,11 +116,16 @@ + + - - +