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!!")