📘前言
目錄
- <font color=orange>📘前言
- 📗 分析并提取Flexray 報文
- <font color=orange>🌎總結
📗 分析并提取Flexray 報文
- 1?? 通過xml marker 工具打開 flexray.arxml 報文矩陣,分析后,得知flexray的報文結構如下圖,
- 2?? 明確我們測試周期需要的參數,Flexray 報文我們需要提取報文名字和報文周期時間 ,而報文周期時間由調度表參數(Slot,Base,Repetition)決定,所以我們需要提取總共4個參數,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?? 測試結果如下,總共有195個滿足測試條件的Flexray報文:
📗 分析提取can報文
- 1?? 通過notepad 打開 .dbc文件。可以分析出dbc文件的結果如下圖
- 以第一行為例解釋下報文的格式: BO_ 是開始標識,80 是報文ID,緊接著字符串是報文名字,8是報文長度,FLC是報文發出者
- 報文下面SG開頭的,是這個報文的信號參數,包括信號的長度,起始終止位等。
- 我們明確Can報文周期測試我們需要提取的參數是什么
下圖,紅色 筆著色的是 報文 cycle參數,比如 BA_ “GenMsgCycleTime” BO_ 80 10; 就表明
ID為80的報文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
):'''@這個函數根據文件后綴,選出所有符合條件的文件'''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?? 測試結果如下圖,雖然穿進去3個dbc文件,但是目標ECU 發出的有效的報文就只有8個報文:
🌎總結
- 🚩基于Python/Capl腳本 對通信矩陣報文(Flexray/Can)的周期檢測(二)(附源碼),點擊跳轉👇
- 🚩要有最樸素的生活,最遙遠的夢想,即使明天天寒地凍,路遙馬亡!
- 🚩 有微信的小伙伴可以關注下浪哥車載診斷,一個行業內小小圈子,群里有網盤資料,源碼,還有各路大神 閑時交流交流技術,聊聊工作機會啥的。
- 🚩如果這篇博客對你有幫助,請 “點贊” “評論”“收藏”一鍵三連 哦!碼字不易,大家的支持就是我堅持下去的動力。
總結
以上是生活随笔為你收集整理的基于Python/Capl脚本 对通信矩阵报文(Flexray/CAN)的周期检测(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。