当前位置: 首页 > news >正文

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

相关文章:

Excel生成DBC脚本源文件

Excel制作 新建一个Excel&#xff0c;后缀为“.xls” 工作本名称改为“CAN_Matrix” 在首行按照列来起名字&#xff0c;在里面只需要填写必须的内容即可。 列数名称第0列Message Name第1列Message Format第2列Message ID第3列Message Length (byte)第4列Message Transmitte…...

Git进阶:本地或远程仓库如何回滚到之前的某个commit

在Git的使用过程中&#xff0c;我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改&#xff0c;还是为了重新组织代码&#xff0c;回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法&#xff0c;帮助读者更好地掌握Git版本控制…...

linux 中文输入法设置的宏观思路 (****)

乱是永远的不乱,变是永远的不变。 $ ibus help # 注意:help 前没有杠符号 $ setxkbmap -help # 注意:help 前只有一个杠符号 $ localectl --help # 注意:help 前有 2 个杠符号 $ man im-config # 注意:-h, --help 只出来提示信息:请参考。。。。。。。 $ man abc…...

271-基于XC7V690T的12路光纤PCIe接口卡

一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板卡接口处提供PCI-e 16速接口&#xff…...

Semaphore UI安装和实践

本次实验环境采用centos7.9操作系统&#xff0c;使用rpm包安装方式。 1.配置yum源 --下载centos华为云镜像仓库 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo[rootlocalhost ~]# wget -O /etc/yum.repos.…...

Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)

1、概述 在传统的单体应用中&#xff0c;事务管理相对简单&#xff0c;通常使用数据库的本地事务&#xff08;如MySQL的BEGIN和COMMIT&#xff09;来保证数据的一致性。然而&#xff0c;在微服务架构中&#xff0c;由于每个服务都有自己的数据库&#xff0c;跨服务的事务管理变…...

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具&#xff1a; DockerDocker ComposeOpenSSL&#xff08;用于生成证书&#xff09;#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker&#xff0c;可以参考以下命令安装&…...

使用docker compose安装gitlab

使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 ‌GitLab是一个基于Git的开源项目&#xff0c;…...

大模型日报 2024-12-18

大模型日报 2024-12-18 大模型资讯 标题&#xff1a; 3B模型长思考后击败70B&#xff01;HuggingFace逆向出o1背后技术细节并开源 摘要&#xff1a;这篇文章探讨了小模型在经过长时间思考后&#xff0c;如何在性能上超越更大规模模型的现象。HuggingFace通过逆向工程和开源技术…...

Linux安装mysql5.7

一、下载mysql5.7 ​ 首先我们需要去下载linux版本的mysql-5.7.24的安装包。 1.可以去官方网站链接: https://downloads.mysql.com/archives/community/ ,下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包。 2.在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载…...

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据&am…...

.NET重点

B/S C/S B/S&#xff1a; 浏览器端&#xff1a;JavaScript&#xff0c;HTML&#xff0c;CSS 服务器端&#xff1a;ASP&#xff08;.NET&#xff09;PHP/JSP 优势&#xff1a;维护方便&#xff0c;易于升级和扩展 劣势&#xff1a;服务器负担沉重 C/S java/.NET/VC系列 …...

SMMU软件指南SMMU编程之虚拟机结构和缓存

安全之安全(security)博客目录导读 目录 一、虚拟机结构(VMS) 二、缓存 一、虚拟机结构(VMS) 虚拟机结构(VMS)是SMMU中的概念,是一个由STE.VMSPtr字段指向的结构,包含每个虚拟机的配置设置。在相同安全状态下具有相同虚拟机ID(VMID)的多个STE必须指向相同的VMS。…...

Go 语言并发实战:利用协程处理多个接口进行数据融合

高效地处理多个数据源并将其整合为有意义的结果是开发中一项重要的任务。Go 语言&#xff0c;以其强大的并发特性&#xff0c;为我们提供了优雅而高效的解决方案。那么我们探讨一下如何利用 Go 语言的协程&#xff0c;同时调用多个接口获取数据&#xff0c;并将这些数据无缝地合…...

Redis Hash Tag 知识详解

一、Redis Hash Tag概述 Redis Hash Tag是Redis集群环境里用于控制数据分片的关键机制。在Redis集群中&#xff0c;数据依据键的哈希值来确定分片存储位置。Hash Tag能让用户指定键的特定部分作为哈希计算核心部分&#xff0c;进而使相关键存储于同一节点&#xff0c;这对处理…...

在 Ubuntu 上安装 Muduo 网络库的详细指南

在 Ubuntu 上安装 Muduo 网络库的详细指南 首先一份好的安装教程是非常重要的 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 像这篇文章就和shit一样&#xff0c;安装到2%一定会卡住&#xff0c;如果你不幸用了这个那真是遭老罪了 环境&#xf…...

Golang Gin Redis+Mysql 同步查询更新删除操作(我的小GO笔记)

我的需求是在处理几百上千万数据时避免缓存穿透以及缓存击穿情况出现&#xff0c;并且确保数据库和redis同步&#xff0c;为了方便我查询数据操作加了一些条件精准查询和模糊查询以及全字段模糊查询、分页、排序一些小玩意&#xff0c;redis存储是hash表key值也就是数据ID&…...

nodejs搭配express网站开发后端接口设计需要注意事项

nodejs搭配express网站开发后端接口设计需要注意事项&#xff01;为了回避一些常见的误区&#xff0c;今天和大家汇总一下&#xff0c;最近我遇到的一些错误信息&#xff0c;虽然都是小问题&#xff0c;但是还是需要分享一下&#xff0c;以免大家再次犯错。 1&#xff1a;第一个…...

mysql 基于chunk机制是如何支持运行期间,动态调整buffer pool大小的

mysql 基于chunk机制是如何支持运行期间&#xff0c;动态调整buffer pool大小的 MySQL 的 InnoDB 存储引擎确实支持在运行期间动态调整缓冲池&#xff08;buffer pool&#xff09;的大小&#xff0c;但其机制与自定义缓存系统有所不同。InnoDB 通过内部优化和配置参数来实现这…...

智能客户服务:AI与大数据的革新力量

在当今信息技术日新月异的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;正逐步成为推动各行各业变革的重要力量。尤其是在客户服务领域&#xff0c;大数据与AI的深度融合正引领着客服系统的全面革新。 一、大数据与AI在智能客服系统中的应用 智能客服系统是一种…...

FlowState Lab与SpringBoot集成:构建企业级波动分析微服务

FlowState Lab与SpringBoot集成&#xff1a;构建企业级波动分析微服务 1. 引言&#xff1a;当AI预测遇上微服务架构 电商大促期间的服务器负载波动、金融交易中的异常流量监测、物流系统的季节性需求变化...这些业务场景都需要对时序数据进行实时分析和预测。传统单机版的分析…...

Granite TimeSeries FlowState R1赋能Java应用:商品销量预测微服务开发实录

Granite TimeSeries FlowState R1赋能Java应用&#xff1a;商品销量预测微服务开发实录 最近在做一个电商后台的优化项目&#xff0c;其中一个核心需求就是希望能提前知道商品未来一段时间的销量走势。老板想备货&#xff0c;运营想搞活动&#xff0c;都离不开这个数据。传统的…...

深度解析ShardingCore:EF Core分库分表架构实战与性能优化指南

深度解析ShardingCore&#xff1a;EF Core分库分表架构实战与性能优化指南 【免费下载链接】sharding-core high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库…...

Phi-3-mini-4k-instruct快速体验:Ollama部署教程与入门Prompt分享

Phi-3-mini-4k-instruct快速体验&#xff1a;Ollama部署教程与入门Prompt分享 1. 模型简介 Phi-3-Mini-4K-Instruct是微软推出的轻量级开源语言模型&#xff0c;具有以下核心特点&#xff1a; 轻量高效&#xff1a;仅38亿参数&#xff0c;适合在普通硬件上运行强大推理&…...

Nano-Banana效果展示:多款产品高清拆解图生成作品集

Nano-Banana效果展示&#xff1a;多款产品高清拆解图生成作品集 1. 专业级拆解效果惊艳呈现 想象一下&#xff0c;只需简单输入文字描述&#xff0c;就能获得堪比专业设计师制作的产品爆炸图。Nano-Banana产品拆解引擎让这一想象成为现实&#xff0c;它专为产品拆解、平铺展示…...

汽车UDS刷写避坑指南:从S32K144 Bootloader的链接文件到安全访问,这些细节你注意了吗?

汽车UDS刷写实战避坑手册&#xff1a;S32K144 Bootloader开发中的七个致命细节 当你在凌晨三点的实验室里盯着CANoe窗口不断跳出的NRC 31&#xff08;requestOutOfRange&#xff09;错误码时&#xff0c;会不会突然怀念用J-Link直接烧录的简单日子&#xff1f;UDS刷写就像汽车电…...

ofa_image-caption实际项目:为AR眼镜提供实时本地图像语义理解能力

ofa_image-caption实际项目&#xff1a;为AR眼镜提供实时本地图像语义理解能力 1. 项目背景与价值 想象一下&#xff0c;当你戴着AR眼镜走在街上&#xff0c;看到一家咖啡馆的招牌&#xff0c;眼镜立即为你生成这段英文描述&#xff1a;"A modern coffee shop with larg…...

ZERO-IG:零样本学习驱动的低光图像联合去噪与自适应增强技术解析

1. 零样本学习&#xff1a;低光图像处理的革命性突破 想象一下&#xff0c;你正在用手机拍摄夜景&#xff0c;但照片总是又暗又糊。传统解决方案要么需要大量训练数据&#xff0c;要么效果不尽如人意。而ZERO-IG技术的出现&#xff0c;彻底改变了这一局面。这项技术的核心在于零…...

Mastering Text Tokenization for Large Language Models: From Words to Embeddings

1. 文本标记化的核心概念 你可能已经听说过ChatGPT这类大语言模型的神奇能力&#xff0c;但你知道它们是如何"读懂"人类文字的吗&#xff1f;秘密就藏在文本标记化&#xff08;Tokenization&#xff09;这个关键步骤里。想象一下&#xff0c;我们要教一个完全不懂中…...

保姆级教程:在Ubuntu 20.04上用Docker搞定GPUStack,让Atlas 300I Duo推理卡跑通LLM

保姆级教程&#xff1a;Ubuntu 20.04Docker部署GPUStack全流程指南&#xff08;Atlas 300I Duo专版&#xff09; 最近在折腾Atlas 300I Duo这块推理卡的朋友应该都深有体会——虽然硬件性能强悍&#xff0c;但要让它在Ubuntu系统上顺利跑起大语言模型&#xff0c;光驱动和依赖就…...