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#

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;
1 month ago
public Action<int, List<TagInfo>> ReadDataAction;
1 month ago
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;
}
1 month ago
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;
1 month ago
//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("------------------------------------------------------------------------------------------------------");
1 month ago
//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>
1 month ago
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)
{
1 month ago
//if (iLen == 1)
//{
// LogInfo.Info("------------------------------------------------------------------------------------------------------");
// LogInfo.Info("光电自报合并编号[" + iCombineId + "]的第[" + Antenna + "]号传感器,原始数据:" + bytesToHexStr(pData, pData.Length));
// LogInfo.Info("------------------------------------------------------------------------------------------------------");
// RecAutoDataAction?.Invoke(Convert.ToInt32(iCombineId), pData);
// return;
//}
LogInfo.Info("------------------------------------------------------------------------------------------------------");
1 month ago
//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;
1 month ago
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("------------------------------------------------------------------------------------------------------");
1 month ago
//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 + ",识别单次标签命令自报");
1 month ago
//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("-------------------------------------------------------------------------------------------------------------");
1 month ago
//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);
}
});
}
1 month ago
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>
1 month ago
private List<TagInfo> GetOneEpcByCombineId(uint iCombineId)
{
1 month ago
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)
{
1 month ago
tagInfos = pDeviceAdapter.Device_GetAllIdentifyData(Convert.ToByte(m_SensorInfoList[i].sensorser), Convert.ToUInt16(m_SensorInfoList[i].DelayTime), 1);
if (tagInfos.Count > 0)
{
1 month ago
return tagInfos;
}
return null;
}
}
1 month ago
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;
}
1 month ago
public void RecSendData(Action<int, List<TagInfo>> action)
{
RecSendDataAction = action;
}
1 month ago
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 + ",识别单次标签命令");
1 month ago
//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);
1 month ago
//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;
}
1 month ago
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)
{
3 weeks ago
flag = deviceInfo.m_IDeviceAdapter.Device_WriteAlarmLight(int.Parse(code), 10000);
1 month ago
//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)
{
}
}
}
}