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.

1645 lines
72 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using Mesnac.Log;
using System.Runtime.InteropServices;
using System.Threading;
using System.Configuration;
using System.Collections;
using System.ComponentModel;
namespace Mesnac.DeviceAdapter.Fuchs
{
[ClassInterface(ClassInterfaceType.None)]
public class FuchsAdapter : IDeviceAdapter
{
#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;
#endregion
public int AutoReport
{
get { return AutoReport; }
set { AutoReport = value; }
}
public int Filter
{
get { return Filter; }
set { Filter = value; }
}
//private void InitAnt()
//{
// for (int i = 0; i < 8; i++)
// {
// AntInfo a = new AntInfo();
// AntList[i] = a;
// }
//}
#region 设备连接部分
public bool Device_Init(CommType iCommType, string pUrl, DeviceType iDeviceType)
{
try
{
//InitAnt();
m_iDeviceType = iDeviceType;
//LogService.Instance.Debug("函数调用: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);
LogService.Instance.Info("设备初始化成功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);
LogService.Instance.Info("设备初始化成功,串口号:" + m_strIp + "波特率:" + m_iPort);
}
}
}
catch (Exception ex)
{
LogService.Instance.Error("连接读写器异常:" + 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
{
LogService.Instance.Warn("Device_Connect:连接失败");
return false;
}
}
else
{
return false;
}
}
catch (Exception ex)
{
LogService.Instance.Error("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 void Deal_HFIdentify(byte[] ValidData)
{
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 (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);
}
}
public bool Device_DealValidPack(byte[] ValidData)
{
//UInt16 iDataLen = 0;
//LogService.Instance.Debug("----接受的数据:"+ StringChange.bytesToHexStr(ValidData, 18) + ",函数调用:Device_DealValidPack 开始!");
//LogService.Instance.Debug("----函数调用:Device_DealValidPack 开始!" + StringChange.bytesToHexStr(ValidData, 12));
//LogService.Instance.Debug("Pepperl_Fuchs 进入Device_DealValidPack解析函数");
try
{
//switch (ValidData[2])
//{
// case 0X19: //高频读头开始连续识别指令
// if (ValidData[4] == 0X05)
// {
// s_BeginEvent.Release();
// }
// else if(ValidData[4] == 0X00)//高频读头处理数据
// {
// Deal_HFIdentify(ValidData);
// }
// else
// {
// LogService.Instance.Debug("ValidData[2] == 0x00未知指令\r\n");
// return false;
// }
// break;
// case 0X00: //心跳
// if (ValidData[4] == 0x40)
// {
// Deal_HeartData(ValidData);
// }
// else
// {
// LogService.Instance.Debug("ValidData[2] == 0x00未知指令\r\n");
// return false;
// }
// break;
// case 0X02://高频及超高频读头停止连续识别指令
// Deal_StopIdentify(ValidData);
// break;
// case 0X71: //超高频读头连续读取指令
// if (ValidData[4] == 0X05)
// {
// s_UHFBeginEvent.Release();
// }
// else if (ValidData[4] == 0X00)
// {
// Deal_MESIdentify(ValidData);
// }
// else
// {
// LogService.Instance.Debug("ValidData[2] == 0x71未知指令\r\n");
// return false;
// }
// break;
// case 0X0A: //高频及超高频停止连续读取指令
// if (ValidData[4] == 0X05)
// {
// //LogService.Instance.Debug("----函数调用:Device_DealValidPackNoRead!");
// m_ReadDataLen = 0;
// m_ReadDataSuccessful = false;
// m_ReadSem.Release();
// }
// else if(ValidData[4] == 0X00)
// {
// Deal_UHFReadData(ValidData);
// }
// else
// {
// LogService.Instance.Debug("ValidData[2] == 0x0A未知指令\r\n");
// return false;
// }
// break;
// case 0X10: //高频读头单次读标签指令
// if (ValidData[4] == 0X05)
// {
// m_ReadDataLen = 0;
// m_ReadDataSuccessful = false;
// m_ReadSem.Release();
// }
// else if(ValidData[4] == 0X00)
// {
// Deal_ReadData(ValidData);
// }
// else
// {
// LogService.Instance.Debug("ValidData[2] == 0x10未知指令\r\n");
// return false;
// }
// break;
// case 0X05://高频读头NoData
// break;
// case 0X04://设置读头工作模式高频or超高频
// Deal_SetAntCT(ValidData);
// break;
// case 0X0D:
// Deal_UHFWriteData(ValidData);
// break;
// case 0XBF:
// Deal_SetSignelModel(ValidData);
// break;
// default:
// LogService.Instance.Debug("未知指令\r\n");
// return false;
//}
#region 01.08修改解析函数
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.Debug("----函数调用: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();
LogService.Instance.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.Debug("函数调用: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.Debug("函数调用: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 if (ValidData[2] == 0X01)
{
Deal_ReadTidData(ValidData);
}
else
{
m_ReadDataLen = 0;
m_OneEpcDataLen = 0;
}
break;
}
#endregion
}
catch (Exception ex)
{
LogService.Instance.Error("Device_DealValidPack异常" + ex.Message);
return false;
}
return true;
}
private void Deal_ReadTidData(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_ReadDataLen - 6];
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_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)
{
if (AntList[4].UHFAntenna == true)
{
LogService.Instance.Debug("第5路超高频传感器停止指令接收成功释放信号量");
//dic.Remove(5);
AntList[4].m_StopResult.Release();
}
else
{
LogService.Instance.Debug("第1路传感器停止指令接收成功释放信号量");
AntList[0].m_StopResult.Release();
}
}
else if (ValidData[3] == 0X04)
{
if (AntList[5].UHFAntenna == true)
{
LogService.Instance.Debug("第6路超高频传感器停止指令接收成功释放信号量");
//dic.Remove(6);
AntList[5].m_StopResult.Release();
}
else
{
LogService.Instance.Debug("第2路传感器停止指令接收成功释放信号量");
AntList[1].m_StopResult.Release();
}
}
else if (ValidData[3] == 0X06)
{
if (AntList[6].UHFAntenna == true)
{
LogService.Instance.Debug("第7路超高频传感器停止指令接收成功释放信号量");
//dic.Remove(7);
AntList[6].m_StopResult.Release();
}
else
{
LogService.Instance.Debug("第3路传感器停止指令接收成功释放信号量");
AntList[2].m_StopResult.Release();
}
}
else if (ValidData[3] == 0X08)
{
if (AntList[7].UHFAntenna == true)
{
LogService.Instance.Debug("第8路超高频传感器停止指令接收成功释放信号量");
//dic.Remove(8);
AntList[7].m_StopResult.Release();
}
else
{
LogService.Instance.Debug("第4路传感器停止指令接收成功释放信号量");
AntList[3].m_StopResult.Release();
}
}
}
private void Deal_UHFReadData(byte[] ValidData)
{
m_ReadDataLen = (byte)ValidData[1];
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);
m_ReadDataSuccessful = true;
m_ReadSem.Release();
}
private void MessageReturn(byte Antenna)
{
LogService.Instance.Debug("接收到数据,第"+Antenna+"号传感器类型readType = " + AntList[Antenna - 1].readType);
if (AntList[Antenna - 1].readType == 2)//MES读
{
LogService.Instance.Debug("MES主动读取" + Antenna + "号传感器释放信号量");
if (RecvIdentifyData_ToMES_Event != null)
{
RecvIdentifyData_ToMES_Event(Convert.ToUInt16(m_OneEpcData.Length), m_OneEpcData, Antenna, m_iDeviceId, m_strIp);
}
}
else /*if (AntList[Antenna - 1].readType == 2)//自动读*/
{
LogService.Instance.Debug("自动读取" + Antenna + "号传感器释放信号量");
if (RecvIdentifyDataEvent != null)
{
RecvIdentifyDataEvent(Convert.ToUInt16(m_OneEpcData.Length), m_OneEpcData, Antenna, m_iDeviceId, m_strIp);
}
}
//AntList[Antenna - 1].IsReading = false;
LogService.Instance.Debug("天线" + Antenna + " 号 m_WaitResult释放");
AntList[Antenna - 1].m_WaitResult.Release();
LogService.Instance.Debug("天线" + Antenna + " 号 m_WaitResult释放2");
}
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.Debug("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)
{
s_UHFBeginEvent.Release();
LogService.Instance.Info("s_UHFBeginEvent释放信号量");
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.Debug("接收自报数据:" + 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);
//2020年4月7日 16:30:48 最新修改取消反写标签
//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)
{
//LogService.Instance.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 (Membank == G2MemBank.EPC)
{
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;
}
}
else if (Membank == G2MemBank.TID)
{
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] = 0x01;
if (Antenna < 5)
{
pMessagePack.m_pData[3] = (byte)(0x00 + (Antenna * 2));
}
}
//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;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_ReadSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
//if (m_ReadDataLen > 0) //有数据,正常
if (m_ReadDataLen > 0)
{
if (Membank == G2MemBank.TID)
{
pReadData = new byte[m_OneEpcData.Length];
Array.Copy(m_OneEpcData, 0, pReadData, 0, m_OneEpcData.Length);
iResult = (byte)(pReadData.Length);
m_ReadDataLen = 0;
}
else
{
pReadData = new byte[WordCnt];
Array.Copy(m_OneEpcData, WordPtr, pReadData, 0, WordCnt);
iResult = (byte)(pReadData.Length);
m_ReadDataLen = 0;
}
//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.Warn("读取标签数据失败,与过滤标签不符!");
//}
}
else
{
iResult = 0;
m_ReadDataLen = 0;
LogService.Instance.Warn("读取标签数据失败,返回数据长度为0");
}
}
else //超时
{
m_ReadDataLen = 0;
iResult = 0;
LogService.Instance.Error("读取标签数据失败,超时未返回");
}
}
else
{
LogService.Instance.Error("发送读取标签数据命令失败");
iResult = 0;
}
}
catch (Exception ex)
{
LogService.Instance.Error("读取标签数据异常:" + ex.Message);
iResult = 0;
}
//finally
//{
// m_GlobalSem.Release();
//}
return iResult;
}
public byte Device_SendHeartPack()
{
byte iResult = 0;
try
{
//LogService.Instance.Debug("函数调用: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
{
//通讯连接器失败或网络故障
LogService.Instance.Info("发送心跳报文失败,通讯故障。");
iResult = 3;
//Device_Destroy();
}
}
else
{
return 3;
}
}
catch (Exception ex)
{
LogService.Instance.Error("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;
#region
/************************************************************************************
* Description:
*
* Author:
*
* Emailbaogq@mesnac.com
* Finish DateTime:
* 2019619 11:24:39
* History:
***********************************************************************************/
#endregion
//string strFilterData = m_strFilterData.Trim();//过滤数据去空白字符
//UInt16 iFilterDataLength = Convert.ToUInt16(strFilterData.Length / 2);//过滤长度
//UInt16 filterOffset = Convert.ToUInt16(m_strFilterOffset.Trim()); //过滤偏移
//byte[] pFilterData = new byte[iFilterDataLength];
//for (int i = 0; i < iFilterDataLength; i++)
//{
// pFilterData[i] = Convert.ToByte(strFilterData.Substring(i * 2, 2), 16); //过滤数据
//}
//UInt16 readOffset = Convert.ToUInt16(m_strReadOffset.Trim()); //读取偏移
//UInt16 readLength = Convert.ToUInt16(m_strReadLength.Trim()); //读取长度
UInt16 iFilterDataLength = 0;
UInt16 filterOffset = 0;
byte[] pFilterData = new byte[1];
UInt16 readOffset = 0;
UInt16 readLength = 9;
iResult = (byte)Device_Read(G2MemBank.EPC, filterOffset, iFilterDataLength, pFilterData,
G2MemBank.EPC, readOffset, readLength, ref pReadData, Antenna);
//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);
}
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
{
LogService.Instance.Info("函数调用:Device_Write写入内容" + StringChange.bytesToHexStr(pWriteData, WordCnt));
m_GlobalSem.WaitOne(-1, false);
Fuchs_Write(filterMembank, filterWordPtr, filterWordCnt, filterData, Membank, WordPtr, WordCnt, pWriteData, Antenna);
m_GlobalSem.Release();
for (int i = 0; i < 3; i++)
{
LogService.Instance.Debug("Device_Write 写入的长度: " + WordCnt);
iReadLen = Device_Read(filterMembank, filterWordPtr, filterWordCnt, filterData, Membank, WordPtr, WordCnt, ref pReadData, Antenna);
LogService.Instance.Debug("Device_Read 读取的长度: " + iReadLen);
if (iReadLen == WordCnt)
{
if (StringChange.CompareBytes(pReadData, pWriteData, WordCnt)) //写入的跟读出的一样
{
return 1;
}
else //写入的跟读出的不一样
{
iResult = 2;
}
}
else
{
iResult = 0;
}
}
}
catch (Exception ex)
{
LogService.Instance.Error("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 = 20; //发送指令帧长度
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 = 6 + WordCnt; //高频写标签指令帧长度
pMessagePack.m_pData = new byte[iSendDataLen];
Array.Clear(pMessagePack.m_pData, 0, iSendDataLen);//清空为0
pMessagePack.m_pData[0] = 0X00; //
pMessagePack.m_pData[1] = (byte)(WordCnt + 6); //
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
{
LogService.Instance.Info("发送写入命令失败");
return 0;
}
}
catch (Exception ex)
{
LogService.Instance.Error("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)) //等待结果,并取结果返回。
{
LogService.Instance.Info("传感器设置CT成功");
bResult = true;
}
else //超时
{
bResult = false;
LogService.Instance.Info("传感器设置CT失败");
}
}
else
{
LogService.Instance.Info("传感器设置CT超时");
bResult = false;
}
}
catch (Exception ex)
{
LogService.Instance.Error("传感器设置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 (AntList[Antenna - 1].m_StopResult.WaitOne(5000, false)) //等待结果,并取结果返回。
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,发送停止连续识别命令成功!");
bResult = true;
}
else //超时
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,发送停止连续识别命令超时!");
bResult = false;
}
}
else
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,发送停止连续识别命令失败!");
bResult = false;
}
}
catch (Exception ex)
{
LogService.Instance.Error("第[" + Antenna + "]路传感器,发送停止连续识别命令异常:" + ex.Message);
bResult = false;
}
//finally
//{
// m_GlobalSem.Release();
//}
return bResult;
}
private void WaitTimePanDianData(byte Antenna, int timeout, bool atuoRead) //MES主动盘点等待数据返回函数
{
LogService.Instance.Info("第[" + Antenna + "]路传感器测试1");
AntList[Antenna - 1].m_WaitResult.WaitOne(1, false);
LogService.Instance.Info("第[" + Antenna + "]路传感器测试2");
if (AntList[Antenna - 1].m_WaitResult.WaitOne(timeout, false))
{
LogService.Instance.Debug("收到数据,当前第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
if (atuoRead)
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,自动读释放信号量");
}
else
{
LogService.Instance.Info("第[" + Antenna + "]路传感器MES读释放信号量");
}
AntList[Antenna - 1].readType = 0;
LogService.Instance.Debug("收到数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
AntList[Antenna - 1].m_Waiting.Release();
}
else
{
LogService.Instance.Debug("未收到数据,当前第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
if (atuoRead)
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,自动读未释放信号量");
if (RecvIdentifyDataEvent != null)
{
RecvIdentifyDataEvent(0, null, Antenna, m_iDeviceId, m_strIp);
}
}
else
{
LogService.Instance.Info("第[" + Antenna + "]路传感器MES读未释放信号量");
if (RecvIdentifyData_ToMES_Event != null)
{
RecvIdentifyData_ToMES_Event(0, null, Antenna, m_iDeviceId, m_strIp);
}
}
AntList[Antenna - 1].readType = 0;
LogService.Instance.Debug("未收到数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
AntList[Antenna - 1].m_Waiting.Release();
Device_StopIdentify(Antenna);
}
}
public bool Device_BeginIdentify(byte Antenna, int timeout, bool AutoRead)
{
#region 等第一次读取信号释放,再进行下一次
//if (AntList[Antenna - 1].readType > 0)
//{
// if (AntList[Antenna - 1].IsReading)//上次触发未返回
// {
// AntList[Antenna - 1].m_Waiting.WaitOne(timeout, false);
// LogService.Instance.Debug("-------------------上次读取未释放信号量");
// //已经有读取的信号了等待信号量释放,且不再进行盘点
// return false;
// }
//}
//else
//{
// if (AutoRead)
// {
// AntList[Antenna - 1].readType = 1;//自动读取
// }
// else
// {
// AntList[Antenna - 1].readType = 2;//主动读取
// }
// AntList[Antenna - 1].IsReading = true;
//}
#endregion
LogService.Instance.Debug("开始连续识别,第" + 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.Debug("上次读取已返回数据,再次进行读取后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
//AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
//LogService.Instance.Debug("上次读取已返回数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
}
else
{
LogService.Instance.Debug("上次读取未返回数据,再次进行读取后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
//上一次执行没有返回
AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
LogService.Instance.Debug("上次读取未返回数据,重新赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
}
}
else
{
AntList[Antenna - 1].readType = AutoRead ? 1 : 2;
LogService.Instance.Debug("赋值后第" + Antenna + "号传感器类型readType = " + AntList[Antenna - 1].readType);
}
#endregion
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 m_bgwWaitingForData = new Thread(() => WaitTimePanDianData(Antenna, timeout, AutoRead));
m_bgwWaitingForData.IsBackground = true;
m_bgwWaitingForData.Start();
if (IsUHFAnt)//超高频读头发送连续识别
{
if (s_UHFBeginEvent.WaitOne(2000, false)) //等待结果,并取结果返回。
{
LogService.Instance.Info("第[" + Antenna + "]路超高频传感器,发送连续识别命令成功!");
bResult = true;
}
else //超时
{
bResult = false;
LogService.Instance.Info("第[" + Antenna + "]路超高频传感器,发送连续识别命令超时!");
}
}
else
{
if (s_BeginEvent.WaitOne(2000, false)) //等待结果,并取结果返回。
{
LogService.Instance.Info("第[" + Antenna + "]路高频传感器,发送连续识别命令成功!");
bResult = true;
}
else //超时
{
bResult = false;
LogService.Instance.Info("第[" + Antenna + "]路高频传感器,发送连续识别命令超时!");
}
}
}
else
{
LogService.Instance.Info("第[" + Antenna + "]路传感器,发送开始连续识别命令失败!");
bResult = false;
}
}
catch (Exception ex)
{
LogService.Instance.Error("第[" + Antenna + "]路传感器,发送开始连续识别命令异常:" + ex.Message);
bResult = 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)
{
LogService.Instance.Error("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, 5)) > 0)
{
LogService.Instance.Info("Device_GetReportData获取自报数据" + "数据长度" + iReadLen);
pReadData = new byte[iReadLen + 1];
pReadData[0] = iReadLen;
Array.Copy(pTemp, 0, pReadData, 1, iReadLen);
mut.ReleaseMutex();
return (ushort)(iReadLen + 1);
}
else
{
mut.ReleaseMutex();
return 0;
}
}
public ushort Device_GetIdentifyData(ref byte[] pReadData, byte Antenna)
{
ushort iResult = 0;
try
{
LogService.Instance.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;
LogService.Instance.Info("Device_GetIdentifyData:" + StringChange.bytesToHexStr(pReadData, pReadData.Length));
return iResult;
}
else
{
return 0;
}
}
}
catch (Exception ex)
{
LogService.Instance.Error("获得识别期间数据异常:" + ex.Message);
return 0;
}
}
#endregion
}
}