现场优化7

This commit is contained in:
2026-08-27 11:08:36 +08:00
parent 38f594e4aa
commit 6a59552bc7
10 changed files with 1198 additions and 70 deletions
+44 -8
View File
@@ -11,6 +11,11 @@ using System.Threading.Tasks;
namespace ZLGUSBCANFD
{
/// <summary>
/// 周立功 USBCANFD 系列 CAN 卡控制类(如 USBCANFD-400U),封装设备连接、通道初始化、
/// DBC 矩阵加载与解码、报文发送(单次/循环)、信号物理值设置等功能。
/// 每个通道拥有独立的 DBC 引擎句柄与细粒度锁,支持多台架并行互不干扰。
/// </summary>
[ADPCommand]
public class ZLGCANFD : IDisposable
{
@@ -62,6 +67,16 @@ namespace ZLGUSBCANFD
/// </summary>
public event Action<uint, uint, byte[], ulong, bool, byte>? OnRawMessageReceived;
/// <summary>
/// 构造函数,配置设备类型、索引、通道数及所有通道共用的波特率与终端电阻参数,
/// 并初始化通道状态数组与 DBC 解析器。
/// </summary>
/// <param name="deviceType">设备类型,76 为 USBCANFD-400U</param>
/// <param name="deviceIndex">设备索引,多台同型号设备时区分,默认 0</param>
/// <param name="maxChannels">通道数量,默认 4</param>
/// <param name="abitBaud">仲裁域波特率,默认 "500000"</param>
/// <param name="dbitBaud">数据域波特率(仅 CANFD 生效),默认 "2000000"</param>
/// <param name="enableTerminalResistance">是否启用通道内部终端电阻,默认 true</param>
public ZLGCANFD(uint deviceType = 76, uint deviceIndex = 0, int maxChannels = 4,
string abitBaud = "500000", string dbitBaud = "2000000", bool enableTerminalResistance = true)
{
@@ -91,8 +106,9 @@ namespace ZLGUSBCANFD
#region 1.
/// <summary>
/// 仅仅打开设备,不做具体的通道波特率配置(留给具体的台架去分别配置)
/// 仅仅打开设备,不做具体的通道波特率配置(留给具体的台架去分别配置)
/// </summary>
/// <returns>是否打开成功;设备已打开时重复调用直接返回 true</returns>
public virtual bool ()
{
if (_deviceHandle != IntPtr.Zero) return true;
@@ -101,8 +117,12 @@ namespace ZLGUSBCANFD
}
/// <summary>
/// 针对特定通道进行参数初始化并启动(使用构造时传入的波特率与终端电阻配置)
/// 针对特定通道进行参数初始化并启动(使用构造时传入的波特率与终端电阻配置)
/// 同时为该通道启动专属的后台高性能接收轮询线程。
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
/// <returns>是否初始化并启动成功;通道已启动时重复调用直接返回 true</returns>
/// <exception cref="InvalidOperationException">未先调用“打开设备()”时抛出</exception>
public virtual bool (uint )
{
_isClosing = false; // 重置关闭标志,允许循环发送
@@ -157,6 +177,10 @@ namespace ZLGUSBCANFD
}
}
/// <summary>
/// 关闭 CAN 卡设备:先停止所有循环发送与接收轮询线程,再复位全部通道、
/// 释放各通道 DBC 资源,最后关闭设备主句柄。
/// </summary>
public virtual void CAN卡设备()
{
_isClosing = true; // 通知循环发送任务尽快退出
@@ -218,8 +242,11 @@ namespace ZLGUSBCANFD
#region 2. DBC
/// <summary>
/// 指定通道加载特定的 DBC 文件(支持不同通道加载不同的DBC矩阵)
/// 指定通道加载特定的 DBC 文件(支持不同通道加载不同的DBC矩阵)
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
/// <param name="dbcFilePath">DBC 矩阵文件的完整路径</param>
/// <returns>是否加载成功;该通道已加载过则直接返回 true</returns>
public virtual bool DBC文件(uint , string dbcFilePath)
{
if ( >= _maxChannels) return false;
@@ -257,6 +284,10 @@ namespace ZLGUSBCANFD
}
}
/// <summary>
/// 释放指定通道已加载的 DBC 资源,并清空该通道的报文数据库。
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
public virtual void DBC(uint )
{
if ( >= _maxChannels) return;
@@ -442,6 +473,8 @@ namespace ZLGUSBCANFD
/// <summary>
/// 停止指定通道、指定帧 ID 的循环发送。
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
/// <param name="帧ID">要停止循环发送的报文帧 ID</param>
public virtual void (uint , uint ID)
{
if (_cyclicSenders.TryRemove((, ID), out var entry))
@@ -452,7 +485,7 @@ namespace ZLGUSBCANFD
}
/// <summary>
/// 停止所有 DBC 循环发送任务。
/// 停止所有 DBC 循环发送任务,并等待全部发送任务退出(最多 3 秒)
/// </summary>
public virtual void ()
{
@@ -486,6 +519,8 @@ namespace ZLGUSBCANFD
/// <summary>
/// 清除指定通道、指定帧 ID 的信号覆盖值,恢复为 DBC 初始值。
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
/// <param name="帧ID">要清除覆盖值的报文帧 ID</param>
public virtual void (uint , uint ID)
{
if (_signalOverrides.TryRemove((, ID), out var dict))
@@ -495,8 +530,9 @@ namespace ZLGUSBCANFD
}
/// <summary>
/// 清除指定通道所有帧的信号覆盖值。
/// 清除指定通道所有帧的信号覆盖值,全部恢复为 DBC 初始值
/// </summary>
/// <param name="通道号">通道索引 (0 起始)</param>
public virtual void (uint )
{
foreach (var key in _signalOverrides.Keys)
@@ -635,6 +671,7 @@ namespace ZLGUSBCANFD
/// <param name="信号名称">DBC 中定义的英文信号名称(不区分大小写)</param>
/// <param name="物理值">要写入的实际物理数值</param>
/// <param name="循环发送间隔毫秒">0 = 单次发送;>0 = 周期循环发送(单位毫秒)</param>
/// <param name="直接发送">true = 设置后立即发送;false = 仅记录到持久化覆盖表,等后续 发送报文 时生效</param>
/// <returns>操作是否成功</returns>
public virtual bool (uint , string IDStr, string , double , int = 0, bool = false)
{
@@ -670,6 +707,7 @@ namespace ZLGUSBCANFD
/// <param name="帧IDStr">DBC 中定义的帧 ID(可以是 "26"、"0x1A"、"1A"</param>
/// <param name="循环发送间隔毫秒">0 = 单次发送;>0 = 周期循环发送(毫秒)</param>
/// <param name="是否使用CANFD">1 = 以 CANFD 格式发送;0 = 经典 CAN 格式</param>
/// <returns>是否成功启动/发送</returns>
public virtual bool (uint , string IDStr, int = 0, int 使CANFD = 1)
{
if (!TryParseFrameId(IDStr, out uint ID))
@@ -698,6 +736,7 @@ namespace ZLGUSBCANFD
/// <param name="是否是CANFD">true = CANFDfalse = 经典 CAN</param>
/// <param name="开启波特率加速BRS">CANFD 是否开启波特率加速</param>
/// <param name="循环发送间隔毫秒">0 = 单次发送;>0 = 周期循环发送(毫秒)</param>
/// <returns>是否成功启动/发送</returns>
public virtual bool (
uint ,
string IDStr,
@@ -986,9 +1025,6 @@ namespace ZLGUSBCANFD
#region 5.
/// <summary>
/// 计算物理值也需要传入对应通道,使用通道专属的DBC句柄进行计算
/// </summary>
/// <summary>
/// 智能解析帧 ID 字符串,兼容 10 进制、16 进制(如 "0x1A", "1A", "26"
/// </summary>