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 @@
+
+
-
-
-
-
+
+
+
+
+
@@ -152,8 +157,8 @@
-
-
+
+
@@ -182,7 +187,7 @@
BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="White" >
-
+
diff --git a/Aucma.Core.CodeBinding/Views/IndexPageView.xaml.cs b/Aucma.Core.CodeBinding/Views/IndexPageView.xaml.cs
index a1810581..6bccbd64 100644
--- a/Aucma.Core.CodeBinding/Views/IndexPageView.xaml.cs
+++ b/Aucma.Core.CodeBinding/Views/IndexPageView.xaml.cs
@@ -15,6 +15,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using Aucma.Core.HwPLc;
namespace Aucma.Core.CodeBinding.Views
{
@@ -33,5 +34,41 @@ namespace Aucma.Core.CodeBinding.Views
{
}
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ SendPlcPass();
+ }
+
+ ///
+ /// 下发plc放行信号
+ ///
+ ///
+ ///
+ private bool SendPlcPass()
+ {
+ bool result = false;
+ try
+ {
+ 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停止信号方法出现异常,ex:" + ex);
+ }
+ return result;
+ }
+
+
}
}
diff --git a/Aucma.Core.CodeBinding/appsettings.json b/Aucma.Core.CodeBinding/appsettings.json
index 4f23e6ee..346b88c7 100644
--- a/Aucma.Core.CodeBinding/appsettings.json
+++ b/Aucma.Core.CodeBinding/appsettings.json
@@ -81,7 +81,7 @@
"Enabled": true,
"HitRate": 50,
//"Connection": "Data Source=localhost;Initial Catalog=Hsdb;User ID=sa;Password=sa;Integrated Security=false;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
- "Connection": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.100.72.20)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB)));User ID=C##aucma_scada;Password=aucma;",
+ "Connection": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.100.72.20)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB)));User ID=c##aucma_scada;Password=aucma;",
"ProviderName": "System.Data.SqlClient"
},
{
@@ -190,7 +190,7 @@
"Enabled": true
},
"Scanner": { //扫码器
- "Enabled": true
+ "Enabled": false
},
"ScannerGun": { //扫码枪
"Enabled": true
@@ -199,12 +199,12 @@
"ScannerServer": [
{
"Id": 1,
- "Ip": "169.254.91.169",
+ "Ip": "10.10.92.137",
"Name": "mes扫码器"
},
{
"Id": 2,
- "Ip": "192.168.1.20",
+ "Ip": "10.10.92.138",
"Name": "sn扫码器"
}
],
@@ -214,8 +214,8 @@
"EquipName": "条码绑定Plc",
"PlcType": "Melsec",
"Enabled": true,
- "IP": "127.0.0.1",
- "Port": 6000
+ "IP": "10.10.92.70",
+ "Port": 2015
}
],
diff --git a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs
index 2ad10553..28179fcd 100644
--- a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs
+++ b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs
@@ -1,6 +1,7 @@
using Admin.Core.Common;
using Aucma.Core.Scanner;
using MvCodeReaderSDKNet;
+using StackExchange.Profiling;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -12,6 +13,7 @@ namespace Aucma.Core.ProductOffLine.Business
{
public class MvCodeHelper
{
+
//private static AppConfig appConfig = AppConfig.Instance;
public static bool m_bGrabbing = true;
private static string lastCode;
@@ -19,11 +21,27 @@ namespace Aucma.Core.ProductOffLine.Business
// 内胆扫码器ip
private static string LinerScannerIp = allScanners.First(x => x.Name == "内侧扫码器1").Ip;
// 箱壳扫码器ip
- private static string ShellScannerIp = allScanners.First(x => x.Name == "外侧扫码器2").Ip;
+ private static string ShellScannerIp = allScanners.First(x => x.Name == "外侧扫码器2").Ip;
#region 委托事件
+
+ ///
+ /// 成品下线委托
+ ///
+ ///
+ ///
public delegate void RefreshMaterialCodeStr(string materialCodeStr, string ip);
public static event RefreshMaterialCodeStr RefreshMaterialCodeStrEvent;
+
+ ///
+ /// 刷新扫码器状态
+ ///
+ ///
+ ///
+ public delegate void RefreshState(string ip);
+ public static event RefreshState RefreshStateEvent;
+
+
///
/// 日志信息刷新
///
@@ -55,7 +73,8 @@ namespace Aucma.Core.ProductOffLine.Business
{
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);
+ // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp);
+ RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp);
// 业务处理
}
}
@@ -93,8 +112,9 @@ namespace Aucma.Core.ProductOffLine.Business
{
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);
- // 业务处理
+ // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp);
+ // 业务处理
+ RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp);
}
}
@@ -135,7 +155,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo; // 通用设备信息
- Int32 nDevIndex = -1;
+ int nDevIndex = -1;
// ch:打印设备信息 | en:Print device info
for (Int32 i = 0; i < stDevList.nDeviceNum; i++)
{
@@ -176,8 +196,8 @@ namespace Aucma.Core.ProductOffLine.Business
Console.WriteLine("Open device failed:{0:x8}", nRet);
break;
}
-
-
+ // 刷新扫码器状态
+ RefreshStateEvent?.Invoke("外侧");
// ch:注册回调函数 | en:Register image callback
ImageCallback = new MvCodeReader.cbOutputEx2delegate(ShellImageCallbackFunc);
nRet = device.MV_CODEREADER_RegisterImageCallBackEx2_NET(ImageCallback, IntPtr.Zero);
@@ -304,7 +324,8 @@ namespace Aucma.Core.ProductOffLine.Business
Console.WriteLine("Open device failed:{0:x8}", nRet);
break;
}
-
+ // 刷新扫码器状态
+ RefreshStateEvent?.Invoke("内侧");
// ch:注册回调函数 | en:Register image callback
ImageCallback = new MvCodeReader.cbOutputEx2delegate(LinerImageCallbackFunc);
diff --git a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs
index 50e0ab67..660b867a 100644
--- a/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs
+++ b/Aucma.Core.ProductOffLine/Business/offLineBusiness.cs
@@ -98,6 +98,11 @@ namespace Aucma.Core.ProductOffLine.Business
public event getDirection getDirectioneEvent;
#endregion
+ public OffLineBusiness()
+ {
+ MvCodeHelper.RefreshMaterialCodeStrEvent += MaterialBarScan;
+ // test();
+ }
#region 变量定义
///
/// 定时器
@@ -108,10 +113,12 @@ namespace Aucma.Core.ProductOffLine.Business
public void test()
{
-
- string result = _productOffLineServices.QueryChecked("1531000AP0098DCU0481");
- Console.WriteLine(result);
- string strSave = _productOffLineServices.SaveBarcodeInfo("1531000AP0098DCU0481", "ILS_SORT", result.Replace("0000",""), 1);
+ // private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness));
+ // string result = _productOffLineServices.QueryChecked("1520870000099E2V0004");
+ string result = _productOffLineServices.QueryChecked("1530080CD0098E1V1714");
+ Console.WriteLine(result);
+ string strSave = _productOffLineServices.SaveBarcodeInfo("1520870000099E2V0004", "ILS_SORT", result.Replace("0000",""), 1);
+ // LogHelper.Info("成品码:1520870000099E2V0004"+strSave);
// string tt = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000004899@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01";
//Task.Run(() =>
//{
@@ -127,13 +134,20 @@ namespace Aucma.Core.ProductOffLine.Business
//});
}
- ///
- /// 处理条码
- ///
- ///
- /// 扫码器IP
- public void MaterialBarScan(string code,string scannerIp)
+ public void MaterialBarScan(string code, string scannerIp)
{
+ Task.Run(() =>
+ {
+ MaterialBarScanHandle(code, scannerIp);
+ });
+ }
+ ///
+ /// 处理条码
+ ///
+ ///
+ /// 扫码器IP
+ public void MaterialBarScanHandle(string code,string scannerIp)
+ {
try
{
ScannerModel model = allScanners.FirstOrDefault(x => x.Ip == scannerIp);
@@ -142,7 +156,7 @@ namespace Aucma.Core.ProductOffLine.Business
string materialType = "";
bool BackResult = false;
- if (ScannerNo == 1)
+ if (ScannerNo == 1) //内侧
{
//1.扫描的SN条码去条码系统校验
BackResult = HandleMaterialBarCode(code.Trim(), TempOffLineInfo1); //扫码器1
@@ -151,6 +165,7 @@ namespace Aucma.Core.ProductOffLine.Business
{
return;
}
+ TempOffLineInfo1.ProductRefreshFlag = true;
// 2.更新mes数据库
BackResult = updateMesData(TempOffLineInfo1);
BackResult = true; // 测试
@@ -160,10 +175,10 @@ namespace Aucma.Core.ProductOffLine.Business
bool plcResult = SendAndWaitSignal(ScannerNo, materialType);
if (plcResult)
{
- TempOffLineInfo1.MsgInfo = TempOffLineInfo1.MsgInfo + "plc放行成功";
+ // TempOffLineInfo1.MsgInfo = TempOffLineInfo1.MsgInfo + "plc放行成功";
//界面刷新
- TempOffLineInfo1.ProductRefreshFlag = true;
+ // TempOffLineInfo1.ProductRefreshFlag = true;
}
else
{
@@ -177,7 +192,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
// 扫码器2
- else if (ScannerNo == 2)
+ else if (ScannerNo == 2) // 外侧
{
BackResult = HandleMaterialBarCode(code.Trim(), TempOffLineInfo2); //扫码器2
materialType = TempOffLineInfo2.ProductCode;
@@ -185,6 +200,7 @@ namespace Aucma.Core.ProductOffLine.Business
{
return;
}
+ TempOffLineInfo2.ProductRefreshFlag = true;
// 2.更新mes数据库
BackResult = updateMesData(TempOffLineInfo2);
BackResult = true;
@@ -192,20 +208,20 @@ namespace Aucma.Core.ProductOffLine.Business
if (BackResult)
{
bool plcResult = SendAndWaitSignal(ScannerNo, materialType);
- if (plcResult)
- {
- TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "plc放行成功";
-
- //界面刷新
- TempOffLineInfo2.ProductRefreshFlag = true;
- }
- else
- {
- TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "plc放行异常";
- TempOffLineInfo2.MsgAlarmFlag = true;
- //界面刷新
- TempOffLineInfo2.ProductRefreshFlag = true;
- }
+ //if (plcResult)
+ //{
+ // TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "plc放行成功";
+
+ // //界面刷新
+ // TempOffLineInfo2.ProductRefreshFlag = true;
+ //}
+ //else
+ //{
+ // TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "plc放行异常";
+ // TempOffLineInfo2.MsgAlarmFlag = true;
+ // //界面刷新
+ // TempOffLineInfo2.ProductRefreshFlag = true;
+ //}
log.Info(String.Format("订单号{0} 订单数量{1}", TempOffLineInfo2.ProductOrderNo, TempOffLineInfo2.OrderQty));
}
}
@@ -247,15 +263,29 @@ namespace Aucma.Core.ProductOffLine.Business
OffLineInfo info11 = MapperTwo(TempOffLineInfo);
// 添加成品下线表
CodeBindingRecord bindingRecord1 = _codeBindingServices.FirstAsync(x=>x.ProductCode == info11.ProductCode).Result;
- if (bindingRecord1 == null)
+
+ if (bindingRecord1 == null)
{
log.Info("mes数据库未查询到条码绑定记录");
- return false;
- }
- info11.BoxCode = bindingRecord1.BoxCode;
+ // 条码绑定上位机运行以后打开
+ //return false;
+
+ }
+ else
+ {
+ info11.BoxCode = bindingRecord1.BoxCode;
+ }
+
+
// 产线
info11.ProductLineCode = "CX_02";
- _offLineInfoServices.AddAsync(info11);
+ // 查询本地数据库是否有数据
+ OffLineInfo offLineInfo = _offLineInfoServices.FirstAsync(x => x.ProductSNCode == TempOffLineInfo.ProductSNCode).Result;
+ if(offLineInfo == null)
+ {
+ _offLineInfoServices.AddAsync(info11);
+ }
+
// 修改订单表
////6.更新mes 数据库完成数量和时间(BASE_ORDERINFO) 注意:查询的字段可能需要修改,确保数据一致
@@ -311,8 +341,7 @@ namespace Aucma.Core.ProductOffLine.Business
try
{
// 1.质检
- // List qualityList = _reportQualityInspectionServices.JudgeIsQualified(BarCode);
- List qualityList = null; // 测试使用
+ List qualityList = _reportQualityInspectionServices.JudgeIsQualified(BarCode);
if (qualityList != null)
{
TempOffLineInfo.QualityResult = "失败";
@@ -338,11 +367,21 @@ namespace Aucma.Core.ProductOffLine.Business
log.Info("条码验证开始:" + BarCode);
//1.查询条码系统
- // string result = await _productOffLineServices.QueryChecked(BarCode);
- string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000003987@BCD-160C,家电下乡@@BCD-160C@test皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01";
+ string result = _productOffLineServices.QueryChecked(BarCode);
- //用"@"号分隔
- string[] FArrayList = result.Split('@');
+ //string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000003987@BCD-160C,家电下乡@@BCD-160C@test皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01";
+ string[] FArrayList = new string[20];
+ if (result != null)
+ {
+ //用"@"号分隔
+ FArrayList = result.Split('@');
+ }
+ else
+ {
+ FArrayList[0] = "N";
+ FArrayList[1] = "条码系统查询接口调用失败,请检查网络重新扫描";
+ }
+
if (FArrayList[0].ToUpper() == "Y") //查询数据成功
{
log.Info(BarCode + "成功返回验证信息:" + result);
@@ -377,8 +416,9 @@ namespace Aucma.Core.ProductOffLine.Business
// }
log.Info(TempOffLineInfo.ProductSNCode + ", 多码验证通过!");
//2.上传条码系统
- // return uploadSnSysytem(TempOffLineInfo);
- return true;
+ bool resultUp = uploadSnSysytem(TempOffLineInfo);
+ return resultUp;
+
}
else
@@ -425,7 +465,11 @@ namespace Aucma.Core.ProductOffLine.Business
return false;
}
}
-
+ ///
+ /// 条码系统保存接口
+ ///
+ ///
+ ///
public bool uploadSnSysytem(TempInfo TempOffLineInfo)
{
try
@@ -433,11 +477,11 @@ namespace Aucma.Core.ProductOffLine.Business
if (!string.IsNullOrEmpty(TempOffLineInfo.ProductOrderNo))
{
// 条码系统保存接口
- string strSave = _productOffLineServices.SaveBarcodeInfo(TempOffLineInfo.ProductSNCode, "ILS_SORT", TempOffLineInfo.ProductOrderNo, 1);
+ string strSave = _productOffLineServices.SaveBarcodeInfo(TempOffLineInfo.ProductSNCode, "6945", TempOffLineInfo.ProductOrderNo, 1);
// string strSave = "Y";
if (!string.IsNullOrEmpty(strSave))
{
- if (strSave == "Y")
+ if (strSave == "Y" || strSave=="S")
{
log.Info(TempOffLineInfo.ProductSNCode + "上传条码成功:" + strSave);
TempOffLineInfo.MsgInfo = TempOffLineInfo.MsgInfo + ",上传条码成功";
@@ -455,7 +499,7 @@ namespace Aucma.Core.ProductOffLine.Business
TempOffLineInfo.MsgAlarmFlag = true;
//界面刷新
TempOffLineInfo.ProductRefreshFlag = true;
- return false;
+ // return false;
}
//界面刷新
@@ -542,22 +586,27 @@ namespace Aucma.Core.ProductOffLine.Business
if (obj != null)
{
- if(scannerNo == 1) // 扫码器1对应的货道地址
+ if(scannerNo == 1) // 扫码器1对应的货道地址,内侧
{
- // 写入入库方向,两条道plc地址不同
- obj.plc.WriteInt32("ZR1000", direction);
- // 往plc写入放行信号
- obj.plc.WriteInt32("ZR1002", 1);
+ TempOffLineInfo1.MsgInfo = TempOffLineInfo1.MsgInfo + "下发放行,";
+ TempOffLineInfo1.ProductRefreshFlag = true;
+ // 写入入库方向,两条道plc地址不同
+ obj.plc.WriteInt16("ZR1001", direction.ToString());
+ // 往plc写入放行信号
+ obj.plc.WriteInt16("ZR1003", "1");
}
- else
+ else // 外侧
{
- direction = 2;
- // 写入入库方向,两条道plc地址不同
- obj.plc.WriteInt32("ZR1001", direction);
- // 往plc写入放行信号
- obj.plc.WriteInt32("ZR1003", 1);
+ TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "下发放行";
+ TempOffLineInfo2.ProductRefreshFlag = true;
+ // 写入入库方向,两条道plc地址不同
+ obj.plc.WriteInt16("ZR1000", direction.ToString());
+ // 往plc写入放行信号
+ obj.plc.WriteInt16("ZR1002", "1");
+
+
}
- DateTime targetTime = DateTime.Now.AddSeconds(100);
+ DateTime targetTime = DateTime.Now.AddSeconds(300);
// 等待plc反馈信号
while (true)
{
@@ -567,32 +616,40 @@ namespace Aucma.Core.ProductOffLine.Business
result = false;
break;
}
- if (scannerNo == 1)
+ if (scannerNo == 1)
+ {
+
+ // 读取plc反馈信号
+ if (obj.plc.ReadInt32("ZR1003") == 2)
{
- // 读取plc反馈信号
- if (obj.plc.ReadInt32("ZR1002") == 2)
- {
- Console.WriteLine("收到plc放行成功");
- // 清空数据
- // obj.plc.WriteInt32("ZR1000", 0);
- obj.plc.WriteInt32("ZR1002", 0);
- result = true;
- break;
- }
+ TempOffLineInfo1.MsgInfo = TempOffLineInfo1.MsgInfo + "放行成功";
+ TempOffLineInfo1.ProductRefreshFlag = true;
+ Console.WriteLine("收到plc放行成功");
+ // 清空数据
+ // obj.plc.WriteInt32("ZR1001", 0);
+ obj.plc.WriteInt16("ZR1003", "0");
+ result = true;
+ break;
}
- else
+ }
+
+ else
+ {
+
+ // 读取plc反馈信号
+ if (obj.plc.ReadInt16("ZR1002") == 2)
{
- // 读取plc反馈信号
- if (obj.plc.ReadInt32("ZR1003") == 2)
- {
- Console.WriteLine("收到plc放行成功");
- // 清空数据
- // obj.plc.WriteInt32("ZR1001", 0);
- obj.plc.WriteInt32("ZR1003", 0);
- result = true;
- break;
- }
+ TempOffLineInfo2.MsgInfo = TempOffLineInfo2.MsgInfo + "放行成功";
+ TempOffLineInfo2.ProductRefreshFlag = true;
+ Console.WriteLine("收到plc放行成功");
+ // 清空数据
+ // obj.plc.WriteInt32("ZR1000", 0);
+ obj.plc.WriteInt16("ZR1002", "0");
+ result = true;
+ break;
}
+ }
+
Thread.Sleep(500);
}
diff --git a/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs b/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs
index 5e6e7c15..a147747a 100644
--- a/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs
+++ b/Aucma.Core.ProductOffLine/ViewModels/MainWindowViewModel.cs
@@ -12,8 +12,8 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows.Threading;
using Admin.Core.Common;
-using Aucma.Core.Scanner;
using Admin.Core.Tasks;
+using Aucma.Core.ProductOffLine.Business;
namespace Aucma.Core.ProductOffLine.ViewModels
{
@@ -33,12 +33,12 @@ namespace Aucma.Core.ProductOffLine.ViewModels
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += Timer_Tick;
timer.Start();
-
+ MvCodeHelper.RefreshStateEvent += RefreshScanner;
MesDbState(true);
PlcState(true);
- Scanner1State(true);
- Scanner2State(true);
+ Scanner1State(false);
+ Scanner2State(false);
// Job_AllState_Quartz.RefreshStateEvent += RefreshStatus;
InitHikRobot();
@@ -59,7 +59,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels
Task.Run(() =>
{
- Thread.Sleep(2000);
+ Thread.Sleep(2500);
//MvCodeHelper1.DeviceListAcq();//获取创建设备
// MvCodeHelper1.StartGrab(); // 开启触发扫码接收数据
Business.MvCodeHelper.Liner();
@@ -74,6 +74,17 @@ namespace Aucma.Core.ProductOffLine.ViewModels
}
#endregion
+ public void RefreshScanner(string ip)
+ {
+ if (ip == "外侧")
+ {
+ Scanner1State(true);
+ }
+ else if(ip == "内侧")
+ {
+ Scanner2State(true);
+ }
+ }
#region 设备状态刷新
///
/// 设备状态刷新
@@ -131,10 +142,10 @@ namespace Aucma.Core.ProductOffLine.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(flag1);
+ // Scanner2State(flag2);
}
#endregion
@@ -396,13 +407,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
if (type)
{
- Scanner1UIStatusWb = "扫码器1状态";
+ Scanner1UIStatusWb = "外侧扫码器";
Scanner1UIColor = "Green";
Scanner1UIIcon = "Assets/Images/Green.png";
}
else
{
- Scanner1UIStatusWb = "扫码器1状态";
+ Scanner1UIStatusWb = "外侧扫码器";
Scanner1UIColor = "Red";
Scanner1UIIcon = "Assets/Images/Red.png";
}
@@ -455,13 +466,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
if (type)
{
- Scanner2UIStatusWb = "扫码器2状态";
+ Scanner2UIStatusWb = "内侧扫码器";
Scanner2UIColor = "Green";
Scanner2UIIcon = "Assets/Images/Green.png";
}
else
{
- Scanner2UIStatusWb = "扫码器2状态";
+ Scanner2UIStatusWb = "内侧扫码器";
Scanner2UIColor = "Red";
Scanner2UIIcon = "Assets/Images/Red.png";
}
diff --git a/Aucma.Core.ProductOffLine/appsettings.json b/Aucma.Core.ProductOffLine/appsettings.json
index ef662b0d..a34e0593 100644
--- a/Aucma.Core.ProductOffLine/appsettings.json
+++ b/Aucma.Core.ProductOffLine/appsettings.json
@@ -208,12 +208,12 @@
"ScannerServer": [
{
"Id": 1,
- "Ip": "10.10.92.121",
+ "Ip": "10.10.92.140",
"Name": "内侧扫码器1"
},
{
"Id": 2,
- "Ip": "10.10.92.122",
+ "Ip": "10.10.92.141",
"Name": "外侧扫码器2"
}
],
diff --git a/Aucma.Core.RunPlc/RunPlcService.cs b/Aucma.Core.RunPlc/RunPlcService.cs
index 3c5e250b..5d08a6d4 100644
--- a/Aucma.Core.RunPlc/RunPlcService.cs
+++ b/Aucma.Core.RunPlc/RunPlcService.cs
@@ -21,6 +21,7 @@ namespace Aucma.Core.RunPlc
{
await Task.Run(async () =>
{
+
await StartMelsecMcPlcServer();
});
diff --git a/Aucma.Core.Scanner/Helper/MvCodeHelper.cs b/Aucma.Core.Scanner/Helper/MvCodeHelper.cs
index cee06474..dc322941 100644
--- a/Aucma.Core.Scanner/Helper/MvCodeHelper.cs
+++ b/Aucma.Core.Scanner/Helper/MvCodeHelper.cs
@@ -30,15 +30,7 @@ namespace Aucma.Core.Scanner
#region 委托事件
- #region 条码绑定上位机委托事件
- ///
- /// code1扫码信息刷新
- ///
- ///
- public delegate void BindingReceiveCode(string code, string ip);
- public static event BindingReceiveCode? BindingReceiveCodeEvent;
-
- #endregion
+
#region 成品下线上位机委托事件
///
@@ -86,20 +78,28 @@ namespace Aucma.Core.Scanner
///
public static bool ConnectionStatus(string ip)
{
- // 遍历所有已打开相机
- foreach (KeyValuePair hashmap in m_cMyDevices)
+ try
{
- if (ip.Equals(hashmap.Value))
+ // 遍历所有已打开相机
+ foreach (KeyValuePair hashmap in m_cMyDevices)
{
- return true;
+ if (ip.Equals(hashmap.Value))
+ {
+ return true;
+ }
}
+ // 没有连接上,重新获取并创建设备
+ Task.Run(() =>
+ {
+ DeviceListAcq();
+ });
+ return false;
}
- // 没有连接上,重新获取并创建设备
- Task.Run(() =>
+ catch (Exception ex)
{
- DeviceListAcq();
- });
- return false;
+ Console.WriteLine($"打开相机异常:{ex.Message.ToString()}");
+ return false;
+ }
}
#endregion
@@ -332,7 +332,7 @@ namespace Aucma.Core.Scanner
HandlePalletizDelegateEvent?.Invoke(strCode, hashmap.Value);//成品扫码入分垛库
Console.WriteLine(strCode, hashmap.Value);
// 泡前库业务处理
- // PQKReceiveCodeEvent(strCode);
+ PQKReceiveCodeEvent(strCode);
lastCodeStr = strCode;
}
}