diff --git a/SysTunnelNuget.sln b/SysTunnelNuget.sln
new file mode 100644
index 0000000..d183b5b
--- /dev/null
+++ b/SysTunnelNuget.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36623.8 d17.14
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TunnelNuget", "TunnelNuget\TunnelNuget.csproj", "{7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITunnel", "UITunnel\UITunnel.csproj", "{974DBE1D-C300-4BAA-8163-F7D7AA99CED4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {974DBE1D-C300-4BAA-8163-F7D7AA99CED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {974DBE1D-C300-4BAA-8163-F7D7AA99CED4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {974DBE1D-C300-4BAA-8163-F7D7AA99CED4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {974DBE1D-C300-4BAA-8163-F7D7AA99CED4}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {57D3B418-10FA-47A0-9EAF-3CDC901A6EF1}
+ EndGlobalSection
+EndGlobal
diff --git a/TunnelNuget/IRfidTunnel.cs b/TunnelNuget/IRfidTunnel.cs
new file mode 100644
index 0000000..fb27774
--- /dev/null
+++ b/TunnelNuget/IRfidTunnel.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Rovinj.Tunnel;
+using Rovinj.Reader.Silion;
+using Rovinj.Device;
+namespace TunnelNuget
+{
+ ///
+ /// 隧道机接口
+ ///
+ public interface IRfidTunnel
+ {
+ ///
+ /// 连接通道机
+ ///
+ bool ConnectTunnel(SilionReaderConfig readerConfig, ConnectionConfig plcConnectionConfig, TunnelConfig tunnelConfig);
+
+ ///
+ /// 关闭通道机
+ ///
+ ///
+ void CloseTunnel();
+
+ ///
+ /// 标签报告事件
+ ///
+ ///
+ ///
+ void Tunnel_TagsReported(ITunnel tunnel, TunnelTagsReportedEventArgs e);
+ ///
+ /// 通道机读写器状态变化事件
+ ///
+ ///
+ ///
+ void Tunnel_ReaderStateChanged(ITunnel tunnel, TunnelReaderStateChangedEventArgs e);
+ ///
+ /// 通道机PLC状态变化事件
+ ///
+ ///
+ ///
+ void Tunnel_PlcStateChanged(ITunnel tunnel, TunnelPlcStateChangedEventArgs e);
+
+ ///
+ /// 通道机错误事件
+ ///
+ ///
+ ///
+ void Tunnel_ErrorReceived(ITunnel tunnel, TunnelErrorReceivedEventArgs e);
+ }
+}
diff --git a/TunnelNuget/InfoParams.cs b/TunnelNuget/InfoParams.cs
new file mode 100644
index 0000000..9a4f690
--- /dev/null
+++ b/TunnelNuget/InfoParams.cs
@@ -0,0 +1,214 @@
+using Rovinj.Device;
+using Rovinj.Reader.Silion;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TunnelNuget
+{
+ ///
+ /// 参数列表
+ ///
+ public class InfoParams
+ {
+ ///
+ /// Plc连接工厂
+ ///
+ public class PlcConnectionParams
+ {
+ ///
+ /// Ip地址
+ ///
+ public string Address { get; set; }
+ ///
+ /// 端口号
+ ///
+ public ushort Port { get; set; } = 502;
+ ///
+ /// 波特率
+ ///
+ public int BaudRate { get; set; } = 9600;
+ ///
+ /// 连接模式
+ ///
+ public ConnectionMode Mode { get; set; }
+ }
+
+ ///
+ /// 工厂/构建方法:根据参数创建配置对象
+ ///
+ public static class PlcConnectionFactory
+ {
+ public static ConnectionConfig Create(PlcConnectionParams parameters)
+ {
+ if (parameters == null) throw new ArgumentNullException(nameof(parameters));
+
+ var config = new ConnectionConfig
+ {
+ ConnectionMode = parameters.Mode
+ };
+
+ // 设置网络相关字段
+ switch (parameters.Mode)
+ {
+ case ConnectionMode.Network:
+ config.ConnectionMode = parameters.Mode;
+ config.NetworkAddress = parameters.Address;
+ config.NetworkPort = parameters.Port;
+ break;
+ case ConnectionMode.Serial:
+ config.ConnectionMode = parameters.Mode;
+ config.SerialPortName = parameters.Address;
+ config.BaudRate = parameters.BaudRate;
+ break;
+ case ConnectionMode.USB:
+ config.ConnectionMode = parameters.Mode;
+ config.Address = parameters.Address;
+ break;
+ // 未来扩展…… 继续加
+ default:
+ throw new NotSupportedException($"不支持的连接模式: {parameters.Mode}");
+ }
+ return config;
+ }
+ }
+
+
+ ///
+ /// 参数对象:读写器连接参数
+ ///
+ public class ReaderConnectionParams
+ {
+ ///
+ /// 天线数量
+ ///
+ public object[] Args { get; set; }
+ ///
+ /// IP地址
+ ///
+ public string Address { get; set; }
+ ///
+ /// 连接模式
+ ///
+ public ConnectionMode Mode { get; set; }
+ }
+
+
+ ///
+ /// 工厂/构建方法:根据参数创建读取/写入器的连接配置对象
+ ///
+ public static class ReaderConnectionFactory
+ {
+ public static ConnectionConfig Create(ReaderConnectionParams parameters)
+ {
+ if (parameters == null) throw new ArgumentNullException(nameof(parameters));
+
+ var config = new ConnectionConfig
+ {
+ ConnectionMode = parameters.Mode
+ };
+
+ // 设置网络相关字段(当前示例为网络模式)
+ switch (parameters.Mode)
+ {
+ case ConnectionMode.Network:
+ config.Args = new object[] { parameters.Args };
+ config.ConnectionMode = parameters.Mode;
+ config.NetworkAddress = parameters.Address;
+ break;
+ // 未来扩展…… 继续加
+ default:
+ throw new NotSupportedException($"不支持的连接模式: {parameters.Mode}");
+ }
+
+ return config;
+ }
+ }
+
+ ///
+ /// 参数对象:RFID 读写器参数
+ ///
+ public class SilionReaderParams
+ {
+ ///
+ /// Q值,-1=DynamicQ, 0~15时为StaticQ
+ ///
+ public int QValue { get; set; } = 5;
+ ///
+ /// Gen2会话,取值范围为0、1、2、3
+ ///
+ public int Session { get; set; } = 1;
+ ///
+ /// 读取TID
+ ///
+ public bool ReadTID { get; set; } = false;
+ ///
+ /// 目标,0=A, 1=B, 2=AB, 3=BA
+ ///
+ public int Target { get; set; } = 0;
+ ///
+ /// 0=FM0, 1=M2, 2=M4, 3=M8
+ ///
+ public int RfMode { get; set; } = 1;
+ ///
+ /// 快速模式
+ ///
+ public bool IsFastRead { get; set; } = true;
+ ///
+ /// 0:快速模式;1:快速模式-读距离优先;2:快速模式-读次数优先;3:Ex10快速模式;4:按照给定的Gen2参数进行设置
+ ///
+ public int QuickModeType { get; set; } = 3;
+
+ ///
+ /// 天线
+ ///
+ public int AntCount { get; set; } = 4; // 天线数量,默认 4
+ ///
+ /// 天线功率,单位 dBm
+ ///
+ public double PowerDbm { get; set; } = 30;
+ }
+
+ ///
+ /// 工厂/构建方法:根据参数创建 SilionReaderConfig 对象
+ ///
+ public static class SilionReaderFactory
+ {
+ public static SilionReaderConfig Create(SilionReaderParams parameters)
+ {
+ if (parameters == null) throw new ArgumentNullException(nameof(parameters));
+
+ // 基础配置
+ var readerConfig = new SilionReaderConfig
+ {
+ Qvalue = parameters.QValue,
+ Session = parameters.Session,
+ ReadTID = parameters.ReadTID,
+ Target = parameters.Target,
+ RfMode = parameters.RfMode,
+ IsFastRead = parameters.IsFastRead,
+ QuickModeType = parameters.QuickModeType,
+ Antennas = new List()
+ };
+ // 确保天线数量至少为 1,避免出现无天线的情况。
+ int antCount = Math.Max(1, parameters.AntCount);
+ for (int i = 0; i < antCount; i++)
+ {
+ readerConfig.Antennas.Add(new SilionAntennaConfig
+ {
+ IsEnabled = true,
+ PortNumber = (ushort)(i + 1),
+ TxPowerInDbm = (int)parameters.PowerDbm
+ });
+ }
+
+ return readerConfig;
+ }
+ }
+
+
+
+ }
+}
diff --git a/TunnelNuget/Properties/AssemblyInfo.cs b/TunnelNuget/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8bdb991
--- /dev/null
+++ b/TunnelNuget/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("TunnelNuget")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("TunnelNuget")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("7b9289e9-0ae5-40a8-b5f8-1dcd5fc9f4e3")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/TunnelNuget/RfidTunnel.cs b/TunnelNuget/RfidTunnel.cs
new file mode 100644
index 0000000..d61d4f6
--- /dev/null
+++ b/TunnelNuget/RfidTunnel.cs
@@ -0,0 +1,245 @@
+using Rovinj.Device;
+using Rovinj.Reader.Silion;
+using Rovinj.Tunnel;
+using Rovinj.Tunnel.Plc;
+using Rovinj.Reader;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Media;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Rovinj.Log;
+
+namespace TunnelNuget
+{
+ ///
+ /// 隧道机实现类
+ ///
+ 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 RfidTunnel() { }
+
+ ///
+ /// 通道机读写器状态变化事件
+ ///
+ ///
+ ///
+ 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 (tunnel == null)
+ return;
+
+ if (tunnel.Reader.IsStarted)
+ {
+ tunnel.StopReader();
+ }
+
+ StopTunnel();
+ tunnel.Close();
+ tunnel = null;
+ isTunnelConnected = false;
+ }
+
+ ///
+ /// 停止隧道
+ ///
+ private void StopTunnel()
+ {
+ if (tunnel.IsStarted)
+ 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 (!isTunnelConnected)
+ {
+ //创建并打开隧道
+ tunnel = TunnelFactory.CreateTunnel(TunnelType.SC201, tunnelConfig);//根据实际的设备选择对应的类型,这里假设是SC201
+ tunnel.TagsReported += Tunnel_TagsReported; //读到标签时触发;
+ tunnel.ReaderStateChanged += Tunnel_ReaderStateChanged; //读写器状态变化
+ tunnel.PlcStateChanged += Tunnel_PlcStateChanged; //PLC 状态变化
+ tunnel.ErrorReceived += Tunnel_ErrorReceived; //收到错误时触发
+ if (tunnel.Open())
+ {
+ LogHelper.Info("连接成功");
+
+ isTunnelConnected = true;
+
+ //获取读写器能力(支持的发射功率列表)
+ silionReader = 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 (tunnel.Initialize())//复位
+ {
+ LogHelper.Info("复位成功");
+ //语音提示
+ SoundPlayer player = new SoundPlayer();
+ player.Play();
+ }
+ return true;
+ }
+ else
+ {
+ LogHelper.Error("连接失败");
+ tunnel.Close();
+ isTunnelConnected = false;
+ return false;
+ }
+ }
+ else
+ {
+ CloseTunnel();
+ return false;
+ }
+ }
+
+ }
+}
diff --git a/TunnelNuget/Rovinj.Device.dll b/TunnelNuget/Rovinj.Device.dll
new file mode 100644
index 0000000..0ceb592
Binary files /dev/null and b/TunnelNuget/Rovinj.Device.dll differ
diff --git a/TunnelNuget/Rovinj.Reader.Silion.dll b/TunnelNuget/Rovinj.Reader.Silion.dll
new file mode 100644
index 0000000..b5ac507
Binary files /dev/null and b/TunnelNuget/Rovinj.Reader.Silion.dll differ
diff --git a/TunnelNuget/Rovinj.Reader.dll b/TunnelNuget/Rovinj.Reader.dll
new file mode 100644
index 0000000..14b3ac7
Binary files /dev/null and b/TunnelNuget/Rovinj.Reader.dll differ
diff --git a/TunnelNuget/Rovinj.Tunnel.dll b/TunnelNuget/Rovinj.Tunnel.dll
new file mode 100644
index 0000000..035f601
Binary files /dev/null and b/TunnelNuget/Rovinj.Tunnel.dll differ
diff --git a/TunnelNuget/TunnelNuget.csproj b/TunnelNuget/TunnelNuget.csproj
new file mode 100644
index 0000000..680b7cd
--- /dev/null
+++ b/TunnelNuget/TunnelNuget.csproj
@@ -0,0 +1,79 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {7B9289E9-0AE5-40A8-B5F8-1DCD5FC9F4E3}
+ Library
+ Properties
+ TunnelNuget
+ TunnelNuget
+ v4.6.1
+ 512
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Rovinj.Reader.Silion.1.4.3.3\lib\net461\ModuleAPI.dll
+
+
+ ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+ ..\packages\Rovinj.Device.1.2.0\lib\net461\Rovinj.Device.dll
+
+
+ ..\packages\Rovinj.Log.1.1.0\lib\net461\Rovinj.Log.dll
+
+
+ ..\packages\Rovinj.Reader.1.4.3\lib\net461\Rovinj.Reader.dll
+
+
+ ..\packages\Rovinj.Reader.Silion.1.4.3.3\lib\net461\Rovinj.Reader.Silion.dll
+
+
+ ..\packages\Rovinj.Tunnel.1.9.0\lib\net461\Rovinj.Tunnel.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
\ No newline at end of file
diff --git a/TunnelNuget/packages.config b/TunnelNuget/packages.config
new file mode 100644
index 0000000..feb9099
--- /dev/null
+++ b/TunnelNuget/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TunnelNuget/tunnelPlc.dll b/TunnelNuget/tunnelPlc.dll
new file mode 100644
index 0000000..d38d4a4
Binary files /dev/null and b/TunnelNuget/tunnelPlc.dll differ
diff --git a/UITunnel/App.config b/UITunnel/App.config
new file mode 100644
index 0000000..731f6de
--- /dev/null
+++ b/UITunnel/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UITunnel/Program.cs b/UITunnel/Program.cs
new file mode 100644
index 0000000..7e0ea2a
--- /dev/null
+++ b/UITunnel/Program.cs
@@ -0,0 +1,136 @@
+using Rovinj.Device;
+using Rovinj.Log;
+using Rovinj.Reader;
+using Rovinj.Reader.Silion;
+using Rovinj.Tunnel;
+using Rovinj.Tunnel.Plc;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TunnelNuget;
+using static TunnelNuget.InfoParams;
+
+namespace UITunnel
+{
+ internal class Program
+ {
+ ///
+ /// 模拟连接隧道机
+ ///
+ static void Main(string[] args)
+ {
+ //创建日志目录
+ if (!Directory.Exists("log"))
+ Directory.CreateDirectory("log");
+
+ //初始化日志组件(仅供测试使用)
+ Rovinj.Log.LogHelper.InitLogger(new Rovinj.Log.TextLog($"log\\{DateTime.Now:yyyy-MM-dd}.log"));
+
+ //隧道机业务层
+ RfidTunnel rfidTunnel = new RfidTunnel();
+
+ ////配置RFID读写器参数
+ #region 自定义 配置RFID读写器参数
+ //SilionReaderConfig readerConfig = new SilionReaderConfig()
+ //{
+ // Qvalue = 5,
+ // Session = 1,
+ // ReadTID = false,
+ // Target = 0,
+ // RfMode = 1,
+ // IsFastRead = true,
+ // QuickModeType = 3,
+ // Antennas = new List(),
+ //};
+ //double power = 30; //功率
+ //int antCount = 4; //4个天线
+
+ ////根据用户输入的天线数量(默认 4 个),给每个天线端口配置功率和启用状态。
+ //for (int i = 0; i < antCount; i++)
+ //{
+ // readerConfig.Antennas.Add(new SilionAntennaConfig()
+ // {
+ // IsEnabled = true,
+ // PortNumber = (ushort)(i + 1),
+ // TxPowerInDbm = power
+ // });
+ //}
+ #endregion
+ var readerParams = new SilionReaderParams
+ {
+ QValue = 5,
+ Session = 1,
+ ReadTID = false,
+ Target = 0,
+ RfMode = 1,
+ IsFastRead = true,
+ QuickModeType = 3,
+ AntCount = 4,
+ PowerDbm = 30
+ };
+
+ SilionReaderConfig readerConfig = SilionReaderFactory.Create(readerParams);
+
+ #region 配置PLC连接方式
+
+ //ConnectionConfig plcConnectionConfig = new ConnectionConfig();
+ //plcConnectionConfig.ConnectionMode = ConnectionMode.Network; //网口连接模式
+ //plcConnectionConfig.NetworkAddress = "192.168.1.250"; //PLC IP地址
+ //plcConnectionConfig.NetworkPort = 502; //PLC 端口号
+ #endregion
+ var PlcParameters = new PlcConnectionParams
+ {
+ Address = "192.168.1.250",
+ Mode = ConnectionMode.Network,
+ Port = 502
+ };
+ ConnectionConfig plcConnectionConfig = PlcConnectionFactory.Create(PlcParameters);
+
+ #region 配置读写器连接方式
+
+ //ConnectionConfig readerConnectionConfig = new ConnectionConfig();
+ //readerConnectionConfig.Args = new object[] { antCount }; //天线数量,默认是4个天线,支持1,2,4,8,16
+ //readerConnectionConfig.ConnectionMode = ConnectionMode.Network; //网口连接模式
+ //readerConnectionConfig.NetworkAddress = "192.168.1.100";
+ #endregion
+ var ReaderParameters = new ReaderConnectionParams
+ {
+ Args = new object[] { 4 },
+ Mode = ConnectionMode.Network,
+ Address = "192.168.1.100"
+
+ };
+ ConnectionConfig readerConnectionConfig = ReaderConnectionFactory.Create(ReaderParameters);
+
+
+
+ //封装成隧道配置 根据用户选择,判断是三菱还是西门子 PLC。
+ TunnelConfig tunnelConfig = new TunnelConfig()
+ {
+ PlcType = PlcType.Mitsubishi_FX5U, //PLC类型
+ PlcConnectionConfig = plcConnectionConfig, //PLC连接配置
+ ReaderConnectionConfig = readerConnectionConfig, //读写器连接配置
+ ReaderConfig = readerConfig, //读写器配置
+ ReaderType = Rovinj.Tunnel.Reader.ReaderType.Silion //读写器类型
+ };
+
+ //西门子PLC暂时不支持使用串口的通讯方式
+ if ((tunnelConfig.PlcType == PlcType.Mitsubishi_FX5U || tunnelConfig.PlcType == PlcType.Siemens)
+ && tunnelConfig.PlcConnectionConfig.ConnectionMode != ConnectionMode.Network)
+ {
+ LogHelper.Error("暂不支持的连接方式!");
+ return;
+ }
+
+ //是否连接成功
+ bool result = rfidTunnel.ConnectTunnel(readerConfig, plcConnectionConfig, tunnelConfig);
+ if (result)
+ {
+
+ }
+ }
+ }
+}
diff --git a/UITunnel/Properties/AssemblyInfo.cs b/UITunnel/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..639fa5d
--- /dev/null
+++ b/UITunnel/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("UITunnel")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("UITunnel")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("974dbe1d-c300-4baa-8163-f7d7aa99ced4")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/UITunnel/UITunnel.csproj b/UITunnel/UITunnel.csproj
new file mode 100644
index 0000000..c57d2d0
--- /dev/null
+++ b/UITunnel/UITunnel.csproj
@@ -0,0 +1,103 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {974DBE1D-C300-4BAA-8163-F7D7AA99CED4}
+ Exe
+ UITunnel
+ UITunnel
+ v4.6.1
+ 512
+ true
+ true
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Rovinj.Reader.Silion.1.4.3.3\lib\net461\ModuleAPI.dll
+
+
+ ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+ ..\packages\Rovinj.Device.1.2.0\lib\net461\Rovinj.Device.dll
+
+
+ ..\packages\Rovinj.Log.1.1.0\lib\net461\Rovinj.Log.dll
+
+
+ ..\packages\Rovinj.Reader.1.4.3\lib\net461\Rovinj.Reader.dll
+
+
+ ..\packages\Rovinj.Reader.Silion.1.4.3.3\lib\net461\Rovinj.Reader.Silion.dll
+
+
+ ..\packages\Rovinj.Tunnel.1.9.0\lib\net461\Rovinj.Tunnel.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {7b9289e9-0ae5-40a8-b5f8-1dcd5fc9f4e3}
+ TunnelNuget
+
+
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
\ No newline at end of file
diff --git a/UITunnel/packages.config b/UITunnel/packages.config
new file mode 100644
index 0000000..feb9099
--- /dev/null
+++ b/UITunnel/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file