EasyDbc 1.0.9

dotnet add package EasyDbc --version 1.0.9
                    
NuGet\Install-Package EasyDbc -Version 1.0.9
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EasyDbc" Version="1.0.9" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EasyDbc" Version="1.0.9" />
                    
Directory.Packages.props
<PackageReference Include="EasyDbc" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EasyDbc --version 1.0.9
                    
#r "nuget: EasyDbc, 1.0.9"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EasyDbc@1.0.9
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EasyDbc&version=1.0.9
                    
Install as a Cake Addin
#tool nuget:?package=EasyDbc&version=1.0.9
                    
Install as a Cake Tool

EasyDbc

<p align="right"> <a href="./README.en.md">English</a> | <a >中文</a> | <a href="./README.de.md">Deutsch</a> | <a href="./README.kr.md">한국어</a> | <a href="./README.jp.md">日本語</a> | <a href="./README.fr.md">Français</a> </p>

alternate text is missing from this package README image alternate text is missing from this package README image GitHub

简介

简要介绍项目的功能和目标。
本项目基于 DbcParserLib 开发,在此基础上扩展了以下功能:

  • DBC 文件合并:支持多个 DBC 文件的合并操作。
  • DBC 文件生成功能:可以根据需求生成新的 DBC 文件。
  • Excel 文件解析为 DBC:提供将 Excel 文件解析为 DBC 文件的功能,支持灵活的映射和转换。
  • Excel 文件生成:支持从 DBC 数据生成 Excel 文件。
  • 自定义 Excel 解析和生成逻辑:针对 Excel 文件解析和生成,提供灵活的自定义逻辑,满足不同需求。

这些扩展功能使得项目能够更加灵活和高效地处理 DBC 文件和 Excel 文件,提升了车辆网络管理和信号处理的能力。


功能特性

  • 解析 DBC 文件:支持提取信号、消息和节点信息。
  • 数据展示:通过交互界面直观展示解析结果。
  • 格式校验:可以灵活的解析Excel的新旧格式。
  • 扩展性:Excel 文件解析和生成,提供灵活的自定义逻辑。

插件参考

本项目在实现 Excel 解析和生成功能时,参照了 NPOI 插件。NPOI 是一个开源的 .NET 库,用于处理 Microsoft Office 格式的文件(包括 Excel、Word 和 PowerPoint)。该插件功能强大且易于使用,特别适用于处理 Excel 文件的各种需求。

在本项目中,我主要使用了 NPOI 插件的以下功能:

  • 分组:支持将数据按指定规则分组,以便于更好地展示和管理。
  • 下拉菜单:实现了 Excel 单元格中的下拉菜单功能,简化用户输入,确保数据一致性。
  • 验证:通过 NPOI 提供的数据验证功能,确保 Excel 文件中的数据符合指定规则。
  • 设置背景色:能够自定义 Excel 单元格的背景色,提升可读性和视觉效果。
  • 设置单元格格式:支持设置单元格的格式,如数字格式、日期格式等,确保数据的正确显示。

通过使用 NPOI,本项目能够更加灵活地处理 Excel 文件,实现复杂的功能需求,提升了数据的处理能力。


项目结构

项目根目录/
├── EasyDbc/                # 源代码文件夹
│   ├── Assets/             # 图片等附加资源
│   ├── Contracts/          # 接口文件
│   ├── Helpers/            # 扩展
│   ├── Models/             # 数据模型
│   ├── Observers/          # 错误类
│   ├── Parsers/            # 解析类
│   ├── Generators/         # 文件生成类
│   └── EasyDbc.csproj      # 项目文件
├── DbcFiles/               # 资源文件
├── EasyDbc.Benchmark/      # 性能测试文件夹
├── EasyDbc.Test/           # 单元测试文件夹
├── EasyDbc.Demo/           # 示例项目文件夹
├── README.zh_CN.md         # 中文项目说明文件
├── README.md               # 项目说明文件
└── LICENSE                 # 许可证文件

快速入门

程序运行展示 Demo

以下是本项目的一些功能展示和运行效果截图。

样例说明截图

软件使用说明


功能 1: DBC 文件解析

通过指定路径解析 DBC 文件,并成功加载内容。

运行效果截图

DBC 文件解析

示例说明

  • 输入:选择一个格式良好的 DBC 文件。
  • 输出:成功解析文件内容,展示信号列表和消息信息。

功能 2: Excel 文件解析和生成

支持将 Excel 文件解析为 DBC 数据模型,同时支持根据用户需求生成 Excel 文件。

运行效果截图

Excel 文件解析

示例说明

  • 功能亮点:
    • 支持自定义逻辑解析。
    • 可以灵活地生成包含下拉菜单、数据验证和样式的 Excel 文件。

功能 3: DBC 文件合并

将多个 DBC 文件合并为一个,解决重复信号和冲突问题。

运行效果截图

DBC 文件合并

示例说明

  • 输入:多个待合并的 DBC 文件。
  • 输出:生成一个合并后的完整 DBC 文件,且支持定制化合并规则。

总结

以上是项目的一些核心功能展示。如果你对某些功能感兴趣,可以参考以下章节获取更详细的使用说明。

添加命名空间

//用于Dbc文件和Excel文件生成
using EasyDbc.Generators;
//用于信号的特殊解析 例如:signal.Parent.CycleTime(out var cycleTime);
using EasyDbc.Helpers;
//关联模型
using EasyDbc.Models;
//用于DBC和Excel的文件解析
using EasyDbc.Parsers;

基于不同格式的文件解析成Dbc 类

private bool TryParsingToFile(string path, out Dbc dbc)
{
    string extension = Path.GetExtension(path)?.ToLower();
    //基于文件路径解析DBC文件
    if (extension == ".dbc")
    {
        dbc = Parser.ParseFromPath(path);
        if (dbc != null)
        {
            return true;
        }
        return true;
    }
    else if (extension == ".xls" || extension == ".xlsx")
    {
    //基于文件路径解析EXCEL文件
        ExcelParser excelParser = new ExcelParser();
        ExcelParserState result = excelParser.ParseFirstSheetFromPath(path, out Dbc dbcOutput);
        if (result == ExcelParserState.Success)
        {
            dbc = dbcOutput;
            return true;
        }
    }
    dbc = null;
    return false;
}

合并DBC功能展示,可以基于自己实际需求来添加

⚠️ 重要提示

目前的合并DBC功能,如果有一样的报文,那么最先添加的有效,后面的无效。

private bool ParsingAndMergeDbc()
{
    Nodes = string.Empty;
    Messages.Clear();
    _mergedDbc = null;
    List<Dbc> parsingResult = new List<Dbc>();
    if (!string.IsNullOrEmpty(FilePath1))
    {
        if (TryParsingToFile(FilePath1, out Dbc dbc))
        {
            parsingResult.Add(dbc);
        }
    }
    if (!string.IsNullOrEmpty(FilePath2))
    {
        if (TryParsingToFile(FilePath2, out Dbc dbc))
        {
            parsingResult.Add(dbc);
        }
    }
    if (!string.IsNullOrEmpty(FilePath3))
    {
        if (TryParsingToFile(FilePath3, out Dbc dbc))
        {
            parsingResult.Add(dbc);
        }
    }
    bool result = DbcGenerator.MergeDbc(parsingResult, out _mergedDbc);
    if (result)
    {
        foreach (Node node in _mergedDbc.Nodes)
        {
            Nodes = string.Join("; ", _mergedDbc.Nodes.Select(node => node.Name));
        }
    }
    return result;
}

DBC文件解析

使用静态类 Parser来解析DBC文件, 选择一种解析方式:

//通过文件路径解析
Dbc dbc = Parser.ParseFromPath("C:\\your_dbc_file.dbc");
//通过Stream进行文件解析
Dbc dbc = Parser.ParseFromStream(File.OpenRead("C:\\your_dbc_file.dbc")); 
//通过文本字符串来解析
Dbc dbc = Parser.Parse("a dbc as string");

处理DBC文件对象

DBC对象包含两个集合,MessagesNodes,他们都是IEnumerable<T>的类型,因此可以使用标准的LINQ进行访问、迭代和查询。

例如,获取所有ID大于100且信号数量大于2的报文:

var filteredSelection = dbc
			.Messages
			.Where(m => m.ID > 100 && m.Signals.Count > 2)
			.ToArray();

解析错误管理

用于在解析过程中向用户通报发生的语法错误。 IParseFailureObserver 接口提供了处理语法错误的所有方法,例如:

  • 通用语法错误(例如缺少 ;',
  • 重复的对象定义(例如具有相同 ID 的消息;具有相同名称的节点、信号、自定义属性等)
  • 缺少对象定义(例如自定义属性在声明之前被赋值)
  • 值一致性(例如自定义属性值超出属性定义中的最小值和最大值范围)

该库提供了两种不同的实现:

  1. SilentFailureObserver:默认实现。它会在解析时屏蔽错误
  2. SimpleFailureObserver:简单的观察者,会记录任何错误。SimpleFailureObserver 错误列表:
    • Unknown syntax:没有对应的 TAG 语法
    • [TAG] Syntax error:语法 错误,特定 TAG 的语法错误
    • Duplicated object:解析器发现(并忽略)了重复的对象
    • Object Not found:某个对象在定义之前被声明或引用
    • Property value out of bound:分配给属性的值低于/高于属性定义中的最小/最大值
    • Property value out of index:声明的索引值不可接受(对于支持通过索引访问值的属性,例如枚举值)

错误列表可以通过 GetErrorList() 方法获取。

    // 注释掉这两行代码以移除错误解析管理(错误将默默处理)
    // 你可以提供自己的 IParseFailureObserver 实现来自定义错误解析管理
    var failureObserver = new SimpleFailureObserver();
    Parser.SetParsingFailuresObserver(failureObserver);

    var dbc = Parser.ParseFromPath(filePath);
    var errors = failureObserver.GetErrorList();

信号的打包和解包

简单场景应用示例

要打包和解包信号,可以使用静态类 Packer 打包/解包信号的示例:14 bits,最小值:-61.92,最大值:101.91

Signal sig = new Signal
{
  sig.Length = 14,
  sig.StartBit = 2,
  sig.IsSigned = 1,
  sig.ByteOrder = 1, // 0 = Big Endian (Motorola), 1 = Little Endian (Intel)
  sig.Factor = 0.01,
  sig.Offset = 20
};

// 用于打包发送信号
ulong TxMsg = Packer.TxSignalPack(-34.3, sig);

// 这将解包接收到的信号并计算相应的物理值
double val = Packer.RxSignalUnpack(TxMsg, sig);

可以在CAN传输之前将多个信号打包:

ulong TxMsg = 0;
TxMsg |= Packer.TxSignalPack(value1, sig1);
TxMsg |= Packer.TxSignalPack(value2, sig2);
TxMsg |= Packer.TxSignalPack(value3, sig3);
// ...
// 发送TxMsg到CAN总线。

用户需要通过正确指定 LengthStartBit 来确保信号之间不会互相重叠。

复用(Multiplexing)信号应用示例

一条消息可以包含复用数据,即布局可以根据复用器值的不同而变化。Packer 类无法处理复用,因此用户需要自行检查给定的消息是否确实包含该信号。

例如,考虑以下的 dbc 文件内容:

BO_ 568 UI_driverAssistRoadSign: 8 GTW
 SG_ UI_roadSign M : 0|8@1+ (1,0) [0|0] ""  DAS
 SG_ UI_dummyData m0 : 8|1@1+ (1,0) [0|0] "" Vector__XXX
 SG_ UI_stopSignStopLineDist m1 : 8|10@1+ (0.25,-8) [-8|247.5] "m" Vector__XXX

信号 UI_dummyData 仅在 UI_roadSign 值为 0 时可用,而 UI_stopSignStopLineDist 仅在 UI_roadSign 值为 1 时可用。 您可以通过调用以下方法来访问复用信息:

var multiplexingInfo = signal.MultiplexingInfo();
if(multiplexingInfo.Role == MultiplexingRole.Multiplexor)
{
	// 这是一个复用器!
}
else if(multiplexingInfo.Role == MultiplexingRole.Multiplexed)
{
	Console.WriteLine($"This signal is multiplexed and will be available when multiplexor value is {multiplexingInfo.Group}");
}

您也可以通过调用扩展方法来检查一条消息是否包含复用信号。

if(message.IsMultiplexed())
{
	// ...
}

DBC文件的转码

对于GB2312的转码推荐使用最新标准GB18030,Notepad++可以精准识别,这个标准兼容了GB2312 当前兼容的转码格式如下:

ASCII,          // 美国信息交换标准代码
UTF_8,          // Unicode转换格式 (8位)
UTF_16LE,       // Unicode转换格式 (16位,小端序)
UTF_16BE,       // Unicode转换格式 (16位,大端序)
UTF_32BE,       // Unicode转换格式 (32位,大端序)
UTF_32LE,       // Unicode转换格式 (32位,小端序)
windows_1251,   // 西里尔字母 (Windows)
windows_1252,   // 西欧语言 (Windows)
windows_1253,   // 希腊语 (Windows)
windows_1255,   // 希伯来语 (Windows)
Big5,          // 繁体中文 (大五码)
EUC_KR,        // 韩语 (扩展Unix编码)
EUC_JP,        // 日语 (扩展Unix编码)
ISO_2022_JP,   // 日语 (ISO标准)
ISO_2022_CN,   // 中文 (ISO标准)
ISO_2022_KR,   // 韩语 (ISO标准)
HZ_GB_2312,    // 中文 (HZ编码的GB2312)
Shift_JIS,     // 日语 (Shift JIS)
x_mac_cyrillic,// 西里尔字母 (Mac OS)
KOI8_R,        // 西里尔字母 (KOI8-R)
IBM855,        // 西里尔字母 (IBM)
IBM866,        // 西里尔字母 (替代IBM编码)
ISO_8859_2,    // 中欧语言
ISO_8859_5,    // 西里尔字母
ISO_8859_7,    // 希腊语
ISO_8859_8,    // 希伯来语
GBK,           // 中文 (扩展GB2312)
GB2312,        // 简体中文
GB18030        // 现行中国国家标准
string sourceFilePath = @"..\..\..\..\DbcFiles\SampleDbc_UTF8.dbc";
string outputFilePath = @"..\..\..\..\DbcFiles\OutputDbc_GB2312.dbc";
Parser.ConvertEncodingFromPath(sourceFilePath, outputFilePath, TargetEncoding.GB18030);

贡献

欢迎贡献!请随时提交拉取请求(pull requests)来改进这个库。


Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net5.0-windows7.0 is compatible.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net6.0-windows7.0 is compatible.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net7.0-windows7.0 is compatible.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net8.0-windows7.0 is compatible.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net9.0-windows7.0 is compatible.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 is compatible. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 is compatible.  net462 is compatible.  net463 was computed.  net47 is compatible.  net471 is compatible.  net472 is compatible.  net48 is compatible.  net481 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.9 232 5/14/2025
1.0.7 183 4/18/2025
1.0.6 188 4/18/2025
1.0.5 493 3/25/2025
1.0.4 494 3/25/2025
1.0.1 125 12/26/2024
1.0.0 120 12/24/2024