ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANoe中arxml数据库操作全解析:创建、编辑与加载

CANoe中arxml数据库操作全解析:创建、编辑与加载 做车载总线开发的人手里大概率都装着一两套CANoe工程。说句实话很多朋友对数据库的理解还停留在“拖一个DBC进Simulation Setup”的层面遇到要改协议、加节点、切诊断需求的时候就只能到处找人要数据库等别人改好再发回来来回拉扯非常耽误时间。arxml作为AUTOSAR体系下的标准描述格式其实才是CANoe工程里最值得花时间掌握的数据库形态之一。这篇文章我会按自己平时干活儿的顺序把arxml的创建、编辑、删除、加载这些高频操作完整过一遍也会把项目里踩过的一些坑整理出来。无论是刚接触CANoe的新手还是已经用过DBC但没碰过arxml的老手应该都能从里面找到可以直接抄作业的部分。1. 为什么放弃DBC转身选择arxml1.1 DBC与arxml的真实差异先说一个很多人没意识到的事实DBC只是Vector早期定义的数据库格式它诞生的年份比AUTOSAR早不少所以它能把CAN矩阵、信号布局、报文周期这些信息描述得很紧凑但对现代汽车电子架构里的很多概念比如服务接口、软件组件、诊断参数、IP通信、SOVD扩展基本是无能为力的。arxml全称是AUTOSAR XML它本身是AUTOSAR标准的一部分用于描述整车的软件架构、通信矩阵、ECU配置等信息。你可以把它理解成一份“超集数据库”既能描述传统CAN和CAN FD的帧结构、信号布局也能描述Eth/IP、SOME/IP、DDS甚至服务发现相关的内容。我用自己的项目经验做了个对比表大家可以直观感受一下对比项DBCarxml语法体系Vector私有格式AUTOSAR标准XML SchemaCAN/CAN FD支持支持但CAN FD需特定版本扩展原生支持结构清晰诊断配置不支持支持ODX、DEXT、诊断参数引用SOME/IP及服务接口不支持原生支持路由、软件组件描述有限支持完整支持工具打开方式CANdb、CANoe直接加载文本编辑器、CANoe、ART、Autosar Explorer多人协作可读性一般好本质是纯XML可做差异比较所以如果你只是做CAN总线的信号收发测试DBC完全够用没必要强行换成arxml。但如果项目涉及AUTOSAR开发、需要把通信矩阵和ECU软件配置关联起来或者要在CANoe里做SOME/IP、诊断相关的仿真那arxml就是绕不开的核心文件。1.2 什么场景下必须用arxml我碰到比较多的几类场景一是主机厂直接把整套ARXML工程System Description发给供应商供应商拿这个文件在CANoe里做集成测试二是做AUTOSAR基础软件配置的时候通信栈要导入arxml作为输入这时候如果手里只有DBC根本喂不进去三是诊断需要比如Bootloader刷写、SeedKey安全访问流程这类功能依赖诊断数据库描述arxml里可以通过引用诊断配置把服务表和报文关联起来。还有一些场景是纯数据库层面的需求比如你被要求“把这个节点的CAN ID从0x100改成0x200同时发送周期从100ms改到20ms”这种改动在DBC里很简单在arxml里也不复杂但很多人一打开XML源码就懵了不知道改哪个节点、哪个字段。这就是我接下来想重点讲的内容。1.3 选型建议我个人建议是如果是新项目尤其是有AUTOSAR背景的优先用arxml如果只是维护老项目、手头只有DBC也不需要做E2E、SOME/IP这类扩展那继续用DBC没问题没必要为了“先进”而增加沟通成本。在很多团队里DBC和arxml会同时存在CANoe本身也支持多个数据库同时加载这一点到第5章我会说。2. arxml核心结构拆解2.1 从XML根节点看整体层次arxml本质是一份XML文档顶层是AUTOSAR标签里面包含很多AR-PACKAGE你可以把AR-PACKAGE理解成文件夹或者命名空间。在通信数据库场景里最常见的几个AR-PACKAGE路径是/AUTOSAR/E2E/E2EProfileConfiguration用于E2E profile配置/AUTOSAR/CanNm网络管理相关配置/AUTOSAR/System/System/...系统级通信矩阵描述/AUTOSAR/Platform/...数据类型等基础定义对于我们要改的报文、PDU、信号核心是找到SYSTEM或SIGNAL,I-SIGNAL,P-PDU,I-PDU、FRAME这些节点。打开arxml文本后不要从头开始翻直接用搜索功能定位关键词比如搜FRAME-NAME、SIGNAL-NAME、CAN-ID效率会高很多。2.2 数据类型、信号与PDU的关系很多做测试的人对“信号”和“PDU”的概念分不清。简单说信号是物理量级的定义比如速度、温度、状态PDUProtocol Data Unit是传输载体一个PDU里可以打包多个信号对应到总线上就是一帧数据而FRAME在CAN上就是带CAN-ID和数据长度的完整报文。在arxml里的层次关系大致是I-SIGNAL定义信号名称、初始值、长度、字节序、类型等I-PDU把多个信号映射到PDU内部的起始位、长度等位置CAN-FRAME定义CAN-ID、帧格式标准帧/扩展帧、DLC并引用对应的PDU理解了这条主线后续增删改就有方向了加一个信号本质是在PDU里加一个信号映射加一帧报文本质是加一个CAN-FRAME并让PDU挂上去删一帧报文就是对arxml节点做删除并检查是否有引用关系。2.3 arxml版本差异与兼容性AUTOSAR标准一直在演进arxml也有不同版本常见的有4.2.2、4.3.1、4.4.0等。不同版本之间的标签名有差异比如老版本里信号可能是SIGNAL新版本里更常用I-SIGNAL和SYSTEM-SIGNAL的区分。CANoe导入arxml时会有兼容性校验如果版本太老或太新可能直接报错这时需要确认工程里配置的是哪个AUTOSAR版本尽量保证arxml文件的schema版本和工程一致。3. 从零创建一个arxml数据库的实操过程3.1 工具选择文本编辑器已经很能打了很多人一想到创建arxml就以为必须用专业工具。实际项目中快速验证场景完全可以直接用文本编辑器。类如VS Code、Notepad都可以只要支持XML语法高亮和标签折叠就行。推荐打开软件时开启自动保存和格式化插件避免改完一堆标签之后找不着配对。如果是正经的整车级数据库创建一般会用到Vector提供的AUTOSAR Explorer、Capital或者ARXML Editor等插件它们能以树形结构展示AR-PACKAGE可视化操作体验好很多还能做模型校验。但这类工具通常需要授权在项目前期未必能拿到所以下面我演示的步骤尽量用CANoe自带的资源和通用文本操作来完成。3.2 新建arxml的完整步骤第一步打开任意文本编辑器创建一个空文件加入标准xml声明和AUTOSAR根节点像这样?xml version1.0 encodingUTF-8? AUTOSAR xsi:schemaLocationhttp://autosar.org/schema/r4.0 AUTOSAR_4-0-3.xsd xmlnshttp://autosar.org/schema/r4.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance /AUTOSAR注意xsi:schemaLocation里的版本号要和你目标AUTOSAR版本一致我这里写的是4.0.3更常见的是4.2.2。如果版本和工具不匹配导入时可能只在日志里打一条warning但某些字段解析会出问题。第二步在AUTOSAR里创建AR-PACKAGES定义一个顶层包比如AR-PACKAGES AR-PACKAGE SHORT-NAMENaviSystem/SHORT-NAME ELEMENTS !-- 这里写信号、PDU、Frame的定义 -- /ELEMENTS /AR-PACKAGE /AR-PACKAGES第三步在里面添加SIGNAL或者按版本用I-SIGNAL定义信号名、长度和初值SIGNAL SHORT-NAMEVehicleSpeed/SHORT-NAME LENGTH16/LENGTH INIT-VALUE NUMERICAL-VALUE-SPECIFICATION VALUE0/VALUE /NUMERICAL-VALUE-SPECIFICATION /INIT-VALUE /SIGNAL第四步添加I-PDU把信号放进去并指定起始位和字节序I-PDU SHORT-NAMESpeedPdu/SHORT-NAME I-SIGNAL-PDU I-SIGNAL I-SIGNAL-IREF BASE-SIGNAL-REF DESTSIGNAL/NaviSystem/VehicleSpeed/BASE-SIGNAL-REF /I-SIGNAL-IREF POSITION0/POSITION LENGTH16/LENGTH /I-SIGNAL /I-SIGNAL-PDU /I-PDU第五步添加CAN-FRAME关联PDU和CAN-IDCAN-FRAME SHORT-NAMESpeedFrame/SHORT-NAME FRAME-LENGTH8/FRAME-LENGTH CAN-ADDRESSINGSTANDARD/CAN-ADDRESSING CAN-FRAME-TX-BEHAVIORINTERNAL/CAN-FRAME-TX-BEHAVIOR FRAME-PORT FRAME-PDU PDU-REF DESTI-PDU/NaviSystem/SpeedPdu/PDU-REF /FRAME-PDU /FRAME-PORT /CAN-FRAME这些内容在CANoe导入时会被解析成一条虚拟总线里的报文。这里只是最简示例实际项目中还会有TRIGGER、FRAME-TRIGGERING、PDU-TRIGGERING、IPDU-TRIGGERING等触发节点它们负责把物理层CAN ID和逻辑PDU关联起来。3.3 定义CAN FD与扩展帧如果做的项目是CAN FD需要在CAN-FRAME节点里体现CAN-ADDRESSING-TYPE或类似属性并将帧长度按实际最大支持位数设置比如64字节。扩展帧的CAN-ID需要明确EXTENDED标识否则导入后可能出现ID错乱。经验上定义arxml时最容易犯的错误就是只写了逻辑PDU和Frame却忘了加FRAME-TRIGGERING。CANoe在解析的时候没有TRIGGERING信息就无法把这条报文分配到具体信道和发送周期里。这类文件在导入后往往在Trace窗口能看到信号但发报文的时候完全发不出去很容易让人误判成网络配置问题。3.4 创建完成后的校验创建完arxml后建议先做三件事用XML工具格式化并检查标签闭合在CANoe里执行“导入数据库”并观察Log用CANoe的Write Window看有没有Schema相关Warning。尤其是在团队协作里一个未闭合的标签就会让整包数据没法被其他同事导入反复传文件反而浪费时间。4. 编辑、删除与高效管理arxml4.1 添加一个报文的完整修改路径当我需要往已有arxml里添加一帧报文时一般按这个顺序修改在I-PDU节点下面添加新的PDU定义。在CAN-FRAME下添加新的帧定义并在FRAME-PORT里引用新PDU。在FRAME-TRIGGERING里添加触发关系指定发送周期、偏移量等。保存后用CANoe重新加载验证。前两步相对直观第三步容易漏。展开来说TRIGGERING节点一般会在SYSTEM的FRAME-TRIGGERINGS下面FRAME-TRIGGERING SHORT-NAMESpeedFrame_Trig/SHORT-NAME FRAME-REF DESTCAN-FRAME/NaviSystem/SpeedFrame/FRAME-REF FRAME-TRIGGERING-ENTRY PDU-TRIGGERING-REF DESTPDU-TRIGGERING/NaviSystem/SpeedPdu_Trig/PDU-TRIGGERING-REF /FRAME-TRIGGERING-ENTRY /FRAME-TRIGGERING如果只有FRAME没有TRIGGERINGCANoe里会把它识别成一个“无调度”的报文仿真时默认不发送这一点很多新手会踩坑。4.2 删除报文的两种思路热词里有个问题很高频“arxml怎么删除报文”。我自己经常用的方式有两种。第一种是可视化删除。如果arxml已加载到CANoe里可以在Simulation Setup的数据库树里找到对应报文右键删除。这种方式适合单帧、低频度的清理。但注意如果是直接在CANoe里删删除动作只作用于当前工程并不会回写源arxml文件。换句话说你下次重新建工程时这帧报文又回来了。所以如果目的是“彻底从数据库里去掉”必须去源文件改。第二种是源码删除。在文本编辑器里打开arxml搜索报文名比如SpeedFrame然后顺着引用关系找到它对应的CAN-FRAME节点、FRAME-TRIGGERING节点、I-PDU节点以及信号节点。逐个删除。这里有一个关键点删除之前一定要先确认没有其他Frame或PDU在引用你要删的内容否则CANoe导入时会抛reference错误。示例删除一个FRAME时先搜索该Frame名然后搜索其引用的PDU名再搜索该PDU引用的Signal名。如果这些引用只在当前待删链路里出现可以连根拔起# 以Linux/Mac环境为例先把arxml备份再用python脚本清理 cp system.arxml system_backup.arxml python3 delete_frame.py system.arxml SpeedFrame用脚本批量删除的好处是流程可控改坏了可以随时回滚。生产项目里千万不要在不备份的情况下直接改大文件动辄几万行的XML一个误删标签排查一整天都有可能。4.3 用脚本做批量编辑和版本管理项目做到后期arxml文件动辄几十MB手动查找节点很容易眼花。这时候我建议用Python或PowerShell脚本辅助处理。以一个批量修改CAN ID的脚本为例import xml.etree.ElementTree as ET ns {a: http://autosar.org/schema/r4.0} tree ET.parse(system.arxml) root tree.getroot() for frame in root.iter(CAN-FRAME): name frame.find(a:SHORT-NAME, ns).text if name SpeedFrame: # 这里根据具体schema选择ID节点修改 for can_id in frame.iter(CAN-IDENTIFIER): can_id.text 512 # 0x200 tree.write(system_modified.arxml, encodingUTF-8, xml_declarationTrue)这个脚本会保留命名空间但不同版本的arxml里节点名和属性可能有差异执行前先跑一遍只读脚本打印出所有匹配节点确认结构再执行写入操作。版本控制上建议把所有arxml都纳入Git或SVN管理。arxml是纯文本非常适合做差异对比两个版本之间改了哪些报文、哪些周期一条diff命令就出来了。这一点是DBC做不到的因为DBC排序、换行方式经常引起无意义的大规模diff。5. 在CANoe里加载arxml并完成工程联调5.1 加载arxml到仿真工程CANoe加载arxml的方式和DBC不大一样。不是直接把arxml拖到“Database”面板就行需要先确认arxml类型。如果是“System Description”类型的arxml通常通过“Simulation Setup → Databases”区域的右键菜单“Add Database”加载然后它会自动生成一系列总线节点和PDU。如果是“Communication Matrix”类型也同样添加到数据库列表即可。加载完成后在CANoe中打开“Vector”或者“Network/Protocols”视图就能看到数据库里定义的报文、PDU和信号。需要仿真信号时可以直接在“NPC”或“CAPL”中通过.db访问这些信号。比如message SpeedFrame msg; msg.VehicleSpeed 100; output(msg);这里要注意CANoe里访问arxml数据库信号时信号名和PDU名必须和文件里SHORT-NAME完全一致大小写也敏感写错一个字编译直接报错。5.2 Trace窗口没有ID、Name显示空白的排查热词里有一条“canoe trace窗口没有id name一行空白”我遇到过好几次整理一下原因。Trace窗口默认会显示通道、ID、Name、DLC、Data等列。如果真的出现整行空白多半是三种情况第一Trace窗口没有关联到当前总线的数据库。你在Simulation Setup里加载了arxml但Trace窗口的“Filter”或“Display”配置锁定了其它通道导致解析到的报文ID匹配不上任何数据库条目于是ID和Name列都空白。解决办法是在Trace窗口右键选择“Filter Settings”确认Total Network或指定Channel选对了。第二数据库加载失败但错误被忽略。arxml导入时如果出现引用错误CANoe可能只是把这条报文当作“raw frame”显示ID和Name就会空白。此时去Write Window翻日志看有没有“missing reference”或“invalid PDU”字样。第三报文是在CAN FD或FlexRay等其它物理层收到的而Trace默认的符号解析规则没匹配上。可以尝试在Trace窗口的“View Settings”里切换符号显示模式或者取消和启用“Symbolize”选项。5.3 与DBC混用时的冲突处理有一些工程既有数据库也有数据库也就是DBC和arxml混着用。正常情况下没问题但如果同一帧报文既出现在DBC里又出现在arxml里CANoe会以加载顺序后面的数据库为准这容易导致显示数据不是你以为的那个版本。做法是把arxml放到数据库加载列表的最后让它有更高优先级。同时为了避免“重复定义”的Warning建议在检查数据库窗口里看有没有冲突项把不再需要维护的DBC先移出工程或干脆删掉。5.4 用CAPL操作arxml信号和DBC一样CAPL可以直接通过信号名访问arxml数据库里的内容。一个比较典型的Demoon message SpeedFrame { if (this.VehicleSpeed 120) { write(Speed exceeds 120: %.1f km/h, this.VehicleSpeed); } }需要注意arxml里定义了多种字节序例如Intel与小端、Motorola与大端。CANoe在数据库解析时会自动处理字节序但如果你用的是getSignal等API要确保写入函数里的信号长度和类型一致否则数据解析出来完全对不上。6. 常见问题排查与实用技巧速查6.1 高频问题与解决方案问题可能原因排查思路导入arxml时报“Invalid Schema”版本与工程不匹配检查AUTOSAR版本号让arxml和工程Schema保持一致报文在Trace窗口有ID无Name数据库未正确关联或引用损坏确认数据库加载状态查看Write Window日志调整Trace过滤CANoe仿真报文不输出缺少FRAME-TRIGGERING或周期配置检查TRIGGERING节点与发送周期设置arxml中删除报文后其他节点报错其他Frame或PDU仍在引用该内容搜索引用关系断开所有引用后再删除用脚本修改后中文或特殊字符乱码XML编码问题统一使用UTF-8无BOM编码写入数据库加载顺序导致信号被覆盖DBC和arxml混用时冲突把arxml放在最后或移出多余DBCCAN FD报文解析不出来Frame长度、DLC配置不符检查FRAME-LENGTH与实际CAN FD DLC对齐诊断服务刷写时SeedKey解不出缺少诊断参数描述或DLL未正确配置确认arxml中引用的诊断参数表和供应商DLL路径6.2 提高arxml管理效率的三个小技巧第一用XPATH快速定位节点。面对几万行的XML用编辑器自带的搜索已经很吃力时用Python的lxml库写一条简单查询非常高效from lxml import etree tree etree.parse(system.arxml) for el in tree.xpath(//*[local-name()CAN-FRAME]/SHORT-NAME[text()SpeedFrame]): print(el.text)第二利用“对比工具”审阅改动。arxml在提交前用Beyond Compare或VS Code的Compare插件和基线版本做个全文对比车载协议改动比代码改动更容易引入隐蔽错误对比能提前发现很多引用被误删的问题。第三把arxml转成DBC做快速验证。有些同事习惯看DBC不习惯看XML。可以用Vector提供的工具或一些开源脚本把arxml的核心报文信息转成DBC方便给懂DBC不懂AUTOSAR的人快速核对帧ID和信号布局。这一步在跨团队协作里很有用能省很多解释时间。6.3 一点经验之谈用arxml的时间久了我发现一个规律凡是数据库管理做得好的团队通常都会建立一套“命名规范版本回滚”机制。比如帧名、信号名统一采用大驼峰版本变更记录写在文件名后缀里重要节点用注释标注修改人。arxml是文本格式最怕的不是文件大而是改乱了还不知道改了什么。还有关于诊断配置尤其是SeedKey安全解锁相关的DLL严格来讲不归数据库管但arxml里如果有诊断参数描述CANoe在诊断面板中能自动识别服务。实际项目中遇到刷写失败、解锁不通过这类问题往往不是DLL算法错了而是诊断服务ID或功能寻址ID在arxml里配错了。建议排查时先核对数据库里的诊断请求ID、物理请求ID、功能请求ID和实际ECU配置是否一致。如果你刚开始接触arxml第一次打开文件被一堆嵌套标签劝退是很正常的。别硬啃先把SHORT-NAME、CAN-FRAME、I-PDU、FRAME-TRIGGERING这几个标签用熟再往后做就轻松很多。我做项目到现在最值钱的经验就是把“数据库管理”当成代码工程一样对待每一步都留痕每一个自动化脚本都先跑只读验证这样即使出了错也能快速回退。希望这篇文章能让你在CANoe的arxml数据库操作上少走点弯路顺手把项目里的效率提上去。
返回列表