using LolaiService.Global; using Rovinj.Device; using Rovinj.Log; using Rovinj.Reader; using Rovinj.Reader.Silion; using Rovinj.Tunnel; using Rovinj.Tunnel.Plc; namespace LolaiService.Devices.Tunnel { /// /// 隧道机实现类 /// public class RfidTunnel : IRfidTunnel { /// /// 是否开始校验数量 /// private volatile bool isStartCheckTags; /// /// 扫描ID的标签 /// private string tagsScanId; /// /// 标签ID列表,可以是EPC或TID /// private List tagIdList = new List(); /// /// 当前PLC的状态 /// private PlcStatus currentPlcStatus; /// /// 隧道是否已连接 /// //private bool isTunnelConnected; /// ///通道机接口 /// //private ITunnel tunnel; /// /// 线程退出标识 /// private CancellationTokenSource cancellationTokenSource; /// /// 检查标签线程 /// private Thread checkTagsThread; /// /// Silion读写器,支持R2000/E310/E710芯片,支持1、2、3、4、8、16口天线 /// private SilionReader silionReader; /// /// 通道机读写器状态变化事件 /// /// /// public void Tunnel_ReaderStateChanged(ITunnel tunnel, TunnelReaderStateChangedEventArgs e) { LogHelper.Error("e.RunningState:" + e.RunningState); if (e.RunningState == 0) { //停止业务 LogHelper.Info("停止业务"); } else if (e.RunningState == 1) { //启动业务 tagsScanId = e.ScanId; LogHelper.Info("启动业务"); } else { LogHelper.Info("其他状态"); //其他状态 } } /// /// 标签报告事件 /// /// /// public void Tunnel_TagsReported(ITunnel tunnel, TunnelTagsReportedEventArgs e) { LogHelper.Error("e.Tags.Count:" + e.Tags.Count); for (int i = 0; i < e.Tags.Count; i++) { Tag tag = e.Tags[i]; //过滤掉不符合扫描ID的标签 if (tag.ScanId != tagsScanId) continue; //如果配置为"TID"且TID不为空,则使用TID;否则使用EPC。检查标签ID是否已存在于 tagIdList 中,避免重复添加。 if (tunnel.TunnelConfig.TagIdFieldName == "TID" && !string.IsNullOrEmpty(tag.TID)) { if (tagIdList.Contains(tag.TID)) continue; tagIdList.Add(tag.TID); LogHelper.Info("tag.TID:" + tag.TID); } else { if (tagIdList.Contains(tag.EPC)) continue; tagIdList.Add(tag.EPC); LogHelper.Info("tag.TID:" + tag.TID); } } } /// /// 通道机PLC状态变化事件 /// /// /// public void Tunnel_PlcStateChanged(ITunnel tunnel, TunnelPlcStateChangedEventArgs e) { currentPlcStatus = e.PlcStatus;//记录当前PLC状态 LogHelper.Info("通道机PLC状态变化事件:" + e.PlcStatus); } /// /// 通道机错误接收事件 /// /// /// /// public void Tunnel_ErrorReceived(ITunnel tunnel, TunnelErrorReceivedEventArgs e) { // 在控制台输出错误信息,包括错误消息和异常详情 Console.WriteLine($"错误信息:{e.ErrorMessage},异常:{e.Exception}"); LogHelper.Error("通道机错误接收事件:" + $"错误信息:{e.ErrorMessage},异常:{e.Exception}"); } /// /// 关闭通道机连接 /// /// /// public void CloseTunnel() { if (GlobalData.tunnel == null) return; if (GlobalData.tunnel.Reader.IsStarted) { GlobalData.tunnel.StopReader(); } StopTunnel(); GlobalData.tunnel.Close(); GlobalData.tunnel = null; GlobalData.isTunnelConnected = false; } /// /// 停止隧道 /// private void StopTunnel() { if (GlobalData.tunnel.IsStarted) GlobalData.tunnel.Stop(); isStartCheckTags = false; if (cancellationTokenSource != null) cancellationTokenSource.Cancel(); if (checkTagsThread != null) checkTagsThread.Join(); } /// /// 连接隧道 /// /// 配置RFID读写器参数 /// 配置PLC连接方式 /// 配置读写器连接方式 public bool ConnectTunnel(SilionReaderConfig readerConfig, ConnectionConfig plcConnectionConfig, TunnelConfig tunnelConfig) { if (!GlobalData.isTunnelConnected) { //创建并打开隧道 GlobalData.tunnel = TunnelFactory.CreateTunnel(TunnelType.SC201, tunnelConfig);//根据实际的设备选择对应的类型,这里假设是SC201 GlobalData.tunnel.TagsReported += Tunnel_TagsReported; //读到标签时触发; GlobalData.tunnel.ReaderStateChanged += Tunnel_ReaderStateChanged; //读写器状态变化 GlobalData.tunnel.PlcStateChanged += Tunnel_PlcStateChanged; //PLC 状态变化 GlobalData.tunnel.ErrorReceived += Tunnel_ErrorReceived; //收到错误时触发 if (GlobalData.tunnel.Open()) { LogHelper.Info("连接成功"); GlobalData.isTunnelConnected = true; //获取读写器能力(支持的发射功率列表) silionReader = GlobalData.tunnel.Reader as SilionReader; if (silionReader.ReaderCapability != null) { //发射率列表 List doubles = new List(); for (int i = 0; i < silionReader.ReaderCapability.TxPowers.Count; i++) { doubles.Add(silionReader.ReaderCapability.TxPowers[i]); LogHelper.Info("发射率列表:" + silionReader.ReaderCapability.TxPowers[i]); } } if (GlobalData.tunnel.Initialize())//复位 { LogHelper.Info("复位成功"); //语音提示 //SoundPlayer player = new SoundPlayer(); //player.Play(); } return true; } else { LogHelper.Error("连接失败"); GlobalData.tunnel.Close(); GlobalData.isTunnelConnected = false; return false; } } else { CloseTunnel(); return false; } } /// /// 隧道关门 /// /// public string CloseDoor() { if (GlobalData.tunnel == null) { return "隧道机未连接"; } if (GlobalData.tunnel.CloseDoor()) { return "已关门"; } else { return "关门失败"; } //MessageBox.Show(string.Format(crm.GetString("ExecuteCommandFailed"), btn_CloseDoor.Text)); } /// /// 隧道开门 /// /// public string OpenDoor() { if (GlobalData.tunnel == null) { return "隧道机未连接"; } if (GlobalData.tunnel.OpenDoor()) { return "已开门"; } else { return "开门失败"; } } } }