change-泡前库,条码绑定,成品下线修改调试成功版本

dev
liuwf 1 year ago
parent b232107187
commit ce3e24612c

@ -2131,6 +2131,11 @@
plc放行标志2为放行通过1为pda提示需要放行记录
</summary>
</member>
<member name="P:Admin.Core.Model.CodeBindingRecord.LinerCode">
<summary>
内胆码
</summary>
</member>
<member name="T:Admin.Core.Model.CurrentTeamTime">
<summary>
存储当班班组
@ -2911,6 +2916,11 @@
创建时间
</summary>
</member>
<member name="P:Admin.Core.Model.RealTaskInfo.BoxType">
<summary>
箱体型号310 ,287这种泡前库下发plc使用
</summary>
</member>
<member name="T:Admin.Core.Model.RecordBackPanelComplate">
<summary>
完成记录

@ -55,5 +55,11 @@ namespace Admin.Core.Model
/// </summary>
[SugarColumn(ColumnName = "IS_PASS")]
public int isPlcPass { get; set; }
/// <summary>
/// 内胆码
/// </summary>
[SugarColumn(ColumnName = "LINER_CODE")]
public string LinerCode { get; set; }
}
}

@ -112,5 +112,10 @@ namespace Admin.Core.Model
/// </summary>
[SugarColumn(ColumnName = "CREATED_TIME")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 箱体型号310 ,287这种泡前库下发plc使用
/// </summary>
[SugarColumn(ColumnName = "BOX_TYPE")]
public string BoxType { get; set; }
}
}

@ -58,8 +58,9 @@ namespace Admin.Core.Service
{
// 保存业务
var _db = baseRepository.Db;
var infos = _db.CopyNew().Ado.SqlQueryAsync<BaseTest>($"SELECT ILS_TMPRD.ILS_SORT_BARCODE_PKG.SAVE_BARCODE_INFO({Barcode},{Created_By},{Order_number},{Order_type})").Result;
var infos = _db.CopyNew().Ado.SqlQueryAsync<BaseTest>($"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)
{

@ -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<CodeBindingRecord> 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;
}
}
}

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
@ -83,6 +83,9 @@
<Reference Include="LiveCharts.Wpf">
<HintPath>..\dll\LiveCharts.Wpf.dll</HintPath>
</Reference>
<Reference Include="MvCodeReaderSDK.Net">
<HintPath>..\dll\MvCodeReaderSDK.Net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>

@ -160,45 +160,52 @@ namespace Aucma.Core.BoxFoam.Business
/// <param name="obj_1"></param>
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());
}
}

@ -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<BaseSpaceInfo> 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)
{

@ -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<ScannerModel> allScanners = Appsettings.app<ScannerModel>("ScannerServer").ToList();
// 内胆扫码器ip
private static string LinerScannerIp = allScanners.First(x => x.Name == "扫码器1").Ip;
#region 委托事件
/// <summary>
/// 泡前库扫码
/// </summary>
/// <param name="Code1"></param>
public delegate Task PQKReceiveCode(string code1);
public static event PQKReceiveCode? PQKReceiveCodeEvent;
/// <summary>
/// 日志信息刷新
/// </summary>
/// <param name="message"></param>
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 判断字符编码
/// <summary>
/// 判断字符编码
/// </summary>
/// <param name="inputStream"></param>
/// <returns></returns>
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
}
}

@ -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)
{

@ -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 设备状态刷新
/// <summary>
/// 设备状态刷新
@ -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

@ -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(() =>
{

@ -189,7 +189,7 @@
"Enabled": true
},
"Scanner": { //
"Enabled": true
"Enabled": false
}
},
"ScannerServer": [

@ -36,7 +36,7 @@
<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
@ -80,6 +80,12 @@
<ProjectReference Include="..\Aucma.Core.BoxFoam\Aucma.Core.BoxFoam.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="MvCodeReaderSDK.Net">
<HintPath>..\dll\MvCodeReaderSDK.Net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Update="Views\StatisticsPageView.xaml.cs">
<SubType>Code</SubType>

@ -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<ScannerModel> allScanners = Appsettings.app<ScannerModel>("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 条码绑定上位机委托事件
/// <summary>
/// code1扫码信息刷新
/// </summary>
/// <param name="Code1"></param>
public delegate void BindingReceiveCode(string code, string ip);
public static event BindingReceiveCode? BindingReceiveCodeEvent;
/// <summary>
/// NoRead通知
/// </summary>
/// <param name="Code1"></param>
public delegate void NoRead(string ip);
public static event NoRead? NoReadEvent;
#endregion
/// <summary>
/// 日志信息刷新
/// </summary>
/// <param name="message"></param>
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 判断字符编码
/// <summary>
/// 判断字符编码
/// </summary>
/// <param name="inputStream"></param>
/// <returns></returns>
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
}
}

@ -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<ScannerModel> allScanners = Appsettings.app<ScannerModel>("ScannerServer").ToList();
private static List<ScannerModel> allScanners = Appsettings.app<ScannerModel>("ScannerServer").ToList();
public IndexPageViewModel()
{
try
@ -69,10 +69,10 @@ namespace Aucma.Core.CodeBinding.ViewModels
_printBarCodeServices = App.ServiceProvider.GetService<IPrintBarCodeServices>();
_iMaterialCompletionServices = App.ServiceProvider.GetService<IMaterialCompletionServices>();
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
/// <summary>
/// 接收扫码器传输的条码扫码器ip
/// NoRead处理
/// </summary>
/// <param name="code1"></param>
/// <param name="scannerIp"></param>
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();
}
}
/// <summary>
/// 接收扫码器传输的条码扫码器ip
/// </summary>
/// <param name="code1"></param>
/// <param name="scannerIp"></param>
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);
}
/// <summary>
/// 条码绑定
/// </summary>
/// <param name="code1"></param>
/// <param name="code2"></param>
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交互
/// <summary>
/// 下发plc放行信号
/// 下发plc停止信号
/// </summary>
/// <param name="materialType"></param>
private bool SendPlcPass(PlcModel obj)
/// <param name="obj"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 读取plc放行反馈
/// 下发plc放行信号
/// </summary>
/// <param name="materialType"></param>
private bool waitPlcSignal(PlcModel obj)
/// <param name="obj"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 发送心跳
/// </summary>
/// <param name="obj"></param>
/// <param name="flag"></param>
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);
}
}
///// <summary>
///// 下发plc放行信号
///// </summary>
///// <param name="materialType"></param>
//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;
//}
///// <summary>
///// 读取plc放行反馈
///// </summary>
///// <param name="materialType"></param>
//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
}

@ -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 设备状态刷新
/// <summary>
@ -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

@ -116,11 +116,16 @@
<!--<Label Content="型号 " FontSize="20" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Width="300" FontSize="20" Foreground="#FFFFFF"/>-->
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="100 0 0 0 ">
<Label Content="提示信息 " FontSize="20" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Text="{Binding BindingInfo}" Width="600" Height="200" FontSize="18" Foreground="#FFFFFF"/>
</StackPanel>
<Label Content="提示信息 " FontSize="20" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Text="{Binding BindingInfo}" Width="600" Height="200" FontSize="18" Foreground="#FFFFFF"/>
</StackPanel>
<Button Margin="10,51,420,80" Width="80" Grid.Row="2" Cursor="Hand" Content="放 行" Background="#FF9900" BorderBrush="#FF9900" Click="Button_Click">
</Button>
</Grid>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
@ -152,8 +157,8 @@
</lvc:Axis>
</lvc:CartesianChart.AxisY>
</lvc:CartesianChart>
</Border>
</Grid>
@ -182,7 +187,7 @@
BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="White" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding No}" Header="序号" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding BoxCode}" Header="MES条码" Width="4*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>

@ -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();
}
/// <summary>
/// 下发plc放行信号
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
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;
}
}
}

@ -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
}
],

@ -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 委托事件
/// <summary>
/// 成品下线委托
/// </summary>
/// <param name="materialCodeStr"></param>
/// <param name="ip"></param>
public delegate void RefreshMaterialCodeStr(string materialCodeStr, string ip);
public static event RefreshMaterialCodeStr RefreshMaterialCodeStrEvent;
/// <summary>
/// 刷新扫码器状态
/// </summary>
/// <param name="materialCodeStr"></param>
/// <param name="ip"></param>
public delegate void RefreshState(string ip);
public static event RefreshState RefreshStateEvent;
/// <summary>
/// 日志信息刷新
/// </summary>
@ -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);

@ -98,6 +98,11 @@ namespace Aucma.Core.ProductOffLine.Business
public event getDirection getDirectioneEvent;
#endregion
public OffLineBusiness()
{
MvCodeHelper.RefreshMaterialCodeStrEvent += MaterialBarScan;
// test();
}
#region 变量定义
/// <summary>
/// 定时器
@ -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
//});
}
/// <summary>
/// 处理条码
/// </summary>
/// <param name="code"></param>
/// <param name="scannerIp">扫码器IP</param>
public void MaterialBarScan(string code,string scannerIp)
public void MaterialBarScan(string code, string scannerIp)
{
Task.Run(() =>
{
MaterialBarScanHandle(code, scannerIp);
});
}
/// <summary>
/// 处理条码
/// </summary>
/// <param name="code"></param>
/// <param name="scannerIp">扫码器IP</param>
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<ReportQualityInsPection> qualityList = _reportQualityInspectionServices.JudgeIsQualified(BarCode);
List<ReportQualityInsPection> qualityList = null; // 测试使用
List<ReportQualityInsPection> 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;
}
}
/// <summary>
/// 条码系统保存接口
/// </summary>
/// <param name="TempOffLineInfo"></param>
/// <returns></returns>
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);
}

@ -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 设备状态刷新
/// <summary>
/// 设备状态刷新
@ -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";
}

@ -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"
}
],

@ -21,6 +21,7 @@ namespace Aucma.Core.RunPlc
{
await Task.Run(async () =>
{
await StartMelsecMcPlcServer();
});

@ -30,15 +30,7 @@ namespace Aucma.Core.Scanner
#region 委托事件
#region 条码绑定上位机委托事件
/// <summary>
/// code1扫码信息刷新
/// </summary>
/// <param name="Code1"></param>
public delegate void BindingReceiveCode(string code, string ip);
public static event BindingReceiveCode? BindingReceiveCodeEvent;
#endregion
#region 成品下线上位机委托事件
/// <summary>
@ -86,20 +78,28 @@ namespace Aucma.Core.Scanner
/// <returns></returns>
public static bool ConnectionStatus(string ip)
{
// 遍历所有已打开相机
foreach (KeyValuePair<MvCodeReader, string> hashmap in m_cMyDevices)
try
{
if (ip.Equals(hashmap.Value))
// 遍历所有已打开相机
foreach (KeyValuePair<MvCodeReader, string> 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;
}
}

Loading…
Cancel
Save