Excel生成DBC腳本源文件

Excel制作

新建一個Excel,后綴為“.xls”

工作本名稱改為“CAN_Matrix”

在首行按照列來起名字,在里面只需要填寫必須的內容即可。

列數名稱
第0列Message Name
第1列Message Format
第2列Message
ID
第3列Message
Length
(byte)
第4列Message Transmitter
ECU
第5列Message Receiver
ECU
第6列Message Send Method
第7列Message Cycle Period(ms)
第8列Message Cycle Period Fast(ms)
第9列Message Delay Time(ms)
第10列Message IL Support?
第11列Message Num Of Repetition
第12列Message Start Delay Time(ms)
第13列NM Message
第14列CANFD BRS
第15列Message Comment
第16列Signal Name
第17列Signal
Length
(Bit)
第18列Signal Start Bit
第19列Singal Byte
Order
第20列Signal Unit
第21列Signal Data Type
第22列Signal Resolution
第23列Signal OffSet
第24列Signal Min
Value
第25列Signal Max Value
第26列Singal Inactive Value
第27列Singal Send Method
第28列Singal Start Value
第29列NWM- Wakeup Allowed
第30列Signal Value Descriptions
第31列Signal Comment

代碼源碼

# encoding='utf-8'
import xlrd
from decimal import Decimalimport sys
global Table        #表格
global RowCount     #行數
global ColumnCount  #列數
global OutputFile   #輸出文件ExcelTable = "CAN_Matrix"   #表格
Note = "xin1"               #節點名稱MessageName_Position = 0 #報文名稱序號
MessageFormat_Position = 1 #報文格式序號
MessageID_Position = 2 #報文ID序號
MessageLength_Position = 3 #報文長度序號
MessageTransmitterNote_Position = 4 #報文發送節點序號
MessageReceiverNote_Position = 5 #報文接收節點序號
MessageSendMethod_Position  = 6 #報文發送方式序號
MessagePeriod_Position = 7 #報文周期序號
MessagePeriodFast_Position = 8 #報文快速周期序號
MessageDelayTime_Position = 9 #報文延遲時間序號
MessageILSupport_Position = 10 #報文支持IL序號
MessageNumOfRepetition_Position = 11 #報文重發次數序號
MessageStartDelayTime_Position = 12 #報文開始延遲時間序號
MessageNM_Position = 13 #報文網絡管理序號
MessageCANFDBRS_Position = 14 #報文CANFDBRS序號
MessageComment_Position = 15 #報文注釋序號SignalName_Position = 16 #信號名稱序號
SignalStartLength_Position = 17 #信號長度序號
SignalStartBit_Position = 18 #信號起始位序號
SignalByteOrder_Position = 19 #信號字節序序號
SignalUnit_Position = 20 #信號單位序號
SignalDataType_Position = 21 #信號數據類型序號
SignalResolution_Position = 22 #信號比率序號
SignalOffset_Position = 23 #信號偏移序號
SignalMinValue_Position = 24 #信號最小值序號
SignalMaxValue_Position = 25 #信號最大值序號
SingalInactiveValue_Position = 26 #信號未激活值序號
SingalSendMethod_Position = 27 #信號發送方式序號
SingalStartValue_Position = 28 #信號開始值序號
SingalNWMWakeupAllowed_Position = 29 #信號網管喚醒序號
SignalValueDescriptions_Position = 30 #信號數值描述序號
SignalComment_Position = 31 #信號標注序號def remove_exponent(num):  # 去掉讀取到的數值的小數點后邊的0return num.to_integral() if num == num.to_integral() else num.normalize()def Read_Base_Infomation(): # 獲取基本信息global Table        #表格global RowCount     #行數global ColumnCount  #列數global OutputFile   #輸出文件if len(sys.argv) > 1:InputFilePath = sys.argv[1]else:InputFilePath = "DBCDemo.xls"#print(f"InputFilePath:{InputFilePath}\n")LastIndex = InputFilePath.rfind('\\')StartIndex = InputFilePath.find('.xls', LastIndex)InputFileSuffix = InputFilePath[LastIndex + 1:]#print(f"InputFileSuffix:{InputFileSuffix}\n")Xlsx = xlrd.open_workbook(InputFileSuffix)    # 找到輸入文件Table = Xlsx.sheet_by_name(ExcelTable)  # 找到sheetRowCount = Table.nrows                  # 提取行數ColumnCount = Table.ncols               # 提取列數InputFileNoSuffix = InputFilePath[LastIndex + 1:StartIndex - 3]#輸出文件#print(f"InputFileNoSuffix:{InputFileNoSuffix}\n")OutputFile = InputFileNoSuffix + ".dbc"#print(f"OutputFile:{OutputFile}\n")def Output_DBC_Head():#打印文件頭部global OutputFile   #輸出文件with open(OutputFile, "w",encoding="utf-8") as f:f.write("VERSION \"\"")f.write("\n\n")f.write('''
NS_ : NS_DESC_CM_BA_DEF_BA_VAL_CAT_DEF_CAT_FILTERBA_DEF_DEF_EV_DATA_ENVVAR_DATA_SGTYPE_SGTYPE_VAL_BA_DEF_SGTYPE_BA_SGTYPE_SIG_TYPE_REF_VAL_TABLE_SIG_GROUP_SIG_VALTYPE_SIGTYPE_VALTYPE_BO_TX_BU_BA_DEF_REL_BA_REL_BA_DEF_DEF_REL_BU_SG_REL_BU_EV_REL_BU_BO_REL_SG_MUL_VAL_BS_:\n\n''')f.write(f"BU_: {Note}\n\n\n")def Output_MessageMappingSignal():#報文和信號映射關系global Table        #表格global RowCount     #行數global OutputFile   #輸出文件with open(OutputFile, "a+",encoding="utf-8") as f:i = 1 #跳過表頭while i < RowCount:#逐行輪詢MessageName = Table.cell_value(i, MessageName_Position)# 報文名稱if MessageName == "":   # 本行為空print(f"Empty Message exists\n")returnelse:                   # 本行有內容#MessageID = Table.cell_value(i, MessageID_Position)MessageID = int((Table.cell_value(i, MessageID_Position)), 16)# 報文ID十六進制#print(f"MessageID:{MessageID}\n")MessageLength = remove_exponent(Decimal(Table.cell_value(i, MessageLength_Position)).quantize(Decimal("0")))# 報文長度MessageTransmitterNote = Table.cell_value(i, MessageTransmitterNote_Position)# 報文發送節點MessageReceiverNote = Table.cell_value(i, MessageReceiverNote_Position)# 報文接收節點if MessageTransmitterNote == Note :# 寫入報文ID信息f.write(f"BO_ {MessageID} {MessageName}: {MessageLength} {Note}\n")  else:f.write(f"BO_ {MessageID} {MessageName}: {MessageLength} Vector__XXX\n")               while 1:#掃描這個報文里面的所有信號if (i == RowCount) or (MessageID != int((Table.cell_value(i, MessageID_Position)), 16)):#后面沒有該報文的信號或者已經到盡頭f.write("\n")breakelse:# 后面還有該報文的信號SingleName = Table.cell_value(i, SignalName_Position)#信號名稱#print(f"SingleName:{SingleName}\n")SignalStartBit = remove_exponent(Decimal(Table.cell_value(i, SignalStartBit_Position)).quantize(Decimal("0")))#信號起始位,去除小數點后邊的0以及保留小數點后O位#print(f"SignalStartBit:{SignalStartBit}\n")SignalLength = remove_exponent(Decimal(Table.cell_value(i, SignalStartLength_Position)).quantize(Decimal("0"))) #信號長度#print(f"SignalLength:{SignalLength}\n")if Table.cell_value(i, SignalByteOrder_Position) == "Motorola MSB" or Table.cell_value(i, SignalByteOrder_Position) == "Motorola" or Table.cell_value(i, SignalByteOrder_Position) == "":#信號字節序SignalByteOrder = "@0"else:SignalByteOrder = "@1"#print(f"SignalByteOrder:{SignalByteOrder}\n")if Table.cell_value(i, SignalDataType_Position) == "Unsigned" or Table.cell_value(i, SignalDataType_Position) == "unsigned" or Table.cell_value(i, SignalDataType_Position) == "":#信號有無符號SignalDateType = "+"else:SignalDateType = "-"#print(f"SignalDateType:{SignalDateType}\n")if Table.cell_value(i, SignalUnit_Position) == "":#信號單位SignalUnit = ""else:SignalUnit = Table.cell_value(i, SignalUnit_Position)#print(f"SignalUnit:{SignalUnit}\n")if Table.cell_value(i, SignalResolution_Position) == "":#信號精度SignalResolution = 1else:SignalResolution = remove_exponent(Decimal(Table.cell_value(i, SignalResolution_Position)).quantize(Decimal("0.00000")))if Table.cell_value(i, SignalOffset_Position) == "":#信號偏移SignalOffset = 0else:SignalOffset = remove_exponent(Decimal(Table.cell_value(i, SignalOffset_Position)).quantize(Decimal("0.00000")))#print(f"SignalOffset:{SignalOffset}\n")                         if Table.cell_value(i, SignalOffset_Position) == "":SignalMinValue = 0;else:HexValue = str(Table.cell_value(i, SignalMinValue_Position))#信號最小值if HexValue.startswith('0x') or HexValue.startswith('0X'):SignalMinValue = int(HexValue, 16)  # 將字符串轉換為10進制整數else:SignalMinValue = remove_exponent(Decimal(Table.cell_value(i, SignalMinValue_Position)).quantize(Decimal("0")))#print(f"SignalMinValue:{SignalMinValue}\n") if Table.cell_value(i, SignalMaxValue_Position) == "":SignalMaxValue = 0xFF;else:           HexValue = str(Table.cell_value(i, SignalMaxValue_Position))#信號最大值if HexValue.startswith('0x') or HexValue.startswith('0X'):SignalMaxValue = int(HexValue, 16)  # 將字符串轉換為10進制整數else:SignalMaxValue = remove_exponent(Decimal(Table.cell_value(i, SignalMaxValue_Position)).quantize(Decimal("0")))        #print(f"SignalMaxValue:{SignalMaxValue}\n") if MessageTransmitterNote == Note :f.write(f" SG_ {SingleName} : {SignalStartBit}|{SignalLength}{SignalByteOrder}{SignalDateType} ({SignalResolution},{SignalOffset}) [{SignalMinValue}|{SignalMaxValue}] \"{SignalUnit}\" Vector__XXX\n")else :f.write(f" SG_ {SingleName} : {SignalStartBit}|{SignalLength}{SignalByteOrder}{SignalDateType} ({SignalResolution},{SignalOffset}) [{SignalMinValue}|{SignalMaxValue}] \"{SignalUnit}\" {Note} \n")    i = i + 1 #掃描下一行#print(f"i:{i}\n")f.write("\n")def Output_DBC_Comment(): global Noteglobal OutputFile   #輸出文件with open(OutputFile, "a+", encoding="GB2312") as f:     f.write("""
BA_DEF_ SG_  "GenSigStartValue" FLOAT 0 100000000000;
BA_DEF_ SG_  "GenSigSendType" ENUM  "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType","NotUsed","NotUsed","NotUsed","NotUsed","NotUsed";
BA_DEF_ SG_  "GenSigInactiveValue" INT 0 100000;
BA_DEF_ SG_  "NWM-WakeupAllowed" ENUM  "No","Yes";
BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","NotUsed","NotUsed","NotUsed","NotUsed","Cyclic","NotUsed","IfActive","NoMsgSendType","NotUsed","vector_leerstring";
BA_DEF_ BO_  "GenMsgNrOfRepetition" INT 0 999999;
BA_DEF_ BO_  "GenMsgDelayTime" INT 0 1000;
BA_DEF_ BO_  "GenMsgCycleTime" INT 0 50000;
BA_DEF_ BO_  "GenMsgCycleTimeFast" INT 0 50000;
BA_DEF_ BO_  "GenMsgILSupport" ENUM  "No","Yes";
BA_DEF_ BO_  "NmMessage" ENUM  "no","yes";
BA_DEF_ BO_  "GenMsgStartDelayTime" INT 0 65535;
BA_DEF_ BU_  "NmStationAddress" INT 0 63;
BA_DEF_ BU_  "NmNode" ENUM  "no","yes";
BA_DEF_  "NmBaseAddress" HEX 1024 1087;
BA_DEF_ BO_  "CANFD_BRS" ENUM  "0","1";
BA_DEF_  "DBName" STRING ;
BA_DEF_  "BusType" STRING ;
BA_DEF_ BU_  "NodeLayerModules" STRING ;
BA_DEF_ BU_  "ECU" STRING ;
BA_DEF_ BU_  "CANoeJitterMax" INT 0 0;
BA_DEF_ BU_  "CANoeJitterMin" INT 0 0;
BA_DEF_ BU_  "CANoeDrift" INT 0 0;
BA_DEF_ BU_  "CANoeStartDelay" INT 0 0;
BA_DEF_ BO_  "VFrameFormat" ENUM  "StandardCAN","ExtendedCAN","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","StandardCAN_FD","ExtendedCAN_FD";
BA_DEF_DEF_  "GenSigStartValue" 0;
BA_DEF_DEF_  "GenSigSendType" "Cyclic";
BA_DEF_DEF_  "GenSigInactiveValue" 0;
BA_DEF_DEF_  "NWM-WakeupAllowed" "";
BA_DEF_DEF_  "GenMsgSendType" "NoMsgSendType";
BA_DEF_DEF_  "GenMsgNrOfRepetition" 0;
BA_DEF_DEF_  "GenMsgDelayTime" 0;
BA_DEF_DEF_  "GenMsgCycleTime" 0;
BA_DEF_DEF_  "GenMsgCycleTimeFast" 0;
BA_DEF_DEF_  "GenMsgILSupport" "Yes";
BA_DEF_DEF_  "NmMessage" "no";
BA_DEF_DEF_  "GenMsgStartDelayTime" 0;
BA_DEF_DEF_  "NmStationAddress" 0;
BA_DEF_DEF_  "NmNode" "no";
BA_DEF_DEF_  "NmBaseAddress" 1024;
BA_DEF_DEF_  "CANFD_BRS" "1";
BA_DEF_DEF_  "DBName" "";
BA_DEF_DEF_  "BusType" "";
BA_DEF_DEF_  "NodeLayerModules" "";
BA_DEF_DEF_  "ECU" "";
BA_DEF_DEF_  "CANoeJitterMax" 0;
BA_DEF_DEF_  "CANoeJitterMin" 0;
BA_DEF_DEF_  "CANoeDrift" 0;
BA_DEF_DEF_  "CANoeStartDelay" 0;
BA_DEF_DEF_  "VFrameFormat" "StandardCAN";
BA_ "BusType" "CAN FD";
""")f.write(f'BA_ "DBName" \"{Note}\";\n\n')def Output_SignalAttributes():#添加信號屬性global Table        #表格global RowCount     #行數global OutputFile   #輸出文件with open(OutputFile, "a+", encoding="utf-8") as f:#with open(OutputFile, "a+", encoding="GB2312") as f:  i = 1 #跳過表頭while i < RowCount:#逐行輪詢SingleName = Table.cell_value(i, SignalName_Position)#信號名稱#print(f"SingleName:{SingleName}\n")MessageID = int((Table.cell_value(i, MessageID_Position)), 16)# 報文ID十六進制if Table.cell_value(i, SingalInactiveValue_Position) != "":#信號未激活值SingalInactiveValue = remove_exponent(Decimal(Table.cell_value(i, SingalInactiveValue_Position)).quantize(Decimal("0")))#print(f"SingalInactiveValue:{SingalInactiveValue}\n")f.write(f"BA_ \"GenSigInactiveValue\" SG_ {MessageID} {SingleName} {SingalInactiveValue};\n")if Table.cell_value(i, SingalSendMethod_Position) != "":#信號發送方式SingalSendMethod = Table.cell_value(i, SingalSendMethod_Position)#print(f"SingalSendMethod:{SingalSendMethod}\n")if SingalSendMethod == "Cyclic":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 0;\n")elif SingalSendMethod == "OnWrite":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 1;\n")elif SingalSendMethod == "OnWriteWithRepetition":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 2;\n")              elif SingalSendMethod == "OnChange":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 3;\n")elif SingalSendMethod == "OnChangeWithRepetition":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 4;\n")elif SingalSendMethod == "IfActive":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 5;\n")elif SingalSendMethod == "IfActiveWithRepetition":f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 6;\n")else:f.write(f"BA_ \"GenSigSendType\" SG_ {MessageID} {SingleName} 0;\n")if Table.cell_value(i, SingalStartValue_Position) != "":#信號開始值SingalStartValue = remove_exponent(Decimal(Table.cell_value(i, SingalStartValue_Position)).quantize(Decimal("0")))#print(f"SingalStartValue:{SingalStartValue}\n")f.write(f"BA_ \"GenSigStartValue\" SG_ {MessageID} {SingleName} {SingalStartValue};\n")if Table.cell_value(i, SingalNWMWakeupAllowed_Position) != "":#信號網管喚醒序號SingalNWMWakeupAllowed = Table.cell_value(i, SingalNWMWakeupAllowed_Position)#print(f"SingalNWMWakeupAllowed:{SingalNWMWakeupAllowed}\n")if SingalNWMWakeupAllowed == "Yes" or SingalNWMWakeupAllowed == "YES":f.write(f"BA_ \"NWM-WakeupAllowed\" SG_ {MessageID} {SingleName} 1;\n")else:f.write(f"BA_ \"NWM-WakeupAllowed\" SG_ {MessageID} {SingleName} 0;\n")              i = i + 1def Output_SignalValue():#打印信號值定義global RowCount     #行數global Table global OutputFile   #輸出文件with open(OutputFile, "a+", encoding="utf-8") as f:i = 1 #跳過表頭while i < RowCount:#逐行輪詢if Table.cell_value(i, SignalName_Position) != "":MessageID = int((Table.cell_value(i, MessageID_Position)), 16)if Table.cell_value(i, SignalValueDescriptions_Position) != "":SingleName = Table.cell_value(i, SignalName_Position)SignalValueDescription = Table.cell_value(i, SignalValueDescriptions_Position).strip().replace("\r", "").split("\n")SignalValueDescription = list(reversed(SignalValueDescription))if SignalValueDescription != [""]:#處理列表元素使其生成DBC文件格式中一樣的格式ELE = "\" ".join(SignalValueDescription).replace("0x","").replace(":"," \"")+"\""f.write(f"VAL_ {MessageID} {SingleName} {ELE} ;\n") i = i + 1      def Output_SignalComment():#添加信號注釋global Table        #表格global RowCount     #行數global OutputFile   #輸出文件with open(OutputFile, "a+", encoding="utf-8") as f:#信號注釋,不提倡添加中文注釋#with open(OutputFile, "a+", encoding="GB2312") as f:  i = 1 #跳過表頭while i < RowCount:#逐行輪詢if Table.cell_value(i, SignalName_Position) != "":MessageID = int((Table.cell_value(i, MessageID_Position)), 16)if Table.cell_value(i, SignalValueDescriptions_Position) != "":SingleName = Table.cell_value(i, SignalName_Position)if Table.cell_value(i, SignalComment_Position) != "":#信號標注序號SignalComment = Table.cell_value(i, SignalComment_Position).strip().replace("\n", "").replace("\r", "")f.write(f"CM_ SG_ {MessageID} {SingleName} \"{SignalComment}\";\n")i = i + 1def Output_MessageAttribute():#打印報文屬性global RowCount     #行數global Tableglobal OutputFile   #輸出文件with open(OutputFile, "a+",encoding="utf-8") as f:i = 1 #跳過表頭while i < RowCount:#逐行輪詢MessageID = int((Table.cell_value(i, MessageID_Position)), 16)# 報文IDif Table.cell_value(i, MessageFormat_Position) != "":# 報文格式MessageFormat = Table.cell_value(i, MessageFormat_Position)#print(f"MessageFormat:{MessageFormat}\n")if MessageFormat == "CAN Standard":  f.write(f"BA_ \"VFrameFormat\" BO_ {MessageID} 0;\n")elif MessageFormat == "CAN Extended":               f.write(f"BA_ \"VFrameFormat\" BO_ {MessageID} 1;\n") elif MessageFormat == "CAN FD Standard":              f.write(f"BA_ \"VFrameFormat\" BO_ {MessageID} 14;\n")                      elif MessageFormat == "CAN FD Extended":              f.write(f"BA_ \"VFrameFormat\" BO_ {MessageID} 15;\n")           else:              f.write(f"BA_ \"VFrameFormat\" BO_ {MessageID} 0;\n")  if Table.cell_value(i, MessageSendMethod_Position) != "":# 報文發送方式MessageSendMethod = Table.cell_value(i, MessageSendMethod_Position)#print(f"MessageSendMethod:{MessageSendMethod}\n")if MessageSendMethod == "Cyclic":f.write(f"BA_ \"GenMsgSendType\" BO_ {MessageID} 0;\n")   elif MessageSendMethod == "IfActive":           f.write(f"BA_ \"GenMsgSendType\" BO_ {MessageID} 7;\n")     else:f.write(f"BA_ \"GenMsgSendType\" BO_ {MessageID} 0;\n")     if Table.cell_value(i, MessagePeriod_Position) != "":            MessagePeriod = Table.cell_value(i, MessagePeriod_Position)if MessagePeriod != "Event":# 報文周期      MessagePeriod = remove_exponent(Decimal(Table.cell_value(i, MessagePeriod_Position)).quantize(Decimal("0")))                #print(f"MessagePeriod:{MessagePeriod}\n")f.write(f"BA_ \"GenMsgCycleTime\" BO_ {MessageID} {MessagePeriod};\n") if Table.cell_value(i, MessagePeriodFast_Position) != "":#報文快速周期 MessagePeriodFast = remove_exponent(Decimal(Table.cell_value(i, MessagePeriodFast_Position)).quantize(Decimal("0")))         f.write(f"BA_ \"GenMsgCycleTimeFast\" BO_ {MessageID} {MessagePeriodFast};\n") if Table.cell_value(i, MessageDelayTime_Position) != "":#報文延遲時間MessageDelayTime = remove_exponent(Decimal(Table.cell_value(i, MessageDelayTime_Position)).quantize(Decimal("0")))            f.write(f"BA_ \"GenMsgDelayTime\" BO_ {MessageID} {MessageDelayTime};\n")  if Table.cell_value(i, MessageILSupport_Position) != "":#報文支持IL序號MessageILSupport = Table.cell_value(i, MessageILSupport_Position)if MessageILSupport == "Yes" or MessageILSupport == "YES":f.write(f"BA_ \"GenMsgILSupport\" BO_ {MessageID} 1;\n") else:f.write(f"BA_ \"GenMsgILSupport\" BO_ {MessageID} 0;\n")    if Table.cell_value(i, MessageNumOfRepetition_Position) != "":#報文重發次數MessageNumOfRepetition = remove_exponent(Decimal(Table.cell_value(i, MessageNumOfRepetition_Position)).quantize(Decimal("0")))              f.write(f"BA_ \"GenMsgNrOfRepetition\" BO_ {MessageID} {MessageNumOfRepetition};\n") if Table.cell_value(i, MessageStartDelayTime_Position) != "":#報文開始延遲時間MessageStartDelayTime = remove_exponent(Decimal(Table.cell_value(i, MessageStartDelayTime_Position)).quantize(Decimal("0")))            f.write(f"BA_ \"GenMsgStartDelayTime\" BO_ {MessageID} {MessageStartDelayTime};\n") if Table.cell_value(i, MessageNM_Position) != "":#報文網絡管理MessageNM = Table.cell_value(i, MessageNM_Position)        if MessageNM == "Yes" or MessageNM == "YES":f.write(f"BA_ \"NmMessage\" BO_ {MessageID} 1;\n") else:f.write(f"BA_ \"NmMessage\" BO_ {MessageID} 0;\n")if Table.cell_value(i, MessageCANFDBRS_Position) != "":#報文CANFDBRSMessageCANFDBRS = Table.cell_value(i, MessageCANFDBRS_Position)                                          if MessageCANFDBRS == "Yes" or MessageCANFDBRS == "YES":f.write(f"BA_ \"CANFD_BRS\" BO_ {MessageID} 1;\n") else:f.write(f"BA_ \"CANFD_BRS\" BO_ {MessageID} 0;\n")i = i + 1def Output_MessageComment():#打印報文注釋global Table        #表格global RowCount     #行數global OutputFile   #輸出文件with open(OutputFile, "a+", encoding="GB2312") as f:#打印報文注釋  i = 1 #跳過表頭while i < RowCount:#逐行輪詢MessageID = int((Table.cell_value(i, MessageID_Position)), 16)# 報文IDMessageComment = Table.cell_value(i, MessageComment_Position)# 報文注釋if MessageComment != "":f.write(f"CM_ BO_ {MessageID} \"{MessageComment}\";\n") i = i + 1if __name__ == "__main__" :print(f"Start")#打印的順序不要亂,不然會打不開文件Read_Base_Infomation()Output_DBC_Head()Output_MessageMappingSignal()Output_SignalComment()Output_MessageComment() Output_DBC_Comment()  Output_SignalAttributes()Output_MessageAttribute()Output_SignalValue()print(f"Success!!")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63708.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

16.2、網絡安全風險評估技術與攻擊

目錄 網絡安全風險評估技術方法與工具 網絡安全風險評估技術方法與工具 資產信息收集&#xff0c;可以通過調查表的形式把我們各類的資產信息進行一個統計和收集&#xff0c;掌握被評估對象的重要資產分布&#xff0c;進而分析這些資產關聯的業務面臨的安全威脅以及存在的安全…

C++-----函數與庫

數學中的函數與編程中的函數對比 數學中的函數 - 數學函數是一種映射關系&#xff0c;例如&#xff0c;函數\(y f(x)x^{2}\)&#xff0c;對于每一個輸入值\(x\)&#xff0c;都有唯一確定的輸出值\(y\)。它側重于描述變量之間的數量關系&#xff0c;通常通過公式來表示這種關系…

Loki 微服務模式組件介紹

目錄 一、簡介 二、架構圖 三、組件介紹 Distributor&#xff08;分發器&#xff09; Ingester&#xff08;存儲器&#xff09; Querier&#xff08;查詢器&#xff09; Query Frontend&#xff08;查詢前端&#xff09; Index Gateway&#xff08;索引網關&#xff09…

C++ OpenGL學習筆記(1、Hello World空窗口程序)

終于抽出時間系統學習OpenGL 教程&#xff0c;同時也一步一步記錄怎樣利用openGL進行加速計算。 目錄 1、環境準備1.1、庫的下載1.2、庫的選擇及安裝 2、OpenGL第一個項目&#xff0c;Hello World!2.1、新建hello world控制臺項目2.2、配置openGL環境2.2.1 包含目錄配置2.2.2 …

Linux系統命令基礎

Linux命令? [pypylinux ~]$ 普通?戶py&#xff0c;登陸后 [rootpylinux ~]# 超級?戶root&#xff0c;登錄后root代表當前登錄的?戶 分隔符pylinux 主機名~ 當前的登錄的位置&#xff0c;此時是家?錄# 超級?戶身份提示符 $ 普通?戶身份提示符操作系統?錄分隔符 Linux目錄…

不同版本的 Redis 的鍵值對內存占用情況示例

不同版本的 Redis 的鍵值對內存占用情況示例 文章目錄 不同版本的 Redis 的鍵值對內存占用情況示例Redis 6.0redisObjectdictEntrysds&#x1f340; 數據結構&#x1f340; sdslen() 函數&#x1f340; sdsReqType() 函數&#x1f340; sdsHdrSize() 函數 內存分配 - malloc() …

實現 WebSocket 接入文心一言

目錄 什么是 WebSocket&#xff1f; 為什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的優勢 總結&#xff1a;HTTP 和 WebSocket 的區別 WebSocket 的劣勢 WebSocket 常見應用場景 WebSocket 握手過程 WebSocket 事件處理和生命周期 WebSocket 心跳機制 …

2024.7 XAI 遇見 LLM:可解釋 AI 與大型語言模型之間關系的調查

https://arxiv.org/pdf/2407.15248 問題 Q1&#xff1a;XAI 技術當前如何與 LLMs 集成&#xff1f;Q2&#xff1a;將 LLMs 與 XAI 方法融合的新興趨勢是什么&#xff1f;Q3&#xff1a;當前相關文獻存在哪些差距&#xff0c;哪些領域需要進一步研究&#xff1f; 挑戰 LLMs …

前端滾動錨點(點擊后頁面滾動到指定位置)

三個常用方案&#xff1a; 1.scrollintoView 把調用該方法的元素滾動到屏幕的指定位置&#xff0c;中間&#xff0c;底部&#xff0c;或者頂部 優點&#xff1a;方便&#xff0c;只需要獲取元素然后調用 缺點&#xff1a;不好精確控制&#xff0c;只能讓元素指定滾動到中間&…

前端筆記——大數據量瀏覽器卡頓優化思路

多任務數據量處理卡頓問題 任務分批次 為避免阻塞&#xff0c;可以將 長時間的單一任務 拆分成多個小任務并分批執行。這樣可以在兩次任務之間讓瀏覽器有時間處理渲染、用戶輸入等操作。兩種常見方法&#xff1a; setTimeout 方法&#xff1a; 使用 setTimeout 將任務分段&a…

數智化轉型是什么?

數智化轉型是指企業通過數字化&#xff08;Digitalization&#xff09;和智能化&#xff08;Intelligentization&#xff09;技術的結合&#xff0c;推動業務流程、產品服務、組織管理的全面升級&#xff0c;從而提升效率、增強創新能力&#xff0c;并實現更高價值。相比傳統的…

RIP實驗

要求及分析 路由器上分別配置環回 連接路由器的線路網段為12.1.1.0/24、23.1.1.1.0/24 R1和R3連接的網絡地址分別為192.168.1.0/24/192.168.2.0/24 整個網絡使用RIP達到全網可達 配置 先配置路由器各接口ip和環回和pc ip網關掩碼&#xff08;圖略&#xff09; 進行 RI…

Oracle 中間件 Webcenter Portal服務器環境搭建

環境信息 服務器基本信息 如下表&#xff0c;本次安裝總共使用2臺服務器&#xff0c;具體信息如下&#xff1a; Webcenter1服務器 歸類 SOA服務器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服務器 歸類 OSB服務器 Ip Addr…

macOS 配置 vscode 命令行啟動

打開 vscode 使用 cmd shift p 組合快捷鍵&#xff0c;輸入 install 點擊 Install ‘code’ command in PATH Ref https://code.visualstudio.com/docs/setup/mac

3、交換機IP路由功能

每個用例前自己最好先畫個圖&#xff0c;不然容易繞暈&#xff0c;這篇文章寫好久了&#xff0c;自己都覺得有點繞 一、直連路由 如果一個交換機與另一個交換機時直連著的并且他們用來連接的端口屬于同網段&#xff0c;那么這種情況下他們就屬于直連路由。不需要做任何配置便可…

分層架構 IM 系統之多媒體功能設計與實現

現在 IM 系統已經不僅限于文本消息的通訊了&#xff0c;多媒體數據占據越來越多的比重&#xff0c;比如&#xff1a;文件傳輸、語音通話、視頻通話等。 在前面的文章&#xff08;《基于需求分析模型來結構化剖析 IM 系統》&#xff09;中我們分析過&#xff0c;“多媒體消息”…

0.gitlab ubuntu20.04 部署問題解決

安裝依賴&#xff1a; ① sudo apt-get update 出現&#xff1a; 解決方式&#xff1a; 去 /etc/apt/sources.list.d 這個目錄刪除或注釋對應的list文件 第三方軟件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 這個目錄 重新運行sudo apt-get update 安裝…

Next.js v15 - 服務器操作以及調用原理

約定 服務器操作是在服務器上執行的異步函數。它們可以在服務器組件和客戶端組件中調用&#xff0c;用于處理 Next.js 應用程序中的表單提交和數據修改。 服務器操作可以通過 React 的 “use server” 指令定義。你可以將該指令放在 async 函數的頂部以將該函數標記為服務器操…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

將業界領先的 SOLIDWORKS 3D CAD 解決方案連接到基于單一云端產品開發環境 3DEXPERIENCE 平臺。您的團隊、數據和流程全部連接到一個平臺進行高效的協作工作&#xff0c;從而能快速的做出更好的決策。 目 錄&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

【華為OD-E卷-開心消消樂 100分(python、java、c++、js、c)】

【華為OD-E卷-開心消消樂 100分&#xff08;python、java、c、js、c&#xff09;】 題目 給定一個 N 行 M 列的二維矩陣&#xff0c;矩陣中每個位置的數字取值為 0 或 1。矩陣示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 現需要將矩陣中所有的 1 進行反轉為 0&#…