生活随笔
收集整理的這篇文章主要介紹了
基于Python/Capl脚本 对通信矩阵报文(Flexray/CAN)的周期检测(一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
📘前言
-
🍅 在汽車電子系統(tǒng)測(cè)試中,離不開(kāi)對(duì)報(bào)文周期的測(cè)試,如果系統(tǒng)比較復(fù)雜,要處理成千上萬(wàn)個(gè)報(bào)文,如果純手動(dòng)測(cè)試,會(huì)耗費(fèi)人力,在CAPL腳本的基礎(chǔ)上,通過(guò)python 解析 arxml 文件中的Flxeray 和 dbc 文件中的 CAN報(bào)文。形成自動(dòng)化的測(cè)試腳本。
-
🍅演示軟硬件環(huán)境 Win10 x64 ; CANoe 11 SP2 x64
目錄
- <font color=orange>📘前言
- 📗 分析并提取Flexray 報(bào)文
- <font color=orange>🌎總結(jié)
📗 分析并提取Flexray 報(bào)文
- 1?? 通過(guò)xml marker 工具打開(kāi) flexray.arxml 報(bào)文矩陣,分析后,得知flexray的報(bào)文結(jié)構(gòu)如下圖,
- 2?? 明確我們測(cè)試周期需要的參數(shù),Flexray 報(bào)文我們需要提取報(bào)文名字和報(bào)文周期時(shí)間 ,而報(bào)文周期時(shí)間由調(diào)度表參數(shù)(Slot,Base,Repetition)決定,所以我們需要提取總共4個(gè)參數(shù),Name ,Slot,Base,Repetition ,具體代碼如下:
from lxml
import etree
import re
import os
class cycleTimeTest():def __init__(self
, *args
, **kwargs
): self
.frames_name
= []self
.slot_ID
= []self
.base_cycle
= []self
.cycle_repetition
= []def arxml(self
):html
= etree
.parse
('./files/test.arxml')if html
:root
= html
.getroot
() print(root
.tag
) AR_PACKAGES
=root
.findall
("./%sAR-PACKAGES//%sAR-PACKAGE"%(base_tag
,base_tag
))frames
= AR_PACKAGES
[1].findall
(".//%sFLEXRAY-CLUSTER//%sFLEXRAY-FRAME-TRIGGERING"%(base_tag
,base_tag
))for frame
in frames
:name
= frame
.find
(".//%sFRAME-REF"%(base_tag
)).text
.split
(r'/')[-1] if re
.match('FlcFLC_FlexrayFr', name
):self
.frames_name
.append
(name
)slot
= frame
.find
(".//%sSLOT-ID"%(base_tag
)).text self
.slot_ID
.append
(slot
)cycle
= frame
.find
(".//%sCYCLE-REPETITION//%sBASE-CYCLE"%(base_tag
,base_tag
)).text self
.base_cycle
.append
(cycle
)repetition
= frame
.find
(".//%sCYCLE-REPETITION//%sCYCLE-REPETITION"%(base_tag
,base_tag
)).text
.split
(r'-')[-1] self
.cycle_repetition
.append
(repetition
)print(self
.frames_name
)print(self
.slot_ID
)print(self
.base_cycle
)print(self
.cycle_repetition
)else:print("parse file failed!")if __name__
== '__main__':c
= cycleTimeTest
()c
.arxml
()
- 3?? 測(cè)試結(jié)果如下,總共有195個(gè)滿足測(cè)試條件的Flexray報(bào)文:
📗 分析提取can報(bào)文
- 1?? 通過(guò)notepad 打開(kāi) .dbc文件。可以分析出dbc文件的結(jié)果如下圖
- 以第一行為例解釋下報(bào)文的格式: BO_ 是開(kāi)始標(biāo)識(shí),80 是報(bào)文ID,緊接著字符串是報(bào)文名字,8是報(bào)文長(zhǎng)度,FLC是報(bào)文發(fā)出者
- 報(bào)文下面SG開(kāi)頭的,是這個(gè)報(bào)文的信號(hào)參數(shù),包括信號(hào)的長(zhǎng)度,起始終止位等。
- 我們明確Can報(bào)文周期測(cè)試我們需要提取的參數(shù)是什么
下圖,紅色 筆著色的是 報(bào)文 cycle參數(shù),比如 BA_ “GenMsgCycleTime” BO_ 80 10; 就表明
ID為80的報(bào)文cycle 是10ms
.
from lxml
import etree
import re
import os
class cycleTimeTest():def __init__(self
, *args
, **kwargs
): self
.frames_name
= []self
.slot_ID
= []self
.base_cycle
= []self
.cycle_repetition
= []self
.can_mesages_name
= []self
.can_mesages_id
= []self
.can_mesages_peried
= []def get_abspath(self
,file_suffix
):'''@這個(gè)函數(shù)根據(jù)文件后綴,選出所有符合條件的文件'''self
.root_path
= os
.path
.dirname
(os
.path
.abspath
(__file__
)) self
.root_path
= os
.path
.join
(self
.root_path
, "files")self
.fileList
= os
.listdir
(self
.root_path
)self
.get_files
= []for file in self
.fileList
:if file.split
(".")[-1] == file_suffix
:self
.get_files
.append
(os
.path
.join
(self
.root_path
, file))return self
.get_files
def arxml(self
):html
= etree
.parse
('./files/test.arxml')if html
:root
= html
.getroot
() print(root
.tag
) base_tag
= "{http://autosar.org/schema/r4.0}" AR_PACKAGES
=root
.findall
("./%sAR-PACKAGES//%sAR-PACKAGE"%(base_tag
,base_tag
))frames
= AR_PACKAGES
[1].findall
(".//%sFLEXRAY-CLUSTER//%sFLEXRAY-FRAME-TRIGGERING"%(base_tag
,base_tag
))for frame
in frames
:name
= frame
.find
(".//%sFRAME-REF"%(base_tag
)).text
.split
(r'/')[-1] if re
.match('FlcFLC_FlexrayFr', name
):self
.frames_name
.append
(name
)slot
= frame
.find
(".//%sSLOT-ID"%(base_tag
)).text self
.slot_ID
.append
(int(slot
))cycle
= frame
.find
(".//%sCYCLE-REPETITION//%sBASE-CYCLE"%(base_tag
,base_tag
)).text self
.base_cycle
.append
(int(cycle
))repetition
= frame
.find
(".//%sCYCLE-REPETITION//%sCYCLE-REPETITION"%(base_tag
,base_tag
)).text
.split
(r'-')[-1] self
.cycle_repetition
.append
(int(repetition
))print(self
.frames_name
)print(self
.slot_ID
)print(self
.base_cycle
)print(self
.cycle_repetition
)return 1else:print("parse file failed!")def dbc(self
):self
.dbcfiles
= self
.get_abspath
('dbc')if self
.dbcfiles
:for i
in range(len(self
.dbcfiles
)):print(self
.get_files
[i
])self
.get_can_message_name_and_id
(self
.dbcfiles
[i
])print(self
.can_mesages_name
)print(self
.can_mesages_id
)print(self
.can_mesages_peried
)def get_can_message_name_and_id(self
,filename
):f
= open(filename
)if f
:line
= f
.readline
() while line
: message_search_obj
= re
.search
(message_pattern
, line
.strip
()) if message_search_obj
:id = message_search_obj
.group
(1) name
= message_search_obj
.group
(2)cycle
= self
.get_can_message_cycle
(filename
,id) if cycle
: self
.can_mesages_id
.append
(int(id))self
.can_mesages_name
.append
(name
)self
.can_mesages_peried
.append
(cycle
)line
= f
.readline
()f
.close
()else:print("open file :%s failed"%filename
)def get_can_message_cycle(self
,filename
,id):f
= open(filename
)if f
:line
= f
.readline
()while line
:cycle_pattern
= re
.compile(r'''BA_ "GenMsgCycleTime" BO_ %s (.*?);''' % id,re
.S
) message_search_obj
= re
.search
(cycle_pattern
, line
.strip
())if message_search_obj
:cycle
= int(float(message_search_obj
.group
(1)))f
.close
()return cycleline
= f
.readline
()f
.close
()else:print("open file :%s failed"%filename
)
if __name__
== '__main__':c
= cycleTimeTest
()c
.arxml
()c
.dbc
()
- 3?? 測(cè)試結(jié)果如下圖,雖然穿進(jìn)去3個(gè)dbc文件,但是目標(biāo)ECU 發(fā)出的有效的報(bào)文就只有8個(gè)報(bào)文:
🌎總結(jié)
- 🚩基于Python/Capl腳本 對(duì)通信矩陣報(bào)文(Flexray/Can)的周期檢測(cè)(二)(附源碼),點(diǎn)擊跳轉(zhuǎn)👇
- 🚩要有最樸素的生活,最遙遠(yuǎn)的夢(mèng)想,即使明天天寒地凍,路遙馬亡!
- 🚩 有微信的小伙伴可以關(guān)注下浪哥車載診斷,一個(gè)行業(yè)內(nèi)小小圈子,群里有網(wǎng)盤資料,源碼,還有各路大神 閑時(shí)交流交流技術(shù),聊聊工作機(jī)會(huì)啥的。
- 🚩如果這篇博客對(duì)你有幫助,請(qǐng) “點(diǎn)贊” “評(píng)論”“收藏”一鍵三連 哦!碼字不易,大家的支持就是我堅(jiān)持下去的動(dòng)力。
總結(jié)
以上是生活随笔為你收集整理的基于Python/Capl脚本 对通信矩阵报文(Flexray/CAN)的周期检测(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。