国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

汽車架構(gòu)解析:python解析Autosar架構(gòu)的ARXML

這篇具有很好參考價(jià)值的文章主要介紹了汽車架構(gòu)解析:python解析Autosar架構(gòu)的ARXML。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

  • Autosar架構(gòu)下arxml文件作為通用數(shù)據(jù)庫(kù)文件,在數(shù)據(jù)傳輸和存儲(chǔ)中起到關(guān)鍵作用。行業(yè)上其實(shí)有一些arxml的工具可以將arxml轉(zhuǎn)換成dbc,再將dbc轉(zhuǎn)換成自己想要的數(shù)據(jù),但是拿到的數(shù)據(jù)是不完整的,arxml有一些數(shù)據(jù)dbc是沒(méi)有的,也根據(jù)缺少的數(shù)據(jù)直接到ARXML拿,不用硬解ARXML。
  • 想要解析ARXML的最好的方法就是對(duì)原始數(shù)據(jù)進(jìn)行處理。網(wǎng)上有一些python的庫(kù)推薦,如xml.etree.ElementTree等,我試用了下,arxml的層級(jí)關(guān)系太多了感覺(jué)處理起來(lái)不太自由。
  • 于是我決定用python的正則表達(dá)式來(lái)解析,因?yàn)橹懒怂钄?shù)據(jù)存放的結(jié)構(gòu)體,就可以通過(guò)正則表達(dá)式快速定位獲取數(shù)據(jù),而且可以自由的獲取arxml的任意數(shù)據(jù)片段,按照自己的規(guī)則解析。

正則表達(dá)式相關(guān)學(xué)習(xí)點(diǎn)這里


一、Container-I-PDU概念引入

1、下圖為autosar的協(xié)議棧,可以看出具備多種類型的PDU:Dcm-I-PDU、General-Purpose-PDU、General-Purpose-I-PDU、I-Signal-I-PDU、Multiplexed-I-PDU、NM-PDU、N-PDU、User-Defined-PDU、User-Defined-I-PDU、XCP-PDU、J1939-Dcm-I-PDU 和 Secured-I-PDU。

python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言


2、而Container-I-PDU 是一種在 AUTOSAR 中使用的數(shù)據(jù)單元,用于封裝其他類型的 PDU(Protocol Data Unit)。它是一種容器,可以包含不同類型的 PDU 作為其成員。Container-I-PDU 的主要目的是將多個(gè) PDU 組合成一個(gè)邏輯單元進(jìn)行傳輸。通過(guò)將多個(gè) PDU 打包到一個(gè) Container-I-PDU 中,可以減少通信開(kāi)銷,并提高通信效率。

python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言


3、雖然有Container-I-PDU的概念,但是不代表I-PDU就一定需要通過(guò)Container-I-PDU去傳輸,因此也有兩種傳輸方式。

1)通過(guò)Container-I-PDU打包傳輸:

python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言

python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言

如果是通過(guò)Container-I-PDU打包發(fā)出則需要先找到Container-I-PDU,再找到I-PDU,最后才能找到Signal。

2)不通過(guò)Container-I-PDU打包傳輸:

python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言
python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言

如果是直接通過(guò)I-PDU發(fā)出,則直接找到I-PDU,再找到Signal。

二、以文本形式讀取ARXML文件

import re
file_path = r'C:\Users\Desktop\Demo.arxml'
# ============讀取Arxml文件============
with open(file_path, 'r') as file:
    # 讀取文件內(nèi)容
    arxml_data = file.read()

三、解析Frame的基本參數(shù)

1、下面是arxml的片段其中就包括了CAN報(bào)文的名稱DMS_ADCANFD_FrP01,尋址模式STANDARD,通訊協(xié)議CAN-FD,以及報(bào)文ID554;

2、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<CAN-FRAME-TRIGGERING...>數(shù)據(jù)片段</CAN-FRAME-TRIGGERING>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<FRAME-REF DEST="CAN-FRAME">../報(bào)文名稱</FRAME-REF>來(lái)獲得報(bào)文名稱;
  • 匹配片段中的<CAN-ADDRESSING-MODE>幀類型</CAN-ADDRESSING-MODE>來(lái)獲得幀類型;
  • 匹配片段中的<CAN-FRAME-TX-BEHAVIOR>報(bào)文類型</CAN-FRAME-TX-BEHAVIOR>來(lái)獲得報(bào)文類型;
  • 匹配片段中的<IDENTIFIER>報(bào)文ID</IDENTIFIER>來(lái)獲得報(bào)文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、正則表達(dá)式處理數(shù)據(jù)

python代碼:

#找出所有frame的數(shù)據(jù)片段
CANFrameNode_pattern  = r'<CAN-FRAME-TRIGGERING.*?>(.*?)</CAN-FRAME-TRIGGERING>'
CANFrameNodes_List = re.findall(CANFrameNode_pattern, arxml_data, re.DOTALL) # 使用 re.DOTALL 標(biāo)志使 . 匹配任意字符,包括換行符

#設(shè)置CANFrame的匹配規(guī)則:報(bào)文名稱:<FRAME-REF DEST="CAN-FRAME">(.*?)</FRAME-REF>,尋址模式:<CAN-ADDRESSING-MODE>,報(bào)文類型CAN/CANFD:<CAN-FRAME-TX-BEHAVIOR>,報(bào)文標(biāo)識(shí)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>'

#開(kāi)始匹配上述參數(shù)
for CANFrameNodes in CANFrameNodes_List:
    CANFrames_match = re.findall(CANFrame_pattern, CANFrameNodes, re.DOTALL)  # 使用 re.DOTALL 標(biāo)志使 . 匹配任意字符,包括換行符
    if CANFrames_match:
        for CANFrame in CANFrames_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)

打印結(jié)果:

#打印結(jié)果只列舉一個(gè)
[{'FrameName': 'DMS_ADCANFD_FrP01', 'AdressingMode': 'STANDARD', 'Frametype': 'CAN-FD', 'CanId': '554', 'signals': []}]

四、解析Frame中的PDU

1、這里舉例解析Frame中的Container-I-PDU和Signal-I-PDU,這里強(qiáng)調(diào)必須注意是否存在Container-I-PDU,因?yàn)槠ヅ涞姆椒ú惶粯印?/strong>

2、下面是arxml的片段其中就包括了CAN報(bào)文的名稱DMS_ADCANFD_FrP01,PDU名稱PduTrDMS_ADCANFD_050ms_Container01;

3、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<CAN-FRAME-TRIGGERING...>數(shù)據(jù)片段</CAN-FRAME-TRIGGERING>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<FRAME-REF DEST="CAN-FRAME">../報(bào)文名稱</FRAME-REF>來(lái)獲得報(bào)文名稱;
  • 匹配片段中的<PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">../PDU名稱</PDU-TRIGGERING-REF>來(lái)獲取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、正則表達(dá)式處理數(shù)據(jù)

python代碼:
這里的參數(shù)不和上述的《三、解析Frame的基本參數(shù)》一起匹配的原因是Frame中的Container-I-PDU的數(shù)量可能不唯一,用貪婪匹配可以匹配多個(gè)結(jié)果。

#設(shè)置PDU的匹配規(guī)則:報(bào)文名稱:<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和PDU
for CANFrameNode in CANFrameNodes_List:
    Frame_Pdus_dict = {"FrameName":"","pduname":""}
    PDUS_match = re.findall(PDUS_pattern, CANFrameNode,re.DOTALL)
    Framepdu = [match[0].split("/")[-1] or match[1].split("/")[-1] for match in PDUS_match if match[0] or match[1]]
    Frame_Pdus_dict["FrameName"] = Framepdu[0]
    Frame_Pdus_dict["pduname"] = Framepdu[1:]
    Frame_Pdus_Data.append(Frame_Pdus_dict)

print(Frame_Pdus_Data)

打印結(jié)果:

#打印結(jié)果只列舉一個(gè)
[{'FrameName': 'DMS_ADCANFD_FrP01', 'pduname': ['PduTrDMS_ADCANFD_050ms_Container01']}]

5、下面是arxml的片段其中就包括了PDU的名稱CCP_ADCANFD_020ms_Container11,Container-I-PDU中的I-PDUPduTrCCP_020ms_PDU00_AD,PduTrCCP_020ms_PDU02_AD,NewPduTriggering_a1955a2b08c2a3bb;

6、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<CONTAINER-I-PDU...>數(shù)據(jù)片段</CONTAINER-I-PDU>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>PDU名稱</SHORT-NAME>來(lái)獲得報(bào)文名稱;
  • 匹配片段中的<CONTAINED-PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">../IPDU名稱</CONTAINED-PDU-TRIGGERING-REF>來(lái)獲取PDU名稱,I-PDU可能存在多個(gè);
<CONTAINER-I-PDU UUID="84de9d07-cf25-4a32-8cc4-92fd8eabcc93">
 <SHORT-NAME>CCP_ADCANFD_020ms_Container11</SHORT-NAME>
 <LENGTH>64</LENGTH>
 <CONTAINED-PDU-TRIGGERING-REFS>
   <CONTAINED-PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/PduTrCCP_020ms_PDU00_AD</CONTAINED-PDU-TRIGGERING-REF>
   <CONTAINED-PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/PduTrCCP_020ms_PDU02_AD</CONTAINED-PDU-TRIGGERING-REF>
   <CONTAINED-PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/VehicleTopology/ADCANFD/PhCnADCANFD/NewPduTriggering_a1955a2b08c2a3bb</CONTAINED-PDU-TRIGGERING-REF>
 </CONTAINED-PDU-TRIGGERING-REFS>
 <CONTAINER-TIMEOUT>0</CONTAINER-TIMEOUT>
 <CONTAINER-TRIGGER>DEFAULT-TRIGGER</CONTAINER-TRIGGER>
 <HEADER-TYPE>SHORT-HEADER</HEADER-TYPE>
 <RX-ACCEPT-CONTAINED-I-PDU>ACCEPT-CONFIGURED</RX-ACCEPT-CONTAINED-I-PDU>
 <THRESHOLD-SIZE>0</THRESHOLD-SIZE>
</CONTAINER-I-PDU>

python代碼
匹配CONTAINER-I-PDU中的PDU

#============找出CONTAINER-I-PDU中的PDU===========
Container_PDUS_pattern = r'<CONTAINER-I-PDU(?: UUID="[^"]+")?>(.*?)</CONTAINER-I-PDU>'

#匹配具體參數(shù)獲得I-PDU參數(shù)
Container_PDUS_match = re.findall(Container_PDUS_pattern, arxml_data, re.DOTALL)  # 使用 re.DOTALL 標(biāo)志使 . 匹配任意字符,包括換行符
ISignal_PDUS_pattern = r'<SHORT-NAME>(.*?)</SHORT-NAME>|<CONTAINED-PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">(.*?)</CONTAINED-PDU-TRIGGERING-REF>'

Container_PDUS = []
for Container_PDU in Container_PDUS_match:
    ISignal_PDUS = []
    ISignal_PDUS_match = re.findall(ISignal_PDUS_pattern, Container_PDU, re.DOTALL)
    for ISignal_PDU in ISignal_PDUS_match:
        a = [PDU.split("/")[-1] for PDU in ISignal_PDU if PDU !=""]
        ISignal_PDUS.extend([PDU.split("/")[-1] for PDU in ISignal_PDU if PDU !=""])
    Container_PDUS.append(ISignal_PDUS)

將Container-I-PDU中的iI-PDU成員整合到Frame中

#填充CONTAINER-I-PDU數(shù)據(jù)到字典
for Frame_Pdus in Frame_Pdus_Data:
    for pdname in Frame_Pdus['pduname']:
        for Container_PDU in Container_PDUS: 
            if any( element in pdname for element in Container_PDU) is True:
                for Cp in Container_PDU:
                    PduData_dict = {"FrameName":"","pduname":""}
                    PduData_dict["FrameName"] = Frame_Pdus["FrameName"]                       
                    PduData_dict["pduname"] = Cp
                    Pdus_data.append(PduData_dict)
print(Pdus_data)

打印結(jié)果:

#這里只舉例一個(gè)結(jié)果
[{'FrameName': 'CCP_ADCANFD_FrP02', 'pduname': 'CCP_ADCANFD_020ms_Container11'}, {'FrameName': 'CCP_ADCANFD_FrP02', 'pduname': 'PduTrCCP_020ms_PDU00_AD'}, {'FrameName': 'CCP_ADCANFD_FrP02', 'pduname': 'PduTrCCP_020ms_PDU02_AD'}, {'FrameName': 'CCP_ADCANFD_FrP02', 'pduname': 'NewPduTriggering_a1955a2b08c2a3bb'}]

7、拓展:假設(shè)有其他PDU,但是又不經(jīng)過(guò)Container-I-PDU打包傳輸怎么辦?直接在Frame中匹配到N-PDU或者I-Signal-PDUd等等,這種情況也很常見(jiàn),大家在匹配PDU部分的時(shí)候一定要特別注意不要在Frame中匹配Container-I-PDU;

<NM-PDU UUID="f07d063e-61af-47b8-aee2-5118e0a44392">
 <SHORT-NAME>NmPDU_ADCANFD_DMS</SHORT-NAME>
 <LENGTH>8</LENGTH>
 <I-SIGNAL-TO-I-PDU-MAPPINGS>
   <I-SIGNAL-TO-I-PDU-MAPPING UUID="006c991f-1d37-3873-92ab-c3387a927208">
     <SHORT-NAME>isDMS_NM_BSMtoRMS_mtx</SHORT-NAME>
     <I-SIGNAL-REF DEST="I-SIGNAL">/Communication/ISignal/isDMS_NM_BSMtoRMS</I-SIGNAL-REF>
     <PACKING-BYTE-ORDER>MOST-SIGNIFICANT-BYTE-FIRST</PACKING-BYTE-ORDER>
     <START-POSITION>16</START-POSITION>
     <TRANSFER-PROPERTY>TRIGGERED</TRANSFER-PROPERTY>
   </I-SIGNAL-TO-I-PDU-MAPPING>
 </I-SIGNAL-TO-I-PDU-MAPPINGS>
 <NM-VOTE-INFORMATION>false</NM-VOTE-INFORMATION>
 <UNUSED-BIT-PATTERN>255</UNUSED-BIT-PATTERN>
</NM-PDU>

python代碼:

NM_PDUS_Pattern = r'<NM-PDU(?: UUID="[^"]+")?>.*?<SHORT-NAME>(.*?)</SHORT-NAME>.*?</NM-PDU>'
NM_PDUs = re.findall(N_PDUS_pattern,arxml_data,re.DOTALL)

打印結(jié)果

#這里只舉例一個(gè)結(jié)果
NmPDU_ADCANFD_DMS

可以直接查找有Frame中的PDU,而且PDU里面直接有signal參數(shù),后面會(huì)正式一起匹配Signal的參數(shù)。


五、解析PDU中的Signals

1、匹配Signal名稱的mapping關(guān)系,因?yàn)镻DU中的Signal名稱只是Mapping Signal name,真正的名稱在其他arxml片段,我也不知道autosar為什么需要這么設(shè)計(jì),還是按照他的規(guī)則辦事吧。

2、下面是arxml的片段其中就包括了PDU中Signal的名稱ISTrisDMSAdoWrnngDspCmd_0,以及真實(shí)用到的RealSignal名稱isDMSAdoWrnngDspCmd;

3、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<I-SIGNAL-TRIGGERINGS>數(shù)據(jù)片段</I-SIGNAL-TRIGGERING>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>PDU中Signal名稱</SHORT-NAME>來(lái)獲得PDU中Mapping Signal name名稱;
  • 匹配片段中的<I-SIGNAL-REF DEST="I-SIGNAL">../RealSignal名稱</I-SIGNAL-REF>來(lái)獲取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代碼

#因?yàn)镻DU中的部分Signal名稱有Mapping關(guān)系,所以需要拿到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屬性,僅有一個(gè)
for signalTrig in signalTrig_match:
    if '<I-SIGNAL-REF DEST="I-SIGNAL">' in signalTrig:
        signalTrig_str= signalTrig

#匹配signal name的Mapping關(guān)系
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 = []
for num in range(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)

打印結(jié)果

#這里只舉例一個(gè)結(jié)果
[{'MappingName': 'ISTrisDMSAdoWrnngDspCmd_0', 'RealName': 'isDMSAdoWrnngDspCmd'}]

匹配完Signal名稱的Mapping關(guān)系之后,需要開(kāi)始匹配PDU中的Mapping Signal name名稱,并且替換Mapping Signal name為Real Signal name,因?yàn)橹荒芡ㄟ^(guò)真實(shí)的Real Signal name才能找到Signal的相關(guān)參數(shù)。


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

5、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<PDU-TRIGGERING(?: UUID="[^"]+")?>數(shù)據(jù)片段</PDU-TRIGGERING>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>PDU名稱</SHORT-NAME>來(lái)獲得PDU名稱;
  • 匹配片段中的<I-SIGNAL-TRIGGERING-REF DEST="I-SIGNAL-TRIGGERING">../Mapping Signal name名稱</I-SIGNAL-TRIGGERING-REF>來(lái)獲取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、匹配完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 標(biāo)志使 . 匹配任意字符,包括換行符

 #============匹配PDU Name和signals name=============
 signals_pattern = r'<SHORT-NAME>(.*?)</SHORT-NAME>|<I-SIGNAL-TRIGGERING-REF\b.*?>(.*?)</I-SIGNAL-TRIGGERING-REF>'
 PDUSignals_data = []
 for PDUSignals in PDUSignals_match:
     PDU_signals = []
     PDU_signals_dict = {'pduname':'','signals':[]}
     #開(kāi)始查找signal的信息
     signals_match = re.findall(signals_pattern, PDUSignals, re.DOTALL)  # 使用 re.DOTALL 標(biāo)志使 . 匹配任意字符,包括換行符
     for cntr,signal_match in enumerate(signals_match):
         signalsdata_dict = {"signalname":"","signaldata":[]}
         if cntr == 0:
             PDU_signals_dict['pduname'] = signal_match[0]
         else:
             signal_name = signal_match[1].split("/")[-1]
             for signalname_map in signalsname_map:
                 #開(kāi)始替換signal的名稱
                 if signal_name in signalname_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)

打印結(jié)果

#這里只舉例一個(gè)結(jié)果
[{'pduname': 'PduTrDMS_050ms_PDU00', 'signals': [{'signalname': 'isDMSAdoWrnngDspCmd', 'signaldata': []}]

六、解析Signal中的初始值和長(zhǎng)度

1、下面是arxml的片段其中就包括了Signal NameisDMSAdoWrnngDspCmd,初始值InitValue2,和長(zhǎng)度Length2;

2、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<I-SIGNAL(?: UUID="[^"]+")?>數(shù)據(jù)片段</I-SIGNAL>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>Signal Name名稱</SHORT-NAME>來(lái)獲得Signal Name;
  • 匹配片段中的<VALUE>初始值</VALUE>來(lái)獲取Signal的初始值InitValue;
  • 匹配片段中的<LENGTH>長(zhǎng)度</LENGTH>來(lái)獲取Signal的長(zhǎng)度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代碼
有些信號(hào)是不存在初始值的,解析的時(shí)候要注意

 #匹配<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的初始值和長(zhǎng)度的數(shù)據(jù)
 iSignalsPara_pattern = r'<SHORT-NAME>(.*?)</SHORT-NAME>|<VALUE>(.*?)</VALUE>|<LENGTH>(.*?)</LENGTH>'
 iSignalsPara_data = []

 for iSignals in iSignals_match:
     signal_dict = {'signalname':'','initvalue':None,'length':0 }
     iSignal_match = re.findall(iSignalsPara_pattern,iSignals,re.DOTALL)

     if len(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長(zhǎng)度為2,說(shuō)明沒(méi)有匹配到initvalue
     elif len(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)

打印結(jié)果

#這里只舉例一個(gè)結(jié)果
[{'signalname': 'isDMSAdoWrnngDspCmd', 'initvalue': '2', 'length': '2'}]

七、解析Signal中的起始位置

1、下面是arxml的片段其中就包括了Signal NameisDMSAdoWrnngDspCmd_mtx,初始值StartPosition63

2、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<I-SIGNAL-TO-PDU-MAPPINGS>片段數(shù)據(jù)</I-SIGNAL-TO-PDU-MAPPINGS>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>Signal Name名稱</SHORT-NAME>來(lái)獲得Signal Name;
  • 匹配片段中的<START-POSITION>起始位</START-POSITION>來(lái)獲取Signal的起始位StartPosition;
<I-SIGNAL-TO-PDU-MAPPINGS>
 <I-SIGNAL-TO-I-PDU-MAPPING UUID="212b6d36-3fbb-3ecc-b3c7-7be45a4c75ff">
   <SHORT-NAME>isDMSAdoWrnngDspCmd_mtx</SHORT-NAME>
   <I-SIGNAL-REF DEST="I-SIGNAL">/Communication/ISignal/isDMSAdoWrnngDspCmd</I-SIGNAL-REF>
   <PACKING-BYTE-ORDER>MOST-SIGNIFICANT-BYTE-FIRST</PACKING-BYTE-ORDER>
   <START-POSITION>63</START-POSITION>
 </I-SIGNAL-TO-I-PDU-MAPPING>
</I-SIGNAL-TO-PDU-MAPPINGS>

python代碼

 #匹配<I-SIGNAL-TO-PDU-MAPPINGS></I-SIGNAL-TO-PDU-MAPPINGS>中的內(nèi)容,signal的START-POSITION在其中
 signal2PDUs_pattern = r'<I-SIGNAL-TO-PDU-MAPPINGS>(.*?)</I-SIGNAL-TO-PDU-MAPPINGS>'
 signal2PDUs_match = re.findall(signal2PDUs_pattern,arxml_data,re.DOTALL)

 #匹配signal的真實(shí)名稱和signal的start position
 startPosition_pattern = r'<I-SIGNAL(?:-GROUP)?-REF DEST="I-SIGNAL(?:-GROUP)?">(.*?)</I-SIGNAL(?:-GROUP)?-REF>|<START-POSITION>(.*?)</START-POSITION>'
 iSignalSPos_data = []

 for signal2PDU in signal2PDUs_match:
     #開(kāi)始匹配
     signalSPos_match = re.findall(startPosition_pattern,signal2PDU,re.DOTALL)
     #每個(gè)signal有2個(gè)參數(shù),signal名稱,start position
     for num in range(0,len(signalSPos_match),2):
         signalSPos_dict = {'signalname':'','startposition': 0}
         signalPara = signalSPos_match[num:num+2]
         try:
             signalname = signalPara[0][0].split("/")[-1]
             if "PDU" not in signalname.upper():
                 #處理signalName,因?yàn)閟ignal是路徑加名稱../signalName
                 signalSPos_dict['signalname'] = signalPara[0][0].split("/")[-1]
                 signalSPos_dict['startposition'] = signalPara[1][1]
                 iSignalSPos_data.append(signalSPos_dict)
         except IndexError:
             print("無(wú)法找到參數(shù)")

 print(iSignalSPos_data)

打印結(jié)果

#這里只舉例一個(gè)結(jié)果
[{'signalname': 'isDMSAdoWrnngDspCmd', 'startposition': '63'}]

八、解析Signal中的枚舉值或公式

1、每個(gè)信號(hào)都有Internal-To-phys,有些類型是TEXTTABLE,有些是LINEAR;

TEXTTABLE:
python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言
LINEAR:
python解析arxml,通信協(xié)議,汽車,python,開(kāi)發(fā)語(yǔ)言

因此匹配方法有兩種情況

情況一:TEXTTABLE類型

2、下面是arxml的片段其中就包括了Signal NameDMSAdoWrnngDspCmd,Internal-To-phys類型TEXTTABLE,值的范圍0-0,枚舉值DMSAdoWrnngDspCmd_0_Unavailable/DMSAdoWrnngDspCmd_1_Off/DMSAdoWrnngDspCmd_2_On/DMSAdoWrnngDspCmd_3_laststatus

3、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<COMPU-METHOD(?: UUID="[^"]+")?>數(shù)據(jù)片段</COMPU-METHOD>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>Signal Name名稱</SHORT-NAME>來(lái)獲得Signal Name;
  • 匹配片段中的<LOWER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>LIMIT值區(qū)域</LOWER-LIMIT>來(lái)獲得Signal值得區(qū)域范圍;
  • 匹配片段中的<VT>枚舉值</VT>來(lái)獲取Signal的枚舉值;
<COMPU-METHOD UUID="26578eb7-6133-4ca0-8764-932f674899e2">
  <SHORT-NAME>DMSAdoWrnngDspCmd</SHORT-NAME>
  <CATEGORY>TEXTTABLE</CATEGORY>
  <COMPU-INTERNAL-TO-PHYS>
    <COMPU-SCALES>
      <COMPU-SCALE>
        <LOWER-LIMIT INTERVAL-TYPE="CLOSED">0</LOWER-LIMIT>
        <UPPER-LIMIT INTERVAL-TYPE="CLOSED">0</UPPER-LIMIT>
        <COMPU-CONST>
          <VT>DMSAdoWrnngDspCmd_0_Unavailable</VT>
        </COMPU-CONST>
      </COMPU-SCALE>
      <COMPU-SCALE>
        <LOWER-LIMIT INTERVAL-TYPE="CLOSED">1</LOWER-LIMIT>
        <UPPER-LIMIT INTERVAL-TYPE="CLOSED">1</UPPER-LIMIT>
        <COMPU-CONST>
          <VT>DMSAdoWrnngDspCmd_1_Off</VT>
        </COMPU-CONST>
      </COMPU-SCALE>
      <COMPU-SCALE>
        <LOWER-LIMIT INTERVAL-TYPE="CLOSED">2</LOWER-LIMIT>
        <UPPER-LIMIT INTERVAL-TYPE="CLOSED">2</UPPER-LIMIT>
        <COMPU-CONST>
          <VT>DMSAdoWrnngDspCmd_2_On</VT>
        </COMPU-CONST>
      </COMPU-SCALE>
      <COMPU-SCALE>
        <LOWER-LIMIT INTERVAL-TYPE="CLOSED">3</LOWER-LIMIT>
        <UPPER-LIMIT INTERVAL-TYPE="CLOSED">3</UPPER-LIMIT>
        <COMPU-CONST>
          <VT>DMSAdoWrnngDspCmd_3_laststatus</VT>
        </COMPU-CONST>
      </COMPU-SCALE>
    </COMPU-SCALES>
  </COMPU-INTERNAL-TO-PHYS>
</COMPU-METHOD>

情況二:LINEAR類型

4、下面是arxml的片段其中就包括了Signal NameVehSpdAvg,Internal-To-phys類型LINEAR,值的范圍0-32767,Offset分子0,F(xiàn)actor分子0.015625,Offset和Factor分母1,最終需要組合成(0-32767): (0.015625*raw) / 1;

5、我們查找報(bào)文相關(guān)的參數(shù)就可以通過(guò)查找<COMPU-METHOD(?: UUID="[^"]+")?>數(shù)據(jù)片段</COMPU-METHOD>來(lái)獲取arxml中的數(shù)據(jù)片段,再進(jìn)行更詳細(xì)的匹配獲取其余數(shù)據(jù)。

  • 匹配片段中的<SHORT-NAME>Signal Name名稱</SHORT-NAME>來(lái)獲得Signal Name;
  • 匹配片段中的<LOWER-LIMIT(?: INTERVAL-TYPE="CLOSED")?>Signal值區(qū)域</LOWER-LIMIT>來(lái)獲得Signal值得區(qū)域范圍;
  • 匹配片段中的 <COMPU-NUMERATOR><V>Offset分子</V><V>Factor分子</V></COMPU-NUMERATOR>來(lái)獲取分子;
  • 匹配片段中的<COMPU-DENOMINATOR><V>分母</V></COMPU-DENOMINATOR>來(lái)獲得分母;
<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)

#匹配信號(hào)名和對(duì)應(yīng)的值,有枚舉值或者線性值
compuMethodPara_pattern = r'<SHORT-NAME>(.*?)</SHORT-NAME>|<CATEGORY>(.*?)</CATEGORY>|<COMPU-SCALES>(.*?)</COMPU-SCALES>'

#匹配TEXTTABLE中的枚舉值<COMPU-SCALE>,每個(gè)<COMPU-SCALE>中有一個(gè)枚舉值和枚舉文本
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>值的計(jì)算公式
compuScaleFormula_pattern = r'<V>(.*?)</V>'

compuMethodPara_data = []
for compuMethod in compuMethod_match:
    enumrate = []
    compuMethodPara_dic = {'signalname':'','category':'','TEXTTABLE':[],'formula':''}
    #匹配信號(hào)名和對(duì)應(yīng)的值,有枚舉值或者線性值
    compuMethodPara_match = re.findall(compuMethodPara_pattern,compuMethod,re.DOTALL)

    if len(compuMethodPara_match) == 3:
        #signalname
        compuMethodPara_dic['signalname'] = compuMethodPara_match[0][0]

        #值的類型,是TEXTTABLE或者LINEAR
        category = compuMethodPara_match[1][1]
        compuMethodPara_dic['category'] = category

        #compuScales含有多個(gè)枚舉的值和文本
        compuScales_text = compuMethodPara_match[2][2]
        #signal有枚舉值
        if category == "TEXTTABLE":
            compuScales = re.findall(compuScale_pattern,compuScales_text,re.DOTALL)

            for compuScale in compuScales:
                #查找枚舉值和枚舉文本
                compuScalePara = re.findall(compuScaleEnum_pattern,compuScale,re.DOTALL)
                #字典形式存放枚舉值和枚舉文本
                try:
                    enumrate_dict = {compuScalePara[0][0]:compuScalePara[0][1]}
                    enumrate.append(enumrate_dict)
                except IndexError:
                    print(compuScalePara)
                    
            compuMethodPara_dic['TEXTTABLE'] = enumrate
            
        #信號(hào)有factor和offset
        elif category == "LINEAR":
            Limit = re.findall(compuScaleLimit_pattern,compuMethod,re.DOTALL)
            formula = re.findall(compuScaleFormula_pattern,compuMethod,re.DOTALL)
            
            if len(Limit) == 1 and len(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)

打印結(jié)果

[{'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'}]

九、解析ARXML總結(jié)

1、注意這不是完整版的ARXML解析代碼,只是提供一種方法給大家參考,還有大量的參數(shù)需要大家去學(xué)習(xí)解讀autosar規(guī)范,本人也是利用下班時(shí)間自己學(xué)習(xí),如果有什么問(wèn)題請(qǐng)大家指出。

2、另外正則表達(dá)式并不是行業(yè)內(nèi)推薦的方法,大家在操作前可以先看看Python的庫(kù)matrix,我更建議使用matrix將ARXML轉(zhuǎn)換成DBC,然后缺少哪些數(shù)據(jù)再去ARXML拿,拿完之后再匹配到DBC矩陣中去。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-651790.html

到了這里,關(guān)于汽車架構(gòu)解析:python解析Autosar架構(gòu)的ARXML的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 1-5 AUTOSAR數(shù)據(jù)交換文件ARXML

    1-5 AUTOSAR數(shù)據(jù)交換文件ARXML

    總目錄——AUTOSAR入門(mén)詳解 AUTOSAR入門(mén)詳解目錄匯總:待續(xù)中。。。 https://xianfan.blog.csdn.net/article/details/132818463 目錄 一、Arxml文件 二、各類ARXML文件 ????????arxml文件是AUTOSAR(Automotive Open System Architecture)標(biāo)準(zhǔn)定義的XML文件,用于描述汽車電子系統(tǒng)中的軟件組件、通信接口和

    2024年02月05日
    瀏覽(20)
  • AUTOSAR ARXML數(shù)據(jù)庫(kù)文件介紹

    ARXML概要介紹 本文主要幫助讀者理解AUTOSAR ARXML通信數(shù)據(jù)庫(kù)文件。 目前非?;馃岬腁UTOSAR架構(gòu)越來(lái)越得到車廠和零部件廠商的普遍應(yīng)用,AUTOSAR又分為Classic Platform和Adaptive Platform。 其中Classic Platform應(yīng)用在實(shí)時(shí)性要求比較的處理器,而Adaptive Platform應(yīng)用在需要大量計(jì)算的處理器。

    2024年02月09日
    瀏覽(22)
  • AUTOSAR汽車電子嵌入式編程精講300篇-基于AUTOSAR架構(gòu)的AT控制系統(tǒng)研究與實(shí)現(xiàn)

    目錄 前言 國(guó)內(nèi)外研究現(xiàn)狀?? 國(guó)外研究現(xiàn)狀 ? 國(guó)內(nèi)研究現(xiàn)狀

    2024年02月07日
    瀏覽(28)
  • AutoSAR探秘:服務(wù)需求定義與arxml中服務(wù)的定義

    AutoSAR、入門(mén)、實(shí)戰(zhàn)開(kāi)發(fā)、服務(wù)需求、arxml、服務(wù)定義 AutoSAR,作為汽車電子領(lǐng)域的先進(jìn)標(biāo)準(zhǔn),涵蓋眾多方面,其中服務(wù)的需求定義和在arxml中的定義是我們深入研究的重要主題。本篇博客將聚焦于服務(wù)需求的定義以及在arxml中如何定義服務(wù),通過(guò)案例和代碼示例,帶領(lǐng)讀者深入

    2024年02月03日
    瀏覽(33)
  • 詳解AUTOSAR:DaVinci Configurator導(dǎo)入ARXML配置(拓展篇—2)

    詳解AUTOSAR:DaVinci Configurator導(dǎo)入ARXML配置(拓展篇—2)

    對(duì)汽車電子技術(shù)感興趣的小伙伴請(qǐng) 關(guān)注公眾號(hào):美男子玩編程 ,公眾號(hào)優(yōu)先推送最新技術(shù)博文,創(chuàng)作不易,請(qǐng)各位朋友多多點(diǎn)贊、收藏、關(guān)注支持~ 雙擊達(dá)芬奇工具,打開(kāi)工具,如下圖所示: 新建一個(gè)項(xiàng)目工程,點(diǎn)擊File-New,出現(xiàn)如下圖所示: 在Project Name:給新創(chuàng)建的工程

    2024年02月10日
    瀏覽(13)
  • 汽車電子Autosar之DTC

    目錄 一、DTC基本介紹 1、DTC基本組成 2、DTC故障類型 3、DTC與event區(qū)別與聯(lián)系

    2024年02月08日
    瀏覽(19)
  • 汽車電子AUTOSAR之EcuM模塊

    目錄 前言 正文 EcuM模塊總體介紹 主要功能 總狀態(tài)機(jī)(Flexible 與 Fixed)

    2024年02月08日
    瀏覽(25)
  • 使用AUTOSAR來(lái)開(kāi)發(fā)汽車基礎(chǔ)軟件的優(yōu)點(diǎn)

    使用AUTOSAR來(lái)開(kāi)發(fā)汽車基礎(chǔ)軟件的優(yōu)點(diǎn)

    1、高質(zhì)量 。以前我們采用手寫(xiě)代碼的方式,是幾個(gè)工程師在戰(zhàn)斗?,F(xiàn)在我們采用平臺(tái),BSW代碼都是供應(yīng)商提供的,我們相當(dāng)于后面還有一個(gè)團(tuán)隊(duì)陪著我們?cè)趹?zhàn)斗。 2、低成本 。大家都說(shuō)采用AUTOSAR平臺(tái)好貴,但是從長(zhǎng)遠(yuǎn)來(lái)看是值得的,因?yàn)槟悴挥没ê芏嗳肆蜁r(shí)間成本去找

    2024年02月02日
    瀏覽(89)
  • 汽車安全硬件擴(kuò)展 AUTOSAR SHE SecureHardwareExtensions

    汽車安全硬件擴(kuò)展 AUTOSAR SHE SecureHardwareExtensions

    SHE(Secure Hardware Extension)在車聯(lián)網(wǎng)中,被應(yīng)用在車端ECU中負(fù)責(zé)安全存儲(chǔ)與安全計(jì)算。是由HIS(由Audi、BMW、Porsche、Volkswagen組成)制定的標(biāo)準(zhǔn),中文意思“安全硬件擴(kuò)展”,是對(duì)任何給定微控制器的片上擴(kuò)展。它旨在將對(duì)加密密鑰的控制從軟件域移到硬件域,從而保護(hù)這些密鑰

    2024年02月04日
    瀏覽(19)
  • 汽車電子行業(yè)的“AUTOSAR”到底是什么?

    AUTOSAR (AUTomotive Open System ARchitecture) 是一種開(kāi)放的軟件架構(gòu)標(biāo)準(zhǔn),用于汽車電子系統(tǒng)的開(kāi)發(fā)和管理。該標(biāo)準(zhǔn)旨在通過(guò)統(tǒng)一的硬件和軟件接口,實(shí)現(xiàn)汽車電子系統(tǒng)的互操作性和可重用性,并促進(jìn)不同的汽車制造商和零部件供應(yīng)商之間的合作和交流。本文將介紹AUTOSAR標(biāo)準(zhǔn)的起源、

    2024年01月23日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包