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> EquipStateAction; public Action> ReadDataAction; public Action> RecSendDataAction; public Action RecGetDataAction; public Action RecAutoDataAction; public List equipList; public List listGroup; public List m_SensorInfoList; public List m_AntInfoInfoList; public List 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 CombineDataList = new List(); public static AntInfo[] AntList; public CombineData CombineData; public bool TagInventory; /// /// 初始化设备天线信息 /// 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; } } /// /// 初始化创建设备实例 /// public void Init() { CombineData = new CombineData(); DeviceInfo pDeviceInfo = null; m_DeviceInfoList = new List(); 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(); } /// /// 创建设备动态链接库 /// /// /// 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; } } /// /// 设备数据处理函数 /// public void CreatEquipClient() { if (equipList == null) { LogInfo.Info("设备信息表为空!"); return; } m_bgwDeviceDetect.DoWork += bgwDeviceDetect_DoWork; m_bgwDeviceDetect.RunWorkerAsync(this); } /// /// 监听设备数据事件 /// /// /// 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); } } } /// /// 监听MES主动读取后数据返回事件 /// /// /// /// /// /// /// 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); } } /// /// 根据设备编号获取传感器合并编号 /// /// 传感器编号 /// 设备编号 /// 传感器类型 /// 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; } /// /// 监听自动上报后数据返回事件 /// /// 数据长度 /// 数据 /// 天线 /// 设备编号 /// 传感器编号 /// 传感器类型 public void RecvIdentifyData_Instance(ushort iLen, List 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(); } /// /// 主动读取设备数据函数 /// /// 传感器合并编号 /// 过滤区 /// 过滤偏移量 /// 过滤数据长度 /// 过滤数据 /// 数据区 /// 数据地址偏移量 /// 数据长度 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); } } /// /// 根据设备编号返回设备信息 /// /// 设备编号 /// 设备信息 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; } /// /// 根据传感器合并编号获取设备信息 /// /// 传感器编号 /// 设备信息 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; } /// /// 根据传感器编号返回传感器信息 /// /// 传感器编号 /// 传感器信息 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; } /// /// 写入数据 /// /// 传感器合并编号 /// 过滤区 /// 过滤偏移量 /// 过滤数据长度 /// 过滤数据 /// 数据区 /// 数据地址偏移量 /// 数据长度 /// 写入数据 /// 天线号 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()); } } /// /// 主动读取EPC发送给客户端 /// /// 传感器合并编号 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 rfiddata) { List tags = new List(); 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); } } /// /// 根据合并编号主动读取EPC返回原始数据 /// /// 传感器编号 /// 原始数据 private List GetOneEpcByCombineId(uint iCombineId) { List 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; } /// /// 根据设备编号返回设备动态类 /// /// /// 设备动态类 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 action) { RecAutoDataAction = action; } public void RecEquipState(Action> action) { EquipStateAction = action; } public void RecGetData(Action action) { RecGetDataAction = action; } public void RecSendData(Action> action) { RecSendDataAction = action; } public void RetReadData(Action> action) { ReadDataAction = action; } public void SensorInfo(List sensorList) { m_SensorInfoList = sensorList; } public void EquipInfo(List equipList) { this.equipList = equipList; } /// /// 根据传感器合并编号处理数据 /// /// 传感器合并编号 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); } } } } /// /// 开始连续盘点 /// /// 传感器合并编号 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()); } } /// /// 连续盘点超时处理 /// /// 传感合并编号 /// 触发方式 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); } } /// /// 停止连续盘点 /// /// 传感器合并编号 /// 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; } } /// /// 客户端连续盘点 /// /// 传感器合并编号 /// 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()); } }); } /// /// 读取单条EPC /// /// 传感器合并编号 /// 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) { } } } }