You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

992 lines
43 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Highway.Assemble.common;
using log4net;
using Mesnac.DeviceAdapter;
using Mesnac.DeviceAdapterNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Highway.Assemble.EquipClient
{
public class EquipClient : IEquipClient
{
public static readonly ILog LogInfo = LogManager.GetLogger("RollingLogFileAppender");
public Action<List<DeviceInfo>> EquipStateAction;
public Action<int, List<TagInfo>> ReadDataAction;
public Action<int, List<TagInfo>> RecSendDataAction;
public Action<int, int, int> RecGetDataAction;
public Action<int, byte[]> RecAutoDataAction;
public List<Equip> equipList;
public List<Equip> listGroup;
public List<Sensor> m_SensorInfoList;
public List<Sensor> m_AntInfoInfoList;
public List<DeviceInfo> m_DeviceInfoList;
private BackgroundWorker m_bgwDeviceDetect = new BackgroundWorker();
private ManualResetEvent StartDetectEvent = new ManualResetEvent(initialState: false);
private ManualResetEvent ExitEvent = new ManualResetEvent(initialState: false);
private ManualResetEvent DetectEvent = new ManualResetEvent(initialState: false);
public List<CombineData> CombineDataList = new List<CombineData>();
public static AntInfo[] AntList;
public CombineData CombineData;
public bool TagInventory;
/// <summary>
/// 初始化设备天线信息
/// </summary>
private void InitAnt()
{
AntList = new AntInfo[m_SensorInfoList.Count];
for (int i = 0; i < m_SensorInfoList.Count; i++)
{
AntInfo a = new AntInfo();
a.m_iCombineId = Convert.ToInt32(m_SensorInfoList[i].combineid);
AntList[i] = a;
}
}
/// <summary>
/// 初始化创建设备实例
/// </summary>
public void Init()
{
CombineData = new CombineData();
DeviceInfo pDeviceInfo = null;
m_DeviceInfoList = new List<DeviceInfo>();
if (equipList == null)
{
LogInfo.Info("设备信息表为空!");
return;
}
for (int i = 0; i < equipList.Count; i++)
{
pDeviceInfo = new DeviceInfo();
pDeviceInfo.m_iDeviceId = Convert.ToUInt16(equipList[i].deviceId);
pDeviceInfo.m_iConnectMode = Convert.ToByte(equipList[i].connectmode);
pDeviceInfo.m_strConnectStr = equipList[i].connectstr;
pDeviceInfo.m_strDeviceType = equipList[i].deviceType;
pDeviceInfo.m_IDeviceAdapter = CreateDeviceAdapter(pDeviceInfo);
if (pDeviceInfo.m_IDeviceAdapter == null)
{
LogInfo.Info("创建编号为" + pDeviceInfo.m_iDeviceId + "的设备实例失败");
}
m_DeviceInfoList.Add(pDeviceInfo);
}
InitAnt();
}
/// <summary>
/// 创建设备动态链接库
/// </summary>
/// <param name="pDeviceInfo"></param>
/// <returns></returns>
public IDeviceAdapter CreateDeviceAdapter(DeviceInfo pDeviceInfo)
{
IDeviceAdapter IAdapter = null;
try
{
string strDllName = "Mesnac.DeviceAdapter." + pDeviceInfo.m_strDeviceType;
Assembly assembly = Assembly.Load(strDllName);
string fullName = strDllName + "." + pDeviceInfo.m_strDeviceType + "Adapter";
return (IDeviceAdapter)assembly.CreateInstance(fullName);
}
catch (Exception ex)
{
LogInfo.Info("CreateDeviceAdapter异常:" + ex.ToString());
return null;
}
}
/// <summary>
/// 设备数据处理函数
/// </summary>
public void CreatEquipClient()
{
if (equipList == null)
{
LogInfo.Info("设备信息表为空!");
return;
}
m_bgwDeviceDetect.DoWork += bgwDeviceDetect_DoWork;
m_bgwDeviceDetect.RunWorkerAsync(this);
}
/// <summary>
/// 监听设备数据事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwDeviceDetect_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundworker = sender as BackgroundWorker;
while (true)
{
try
{
if (ExitEvent.WaitOne(0, exitContext: false))
{
e.Cancel = true;
LogInfo.Info("设备检测线程正常退出");
ExitEvent.Reset();
break;
}
for (int i = 0; i < m_DeviceInfoList.Count; i++)
{
DeviceInfo item = m_DeviceInfoList[i];
IDeviceAdapter pDeviceAdapter = item.m_IDeviceAdapter;
Task t = Task.Run(async delegate
{
if (pDeviceAdapter == null)
{
item.m_ConnectState = 0;
}
if (item.m_ConnectState == 0)
{
if (pDeviceAdapter.Device_Init_Id((CommType)item.m_iConnectMode, item.m_strConnectStr, item.m_iDeviceId))
{
if (pDeviceAdapter.Device_Connect())
{
pDeviceAdapter.RecvIdentifyDataEvent -= RecvIdentifyData_Instance;
pDeviceAdapter.RecvIdentifyDataEvent += RecvIdentifyData_Instance;
//pDeviceAdapter.RecvIdentifyData_ToMES_Event -= RecvIdentifyDataToMES_Instance;
//pDeviceAdapter.RecvIdentifyData_ToMES_Event += RecvIdentifyDataToMES_Instance;
switch (pDeviceAdapter.Device_SendHeartPack())
{
case 1:
item.m_ConnectState = 1;
break;
case 2:
item.m_ConnectState = 2;
break;
default:
item.m_ConnectState = 0;
break;
}
}
}
else
{
item.m_ConnectState = 0;
}
}
else if (item.m_ConnectState == 1)
{
switch (pDeviceAdapter.Device_SendHeartPack())
{
case 1:
item.m_ConnectState = 1;
break;
case 2:
item.m_ConnectState = 2;
break;
default:
item.m_ConnectState = 0;
break;
}
}
else if (item.m_ConnectState == 2)
{
switch (pDeviceAdapter.Device_SendHeartPack())
{
case 1:
item.m_ConnectState = 1;
break;
case 2:
item.m_ConnectState = 2;
item.m_IDeviceAdapter.Device_Destroy();
break;
default:
item.m_ConnectState = 0;
item.m_IDeviceAdapter.Device_Destroy();
break;
}
}
EquipStateAction?.Invoke(m_DeviceInfoList);
await Task.Delay(100);
});
}
DetectEvent.Reset();
DetectEvent.WaitOne(120000, exitContext: false);
}
catch (Exception ex)
{
LogInfo.Info("设备检测线程异常:" + ex.Message);
DetectEvent.Reset();
DetectEvent.WaitOne(30000, exitContext: false);
}
}
}
/// <summary>
/// 监听MES主动读取后数据返回事件
/// </summary>
/// <param name="iLen"></param>
/// <param name="pData"></param>
/// <param name="Antenna"></param>
/// <param name="iDeviceId"></param>
/// <param name="strId"></param>
/// <param name="sensorType"></param>
private void RecvIdentifyDataToMES_Instance(ushort iLen, byte[] pData, byte Antenna, ushort iDeviceId, string strId, string sensorType)
{
uint iCombineId = 0u;
try
{
iCombineId = GetCombineIdByDeviceIdAndSer(Antenna, iDeviceId, sensorType);
if (iCombineId != 0)
{
if (iLen > 0)
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("MES主动读取合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器,自报数据:" + Encoding.ASCII.GetString(pData, 0, pData.Length) + ",原始数据:" + bytesToHexStr(pData, pData.Length));
LogInfo.Info("------------------------------------------------------------------------------------------------------");
//ReadDataAction?.Invoke(Convert.ToInt32(iCombineId), pData);
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("MES主动读取合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器自报数据NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
ReadDataAction?.Invoke(Convert.ToInt32(iCombineId), null);
}
}
}
catch (Exception ex)
{
LogInfo.Info("RecvIdentifyDataToMES_Instance:" + ex.ToString());
ReadDataAction?.Invoke(Convert.ToInt32(iCombineId), null);
}
}
/// <summary>
/// 根据设备编号获取传感器合并编号
/// </summary>
/// <param name="iSensorSer">传感器编号</param>
/// <param name="iDeviceId">设备编号</param>
/// <param name="sensorType">传感器类型</param>
/// <returns></returns>
private uint GetCombineIdByDeviceIdAndSer(byte iSensorSer, ushort iDeviceId, string sensorType)
{
uint iCombineId = 0u;
for (int i = 0; i < m_SensorInfoList.Count; i++)
{
if (iSensorSer == Convert.ToUInt16(m_SensorInfoList[i].sensorser) && iDeviceId == Convert.ToUInt16(m_SensorInfoList[i].deviceId) && sensorType == m_SensorInfoList[i].sensortypeid)
{
iCombineId = Convert.ToUInt32(m_SensorInfoList[i].combineid);
break;
}
}
return iCombineId;
}
/// <summary>
/// 监听自动上报后数据返回事件
/// </summary>
/// <param name="iLen">数据长度</param>
/// <param name="pData">数据</param>
/// <param name="Antenna">天线</param>
/// <param name="iDeviceId">设备编号</param>
/// <param name="strId">传感器编号</param>
/// <param name="sensorType">传感器类型</param>
public void RecvIdentifyData_Instance(ushort iLen, List<TagInfo> tagInfos, byte Antenna, ushort iDeviceId, string strId, string sensorType)
{
uint iCombineId = 0u;
try
{
iCombineId = GetCombineIdByDeviceIdAndSer(Antenna, iDeviceId, sensorType);
if (iCombineId == 0)
{
return;
}
if (iLen > 0)
{
//if (iLen == 1)
//{
// LogInfo.Info("------------------------------------------------------------------------------------------------------");
// LogInfo.Info("光电自报合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器,原始数据:" + bytesToHexStr(pData, pData.Length));
// LogInfo.Info("------------------------------------------------------------------------------------------------------");
// RecAutoDataAction?.Invoke(Convert.ToInt32(iCombineId), pData);
// return;
//}
LogInfo.Info("------------------------------------------------------------------------------------------------------");
//LogInfo.Info("读写器自报合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器,自报数据:" + Encoding.ASCII.GetString(pData, 0, pData.Length) + ",原始数据:" + bytesToHexStr(pData, pData.Length));
LogInfo.Info("------------------------------------------------------------------------------------------------------");
AntInfo[] antList = AntList;
foreach (AntInfo item in antList)
{
if (item.m_iCombineId == iCombineId)
{
item.IsReading = false;
item.ReadData = new byte[tagInfos[0].EPC.Length];
Array.Copy(tagInfos[0].EPC, 0, item.ReadData, 0, tagInfos[0].EPC.Length);
RecSendDataAction?.Invoke(Convert.ToInt32(iCombineId), tagInfos);
}
}
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("自报合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器自报数据NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
RecSendDataAction?.Invoke(Convert.ToInt32(iCombineId), null);
}
}
catch (Exception ex)
{
LogInfo.Info("空间名:" + ex.Source + "\n方法名" + ex.TargetSite?.ToString() + "\n故障点" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + "\n错误提示" + ex.Message);
if (iLen == 0)
{
RecAutoDataAction?.Invoke(Convert.ToInt32(iCombineId), null);
}
}
}
public static string bytesToHexStr(byte[] bytes, int iLen)
{
StringBuilder sb = new StringBuilder();
if (bytes != null)
{
for (int i = 0; i < iLen; i++)
{
sb.Append(bytes[i].ToString("X2"));
}
}
return sb.ToString();
}
/// <summary>
/// 主动读取设备数据函数
/// </summary>
/// <param name="num">传感器合并编号</param>
/// <param name="filterMembank">过滤区</param>
/// <param name="filterWordPtr">过滤偏移量</param>
/// <param name="filterWordCnt">过滤数据长度</param>
/// <param name="filterData">过滤数据</param>
/// <param name="Membank">数据区</param>
/// <param name="WordPtr">数据地址偏移量</param>
/// <param name="WordCnt">数据长度</param>
public void ReadData(int num, byte filterMembank, ushort filterWordPtr, ushort filterWordCnt, byte[] filterData, byte Membank, ushort WordPtr, ushort WordCnt)
{
ushort iReadLen = 0;
byte[] pReadData = null;
DeviceInfo pDeviceInfo = null;
Sensor pSensorInfo = null;
try
{
LogInfo.Info("接收到MES主动读取数据命令合并编号" + num);
pDeviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
pSensorInfo = GetSensorInfoByCombineId(Convert.ToUInt32(num));
if (pDeviceInfo.m_IDeviceAdapter != null)
{
if (pDeviceInfo.m_IDeviceAdapter.Device_Read((G2MemBank)filterMembank, filterWordPtr, filterWordCnt, filterData, (G2MemBank)Membank, WordPtr, WordCnt, ref pReadData, Convert.ToByte(pSensorInfo.sensorser), pSensorInfo.ReadCounts) != 0)
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("MES主动读取数据成功合并编号[" + num + "],读取标签数据:" + Encoding.ASCII.GetString(pReadData, 0, pReadData.Length) + ",原始数据:" + bytesToHexStr(pReadData, pReadData.Length));
LogInfo.Info("------------------------------------------------------------------------------------------------------");
//ReadDataAction?.Invoke(num, pReadData);
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("MES主动读取数据成功合并编号[" + num + "],读取数据:NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
ReadDataAction?.Invoke(num, null);
}
}
else
{
LogInfo.Info("MES主动读取失败合并编号" + num);
ReadDataAction?.Invoke(num, null);
}
}
catch (Exception ex)
{
LogInfo.Info("MES主动读取异常:" + ex.ToString());
ReadDataAction?.Invoke(num, null);
}
}
/// <summary>
/// 根据设备编号返回设备信息
/// </summary>
/// <param name="iDeviceId">设备编号</param>
/// <returns>设备信息</returns>
private DeviceInfo GetDeviceInfoByDeviceId(ushort iDeviceId)
{
DeviceInfo pDeviceInfo = null;
for (int i = 0; i < m_DeviceInfoList.Count; i++)
{
if (iDeviceId == m_DeviceInfoList[i].m_iDeviceId)
{
return m_DeviceInfoList[i];
}
}
return pDeviceInfo;
}
/// <summary>
/// 根据传感器合并编号获取设备信息
/// </summary>
/// <param name="iCombineId">传感器编号</param>
/// <returns>设备信息</returns>
private DeviceInfo GetIDeviceInfoByCombineId(uint iCombineId)
{
DeviceInfo pDeviceInfo = null;
for (int i = 0; i < m_SensorInfoList.Count; i++)
{
if (iCombineId == Convert.ToUInt32(m_SensorInfoList[i].combineid))
{
pDeviceInfo = GetDeviceInfoByDeviceId(Convert.ToUInt16(m_SensorInfoList[i].deviceId));
if (pDeviceInfo != null)
{
break;
}
}
}
return pDeviceInfo;
}
/// <summary>
/// 根据传感器编号返回传感器信息
/// </summary>
/// <param name="iCombineId">传感器编号</param>
/// <returns>传感器信息</returns>
private Sensor GetSensorInfoByCombineId(uint iCombineId)
{
Sensor pSensorInfo = null;
for (int i = 0; i < m_SensorInfoList.Count; i++)
{
if (iCombineId == Convert.ToUInt32(m_SensorInfoList[i].combineid))
{
pSensorInfo = m_SensorInfoList[i];
break;
}
}
return pSensorInfo;
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="num">传感器合并编号</param>
/// <param name="filterMembank">过滤区</param>
/// <param name="filterWordPtr">过滤偏移量</param>
/// <param name="filterWordCnt">过滤数据长度</param>
/// <param name="filterData">过滤数据</param>
/// <param name="Membank">数据区</param>
/// <param name="WordPtr">数据地址偏移量</param>
/// <param name="WordCnt">数据长度</param>
/// <param name="pWriteData">写入数据</param>
/// <param name="Antenna">天线号</param>
public void WriteData(int num, byte filterMembank, ushort filterWordPtr, ushort filterWordCnt, byte[] filterData, byte Membank, ushort WordPtr, ushort WordCnt, byte[] pWriteData, byte Antenna)
{
int iState = 0;
ushort iWriteLen = 0;
DeviceInfo pDeviceInfo = null;
Sensor pSensorInfo = null;
switch (Membank)
{
case 1:
if (pWriteData[0] == byte.MaxValue)
{
iState = 3;
LogInfo.Info("方法WriteData接收合并编号[" + num + "]的第[" + Antenna + "]路IO打开报警灯命令");
}
else
{
iState = 4;
LogInfo.Info("方法WriteData接收合并编号[" + num + "]的第[" + Antenna + "]路IO关闭报警灯命令");
}
break;
case 2:
iState = 5;
LogInfo.Info("方法WriteData接收合并编号[" + num + "]的第[" + Antenna + "]路IO持续打开报警灯后关闭命令");
break;
case 3:
iState = 6;
LogInfo.Info("方法WriteData接收合并编号[" + num + "]的第[" + Antenna + "]路IO打开报警灯闪亮命令");
break;
}
pDeviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
pSensorInfo = GetSensorInfoByCombineId(Convert.ToUInt32(num));
try
{
if (pDeviceInfo.m_IDeviceAdapter != null)
{
iWriteLen = pDeviceInfo.m_IDeviceAdapter.Device_Write((G2MemBank)filterMembank, filterWordPtr, filterWordCnt, filterData, (G2MemBank)Membank, WordPtr, WordCnt, pWriteData, Convert.ToByte(pSensorInfo.sensorser));
RecGetDataAction?.Invoke(num, 1, iState);
Thread.Sleep(50);
}
else
{
LogInfo.Info("写入失败,合并编号:" + num);
RecGetDataAction?.Invoke(num, 0, iState);
}
}
catch (Exception ex)
{
LogInfo.Info("写入异常:" + ex.ToString());
}
}
/// <summary>
/// 主动读取EPC发送给客户端
/// </summary>
/// <param name="id">传感器合并编号</param>
public async Task ReadEPC(int id)
{
await Task.Run(delegate
{
byte[] array = null;
try
{
LogInfo.Info("合并编号:" + id + ",识别单次标签命令自报");
//array = GetOneEpcByCombineId(Convert.ToUInt32(id));
if (array != null)
{
LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
LogInfo.Info("识别单次标签成功,合并编号[" + id + "],读取标签数据:" + Encoding.ASCII.GetString(array, 0, array.Length) + ",原始数据:" + bytesToHexStr(array, array.Length));
LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
//ReadDataAction?.Invoke(id, array);
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("识别单次标签成功,合并编号[" + id + "]读取标签数据NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
ReadDataAction?.Invoke(id, null);
}
}
catch (Exception ex)
{
LogInfo.Info("Deal_IdentifyOneEpc异常:" + ex.ToString());
ReadDataAction?.Invoke(id, null);
}
});
}
public void ReadRFID(int id,out List<TagInfo> rfiddata)
{
List<TagInfo> tags = new List<TagInfo>();
byte[] array = null;
rfiddata = null;
try
{
LogInfo.Info("合并编号:" + id + ",识别单次标签命令自报");
tags = GetOneEpcByCombineId(Convert.ToUInt32(id));
if (tags != null)
{
//LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
//LogInfo.Info("识别单次标签成功,合并编号[" + id + "],读取标签数据:" + Encoding.ASCII.GetString(array, 0, array.Length) + ",原始数据:" + bytesToHexStr(array, array.Length));
//LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
//rfiddata = Encoding.ASCII.GetString(array, 0, array.Length);
rfiddata = tags;
ReadDataAction?.Invoke(id, tags);
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("识别单次标签成功,合并编号[" + id + "]读取标签数据NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
ReadDataAction?.Invoke(id, null);
}
}
catch (Exception ex)
{
LogInfo.Info("Deal_IdentifyOneEpc异常:" + ex.ToString());
ReadDataAction?.Invoke(id, null);
}
}
/// <summary>
/// 根据合并编号主动读取EPC返回原始数据
/// </summary>
/// <param name="iCombineId">传感器编号</param>
/// <returns>原始数据</returns>
private List<TagInfo> GetOneEpcByCombineId(uint iCombineId)
{
List<TagInfo> tagInfos = null;
byte[] pReturnResult = null;
IDeviceAdapter pDeviceAdapter = null;
byte iEpcLen = 0;
for (int i = 0; i < m_SensorInfoList.Count; i++)
{
if (iCombineId != Convert.ToUInt32(m_SensorInfoList[i].combineid))
{
continue;
}
pDeviceAdapter = GetDeviceAdapterByDeviceId(Convert.ToUInt16(m_SensorInfoList[i].deviceId));
if (pDeviceAdapter != null)
{
tagInfos = pDeviceAdapter.Device_GetAllIdentifyData(Convert.ToByte(m_SensorInfoList[i].sensorser), Convert.ToUInt16(m_SensorInfoList[i].DelayTime), 1);
if (tagInfos.Count > 0)
{
return tagInfos;
}
return null;
}
}
return tagInfos;
}
/// <summary>
/// 根据设备编号返回设备动态类
/// </summary>
/// <param name="iDeviceId"></param>
/// <returns>设备动态类</returns>
private IDeviceAdapter GetDeviceAdapterByDeviceId(ushort iDeviceId)
{
IDeviceAdapter pDeviceAdapter = null;
for (int i = 0; i < m_DeviceInfoList.Count; i++)
{
if (iDeviceId == m_DeviceInfoList[i].m_iDeviceId)
{
return m_DeviceInfoList[i].m_IDeviceAdapter;
}
}
return pDeviceAdapter;
}
public void RecAutoData(Action<int, byte[]> action)
{
RecAutoDataAction = action;
}
public void RecEquipState(Action<List<DeviceInfo>> action)
{
EquipStateAction = action;
}
public void RecGetData(Action<int, int, int> action)
{
RecGetDataAction = action;
}
public void RecSendData(Action<int, List<TagInfo>> action)
{
RecSendDataAction = action;
}
public void RetReadData(Action<int, List<TagInfo>> action)
{
ReadDataAction = action;
}
public void SensorInfo(List<Sensor> sensorList)
{
m_SensorInfoList = sensorList;
}
public void EquipInfo(List<Equip> equipList)
{
this.equipList = equipList;
}
/// <summary>
/// 根据传感器合并编号处理数据
/// </summary>
/// <param name="num">传感器合并编号</param>
private void Deal_Data(int num)
{
AntInfo[] antList = AntList;
foreach (AntInfo item in antList)
{
item.ReadData = null;
if (item.m_iCombineId != num)
{
continue;
}
while (item.IsReading)
{
if (item.ReadData != null)
{
Array.Clear(item.ReadData, 0, item.ReadData.Length);
item.ReadData = null;
item.IsReading = false;
item.readType = 0;
}
else
{
Thread.Sleep(10);
}
}
}
}
/// <summary>
/// 开始连续盘点
/// </summary>
/// <param name="num">传感器合并编号</param>
public void Device_BeginIdentify(int num)
{
bool bResult = false;
DeviceInfo pDeviceInfo = null;
Sensor pSensorInfo = null;
pDeviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
pSensorInfo = GetSensorInfoByCombineId(Convert.ToUInt32(num));
AntInfo[] antList = AntList;
foreach (AntInfo item in antList)
{
if (item.m_iCombineId == num)
{
if (item.IsReading)
{
return;
}
item.IsReading = true;
item.readType = 1;
}
}
LogInfo.Info("合并编号:" + num + ",发送连续读取标签命令自报");
try
{
if (pDeviceInfo.m_IDeviceAdapter != null)
{
bResult = pDeviceInfo.m_IDeviceAdapter.Device_BeginIdentify(Convert.ToByte(pSensorInfo.sensorser), Convert.ToInt32(pSensorInfo.timeout), AutoRead: true, num);
if (!bResult)
{
bResult = pDeviceInfo.m_IDeviceAdapter.Device_BeginIdentify(Convert.ToByte(pSensorInfo.sensorser), Convert.ToInt32(pSensorInfo.timeout), AutoRead: true, num);
if (!bResult)
{
bResult = pDeviceInfo.m_IDeviceAdapter.Device_BeginIdentify(Convert.ToByte(pSensorInfo.sensorser), Convert.ToInt32(pSensorInfo.timeout), AutoRead: true, num);
}
}
Thread.Sleep(1);
AntInfo[] antList2 = AntList;
foreach (AntInfo item2 in antList2)
{
if (item2.m_iCombineId == num && !Task.Factory.StartNew(delegate
{
Deal_Data(item2.m_iCombineId);
}).Wait(Convert.ToInt32(pSensorInfo.timeout)))
{
item2.IsReading = false;
item2.readType = 0;
DealNoData(num, v: true);
item2.ReadData = null;
}
}
if (bResult)
{
LogInfo.Info("发送连续读取指令成功,合并编号:" + num);
}
else
{
LogInfo.Info("发送连续读取指令失败,合并编号:" + num);
}
}
else
{
LogInfo.Info("发送连续读取指令失败,合并编号:" + num);
}
}
catch (Exception ex)
{
LogInfo.Info("发送连续读取指令异常:" + ex.ToString());
}
}
/// <summary>
/// 连续盘点超时处理
/// </summary>
/// <param name="num">传感合并编号</param>
/// <param name="v">触发方式</param>
private void DealNoData(int num, bool v)
{
if (v)
{
LogInfo.Info("》》》触发读取时间超时返回Nodata合并编号" + num);
RecSendDataAction?.Invoke(Convert.ToInt32(num), null);
}
else
{
LogInfo.Info("》》》MES主动读取时间超时返回Nodata合并编号" + num);
ReadDataAction?.Invoke(Convert.ToInt32(num), null);
}
Device_StopIdentify(num);
if (!Device_StopIdentify(num))
{
Device_StopIdentify(num);
}
if (!Device_StopIdentify(num))
{
Device_StopIdentify(num);
}
}
/// <summary>
/// 停止连续盘点
/// </summary>
/// <param name="num">传感器合并编号</param>
/// <returns></returns>
public bool Device_StopIdentify(int num)
{
bool bResult = false;
DeviceInfo pDeviceInfo = null;
Sensor pSensorInfo = null;
pDeviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
pSensorInfo = GetSensorInfoByCombineId(Convert.ToUInt32(num));
LogInfo.Info("合并编号:" + num + ",发送停止连续读取标签命令自报");
try
{
if (pDeviceInfo.m_IDeviceAdapter != null)
{
if (pDeviceInfo.m_IDeviceAdapter.Device_StopIdentify(Convert.ToByte(pSensorInfo.sensorser)))
{
LogInfo.Info("发送停止连续读取指令成功,合并编号:" + num);
return true;
}
LogInfo.Info("发送停止连续读取指令失败,合并编号:" + num);
return false;
}
LogInfo.Info("发送停止连续读取指令失败,合并编号:" + num);
return false;
}
catch (Exception ex)
{
LogInfo.Info("发送停止连续读取指令异常:" + ex.ToString());
return false;
}
}
/// <summary>
/// 客户端连续盘点
/// </summary>
/// <param name="num">传感器合并编号</param>
/// <returns></returns>
public async Task Device_MESBeginIdentify(int num)
{
await Task.Run(delegate
{
bool flag = false;
DeviceInfo deviceInfo = null;
Sensor sensor = null;
deviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
sensor = GetSensorInfoByCombineId(Convert.ToUInt32(num));
LogInfo.Info("合并编号:" + num + ",MES主动发送连续读取标签命令");
AntInfo[] antList = AntList;
foreach (AntInfo antInfo in antList)
{
if (antInfo.m_iCombineId == num)
{
if (antInfo.IsReading)
{
LogInfo.Info("合并编号:" + num + ",当前正在读取,请等待上一次读取返回!");
return;
}
antInfo.IsReading = true;
antInfo.readType = 2;
}
}
try
{
if (deviceInfo.m_IDeviceAdapter != null)
{
flag = deviceInfo.m_IDeviceAdapter.Device_BeginIdentify(Convert.ToByte(sensor.sensorser), Convert.ToInt32(sensor.timeout), AutoRead: false, num);
AntInfo[] antList2 = AntList;
foreach (AntInfo item in antList2)
{
if (item.m_iCombineId == num && !Task.Factory.StartNew(delegate
{
Deal_Data(item.m_iCombineId);
}).Wait(Convert.ToInt32(sensor.timeout)))
{
item.IsReading = false;
DealNoData(num, v: false);
item.ReadData = null;
}
}
}
else
{
LogInfo.Info("MES主动发送连续读取指令失败合并编号" + num);
}
}
catch (Exception ex)
{
LogInfo.Info("MES主动发送连续读取指令异常:" + ex.ToString());
}
});
}
/// <summary>
/// 读取单条EPC
/// </summary>
/// <param name="id">传感器合并编号</param>
/// <returns></returns>
public string ReadEPCData(int id)
{
byte[] pEpc = null;
string m_data = "";
try
{
LogInfo.Info("合并编号:" + id + ",识别单次标签命令");
//pEpc = GetOneEpcByCombineId(Convert.ToUInt32(id));
if (pEpc != null)
{
LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
LogInfo.Info("识别单次标签成功,合并编号[" + id + "],读取标签数据:" + Encoding.ASCII.GetString(pEpc, 0, pEpc.Length) + ",原始数据:" + bytesToHexStr(pEpc, pEpc.Length));
LogInfo.Info("-------------------------------------------------------------------------------------------------------------");
m_data = Encoding.ASCII.GetString(pEpc, 0, pEpc.Length);
//ReadDataAction?.Invoke(id, pEpc);
}
else
{
LogInfo.Info("------------------------------------------------------------------------------------------------------");
LogInfo.Info("识别单次标签成功,合并编号[" + id + "]读取标签数据NoData");
LogInfo.Info("------------------------------------------------------------------------------------------------------");
ReadDataAction?.Invoke(id, null);
}
}
catch (Exception ex)
{
LogInfo.Info("Deal_IdentifyOneEpc异常:" + ex.ToString());
ReadDataAction?.Invoke(id, null);
}
return m_data;
}
public void WriteAlarmLight(int num,string code)
{
bool flag = false;
try
{
DeviceInfo deviceInfo = null;
//Sensor sensor = null;
deviceInfo = GetIDeviceInfoByCombineId(Convert.ToUInt32(num));
//sensor = GetSensorInfoByCombineId(Convert.ToUInt32(num));
if (deviceInfo.m_IDeviceAdapter != null)
{
flag = deviceInfo.m_IDeviceAdapter.Device_WriteAlarmLight(int.Parse(code), 10000);
//Thread.Sleep(3000);
//flag = deviceInfo.m_IDeviceAdapter.Device_WriteAlarmLight(2,2000);
//Thread.Sleep(3000);
//flag = deviceInfo.m_IDeviceAdapter.Device_WriteAlarmLight(3,2000);
}
}
catch (Exception ex)
{
}
}
}
}