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.

1543 lines
67 KiB
C#

using System;
1 month ago
using System.Collections.Generic;
using System.ComponentModel;
//using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Threading;
namespace Mesnac.DeviceAdapter.Fuchs
{
[ClassInterface(ClassInterfaceType.None)]
public class FuchsAdapter : IDeviceAdapter
{
public log4net.ILog LogInfo = log4net.LogManager.GetLogger("RollingLogFileAppender"); //Logging 名字要在 App.config 中能找到
#region 全局变量声明
//Dictionary<byte, int> dic = new Dictionary<byte, int>();
public AntInfo[] AntList = AntListInfo.AntList;//0没有读取状态1主动读2被动读
private DeviceType m_iDeviceType = DeviceType.Fuchs;
ICommunicateService m_ICommunicateService = null;
public event RecvIdentifyData RecvIdentifyDataEvent = null;
public event RecvIdentifyData RecvIdentifyData_ToMES_Event = null; //MES主动读取委托
private BackgroundWorker m_WaitingDealData = new BackgroundWorker();
public UInt16 m_iDeviceId = 0;
private string m_strIp; //读写器IP或串口号
private int m_iPort; //读写器端口号或波特率
//private readonly string m_ReadTimeout = ConfigurationManager.AppSettings["ReadTimeout"]; //读取失败,重新读取延时时间
//private readonly string m_ReadCount = ConfigurationManager.AppSettings["ReadCounts"]; //读取失败,重新读取次数
//private readonly string m_ReadDbm = ConfigurationManager.AppSettings["ReadDbm"];
//private readonly string m_WriteDbm = ConfigurationManager.AppSettings["WriteDbm"];
//private readonly string m_AnalysisFlag = ConfigurationManager.AppSettings["AnalysisFlag"]; //1按照次数最多返回条码2按照平均功率最大返回条码
//private readonly string m_strFilterData = ConfigurationManager.AppSettings["FilterData"]; //过滤数据
//private readonly string m_strFilterOffset = ConfigurationManager.AppSettings["FilterOffset"]; //过滤偏移默认为0
//private readonly string m_strReadOffset = ConfigurationManager.AppSettings["ReadOffset"]; //读取偏移默认为0
//private readonly string m_strReadLength = ConfigurationManager.AppSettings["ReadLength"]; //读取偏移默认为8
private Mutex mut = new Mutex();
private bool m_BeginEventSuccessful = false;
private UInt16 m_IdentifyDataLen = 0;
private byte[] m_IdentifyData = new byte[19];
private Semaphore s_BeginEvent = new Semaphore(0, 100000);
private bool IsUHFAnt = false;
private Semaphore s_UHFBeginEvent = new Semaphore(0, 100000);//超高频读头
//private ManualResetEvent BeginEvent = new ManualResetEvent(false);
private Semaphore m_WaitingForData = new Semaphore(0, 100000);
public bool TagInventory_Lable = true;//连续盘点标签标志
//private BackgroundWorker m_bgwWaitingForData = new BackgroundWorker();
private Semaphore m_GlobalSem = new Semaphore(1, 1);
private byte m_ReadDataLen = 0;
private byte[] m_ReadData = null;
private bool m_bWriteSuccedTag = false;
private Semaphore m_WriteSem = new Semaphore(0, 100000);
private bool m_bSetSignleModel = false;
private Semaphore m_SetSignelModelSem = new Semaphore(0, 100000);
private bool m_ReadDataSuccessful = false;
private Semaphore m_ReadSem = new Semaphore(0, 100000);
private bool m_GetHeartSuccessful = false;
private Semaphore m_GetHeartSem = new Semaphore(0, 100000);
private Semaphore m_MulEpcSem = new Semaphore(0, 100000);
private Semaphore m_StopSem = new Semaphore(0, 100000);
private bool m_StopIdentifySuccessful = false;
private Semaphore m_OneEpcSem = new Semaphore(0, 100000);
private bool m_SetDbmSuccessful = false;
private Semaphore m_SetDbmSem = new Semaphore(0, 100000);
private int m_BarcodeGroupCount = 0;
private byte[] m_MulAllData = null;
private byte[] m_AutoReadEPC = null;
private int m_readEPCDataLen = 0;
private byte m_OneEpcDataLen = 0;
private byte[] m_OneEpcData = null;
private byte[] m_filterData = null;
private byte[] m_CompareData = null;
private bool bRereadData = false;
private byte m_OneEpcAntenna = 254;
private bool TagInventory;
#endregion
public int AutoReport
{
get { return AutoReport; }
set { AutoReport = value; }
}
public int Filter
{
get { return Filter; }
set { Filter = value; }
}
#region 设备连接部分
public bool Device_Init(CommType iCommType, string pUrl, DeviceType iDeviceType)
{
try
{
//InitAnt();
m_iDeviceType = iDeviceType;
//LogService.Instance.Info("函数调用:Device_Init Start: ");
{
if (iCommType == CommType.RJ45) //网口
{
if (m_ICommunicateService == null)
{
m_ICommunicateService = new BgTcpClient();
}
string[] split = pUrl.Split(new Char[] { ':' });
m_strIp = split[0];
string strTemp = split[1];
m_iPort = Convert.ToInt32(strTemp);
m_ICommunicateService.Init(m_strIp, m_iPort, this);
//LogInfo.Fatal("设备初始化成功IP" + m_strIp + "端口号:" + m_iPort);
}
else //串口,代用串口号和波特率
{
if (m_ICommunicateService == null)
{
return false;
}
string[] split = pUrl.Split(new Char[] { ':' });
m_strIp = split[0];
string strTemp = split[1];
m_iPort = Convert.ToInt32(strTemp);
m_ICommunicateService.Init(m_strIp, m_iPort, this);
//LogInfo.Fatal("设备初始化成功,串口号:" + m_strIp + "波特率:" + m_iPort);
}
}
}
catch (Exception ex)
{
LogInfo.Fatal("IP" + m_strIp + "端口号:" + m_iPort + "连接读写器异常:" + ex.Message);
return false;
}
return true;
}
public bool Device_Init_Id(CommType iCommType, string pUrl, ushort iDeviceId)
{
m_iDeviceId = iDeviceId;
Device_Init(iCommType, pUrl, (DeviceType)1);
return true;
}
public bool Device_Connect()
{
try
{
if (m_ICommunicateService != null)
{
if (m_ICommunicateService.Connect())
{
//LogService.Instance.Info("Device_Connect:连接成功");
return true;
}
else
{
LogInfo.Fatal("IP" + m_strIp + "端口号: " + m_iPort + ",Device_Connect:连接失败");
return false;
}
}
else
{
return false;
}
}
catch (Exception ex)
{
LogInfo.Info("Device_Connect异常" + ex.Message);
return false;
}
}
public void Device_Destroy()
{
m_ICommunicateService.DisConnect();
}
public bool Device_GetState()
{
return m_ICommunicateService.GetState();
}
public bool Device_ReConnect()
{
try
{
if (m_ICommunicateService != null)
{
m_ICommunicateService.DisConnect();
}
}
catch { }
return Device_Connect();
}
#endregion
public bool Device_DealValidPack(byte[] ValidData)
{
//UInt16 iDataLen = 0;
//LogService.Instance.Info("----接受的数据:"+ StringChange.bytesToHexStr(ValidData, 18) + ",函数调用:Device_DealValidPack 开始!");
//LogService.Instance.Info("----函数调用:Device_DealValidPack 开始!" + StringChange.bytesToHexStr(ValidData, 12));
//LogService.Instance.Info("Pepperl_Fuchs 进入Device_DealValidPack解析函数");
try
{
#region 修改解析函数
switch (ValidData[4])
{
case 0x40: //心跳
Deal_HeartData(ValidData);
break;
case 0x05: //未读到标签&&超高频读头连续识别指令返回 Received:00.06.1D.02.FF.1C.00.06.1D.02.05.1D
if (ValidData[1] == 0X06 && ValidData[2] == 0X0A)
{
//LogService.Instance.Info("----函数调用:Device_DealValidPackNoRead!");
m_ReadDataLen = 0;
m_ReadDataSuccessful = false;
m_ReadSem.Release();
}
else if (ValidData[2] == 0X19) //高频读头发送连续识别指令返回
{
s_BeginEvent.Release();
}
else if (ValidData[2] == 0X71)//超高频读头发送连续识别指令返回
{
s_UHFBeginEvent.Release();
//LogInfo.Info("发送连续识别指令接收返回帧,释放信号量");
}
else if (ValidData[2] == 0X10)
{
m_ReadDataLen = 0;
m_ReadDataSuccessful = false;
m_ReadSem.Release();
}
//else if (ValidData[0] == 0X00 && ValidData[1] == 0X06 && ValidData[2] == 0X02 && ValidData[3] == 0X02) //停止连续识别返回
//{
// m_StopIdentifySuccessful = true;
// m_StopSem.Release();
//}
break;
case 0X04: //多标签超高频读头接收报文
if (ValidData[0] == 0X00 && ValidData[4] == 0X04)
{
byte bDataLen = 5;
m_ReadDataLen = (byte)ValidData[7];
//m_OneEpcDataLen = m_ReadDataLen;
m_OneEpcDataLen = (byte)(m_ReadDataLen - bDataLen);
m_OneEpcData = new byte[m_OneEpcDataLen];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 10, m_OneEpcData, 0, m_OneEpcDataLen);
//LogService.Instance.Info("函数调用:Device_DealValidPack数据解析为" + Encoding.ASCII.GetString(m_OneEpcData, 0, 9));
}
else
{
m_ReadDataLen = 0;
m_OneEpcDataLen = 0;
}
m_ReadSem.Release();
break;
case 0X02: //单标签超高频读头
if (ValidData[0] == 0X00 && ValidData[4] == 0X02)
{
//byte bDataLen = 5;
m_ReadDataLen = (byte)ValidData[1];
//m_OneEpcDataLen = m_ReadDataLen;
m_OneEpcDataLen = (byte)(9);
m_OneEpcData = new byte[m_OneEpcDataLen];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 8, m_OneEpcData, 0, m_OneEpcDataLen);
//LogService.Instance.Info("函数调用:Device_DealValidPack数据解析为" + Encoding.ASCII.GetString(m_OneEpcData, 0, 9));
}
else
{
m_ReadDataLen = 0;
m_OneEpcDataLen = 0;
}
m_ReadSem.Release();
break;
case 0X00: //高频及超高频读头接收报文正常有数据
if (ValidData[1] == 0X12 && ValidData[2] == 0X19)
{
Deal_MESIdentify(ValidData);
}
else if (ValidData[1] == 0X12 && ValidData[2] == 0X10)
{
Deal_ReadData(ValidData);
}
else if (ValidData[1] == 0X14 && ValidData[2] == 0X71) //超高频读头设置按时间段连续盘点后自报数据返回
{
Deal_MESIdentify(ValidData);
}
else if (ValidData[1] == 0X14 && ValidData[2] == 0X0A) //超高频读头
{
Deal_UHFReadData(ValidData);
}
else if (ValidData[1] == 0X06 && ValidData[2] == 0X04) //设置读头工作模式返回指令
{
Deal_SetAntCT(ValidData);
}
else if (ValidData[2] == 0X0D)
{
Deal_UHFWriteData(ValidData);
}
else if (ValidData[1] == 0X06 && ValidData[2] == 0X02)//停止连续识别指令
{
Deal_StopIdentify(ValidData);
}
else if (ValidData[2] == 0XBF)
{
Deal_SetSignelModel(ValidData);
}
else
{
m_ReadDataLen = 0;
m_OneEpcDataLen = 0;
}
break;
}
#endregion
}
catch (Exception ex)
{
LogInfo.Info("Device_DealValidPack异常" + ex.Message);
return false;
}
return true;
}
private void Deal_SetSignelModel(byte[] validData)
{
m_SetSignelModelSem.Release();
}
private void Deal_UHFWriteData(byte[] ValidData)
{
m_bWriteSuccedTag = true;
m_WriteSem.Release();
}
private void Deal_SetAntCT(byte[] validData)
{
m_SetDbmSuccessful = true;
m_SetDbmSem.Release();
}
private void Deal_StopIdentify(byte[] ValidData)
{
if (ValidData[3] == 0X02)
{
LogInfo.Info("第1路传感器停止指令接收成功释放信号量");
}
else if (ValidData[3] == 0X04)
{
LogInfo.Info("第2路传感器停止指令接收成功释放信号量");
}
else if (ValidData[3] == 0X06)
{
LogInfo.Info("第3路传感器停止指令接收成功释放信号量");
}
else if (ValidData[3] == 0X08)
{
LogInfo.Info("第4路传感器停止指令接收成功释放信号量");
}
m_StopSem.Release();
}
private void Deal_UHFReadData(byte[] ValidData)
{
m_ReadDataLen = (byte)ValidData[1];
m_OneEpcDataLen = (byte)(9);
m_OneEpcData = new byte[ValidData[1] - 8];
if (ValidData[3] == 0x02)
{
m_OneEpcAntenna = 5;
}
else if (ValidData[3] == 0x04)
{
m_OneEpcAntenna = 6;
}
else if (ValidData[3] == 0x06)
{
m_OneEpcAntenna = 7;
}
else if (ValidData[3] == 0x08)
{
m_OneEpcAntenna = 8;
}
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 8, m_OneEpcData, 0, m_OneEpcData.Length);
m_ReadDataSuccessful = true;
m_ReadSem.Release();
}
private void MessageReturn(byte Antenna)
{
//LogService.Instance.Info("接收到数据,第"+Antenna+"号传感器类型readType = " + AntList[Antenna - 1].readType);
if (RecvIdentifyDataEvent != null)
{
1 month ago
RecvIdentifyDataEvent(Convert.ToUInt16(m_OneEpcData.Length), null, Antenna, m_iDeviceId, m_strIp, "1");
}
}
private void Deal_MESIdentify(byte[] ValidData)
{
if (ValidData[2] == 0X19)
{
//m_ReadDataLen = (byte)ValidData[1];
//m_OneEpcDataLen = Convert.ToByte(Convert.ToString(m_ReadDataLen, 16));
m_OneEpcData = new byte[12];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 6, m_OneEpcData, 0, m_OneEpcData.Length);
Array.Reverse(m_OneEpcData, 0, 4);
Array.Reverse(m_OneEpcData, 4, 4);
Array.Reverse(m_OneEpcData, 8, 4);
//if (RecvIdentifyData_ToMES_Event != null)
//{
//LogService.Instance.Info("Pepperl_Fuchs 进入Deal_MESIdentify解析函数:" + StringChange.bytesToHexStr(ValidData,18));
if (ValidData[3] == 0X32)
{
MessageReturn(1);
}
else if (ValidData[3] == 0X34)
{
MessageReturn(2);
}
else if (ValidData[3] == 0X36)
{
MessageReturn(3);
}
else if (ValidData[3] == 0X38)
{
MessageReturn(4);
}
}
else if (ValidData[2] == 0X71)
{
//add by baogq 2020年5月11日 09:15:20
//2022-03-05 11:12:21 修改托盘标签第七位是R
if (ValidData[14] == 0X52)
{
m_OneEpcData = new byte[7];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 8, m_OneEpcData, 0, m_OneEpcData.Length);
}
else
{
m_OneEpcData = new byte[ValidData[1] - 8];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 8, m_OneEpcData, 0, m_OneEpcData.Length);
}
//LogService.Instance.Info("接收自报数据:" + StringChange.bytesToHexStr(m_OneEpcData, m_OneEpcData.Length));
if (ValidData[3] == 0X02)
{
MessageReturn(5);
}
else if (ValidData[3] == 0X04)
{
MessageReturn(6);
}
else if (ValidData[3] == 0X06)
{
MessageReturn(7);
}
else if (ValidData[3] == 0X08)
{
MessageReturn(8);
}
}
else if (ValidData[2] == 0X10) //高频读头单次读标签
{
m_OneEpcData = new byte[12];
m_ReadDataLen = Convert.ToByte(m_OneEpcData.Length);
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 6, m_OneEpcData, 0, m_OneEpcData.Length);
Array.Reverse(m_OneEpcData, 0, 4);
Array.Reverse(m_OneEpcData, 4, 4);
Array.Reverse(m_OneEpcData, 8, 4);
m_ReadDataSuccessful = true;
m_ReadSem.Release();
}
}
private void Deal_ReadData(byte[] ValidData)//处理读取数据返回帧
{
m_ReadDataLen = (byte)ValidData[1];
//m_OneEpcDataLen = m_ReadDataLen;
m_OneEpcDataLen = Convert.ToByte(Convert.ToString(m_ReadDataLen, 16));
m_OneEpcData = new byte[m_OneEpcDataLen];
Array.Clear(m_OneEpcData, 0, m_OneEpcData.Length);
Array.Copy(ValidData, 6, m_OneEpcData, 0, m_OneEpcDataLen);
Array.Reverse(m_OneEpcData, 0, 4);
Array.Reverse(m_OneEpcData, 4, 4);
Array.Reverse(m_OneEpcData, 8, 4);
m_ReadDataSuccessful = true;
m_ReadSem.Release();
}
private void Deal_HeartData(byte[] ValidData)//处理心跳返回帧
{
try
{
if (ValidData[0] == 0X00 && ValidData[4] == 0x40)
{
m_GetHeartSuccessful = true;
}
else
{
m_GetHeartSuccessful = false;
}
}
catch (Exception ex)
{
m_GetHeartSuccessful = false;
}
m_GetHeartSem.Release();
}
public UInt16 Device_Read(G2MemBank filterMembank, UInt16 filterWordPtr, UInt16 filterWordCnt, Byte[] filterData,
G2MemBank Membank, UInt16 WordPtr, UInt16 WordCnt, ref Byte[] pReadData, byte Antenna, int ReadTimes)
{
UInt16 resuat = 0;
int i_ReadCount = 1;
while (resuat == 0 && ReadTimes > 0)
{
//LogInfo.Info("读取数据第[" + i_ReadCount + "]次");
resuat = Device_Read(filterMembank, filterWordPtr, filterWordCnt, filterData, Membank, WordPtr, WordCnt, ref pReadData, Antenna);
i_ReadCount++;
ReadTimes--;
}
return resuat;
}
public UInt16 Device_Read(G2MemBank filterMembank, UInt16 filterWordPtr, UInt16 filterWordCnt, Byte[] filterData,
G2MemBank Membank, UInt16 WordPtr, UInt16 WordCnt, ref Byte[] pReadData, byte Antenna)
{
byte iResult = 0;
string s_CompareData1 = "";
string s_CompareData2 = "";
try
{
m_GlobalSem.WaitOne(-1, false);
//LogService.Instance.Info("函数调用:Device_Read 开始:");
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[6];
Array.Clear(pMessagePack.m_pData, 0, 6);//清空为0
if (Antenna < 5)
{
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x06;
pMessagePack.m_pData[2] = 16; //读Data区
//1、2、3、4天线为高频读头
pMessagePack.m_pData[3] = (byte)(0X30 + (Antenna * 2));
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x00;
}
//5、6、7、8天线为超高频读头
if (Antenna == 5)
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x04;
pMessagePack.m_pData[2] = 0x0A;
pMessagePack.m_pData[3] = 0x02;
}
else if (Antenna == 6)
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x04;
pMessagePack.m_pData[2] = 0x0A;
pMessagePack.m_pData[3] = 0x04;
}
else if (Antenna == 7)
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x04;
pMessagePack.m_pData[2] = 0x0A;
pMessagePack.m_pData[3] = 0x06;
}
else if (Antenna == 8)
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x04;
pMessagePack.m_pData[2] = 0x0A;
pMessagePack.m_pData[3] = 0x08;
}
//m_filterData = new byte[filterWordCnt];
//m_CompareData = new byte[filterWordCnt];
//if (filterWordCnt > 0)
//{
// Array.Copy(filterData, 0, m_filterData, 0, filterWordCnt);
//}
//Array.Copy(m_filterData, filterWordPtr, m_CompareData, 0, filterWordCnt);
//m_ReadSem.Release(1);
m_ReadSem.WaitOne(1, false);
m_ReadDataLen = 0;
//Thread.Sleep(2000);
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_ReadSem.WaitOne(900, false)) //等待结果,并取结果返回。
{
//if (m_ReadDataLen > 0) //有数据,正常
if (m_ReadDataLen > 0 && m_OneEpcAntenna == Antenna)
{
if (m_OneEpcData[1] == 0X36 || m_OneEpcData[1] == 0X37)
{
pReadData = new byte[7];
Array.Copy(m_OneEpcData, WordPtr, pReadData, 0, pReadData.Length);
}
else
{
pReadData = new byte[WordCnt];
Array.Copy(m_OneEpcData, WordPtr, pReadData, 0, WordCnt);
}
iResult = (byte)(pReadData.Length);
m_ReadDataLen = 0;
m_OneEpcAntenna = 254;
//Array.Copy(m_OneEpcData, filterWordPtr, m_CompareData, 0, filterWordCnt);
//s_CompareData1 = StringChange.bytesToHexStr(m_filterData, m_filterData.Length);
//s_CompareData2 = StringChange.bytesToHexStr(m_CompareData, filterWordCnt);
//if (s_CompareData1 == s_CompareData2 && Membank == G2MemBank.EPC && filterMembank == G2MemBank.EPC)
//{
// pReadData = new byte[WordCnt];
// Array.Copy(m_OneEpcData, WordPtr, pReadData, 0, WordCnt);
// iResult = (byte)(pReadData.Length);
// //LogService.Instance.Info("------------------------------------------------------------------------------------------------------" + "\r\n");
// //LogService.Instance.Info("读取到标签数据为:" + Encoding.ASCII.GetString(pReadData, 0, pReadData.Length) + ",原始数据为: " + StringChange.bytesToHexStr(pReadData, pReadData.Length) + ",数据长度为: " + pReadData.Length + "\r\n");
// //LogService.Instance.Info("------------------------------------------------------------------------------------------------------");
// m_ReadDataLen = 0;
//}
//else
//{
// iResult = 0;
// m_ReadDataLen = 0;
// LogService.Instance.Info("读取标签数据失败,与过滤标签不符!");
//}
}
else
{
iResult = 0;
m_ReadDataLen = 0;
m_OneEpcAntenna = 254;
//LogInfo.Info("读取标签数据失败,返回数据长度为0");
}
}
else //超时
{
m_ReadDataLen = 0;
iResult = 0;
m_OneEpcAntenna = 254;
//LogInfo.Info("读取标签数据失败,超时未返回");
}
}
else
{
//LogInfo.Info("发送读取标签数据命令失败");
iResult = 0;
}
}
catch (Exception ex)
{
//LogInfo.Info("读取标签数据异常:" + ex.Message);
iResult = 0;
}
finally
{
m_GlobalSem.Release();
}
return iResult;
}
public byte Device_SendHeartPack()
{
byte iResult = 0;
try
{
//LogService.Instance.Info("函数调用:Device_SendHeartPack");
m_GlobalSem.WaitOne(-1, false);
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[6];
Array.Clear(pMessagePack.m_pData, 0, 6);//清空为0
//发送读取参数QV指令 00 0A BE 02 00 55 51 56 00 00 只适用于一号天线
//pMessagePack.m_pData[0] = 0x00;
//pMessagePack.m_pData[1] = 0x0A;
//pMessagePack.m_pData[2] = 0xBE;
//pMessagePack.m_pData[3] = 0x02;
//pMessagePack.m_pData[4] = 0x00;
//pMessagePack.m_pData[5] = 0x55;
//pMessagePack.m_pData[6] = 0x51;
//pMessagePack.m_pData[7] = 0x56;
//pMessagePack.m_pData[8] = 0x00;
//pMessagePack.m_pData[9] = 0x00;
//baogq add 2019年6月21日 13:38:53
//心跳指令00 06 0A 2A 00 00
//返回00 06 0A 2A FF 09 00 06 0A 0A 04 0A
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x16;
pMessagePack.m_pData[2] = 10;
pMessagePack.m_pData[3] = 42;
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x00;
m_GetHeartSem.WaitOne(1, false);
//m_GetHeartSuccessful = false;
if (m_ICommunicateService != null)
{
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_GetHeartSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
//LogService.Instance.Info("发送心跳报正常。");
iResult = 1; //通讯连接和读写器都正常
}
else //超时
{
//LogService.Instance.Info("发送心跳报文超时。");
iResult = 2; //通讯连接器正常,读写器故障
//Device_Destroy();
};
}
else
{
//通讯连接器失败或网络故障
LogInfo.Info("发送心跳报文失败,通讯故障。");
iResult = 3;
//Device_Destroy();
}
}
else
{
return 3;
}
}
catch (Exception ex)
{
LogInfo.Info("Device_SendHeartPack" + ex.Message);
iResult = 3;
}
finally
{
m_GlobalSem.Release();
}
m_GetHeartSuccessful = false;
return iResult;
}
public Byte Device_GetOneIdentifyData(ref Byte[] pReadData, Byte Antenna, UInt16 Timedout, int ReadCounts)
{
byte iResult = 0;
UInt16 iFilterDataLength = 0;
UInt16 filterOffset = 0;
byte[] pFilterData = new byte[1];
UInt16 readOffset = 0;
UInt16 readLength = 9;
//Thread.Sleep(Timedout);
iResult = (byte)Device_Read(G2MemBank.EPC, filterOffset, iFilterDataLength, pFilterData,
G2MemBank.EPC, readOffset, readLength, ref pReadData, Antenna, ReadCounts);
//LogService.Instance.Info("过滤偏移:[" + filterOffset + "],过滤长度:[" + iFilterDataLength + "],过滤数据:[" + StringChange.bytesToHexStr(pFilterData, pFilterData.Length) + "],读取偏移:["+ readOffset + "],读取长度:["+ readLength + "]");
if (iResult > 0)
{
//LogService.Instance.Info("函数调用:Device_GetOneIdentifyData成功返回标签数据为" + Encoding.ASCII.GetString(pReadData, 0, pReadData.Length) + "原始数据为:" + StringChange.bytesToHexStr(pReadData, pReadData.Length));
return iResult;
}
else
{
//LogService.Instance.Info("函数调用:Device_GetOneIdentifyData读取失败进入失败重读");
//iResult = (byte)Device_Read(G2MemBank.EPC, filterOffset, iFilterDataLength, pFilterData,
// G2MemBank.EPC, readOffset, readLength, ref pReadData, Antenna, ReadCounts);
iResult = 0;
}
return iResult;
}
public UInt16 Device_Write(G2MemBank filterMembank, UInt16 filterWordPtr, UInt16 filterWordCnt, Byte[] filterData,
G2MemBank Membank, UInt16 WordPtr, UInt16 WordCnt, Byte[] pWriteData, byte Antenna)
{
mut.WaitOne();
byte iResult = 0;
byte[] pReadData = null;
UInt16 iReadLen = 0;
try
{
LogInfo.Info("函数调用:Device_Write写入内容" + StringChange.bytesToHexStr(pWriteData, WordCnt));
for (int i = 0; i < 3; i++)
{
m_GlobalSem.WaitOne(-1, false);
Fuchs_Write(filterMembank, filterWordPtr, filterWordCnt, filterData, Membank, WordPtr, WordCnt, pWriteData, Antenna);
m_GlobalSem.Release();
LogInfo.Info("Device_Write 写入的长度: " + WordCnt);
iReadLen = Device_Read(filterMembank, filterWordPtr, filterWordCnt, filterData, Membank, WordPtr, WordCnt, ref pReadData, Antenna);
LogInfo.Info("Device_Read 读取的长度: " + iReadLen);
if (iReadLen == WordCnt)
{
if (StringChange.CompareBytes(pReadData, pWriteData, iReadLen)) //写入的跟读出的一样
{
return 1;
}
else //写入的跟读出的不一样
{
iResult = 2;
}
}
else
{
iResult = 0;
}
}
}
catch (Exception ex)
{
LogInfo.Info("Device_Write异常" + ex.Message);
mut.ReleaseMutex();
return 0;
}
mut.ReleaseMutex();
return iResult;
}
private UInt16 Fuchs_Write(G2MemBank filterMembank, ushort filterWordPtr, ushort filterWordCnt, byte[] filterData, G2MemBank Membank, ushort WordPtr, ushort WordCnt, byte[] pWriteData, byte Antenna)
{
byte[] u16byte = new byte[2];
byte iResult = 0;
int iSendDataLen;
try
{
MessagePack pMessagePack = new MessagePack();
//00 14 0D E4 00 00 30 00 51 37 31 31 35 30 30 30 31 00 00 00 1号超高频读头写入报文示例
if (Antenna > 4) //超高频读头
{
iSendDataLen = 8 + WordCnt; //发送指令帧长度
pMessagePack.m_pData = new byte[iSendDataLen];
Array.Clear(pMessagePack.m_pData, 0, iSendDataLen);//清空为0
pMessagePack.m_pData[0] = 0X00; //
pMessagePack.m_pData[1] = 0X14; //
pMessagePack.m_pData[2] = 0X0D; //
if (Antenna == 5)
{
pMessagePack.m_pData[3] = 0XE2; //1号超高频读头
}
else if (Antenna == 6)
{
pMessagePack.m_pData[3] = 0XE4; //2号超高频读头
}
else if (Antenna == 7)
{
pMessagePack.m_pData[3] = 0XE6; //3号超高频读头
}
else if (Antenna == 8)
{
pMessagePack.m_pData[3] = 0XE6; //4号超高频读头
}
pMessagePack.m_pData[4] = 0X00; //
pMessagePack.m_pData[5] = 0X00; //
pMessagePack.m_pData[6] = 0X30; //
pMessagePack.m_pData[7] = 0X00; //
if (WordCnt > 0)
{
Array.Copy(pWriteData, 0, pMessagePack.m_pData, 8, WordCnt); //写入数据
}
pMessagePack.m_pData[17] = 0X00;
pMessagePack.m_pData[18] = 0X00;
pMessagePack.m_pData[19] = 0X00;
}
else if (Antenna < 5) //高频读头
{
//00 12 40 32 00 00 31 32 33 34 35 36 37 38 39 00 00 00
iSendDataLen = 18; //高频写标签指令帧长度
pMessagePack.m_pData = new byte[iSendDataLen];
Array.Clear(pMessagePack.m_pData, 0, iSendDataLen);//清空为0
pMessagePack.m_pData[0] = 0X00; //
pMessagePack.m_pData[1] = 0X12; //
pMessagePack.m_pData[2] = 0X40; //
pMessagePack.m_pData[3] = (byte)(0X30 + (Antenna * 2));
pMessagePack.m_pData[4] = 0X00; //
pMessagePack.m_pData[5] = 0X00; //
if (WordCnt > 0)
{
Array.Copy(pWriteData, 0, pMessagePack.m_pData, 6, WordCnt); //写入数据
}
pMessagePack.m_pData[15] = 0X00;
pMessagePack.m_pData[16] = 0X00;
pMessagePack.m_pData[17] = 0X00;
Array.Reverse(pMessagePack.m_pData, 6, 4);
Array.Reverse(pMessagePack.m_pData, 10, 4);
Array.Reverse(pMessagePack.m_pData, 14, 4);
}
//m_WriteSem.Release(1);
m_WriteSem.WaitOne(1, false);
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_WriteSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
if (m_bWriteSuccedTag == true) //有数据,正常
{
iResult = 1;
}
else
{
iResult = 0;
}
}
else //超时
{
iResult = 0;
}
}
else
{
LogInfo.Info("发送写入命令失败");
return 0;
}
}
catch (Exception ex)
{
LogInfo.Info("Fuchs_Write异常" + ex.Message);
return 0;
}
return iResult;
}
public bool Device_SetRf(int iDbi, byte Antenna, WriteOrRead RorW) //设置CT读头模式高频or超高频
{
bool bResult = false;
try
{
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[6];
Array.Clear(pMessagePack.m_pData, 0, 6);//清空为0
if (Antenna < 5)
{
//设置高频CT 00 06 04 02 32 30
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X06;
pMessagePack.m_pData[2] = 0X04; //设置CT
//高频天线号 1234
pMessagePack.m_pData[3] = (byte)(Antenna * 2);
pMessagePack.m_pData[4] = 0x32;
pMessagePack.m_pData[5] = 0x30;
}
else if (Antenna > 4) // 约定5,6,7,8天线号为超高频读头
{
//设置超高频读头CT 00 06 04 04 38 30
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X06;
pMessagePack.m_pData[2] = 0X04; //设置CT
if (Antenna == 5)
{
pMessagePack.m_pData[3] = 0X02;
}
else if (Antenna == 6)
{
pMessagePack.m_pData[3] = 0X04;
}
else if (Antenna == 7)
{
pMessagePack.m_pData[3] = 0X06;
}
else if (Antenna == 8)
{
pMessagePack.m_pData[3] = 0X08;
}
pMessagePack.m_pData[4] = 0x38;
pMessagePack.m_pData[5] = 0x30;
}
m_SetDbmSem.WaitOne(1, false);
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_SetDbmSem.WaitOne(1000, false)) //等待结果,并取结果返回。
{
LogInfo.Info("传感器设置CT成功");
bResult = true;
}
else //超时
{
bResult = false;
LogInfo.Info("传感器设置CT失败");
}
}
else
{
LogInfo.Info("传感器设置CT超时");
bResult = false;
}
}
catch (Exception ex)
{
LogInfo.Info("传感器设置CT异常" + ex.Message);
bResult = false;
}
return bResult;
}
#region 修改按时间段盘点需求
public bool Device_StopIdentify(byte Antenna) //停止指令
{
bool bResult = false;
try
{
MessagePack pMessagePack = new MessagePack();
if (Antenna < 5) //高频读头发送停止连续盘点指令
{
pMessagePack.m_pData = new byte[6];
Array.Clear(pMessagePack.m_pData, 0, 6);//清空为0
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X06;
pMessagePack.m_pData[2] = 0X02; //读Data区
//天线号1234
pMessagePack.m_pData[3] = (byte)(0X30 + (Antenna * 2));
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x00;
}
else if (Antenna > 4) //超高频读头发送停止连续盘点指令
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X04;
pMessagePack.m_pData[2] = 0X02;
if (Antenna == 5)
{
pMessagePack.m_pData[3] = 0X02;
//AntList[Antenna - 1].UHFAntenna = true;
}
else if (Antenna == 6)
{
pMessagePack.m_pData[3] = 0X04;
//AntList[Antenna - 1].UHFAntenna = true;
}
else if (Antenna == 7)
{
pMessagePack.m_pData[3] = 0X06;
//AntList[Antenna - 1].UHFAntenna = true;
}
else if (Antenna == 8)
{
pMessagePack.m_pData[3] = 0X08;
//AntList[Antenna - 1].UHFAntenna = true;
}
}
m_StopSem.WaitOne(1, false);
//AntList[Antenna - 1].m_StopResult.WaitOne(1, false);
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_StopSem.WaitOne(1000, false)) //等待结果,并取结果返回。
{
LogInfo.Info("设备编号[" + m_iDeviceId + "],第[" + Antenna + "]路传感器,发送停止连续识别命令成功!");
bResult = true;
}
else //超时
{
LogInfo.Info("设备编号[" + m_iDeviceId + "],第[" + Antenna + "]路传感器,发送停止连续识别命令超时!");
bResult = false;
}
}
else
{
LogInfo.Info("设备编号[" + m_iDeviceId + "],第[" + Antenna + "]路传感器,发送停止连续识别命令失败!");
bResult = false;
}
}
catch (Exception ex)
{
LogInfo.Info("设备编号[" + m_iDeviceId + "],第[" + Antenna + "]路传感器,发送停止连续识别命令异常:" + ex.Message);
bResult = false;
}
//finally
//{
// m_GlobalSem.Release();
//}
return bResult;
}
private void WaitTimePanDianData(byte Antenna, int timeout, bool atuoRead) //MES主动盘点等待数据返回函数
{
LogInfo.Info("第[" + Antenna + "]路传感器测试1");
AntList[Antenna - 1].m_WaitResult.WaitOne(1, false);
LogInfo.Info("第[" + Antenna + "]路传感器测试2");
if (AntList[Antenna - 1].m_WaitResult.WaitOne(timeout, false))
{
LogInfo.Info("收到数据,当前第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
if (atuoRead)
{
LogInfo.Info("第[" + Antenna + "]路传感器,自动读释放信号量");
}
else
{
LogInfo.Info("第[" + Antenna + "]路传感器MES读释放信号量");
}
AntList[Antenna - 1].readType = 0;
LogInfo.Info("收到数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
AntList[Antenna - 1].m_Waiting.Release();
}
else
{
LogInfo.Info("未收到数据,当前第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
if (atuoRead)
{
LogInfo.Info("第[" + Antenna + "]路传感器,自动读未释放信号量");
if (RecvIdentifyDataEvent != null)
{
RecvIdentifyDataEvent(0, null, Antenna, m_iDeviceId, m_strIp, "1");
}
}
else
{
LogInfo.Info("第[" + Antenna + "]路传感器MES读未释放信号量");
if (RecvIdentifyData_ToMES_Event != null)
{
RecvIdentifyData_ToMES_Event(0, null, Antenna, m_iDeviceId, m_strIp, "1");
}
}
AntList[Antenna - 1].readType = 0;
LogInfo.Info("未收到数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
AntList[Antenna - 1].m_Waiting.Release();
//Device_StopIdentify(Antenna);
}
}
private void Deal_Data(byte Ant)
{
AntList[Ant - 1].ReadData = null;
while (AntList[Ant - 1].IsReading)
{
if (AntList[Ant - 1].ReadData != null)
{
Array.Clear(AntList[Ant - 1].ReadData, 0, AntList[Ant - 1].ReadData.Length);
AntList[Ant - 1].ReadData = null;
AntList[Ant - 1].readType = 0;
AntList[Ant - 1].IsReading = false;
}
}
}
public bool Device_BeginIdentify(byte Antenna, int timeout, bool AutoRead, int num)
{
#region 等第一次读取信号释放,再进行下一次
//if (AntList[Antenna - 1].readType > 0)
//{
// if (AntList[Antenna - 1].IsReading)//上次触发未返回
// {
// AntList[Antenna - 1].m_Waiting.WaitOne(timeout, false);
// LogService.Instance.Info("-------------------上次读取未释放信号量");
// //已经有读取的信号了等待信号量释放,且不再进行盘点
// return false;
// }
//}
//else
//{
// if (AutoRead)
// {
// AntList[Antenna - 1].readType = 1;//自动读取
// }
// else
// {
// AntList[Antenna - 1].readType = 2;//主动读取
// }
// AntList[Antenna - 1].IsReading = true;
//}
#endregion
//LogService.Instance.Info("开始连续识别,第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
#region 接收信号排队进行读取
//if (AntList[Antenna - 1].readType > 0)
//{
// AntList[Antenna - 1].m_Waiting.WaitOne(1, false);
// //已经有读取的信号了等待信号量释放
// if (AntList[Antenna - 1].m_Waiting.WaitOne(timeout, false))
// {
// return false;
// //LogService.Instance.Info("上次读取已返回数据,再次进行读取后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
// //AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
// //LogService.Instance.Info("上次读取已返回数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
// }
// else
// {
// LogService.Instance.Info("上次读取未返回数据,再次进行读取后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
// //上一次执行没有返回
// AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
// LogService.Instance.Info("上次读取未返回数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
// }
//}
//else
//{
// AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
// LogService.Instance.Info("赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
//}
#endregion
//AntList[Antenna - 1].iDeviceId = iDeviceId;
//if (AntList[Antenna - 1].readType > 0 && AntList[Antenna - 1].iDeviceId == iDeviceId)
//{
// if (AntList[Antenna - 1].IsReading && iDeviceId == m_iDeviceId)
// {
// LogService.Instance.Info("》》》IsReading = true" + iDeviceId);
// return false;
// }
// else
// {
// LogService.Instance.Info("》》》IsReading = false" + iDeviceId);
// }
//}
//else
//{
// LogService.Instance.Info("》》》Antenna [" + Antenna + "]readType: " + AntList[Antenna - 1].readType);
// AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
// AntList[Antenna - 1].IsReading = true;
//}
//LogService.Instance.Info("》》》Antenna [" + Antenna + "]readType: " + AntList[Antenna - 1].readType);
//AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
//AntList[Antenna - 1].IsReading = true;
byte[] u16byte = new byte[2];
bool bResult = false;
try
{
MessagePack pMessagePack = new MessagePack();
if (Antenna < 5)
{
pMessagePack.m_pData = new byte[6];
Array.Clear(pMessagePack.m_pData, 0, 6);//清空为0
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X06;
pMessagePack.m_pData[2] = 0X19; //读Data区
//天线号 1234
pMessagePack.m_pData[3] = (byte)(0X30 + (Antenna * 2));
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x00;
IsUHFAnt = false;
}
else if (Antenna > 4) // 约定5,6,7,8天线号为超高频读头
{
pMessagePack.m_pData = new byte[4];
Array.Clear(pMessagePack.m_pData, 0, 4);//清空为0
pMessagePack.m_pData[0] = 0X00;
pMessagePack.m_pData[1] = 0X04;
pMessagePack.m_pData[2] = 0X71;
if (Antenna == 5)
{
pMessagePack.m_pData[3] = 0X02;
}
else if (Antenna == 6)
{
pMessagePack.m_pData[3] = 0X04;
}
else if (Antenna == 7)
{
pMessagePack.m_pData[3] = 0X06;
}
else if (Antenna == 8)
{
pMessagePack.m_pData[3] = 0X08;
}
IsUHFAnt = true;
}
//s_UHFBeginEvent.WaitOne(1, false);
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
//Thread.Sleep(100);
//if (!Task.Factory.StartNew(() => { Deal_Data(Antenna); }).Wait(timeout))
//{
// AntList[Antenna - 1].IsReading = false;
// AntList[Antenna - 1].readType = 0;
// AntList[Antenna - 1].ReadData = null;
// DealNoData(Antenna);
// Device_StopIdentify(Antenna);
// if (!Device_StopIdentify(Antenna)) Device_StopIdentify(Antenna);
// if (!Device_StopIdentify(Antenna)) Device_StopIdentify(Antenna);
//}
//Thread m_bgwWaitingForData = new Thread(() => m_ICommunicateService.Deal_TagInfo(Antenna, timeout));
//m_bgwWaitingForData.IsBackground = true;
//m_bgwWaitingForData.Start();
//bResult = true;
//启动等待数据接受线程
//Thread m_bgwWaitingForData = new Thread(() => WaitTimePanDianData(Antenna, timeout, AutoRead));
//m_bgwWaitingForData.IsBackground = true;
//m_bgwWaitingForData.Start();
if (IsUHFAnt)//超高频读头发送连续识别
{
if (s_UHFBeginEvent.WaitOne(2000, false)) //等待结果,并取结果返回。
{
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路超高频传感器,发送连续识别命令成功!");
bResult = true;
}
else //超时
{
bResult = false;
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路超高频传感器,发送连续识别命令超时!");
}
}
else
{
if (s_BeginEvent.WaitOne(2000, false)) //等待结果,并取结果返回。
{
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路高频传感器,发送连续识别命令成功!");
bResult = true;
}
else //超时
{
bResult = false;
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路高频传感器,发送连续识别命令超时!");
}
}
}
else
{
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路传感器,发送开始连续识别命令失败!");
bResult = false;
//AntList[Antenna - 1].readType = 0;
//AntList[Antenna - 1].IsReading = false;
}
}
catch (Exception ex)
{
LogInfo.Info("传感器编号[" + num + "],第[" + Antenna + "]路传感器,发送开始连续识别命令异常:" + ex.Message);
bResult = false;
//AntList[Antenna - 1].readType = 0;
//AntList[Antenna - 1].IsReading = false;
}
//finally
//{
// m_GlobalSem.Release();
//}
return bResult;
}
#endregion
#region 未实现的函数
public string Device_GetOneIdentifyData(Byte Antenna, UInt16 Timedout)
{
string strResult = "";
int iSendDataLen = 0;
try
{
iSendDataLen = 11;
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[iSendDataLen];
Array.Clear(pMessagePack.m_pData, 0, iSendDataLen);//清空为0
pMessagePack.m_pData[0] = 0x00;
pMessagePack.m_pData[1] = 0x0B;
pMessagePack.m_pData[2] = 0XBF;
pMessagePack.m_pData[3] = (byte)(Antenna * 2);
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x55;
pMessagePack.m_pData[6] = 0x51;
pMessagePack.m_pData[7] = 0x56;
pMessagePack.m_pData[8] = 0x00;
pMessagePack.m_pData[9] = 0x01;
pMessagePack.m_pData[10] = 0x53;
m_SetSignelModelSem.WaitOne(1, false);
if (m_ICommunicateService != null)
{
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_SetSignelModelSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
//LogService.Instance.Info("单标签模式设置成功。");
strResult = "成功"; //通讯连接和读写器都正常
}
else //超时
{
//LogService.Instance.Info("发送心跳报文超时。");
strResult = "超时"; //通讯连接器正常,读写器故障
};
}
else
{
//通讯连接器失败或网络故障
//LogService.Instance.Info("发送心跳报文失败,通讯故障。");
strResult = "失败";
}
}
else
{
return strResult;
}
}
catch (Exception ex)
{
LogInfo.Info("Device_GetOneIdentifyData" + ex.Message);
strResult = "异常";
}
return strResult;
}
public string Device_GetOneIdentifyData_Finish(byte Antenna, ushort Timedout)
{
mut.WaitOne();
return "";
}
public Byte Device_GetOneIdentifyData_Finish(ref byte[] pReadData, byte Antenna, ushort Timedout)
{
mut.WaitOne();
byte iResult = 0;
return iResult;
}
public ushort Device_GetReportData(ref byte[] pReadData, Byte Antenna, UInt32 Timedout)
{
mut.WaitOne();
byte[] pTemp = null;
byte iReadLen = 0;
if ((iReadLen = Device_GetOneIdentifyData(ref pTemp, Antenna, (UInt16)Timedout, 1)) > 0)
{
//LogInfo.Info("设备编号[" + m_iDeviceId + "],第[" + Antenna + "]路超高频传感器,获取自报数:"+ Encoding.ASCII.GetString(pTemp, 0, pTemp.Length));
//LogInfo.Info("Device_GetReportData获取自报数据" + "数据长度" + iReadLen);
pReadData = new byte[iReadLen];
Array.Copy(pTemp, 0, pReadData, 0, iReadLen);
mut.ReleaseMutex();
return (ushort)(iReadLen);
}
else
{
mut.ReleaseMutex();
return 0;
}
}
public ushort Device_GetIdentifyData(ref byte[] pReadData, byte Antenna)
{
ushort iResult = 0;
try
{
LogInfo.Info("函数调用:Device_GetIdentifyData");
lock (m_IdentifyData)
{
if ((m_IdentifyDataLen > 0 && m_IdentifyData[m_IdentifyDataLen - 1] == (Antenna + 1)) || Antenna == 255)
{
iResult = (UInt16)(m_IdentifyDataLen - 1);
pReadData = new byte[m_IdentifyDataLen - 1];
pReadData[0] = (byte)(m_IdentifyDataLen - 3);
pReadData[1] = (byte)Antenna;
Array.Copy(m_IdentifyData, 0, pReadData, 2, m_IdentifyDataLen - 3);
m_IdentifyDataLen = 0;
LogInfo.Info("Device_GetIdentifyData:" + StringChange.bytesToHexStr(pReadData, pReadData.Length));
return iResult;
}
else
{
return 0;
}
}
}
catch (Exception ex)
{
LogInfo.Info("获得识别期间数据异常:" + ex.Message);
return 0;
}
}
public void DealNoData(byte Antenna)
{
if (AntList[Antenna - 1].readType == 2)
{
if (RecvIdentifyData_ToMES_Event != null)
{
RecvIdentifyData_ToMES_Event(0, null, Antenna, m_iDeviceId, m_strIp, "1");
}
}
else
{
if (RecvIdentifyDataEvent != null)
{
RecvIdentifyDataEvent(0, null, Antenna, m_iDeviceId, m_strIp, "1");
}
}
}
1 month ago
public bool Device_WriteAlarmLight(int port, UInt16 Timedout)
{
throw new NotImplementedException();
}
public List<TagInfo> Device_GetAllIdentifyData(byte Antenna, ushort Timedout, int ReadCounts)
{
throw new NotImplementedException();
}
//public List<TagInfo> TagInventoryTimePeriod(byte Antenna, int time)
//{
// List<TagInfo> t = new List<TagInfo> { };
// new System.Threading.Tasks.TaskFactory().StartNew(() => {
// t = LongTimeFunc();
// }).Wait(time);
// bool TagInventory_Lable = true;
// DateTime dt1 = DateTime.Now;
// Device_BeginIdentify(Antenna, time,true);
// while (TagInventory_Lable)
// {
// int dt = (int)DateTime.Now.Subtract(dt1).TotalMilliseconds;
// if (dt > time)
// {
// Device_StopIdentify(Antenna);
// if (!Device_StopIdentify(Antenna)) Device_StopIdentify(Antenna);
// if (!Device_StopIdentify(Antenna)) Device_StopIdentify(Antenna);
// TagInfo TagInfo = new TagInfo();
// TagInfo.Antana = Antenna;
// TagInfo.iDeviceId = m_iDeviceId;
// TagInfo.EPCData = null;
// tagInfoList.Add(TagInfo);
// TagInventory_Lable = false;
// }
// }
// return tagInfoList;
//}
#endregion
}
}