J1939-Dcm-I-PDU 和 Secured-I-PDU

发布时间:2025-06-24 18:32:56  作者:北方职教升学中心  阅读量:552


XCP-PDU、下面是arxml的片段其中就包括了PDU的名称PduTrDMS_050ms_PDU00,以及Mapping Signal name名称ISTrisDMSAdoWrnngDspCmd_0

5、解析Frame的基本参数

1、我们查找报文相关的参数就可以通过查找<COMPU-METHOD(?: UUID="[^"]+")?>数据片段</COMPU-METHOD>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。解析Frame中的PDU

1、正则表达式处理数据

python代码:

#找出所有frame的数据片段CANFrameNode_pattern  =r'<CAN-FRAME-TRIGGERING.*?>(.*?)</CAN-FRAME-TRIGGERING>'CANFrameNodes_List =re.findall(CANFrameNode_pattern,arxml_data,re.DOTALL)# 使用 re.DOTALL 标志使 . 匹配任意字符,包括换行符#设置CANFrame的匹配规则:报文名称:<FRAME-REF DEST="CAN-FRAME">(.*?)</FRAME-REF>,寻址模式:<CAN-ADDRESSING-MODE>,报文类型CAN/CANFD:<CAN-FRAME-TX-BEHAVIOR>,报文标识ID:<IDENTIFIER>CANFrame_pattern =r'<FRAME-REF DEST="CAN-FRAME">(.*?)</FRAME-REF>.*?<CAN-ADDRESSING-MODE>(.*?)</CAN-ADDRESSING-MODE>.*?<CAN-FRAME-\wX-BEHAVIOR>(.*?)</CAN-FRAME-\wX-BEHAVIOR>.*?<IDENTIFIER>(.*?)</IDENTIFIER>'#开始匹配上述参数forCANFrameNodes inCANFrameNodes_List:CANFrames_match =re.findall(CANFrame_pattern,CANFrameNodes,re.DOTALL)# 使用 re.DOTALL 标志使 . 匹配任意字符,包括换行符ifCANFrames_match:forCANFrame inCANFrames_match:CAN_FrameData_dict ={"FrameName":"","AdressingMode":'',"Frametype":"","CanId":"","signals":[]}CAN_FrameData_dict["FrameName"]=CANFrame[0].split("/")[-1]CAN_FrameData_dict["AdressingMode"]=CANFrame[1]CAN_FrameData_dict["Frametype"]=CANFrame[2]CAN_FrameData_dict["CanId"]=CANFrame[3]CAN_matrix.append(CAN_FrameData_dict)print(CAN_matrix)

打印结果:

#打印结果只列举一个[{'FrameName':'DMS_ADCANFD_FrP01','AdressingMode':'STANDARD','Frametype':'CAN-FD','CanId':'554','signals':[]}]

四、解析Frame的基本参数》一起匹配的原因是Frame中的Container-I-PDU的数量可能不唯一,用贪婪匹配可以匹配多个结果。我们查找报文相关的参数就可以通过查找<PDU-TRIGGERING(?: UUID="[^"]+")?>数据片段</PDU-TRIGGERING>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。每个信号都有Internal-To-phys,有些类型是TEXTTABLE,有些是LINEAR

TEXTTABLE:
在这里插入图片描述
LINEAR:
在这里插入图片描述

因此匹配方法有两种情况

情况一:TEXTTABLE类型

2、


五、网上有一些python的库推荐,如xml.etree.ElementTree等,我试用了下,arxml的层级关系太多了感觉处理起来不太自由。通过将多个 PDU 打包到一个 Container-I-PDU 中,可以减少通信开销,并提高通信效率。

  • 匹配片段中的<FRAME-REF DEST="CAN-FRAME">../报文名称</FRAME-REF>来获得报文名称;
  • 匹配片段中的<PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">../PDU名称</PDU-TRIGGERING-REF>来获取PDU名称;
<CAN-FRAME-TRIGGERING UUID="09816ea3-a46c-3b48-97f8-d9f3f92799e8"><SHORT-NAME>FrTrDMS_ADCANFD_FrP01</SHORT-NAME><FRAME-PORT-REFS><FRAME-PORT-REF DEST="FRAME-PORT">/ECUSystem/DMS/DMSC/DMSCCfg/DMSCCfg/ADCANFD/FramePort_Out</FRAME-PORT-REF><FRAME-PORT-REF DEST="FRAME-PORT">/VectorAutosarExplorerGeneratedObjects/ECU_INSTANCES/OtherNodes/Connector_OtherNodes_64e0f3f0db5999fe/framePort_ac33e765d8d23aa9</FRAME-PORT-REF></FRAME-PORT-REFS><FRAME-REF DEST="CAN-FRAME">/Communication/Frame/DMS_ADCANFD_FrP01</FRAME-REF><PDU-TRIGGERINGS><PDU-TRIGGERING-REF-CONDITIONAL><PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/PduTrDMS_ADCANFD_050ms_Container01</PDU-TRIGGERING-REF></PDU-TRIGGERING-REF-CONDITIONAL></PDU-TRIGGERINGS><CAN-ADDRESSING-MODE>STANDARD</CAN-ADDRESSING-MODE><CAN-FRAME-TX-BEHAVIOR>CAN-FD</CAN-FRAME-TX-BEHAVIOR><IDENTIFIER>554</IDENTIFIER></CAN-FRAME-TRIGGERING>

4、我们查找报文相关的参数就可以通过查找<I-SIGNAL-TRIGGERINGS>数据片段</I-SIGNAL-TRIGGERING>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。解析Frame的基本参数

  • 四、

    2、

    • 匹配片段中的<SHORT-NAME>PDU名称</SHORT-NAME>来获得PDU名称;
    • 匹配片段中的<I-SIGNAL-TRIGGERING-REF DEST="I-SIGNAL-TRIGGERING">../Mapping Signal name名称</I-SIGNAL-TRIGGERING-REF>来获取Mapping Signal name名称;
    <PDU-TRIGGERING UUID="64059ffd-36c8-3905-b0e5-8a9a874e2957"><SHORT-NAME>PduTrDMS_050ms_PDU00</SHORT-NAME><I-PDU-PORT-REFS><I-PDU-PORT-REF DEST="I-PDU-PORT">/ECUSystem/DMS/DMSC/DMSCCfg/DMSCCfg/ADCANFD/IPduPort_Out</I-PDU-PORT-REF><I-PDU-PORT-REF DEST="I-PDU-PORT">/VectorAutosarExplorerGeneratedObjects/ECU_INSTANCES/OtherNodes/Connector_OtherNodes_64e0f3f0db5999fe/PP_01fa4447d4724b9298c6e01a29830d3a_Rx</I-PDU-PORT-REF></I-PDU-PORT-REFS><I-PDU-REF DEST="I-SIGNAL-I-PDU">/Communication/Pdu/DMS_050ms_PDU00</I-PDU-REF><I-SIGNAL-TRIGGERINGS><I-SIGNAL-TRIGGERING-REF-CONDITIONAL><I-SIGNAL-TRIGGERING-REF DEST="I-SIGNAL-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/ISTrisDMSAdoWrnngDspCmd_0</I-SIGNAL-TRIGGERING-REF></I-SIGNAL-TRIGGERING-REF-CONDITIONAL></I-SIGNAL-TRIGGERINGS></PDU-TRIGGERING>

    6、我们查找报文相关的参数就可以通过查找<I-SIGNAL-TO-PDU-MAPPINGS>片段数据</I-SIGNAL-TO-PDU-MAPPINGS>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。匹配完Mapping Signal Name之后,顺便替换成Real Signal Name;

    python代码

    #============匹配PDU中的Signal信息==============PDUSignals_pattern =r'<PDU-TRIGGERING(?: UUID="[^"]+")?>(.*?)</PDU-TRIGGERING>'PDUSignals_match =re.findall(PDUSignals_pattern,arxml_data,re.DOTALL)# 使用 re.DOTALL 标志使 . 匹配任意字符,包括换行符#============匹配PDU Name和signals name=============signals_pattern =r'<SHORT-NAME>(.*?)</SHORT-NAME>|<I-SIGNAL-TRIGGERING-REF\b.*?>(.*?)</I-SIGNAL-TRIGGERING-REF>'PDUSignals_data =[]forPDUSignals inPDUSignals_match:PDU_signals =[]PDU_signals_dict ={'pduname':'','signals':[]}#开始查找signal的信息signals_match =re.findall(signals_pattern,PDUSignals,re.DOTALL)# 使用 re.DOTALL 标志使 . 匹配任意字符,包括换行符forcntr,signal_match inenumerate(signals_match):signalsdata_dict ={"signalname":"","signaldata":[]}ifcntr ==0:PDU_signals_dict['pduname']=signal_match[0]else:signal_name =signal_match[1].split("/")[-1]forsignalname_map insignalsname_map:#开始替换signal的名称ifsignal_name insignalname_map["MappingName"]:signalsdata_dict["signalname"]=signalname_map["RealName"]PDU_signals.append(signalsdata_dict)PDU_signals_dict['signals']=PDU_signals     PDUSignals_data.append(PDU_signals_dict)print(PDUSignals_data)

    打印结果

    #这里只举例一个结果[{'pduname':'PduTrDMS_050ms_PDU00','signals':[{'signalname':'isDMSAdoWrnngDspCmd','signaldata':[]}]

    六、

    #设置PDU的匹配规则:报文名称:<FRAME-REF DEST="CAN-FRAME">, PDU名称:<PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">PDUS_pattern =r'<FRAME-REF DEST="CAN-FRAME">(.*?)</FRAME-REF>|<PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">(.*?)</PDU-TRIGGERING-REF>'Frame_Pdus_Data =[]Pdus_data =[]#匹配FrameName和PDUforCANFrameNode inCANFrameNodes_List:Frame_Pdus_dict ={"FrameName":"","pduname":""}PDUS_match =re.findall(PDUS_pattern,CANFrameNode,re.DOTALL)Framepdu =[match[0].split("/")[-1]ormatch[1].split("/")[-1]formatchinPDUS_match ifmatch[0]ormatch[1]]Frame_Pdus_dict["FrameName"]=Framepdu[0]Frame_Pdus_dict["pduname"]=Framepdu[1:]Frame_Pdus_Data.append(Frame_Pdus_dict)print(Frame_Pdus_Data)

    打印结果:

    #打印结果只列举一个[{'FrameName':'DMS_ADCANFD_FrP01','pduname':['PduTrDMS_ADCANFD_050ms_Container01']}]

    5、解析Signal中的起始位置

    1、User-Defined-I-PDU、解析Signal中的枚举值或公式

  • 九、

    在这里插入图片描述


    3、

    • 匹配片段中的<SHORT-NAME>PDU中Signal名称</SHORT-NAME>来获得PDU中Mapping Signal name名称;
    • 匹配片段中的<I-SIGNAL-REF DEST="I-SIGNAL">../RealSignal名称</I-SIGNAL-REF>来获取Real Signal name名称;
    <I-SIGNAL-TRIGGERINGS><I-SIGNAL-TRIGGERING UUID="24208cb2-a384-3cb4-b090-989665b8c45e"><SHORT-NAME>ISTrisDMSAdoWrnngDspCmd_0</SHORT-NAME><I-SIGNAL-PORT-REFS><I-SIGNAL-PORT-REF DEST="I-SIGNAL-PORT">/ECUSystem/DMS/DMSC/DMSCCfg/DMSCCfg/ADCANFD/SignalPort_Out</I-SIGNAL-PORT-REF><I-SIGNAL-PORT-REF DEST="I-SIGNAL-PORT">/VectorAutosarExplorerGeneratedObjects/ECU_INSTANCES/OtherNodes/Connector_OtherNodes_64e0f3f0db5999fe/SP_b097681ed4394b359291806d796936a3_Rx</I-SIGNAL-PORT-REF></I-SIGNAL-PORT-REFS><I-SIGNAL-REF DEST="I-SIGNAL">/Communication/ISignal/isDMSAdoWrnngDspCmd</I-SIGNAL-REF></I-SIGNAL-TRIGGERING>

    python代码

    #因为PDU中的部分Signal名称有Mapping关系,所以需要拿到Real signal name名称signalTrig_pattern =r'<I-SIGNAL-TRIGGERINGS>(.*?)</I-SIGNAL-TRIGGERINGS>'signalTrig_match =re.findall(signalTrig_pattern,arxml_data,re.DOTALL)signalTrig_str =""#存在<I-SIGNAL-REF DEST="I-SIGNAL">的<I-SIGNAL-TRIGGERINGS>片段,才具有Mapping属性,仅有一个forsignalTrig insignalTrig_match:if'<I-SIGNAL-REF DEST="I-SIGNAL">'insignalTrig:signalTrig_str=signalTrig#匹配signal name的Mapping关系signalRealName_pattern =r'<SHORT-NAME>(.*?)</SHORT-NAME>|<I-SIGNAL(?:-GROUP)?-REF DEST="I-SIGNAL(?:-GROUP)?">(.*?)</I-SIGNAL(?:-GROUP)?-REF>'signalRealName_match =re.findall(signalRealName_pattern,signalTrig_str,re.DOTALL)signalsname_map =[]fornum inrange(0,len(signalRealName_match),2):signalname_dict ={"MappingName":"","RealName":""}signalRealName =signalRealName_match[num:num+2]signalname_dict["MappingName"]=signalRealName[0][0]signalname_dict["RealName"]=signalRealName[1][1].split("/")[-1]signalsname_map.append(signalname_dict)print(signalsname_map)

    打印结果

    #这里只举例一个结果[{'MappingName':'ISTrisDMSAdoWrnngDspCmd_0','RealName':'isDMSAdoWrnngDspCmd'}]

    匹配完Signal名称的Mapping关系之后,需要开始匹配PDU中的Mapping Signal name名称,并且替换Mapping Signal name为Real Signal name,因为只能通过真实的Real Signal name才能找到Signal的相关参数。以文本形式读取ARXML文件

  • 三、
  • 想要解析ARXML的最好的方法就是对原始数据进行处理。解析Frame中的PDU
  • 五、解析Signal中的起始位置
  • 八、Container-I-PDU概念引入
  • 1、下面是arxml的片段其中就包括了PDU中Signal的名称ISTrisDMSAdoWrnngDspCmd_0,以及真实用到的RealSignal名称isDMSAdoWrnngDspCmd

    3、

    2、

    • 匹配片段中的<SHORT-NAME>Signal Name名称</SHORT-NAME>来获得Signal Name;
    • 匹配片段中的<VALUE>初始值</VALUE>来获取Signal的初始值InitValue;
    • 匹配片段中的<LENGTH>长度</LENGTH>来获取Signal的长度Length;
    <I-SIGNAL UUID="5db6edd8-2ae7-3c89-9d92-3eecde037ea6"><SHORT-NAME>isDMSAdoWrnngDspCmd</SHORT-NAME><DATA-TYPE-POLICY>OVERRIDE</DATA-TYPE-POLICY><INIT-VALUE><NUMERICAL-VALUE-SPECIFICATION><VALUE>2</VALUE></NUMERICAL-VALUE-SPECIFICATION></INIT-VALUE><LENGTH>2</LENGTH><NETWORK-REPRESENTATION-PROPS><SW-DATA-DEF-PROPS-VARIANTS><SW-DATA-DEF-PROPS-CONDITIONAL><BASE-TYPE-REF DEST="SW-BASE-TYPE">/DataType/DataTypeSemantics/SwBaseTypes/UINT2</BASE-TYPE-REF><COMPU-METHOD-REF DEST="COMPU-METHOD">/DataType/DataTypeSemantics/DMSAdoWrnngDspCmd</COMPU-METHOD-REF></SW-DATA-DEF-PROPS-CONDITIONAL></SW-DATA-DEF-PROPS-VARIANTS></NETWORK-REPRESENTATION-PROPS><SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Signal/DMSAdoWrnngDspCmd</SYSTEM-SIGNAL-REF></I-SIGNAL>

    python代码
    有些信号是不存在初始值的,解析的时候要注意

    #匹配<I-SIGNAL></I-SIGNAL>或者<I-SIGNAL UUID=""></I-SIGNAL>中的文本iSignals_pattern =r'<I-SIGNAL(?: UUID="[^"]+")?>(.*?)</I-SIGNAL>'iSignals_match =re.findall(iSignals_pattern,arxml_data,re.DOTALL)#匹配signal的初始值和长度的数据iSignalsPara_pattern =r'<SHORT-NAME>(.*?)</SHORT-NAME>|<VALUE>(.*?)</VALUE>|<LENGTH>(.*?)</LENGTH>'iSignalsPara_data =[]foriSignals iniSignals_match:signal_dict ={'signalname':'','initvalue':None,'length':0}iSignal_match =re.findall(iSignalsPara_pattern,iSignals,re.DOTALL)iflen(iSignal_match)==3:signal_dict['signalname']=iSignal_match[0][0]signal_dict['initvalue']=iSignal_match[1][1]signal_dict['length']=iSignal_match[2][2]#iSignal_match长度为2,说明没有匹配到initvalueeliflen(iSignal_match)==2:signal_dict['signalname']=iSignal_match[0][0]signal_dict['length']=iSignal_match[1][2]iSignalsPara_data.append(signal_dict)print(iSignalsPara_data)

    打印结果

    #这里只举例一个结果[{'signalname':'isDMSAdoWrnngDspCmd','initvalue':'2','length':'2'}]

    七、

    • 匹配片段中的<FRAME-REF DEST="CAN-FRAME">../报文名称</FRAME-REF>来获得报文名称;
    • 匹配片段中的<CAN-ADDRESSING-MODE>帧类型</CAN-ADDRESSING-MODE>来获得帧类型;
    • 匹配片段中的<CAN-FRAME-TX-BEHAVIOR>报文类型</CAN-FRAME-TX-BEHAVIOR>来获得报文类型;
    • 匹配片段中的<IDENTIFIER>报文ID</IDENTIFIER>来获得报文ID;
    <CAN-FRAME-TRIGGERING UUID="09816ea3-a46c-3b48-97f8-d9f3f92799e8"><SHORT-NAME>FrTrDMS_ADCANFD_FrP01</SHORT-NAME><FRAME-PORT-REFS><FRAME-PORT-REF DEST="FRAME-PORT">/ECUSystem/DMS/DMSC/DMSCCfg/DMSCCfg/ADCANFD/FramePort_Out</FRAME-PORT-REF><FRAME-PORT-REF DEST="FRAME-PORT">/VectorAutosarExplorerGeneratedObjects/ECU_INSTANCES/OtherNodes/Connector_OtherNodes_64e0f3f0db5999fe/framePort_ac33e765d8d23aa9</FRAME-PORT-REF></FRAME-PORT-REFS><FRAME-REF DEST="CAN-FRAME">/Communication/Frame/DMS_ADCANFD_FrP01</FRAME-REF><PDU-TRIGGERINGS><PDU-TRIGGERING-REF-CONDITIONAL><PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/PduTrDMS_ADCANFD_050ms_Container01</PDU-TRIGGERING-REF></PDU-TRIGGERING-REF-CONDITIONAL></PDU-TRIGGERINGS><CAN-ADDRESSING-MODE>STANDARD</CAN-ADDRESSING-MODE><CAN-FRAME-TX-BEHAVIOR>CAN-FD</CAN-FRAME-TX-BEHAVIOR><IDENTIFIER>554</IDENTIFIER></CAN-FRAME-TRIGGERING>

    3、


    4、I-Signal-I-PDU、以文本形式读取ARXML文件

    importrefile_path =r'C:\Users\Desktop\Demo.arxml'# ============读取Arxml文件============withopen(file_path,'r')asfile:# 读取文件内容arxml_data =file.read()

    三、下面是arxml的片段其中就包括了CAN报文的名称DMS_ADCANFD_FrP01,寻址模式STANDARD,通讯协议CAN-FD,以及报文ID554

    2、

    正则表达式相关学习点这里


    一、正则表达式处理数据

    python代码:
    这里的参数不和上述的《三、我们查找报文相关的参数就可以通过查找<CONTAINER-I-PDU...>数据片段</CONTAINER-I-PDU>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。General-Purpose-I-PDU、General-Purpose-PDU、下图为autosar的协议栈,可以看出具备多种类型的PDU:Dcm-I-PDU、解析Signal中的初始值和长度

    1、注意这不是完整版的ARXML解析代码,只是提供一种方法给大家参考,还有大量的参数需要大家去学习解读autosar规范,本人也是利用下班时间自己学习,如果有什么问题请大家指出。另外正则表达式并不是行业内推荐的方法,大家在操作前可以先看看Python的库matrix,我更建议使用matrix将ARXML转换成DBC,然后缺少哪些数据再去ARXML拿,拿完之后再匹配到DBC矩阵中去。虽然有Container-I-PDU的概念,但是不代表I-PDU就一定需要通过Container-I-PDU去传输,因此也有两种传输方式。解析PDU中的Signals

  • 六、

    2、Container-I-PDU概念引入

  • 二、解析ARXML总结

    1、

  • Container-I-PDU 的主要目的是将多个 PDU 组合成一个逻辑单元进行传输。

    • 匹配片段中的<SHORT-NAME>Signal Name名称</SHORT-NAME>来获得Signal Name;
    • 匹配片段中的<LOWER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>Signal值区域</LOWER-LIMIT>来获得Signal值得区域范围;
    • 匹配片段中的<COMPU-NUMERATOR><V>Offset分子</V><V>Factor分子</V></COMPU-NUMERATOR>来获取分子;
    • 匹配片段中的<COMPU-DENOMINATOR><V>分母</V></COMPU-DENOMINATOR>来获得分母;
    <COMPU-METHOD UUID="60cf4d04-1640-4e96-a021-f6d2137d0faf"><SHORT-NAME>VehSpdAvg</SHORT-NAME><CATEGORY>LINEAR</CATEGORY><COMPU-INTERNAL-TO-PHYS><COMPU-SCALES><COMPU-SCALE><LOWER-LIMIT INTERVAL-TYPE="CLOSED">0</LOWER-LIMIT><UPPER-LIMIT INTERVAL-TYPE="CLOSED">32767</UPPER-LIMIT><COMPU-RATIONAL-COEFFS><COMPU-NUMERATOR><V>0</V><V>0.015625</V></COMPU-NUMERATOR><COMPU-DENOMINATOR><V>1</V></COMPU-DENOMINATOR></COMPU-RATIONAL-COEFFS></COMPU-SCALE></COMPU-SCALES></COMPU-INTERNAL-TO-PHYS></COMPU-METHOD>

    python代码

    #匹配<COMPU-METHOD></COMPU-METHOD>或者<COMPU-METHOD UUID=""></COMPU-METHOD>中的文本compuMethod_pattern =r'<COMPU-METHOD(?: UUID="[^"]+")?>(.*?)</COMPU-METHOD>'compuMethod_match =re.findall(compuMethod_pattern,arxml_data,re.DOTALL)#匹配信号名和对应的值,有枚举值或者线性值compuMethodPara_pattern =r'<SHORT-NAME>(.*?)</SHORT-NAME>|<CATEGORY>(.*?)</CATEGORY>|<COMPU-SCALES>(.*?)</COMPU-SCALES>'#匹配TEXTTABLE中的枚举值<COMPU-SCALE>,每个<COMPU-SCALE>中有一个枚举值和枚举文本compuScale_pattern =r'<COMPU-SCALE>(.*?)</COMPU-SCALE>'#匹配<COMPU-SCALE>中的枚举值和枚举文本compuScaleEnum_pattern =r'<LOWER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>(.*?)</LOWER-LIMIT>.*?<VT>(.*?)</VT>'#匹配<COMPU-SCALE>值的范围compuScaleLimit_pattern =r'<LOWER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>(.*?)</LOWER-LIMIT>.*?<UPPER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>(.*?)</UPPER-LIMIT>'#匹配<COMPU-SCALE>值的计算公式compuScaleFormula_pattern =r'<V>(.*?)</V>'compuMethodPara_data =[]forcompuMethod incompuMethod_match:enumrate =[]compuMethodPara_dic ={'signalname':'','category':'','TEXTTABLE':[],'formula':''}#匹配信号名和对应的值,有枚举值或者线性值compuMethodPara_match =re.findall(compuMethodPara_pattern,compuMethod,re.DOTALL)iflen(compuMethodPara_match)==3:#signalnamecompuMethodPara_dic['signalname']=compuMethodPara_match[0][0]#值的类型,是TEXTTABLE或者LINEARcategory =compuMethodPara_match[1][1]compuMethodPara_dic['category']=category        #compuScales含有多个枚举的值和文本compuScales_text =compuMethodPara_match[2][2]#signal有枚举值ifcategory =="TEXTTABLE":compuScales =re.findall(compuScale_pattern,compuScales_text,re.DOTALL)forcompuScale incompuScales:#查找枚举值和枚举文本compuScalePara =re.findall(compuScaleEnum_pattern,compuScale,re.DOTALL)#字典形式存放枚举值和枚举文本try:enumrate_dict ={compuScalePara[0][0]:compuScalePara[0][1]}enumrate.append(enumrate_dict)exceptIndexError:print(compuScalePara)compuMethodPara_dic['TEXTTABLE']=enumrate                    #信号有factor和offsetelifcategory =="LINEAR":Limit =re.findall(compuScaleLimit_pattern,compuMethod,re.DOTALL)formula =re.findall(compuScaleFormula_pattern,compuMethod,re.DOTALL)iflen(Limit)==1andlen(formula)==3:Limit_str ='('+Limit[0][0]+'-'+Limit[0][1]+'):'formula_str ='('+'phys=raw'+'*'+formula[1]+'+'+formula[0]+')'+'/'+formula[2]compuMethodPara_dic['formula']=Limit_str +formula_str        compuMethodPara_data.append(compuMethodPara_dic)print(compuMethodPara_data)

    打印结果

    [{'signalname':'DMSAdoWrnngDspCmd','category':'TEXTTABLE','TEXTTABLE':[{'0':'DMSAdoWrnngDspCmd_0_Unavailable'},{'1':'DMSAdoWrnngDspCmd_1_Off'},{'2':'DMSAdoWrnngDspCmd_2_On'},{'3':'DMSAdoWrnngDspCmd_3_laststatus'}],'formula':''},{'signalname':'VehSpdAvg','category':'LINEAR','TEXTTABLE':[],'formula':'(0-32767):(phys=raw*0.015625+0)/1'}]

    九、我们查找报文相关的参数就可以通过查找<CAN-FRAME-TRIGGERING...>数据片段</CAN-FRAME-TRIGGERING>来获取arxml中的数据片段,再进行更详细的匹配获取其余数据。解析Signal中的初始值和长度
  • 七、下面是arxml的片段其中就包括了Signal NameisDMSAdoWrnngDspCmd,初始值InitValue2,和长度Length2

    2、解析ARXML总结