现场优化7
This commit is contained in:
+44
-8
@@ -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 = CANFD;false = 经典 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>
|
||||
|
||||
Reference in New Issue
Block a user