├── Excel2DBC.vb ├── Excel2DBC.zip ├── LICENSE ├── README.md └── test.dbc /Excel2DBC.vb: -------------------------------------------------------------------------------- 1 | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 2 | 'If you see this comment, you have already cracked this tool.I hope this code will help you. 3 | 'Submit issue if you have problem. 4 | 'Author: zhyongquan 5 | 'Email: zhyongquan@gmail.com 6 | 'GitHub: https://github.com/zhyongquan/Excel2DBC 7 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 8 | 9 | Option Explicit 10 | 11 | Sub dbc_Click() 12 | 13 | Application.DisplayAlerts = False 14 | On Error Resume Next 15 | 16 | Dim i, j, k, node_count, message_count, signal_count As Integer 17 | Dim Filename, arr 18 | Dim nodes As String 19 | Dim message, id, dlc, cycle_time, tx 20 | Dim line, signal, byte_order, value_type, initial_value, value_table, comment, rx As String 21 | Dim initial_value_list, value_table_list, cycle_time_list, comment_list As String 22 | Dim str, text As String 23 | Dim fso As New FileSystemObject 24 | Dim starttime, endtime As Date 25 | Dim elapsed As Double 26 | Dim dbc_type As String 27 | 28 | Filename = Application.GetSaveAsFilename(fileFilter:="DBC Files (*.dbc), *.dbc") 29 | 30 | If Filename = False Then 31 | Exit Sub 32 | End If 33 | 34 | dbc_type = ActiveSheet.Cells(1, 2) 35 | 36 | starttime = Now 37 | endtime = starttime 38 | 39 | Open Filename For Output As 1# 40 | 41 | If dbc_type <> "J1939" Then 42 | Print #1, Sheet4.Cells(1, 2) 43 | Else 44 | Print #1, Sheet5.Cells(1, 2) 45 | End If 46 | 47 | Print #1, vbLf 48 | 49 | i = 18 50 | nodes = "" 51 | While Len(ActiveSheet.Cells(2, i)) > 0 52 | node_count = node_count + 1 53 | nodes = nodes & " " & ActiveSheet.Cells(2, i) 54 | i = i + 1 55 | Wend 56 | Print #1, "BU_:" & nodes 57 | 58 | i = 3 59 | message_count = 0 60 | signal_count = 0 61 | While Len(ActiveSheet.Cells(i, 5)) > 0 62 | If Len(ActiveSheet.Cells(i, 1)) > 0 Then 63 | message_count = message_count + 1 64 | message = ActiveSheet.Cells(i, 1) 65 | id = Hex2Dec(ActiveSheet.Cells(i, 2)) 66 | If dbc_type <> "Standard" Then 67 | id = id + 2147483648# 68 | End If 69 | dlc = ActiveSheet.Cells(i, 3) 70 | For j = 1 To node_count 71 | If ActiveSheet.Cells(i, j + 17) = "T" Then 72 | tx = ActiveSheet.Cells(2, j + 17) 73 | Exit For 74 | End If 75 | Next j 76 | If tx = "" Then 77 | tx = "Vector__XXX" 78 | End If 79 | Print #1, vbLf 80 | Print #1, "BO_ " & id & " " & ActiveSheet.Cells(i, 1) & ": " & ActiveSheet.Cells(i, 3) & " " & tx 81 | If Len(ActiveSheet.Cells(i, 4) > 0) Then 82 | cycle_time = ActiveSheet.Cells(i, 4) + 0 83 | 'cycle_time_list = cycle_time_list & "BA_ " & """GenMsgILSupport"" BO_ " & id & " " & 1 & ";" & vbLf 84 | cycle_time_list = cycle_time_list & "BA_ " & """GenMsgSendType"" BO_ " & id & " " & 0 & ";" & vbLf 85 | cycle_time_list = cycle_time_list & "BA_ " & """GenMsgCycleTime"" BO_ " & id & " " & cycle_time & ";" & vbLf 86 | End If 87 | 88 | Else 89 | ' ActiveSheet.Cells(i, 1) = message 90 | ' Hex2Dec(ActiveSheet.Cells(i, 2)) = id 91 | ' Hex2Dec(ActiveSheet.Cells(i, 3)) = dlc 92 | ' ActiveSheet.Cells(i, 4) = cycle_time 93 | End If 94 | signal_count = signal_count + 1 95 | signal = ActiveSheet.Cells(i, 5) 96 | If ActiveSheet.Cells(i, 8) = "MSB" Then 97 | byte_order = "0" 98 | Else 99 | byte_order = "1" 100 | End If 101 | If ActiveSheet.Cells(i, 9) = "Unsigned" Then 102 | value_type = "+" 103 | Else 104 | value_type = "-" 105 | End If 106 | rx = "" 107 | For j = 1 To node_count 108 | If ActiveSheet.Cells(i, j + 17) = "R" Then 109 | rx = rx & ActiveSheet.Cells(2, j + 17) & "," 110 | End If 111 | Next j 112 | If rx = "" Then 113 | rx = " Vector__XXX" 114 | Else 115 | rx = Mid(rx, 1, Len(rx) - 1) 116 | End If 117 | Print #1, " SG_ " & ActiveSheet.Cells(i, 5) & " : " & ActiveSheet.Cells(i, 6) & "|" & ActiveSheet.Cells(i, 7) & "@" & byte_order & value_type & _ 118 | " (" & Num2Str(ActiveSheet.Cells(i, 11)) & "," & Num2Str(ActiveSheet.Cells(i, 12)) & ") " & "[" & Num2Str(ActiveSheet.Cells(i, 13)) & "|" & Num2Str(ActiveSheet.Cells(i, 14)) & "] " & _ 119 | """" & ActiveSheet.Cells(i, 15) & """" & rx 120 | If Len(ActiveSheet.Cells(i, 10)) > 0 And Len(ActiveSheet.Cells(i, 1)) > 0 And ActiveSheet.Cells(i, 11) <> 0 Then 121 | initial_value = (ActiveSheet.Cells(i, 10) + ActiveSheet.Cells(i, 12)) / ActiveSheet.Cells(i, 11) 122 | initial_value_list = initial_value_list & "BA_ ""GenSigStartValue"" SG_ " & id & " " & signal & " " & initial_value & ";" & vbLf 123 | End If 124 | If Len(ActiveSheet.Cells(i, 16)) > 0 Then 125 | arr = Split(ActiveSheet.Cells(i, 16), vbLf) 126 | value_table = "" 127 | For j = UBound(arr) To 0 Step -1 128 | k = InStr(arr(j), "=") 129 | value_table = value_table & Hex2Dec(Mid(arr(j), 1, k - 1)) & " """ & Mid(arr(j), k + 1, Len(arr(j)) - k - 1) & """ " 130 | Next j 131 | value_table_list = value_table_list & "VAL_ " & id & " " & signal & " " & value_table & ";" & vbLf 132 | End If 133 | If Len(ActiveSheet.Cells(i, 17)) > 0 Then 134 | comment = ActiveSheet.Cells(i, 17) 135 | comment_list = comment_list & "CM_ SG_ " & id & " " & signal & " """ & comment & """;" & vbLf 136 | End If 137 | i = i + 1 138 | Wend 139 | 140 | Print #1, vbLf 141 | Print #1, comment_list 142 | If dbc_type <> "J1939" Then 143 | Print #1, Sheet4.Cells(2, 2) 144 | Print #1, Sheet4.Cells(3, 2) 145 | Else 146 | Print #1, Sheet5.Cells(2, 2) 147 | Print #1, Sheet5.Cells(3, 2) 148 | End If 149 | Print #1, "BA_ ""DBName"" """ & fso.GetBaseName(Filename) + """;" + vbLf 150 | Print #1, cycle_time_list 151 | Print #1, initial_value_list 152 | Print #1, value_table_list 153 | 154 | Close #1 155 | 156 | 157 | str = "DBC File= " + fso.GetFileName(Filename) + vbLf 158 | str = str + "ECU Nodes Count= " + CStr(node_count) + vbLf 159 | str = str + "Messages Count= " + CStr(message_count) + vbLf 160 | str = str + "Signals Count= " + CStr(signal_count) 161 | ActiveSheet.Cells(1, 5) = str 162 | 163 | Set fso = Nothing 164 | 165 | MsgBox "Finish, " + GetElapsedTime(starttime, "elapsed time") 166 | 167 | End Sub 168 | 169 | Private Function Num2Str(ByVal num) As String 170 | 171 | Dim str As String 172 | str = CStr(num) 173 | If Len(str) > 0 And Mid(str, 1, 1) = "." Then 174 | str = "0" & str 175 | ElseIf Len(str) > 0 And Mid(str, 1, 2) = "-." Then 176 | str = "-0." & Mid(str, 3, Len(str) - 2) 177 | End If 178 | Num2Str = str 179 | 180 | End Function 181 | 182 | Private Function GetElapsedTime(ByVal starttime As Date, ByVal step As String) As String 183 | Dim text As String 184 | Dim elapsed As Double 185 | Dim endtime As Date 186 | 187 | endtime = Now 188 | elapsed = endtime - starttime 189 | text = step + ": " + Format(elapsed * 3600 * 24, "#0") + "s" 190 | GetElapsedTime = text 191 | 192 | End Function 193 | 194 | Function Hex2Dec(h) 195 | h = Mid(h, 3, Len(h) - 2) 196 | Dim L As Long: L = Len(h) 197 | If L < 16 Then ' CDec results in Overflow error for hex numbers above 16 ^ 8 198 | Hex2Dec = CDec("&h0" & h) 199 | If Hex2Dec < 0 Then Hex2Dec = Hex2Dec + 4294967296# ' 2 ^ 32 200 | ElseIf L < 25 Then 201 | Hex2Dec = Hex2Dec(Left$(h, L - 9)) * 68719476736# + CDec("&h" & Right$(h, 9)) ' 16 ^ 9 = 68719476736 202 | End If 203 | End Function 204 | 205 | Sub excel2dbc(control As IRibbonControl) 206 | dbc_Click 207 | End Sub 208 | -------------------------------------------------------------------------------- /Excel2DBC.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhyongquan/Excel2DBC/cc7f7d56c4b37740e0ea6a3fa32c9f9228777700/Excel2DBC.zip -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 zhang yongquan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Excel2DBC 2 | Convert excel to dbc by vba. 3 | 4 | >password:b6#_L!aprIC9LsoQ=-p2 5 | 6 | **Warning: This is a very simple tool. Don't recommend to use this in business case.** 7 | 8 | ![image](https://s2.ax1x.com/2019/05/08/E6unSA.png) 9 | 10 | Output dbc in candb++. 11 | 12 | ![image](https://s2.ax1x.com/2019/05/08/E6ueWd.png) 13 | -------------------------------------------------------------------------------- /test.dbc: -------------------------------------------------------------------------------- 1 | VERSION "" 2 | 3 | 4 | NS_ : 5 | NS_DESC_ 6 | CM_ 7 | BA_DEF_ 8 | BA_ 9 | VAL_ 10 | CAT_DEF_ 11 | CAT_ 12 | FILTER 13 | BA_DEF_DEF_ 14 | EV_DATA_ 15 | ENVVAR_DATA_ 16 | SGTYPE_ 17 | SGTYPE_VAL_ 18 | BA_DEF_SGTYPE_ 19 | BA_SGTYPE_ 20 | SIG_TYPE_REF_ 21 | VAL_TABLE_ 22 | SIG_GROUP_ 23 | SIG_VALTYPE_ 24 | SIGTYPE_VALTYPE_ 25 | BO_TX_BU_ 26 | BA_DEF_REL_ 27 | BA_REL_ 28 | BA_DEF_DEF_REL_ 29 | BU_SG_REL_ 30 | BU_EV_REL_ 31 | BU_BO_REL_ 32 | SG_MUL_VAL_ 33 | 34 | BS_: 35 | 36 | 37 | BU_: ECM TCM GW 38 | 39 | 40 | BO_ 1537 ECM_01: 8 ECM 41 | SG_ EngineSpeed : 7|16@0+ (0.25,0) [0|16383.8] "rpm"TCM,GW 42 | SG_ EngineSpeedValidity : 16|1@0+ (1,0) [0|1] ""TCM,GW 43 | 44 | 45 | BO_ 1538 ECM_02: 8 ECM 46 | SG_ EngineTorque : 7|16@0- (0.01,0) [-327.68|327.67] "Nm"TCM 47 | 48 | 49 | CM_ SG_ 1537 EngineSpeed "EngineSpeed"; 50 | CM_ SG_ 1537 EngineSpeedValidity "EngineSpeedValid"; 51 | CM_ SG_ 1538 EngineTorque "EngineTorque"; 52 | 53 | BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 0; 54 | BA_DEF_ BO_ "GenMsgDelayTime" INT 0 0; 55 | BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 0; 56 | BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 0; 57 | BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0; 58 | BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","NotUsed","NotUsed","NotUsed","NotUsed","NotUsed","NotUsed","IfActive","NoMsgSendType","NotUsed"; 59 | BA_DEF_ SG_ "GenSigStartValue" INT 0 0; 60 | BA_DEF_ SG_ "GenSigInactiveValue" INT 0 0; 61 | BA_DEF_ SG_ "GenSigCycleTimeActive" INT 0 0; 62 | BA_DEF_ SG_ "GenSigCycleTime" INT 0 0; 63 | BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType","NotUsed","NotUsed","NotUsed","NotUsed","NotUsed"; 64 | BA_DEF_ "Baudrate" INT 0 1000000; 65 | BA_DEF_ "BusType" STRING ; 66 | BA_DEF_ "NmType" STRING ; 67 | BA_DEF_ "Manufacturer" STRING ; 68 | BA_DEF_ BO_ "TpTxIndex" INT 0 255; 69 | BA_DEF_ BU_ "NodeLayerModules" STRING ; 70 | BA_DEF_ BU_ "NmStationAddress" HEX 0 255; 71 | BA_DEF_ BU_ "NmNode" ENUM "no","yes"; 72 | BA_DEF_ BO_ "NmMessage" ENUM "no","yes"; 73 | BA_DEF_ "NmAsrWaitBusSleepTime" INT 0 65535; 74 | BA_DEF_ "NmAsrTimeoutTime" INT 1 65535; 75 | BA_DEF_ "NmAsrRepeatMessageTime" INT 0 65535; 76 | BA_DEF_ BU_ "NmAsrNodeIdentifier" HEX 0 255; 77 | BA_DEF_ BU_ "NmAsrNode" ENUM "no","yes"; 78 | BA_DEF_ "NmAsrMessageCount" INT 1 256; 79 | BA_DEF_ BO_ "NmAsrMessage" ENUM "no","yes"; 80 | BA_DEF_ BU_ "NmAsrCanMsgReducedTime" INT 1 65535; 81 | BA_DEF_ "NmAsrCanMsgCycleTime" INT 1 65535; 82 | BA_DEF_ BU_ "NmAsrCanMsgCycleOffset" INT 0 65535; 83 | BA_DEF_ "NmAsrBaseAddress" HEX 0 2047; 84 | BA_DEF_ BU_ "ILUsed" ENUM "no","yes"; 85 | BA_DEF_ "ILTxTimeout" INT 0 65535; 86 | BA_DEF_ SG_ "GenSigTimeoutValue" INT 0 65535; 87 | BA_DEF_ SG_ "GenSigTimeoutTime" INT 0 65535; 88 | BA_DEF_ BO_ "GenMsgILSupport" ENUM "no","yes"; 89 | BA_DEF_ BO_ "GenMsgFastOnStart" INT 0 65535; 90 | BA_DEF_ BO_ "DiagUudtResponse" ENUM "false","true"; 91 | BA_DEF_ BO_ "DiagUudResponse" ENUM "False","True"; 92 | BA_DEF_ BO_ "DiagState" ENUM "no","yes"; 93 | BA_DEF_ BO_ "DiagResponse" ENUM "no","yes"; 94 | BA_DEF_ BO_ "DiagRequest" ENUM "no","yes"; 95 | BA_DEF_ "DBName" STRING ; 96 | BA_DEF_DEF_ "GenMsgStartDelayTime" 0; 97 | BA_DEF_DEF_ "GenMsgDelayTime" 0; 98 | BA_DEF_DEF_ "GenMsgNrOfRepetition" 0; 99 | BA_DEF_DEF_ "GenMsgCycleTimeFast" 0; 100 | BA_DEF_DEF_ "GenMsgCycleTime" 0; 101 | BA_DEF_DEF_ "GenMsgSendType" "Cyclic"; 102 | BA_DEF_DEF_ "GenSigStartValue" 0; 103 | BA_DEF_DEF_ "GenSigInactiveValue" 0; 104 | BA_DEF_DEF_ "GenSigCycleTimeActive" 0; 105 | BA_DEF_DEF_ "GenSigCycleTime" 0; 106 | BA_DEF_DEF_ "GenSigSendType" "Cyclic"; 107 | BA_DEF_DEF_ "Baudrate" 500000; 108 | BA_DEF_DEF_ "BusType" ""; 109 | BA_DEF_DEF_ "NmType" ""; 110 | BA_DEF_DEF_ "Manufacturer" "Vector"; 111 | BA_DEF_DEF_ "TpTxIndex" 0; 112 | BA_DEF_DEF_ "NodeLayerModules" " "; 113 | BA_DEF_DEF_ "NmStationAddress" 0; 114 | BA_DEF_DEF_ "NmNode" "no"; 115 | BA_DEF_DEF_ "NmMessage" "no"; 116 | BA_DEF_DEF_ "NmAsrWaitBusSleepTime" 1500; 117 | BA_DEF_DEF_ "NmAsrTimeoutTime" 2000; 118 | BA_DEF_DEF_ "NmAsrRepeatMessageTime" 3200; 119 | BA_DEF_DEF_ "NmAsrNodeIdentifier" 50; 120 | BA_DEF_DEF_ "NmAsrNode" "no"; 121 | BA_DEF_DEF_ "NmAsrMessageCount" 128; 122 | BA_DEF_DEF_ "NmAsrMessage" "no"; 123 | BA_DEF_DEF_ "NmAsrCanMsgReducedTime" 320; 124 | BA_DEF_DEF_ "NmAsrCanMsgCycleTime" 640; 125 | BA_DEF_DEF_ "NmAsrCanMsgCycleOffset" 0; 126 | BA_DEF_DEF_ "NmAsrBaseAddress" 1280; 127 | BA_DEF_DEF_ "ILUsed" "no"; 128 | BA_DEF_DEF_ "ILTxTimeout" 0; 129 | BA_DEF_DEF_ "GenSigTimeoutValue" 0; 130 | BA_DEF_DEF_ "GenSigTimeoutTime" 0; 131 | BA_DEF_DEF_ "GenMsgILSupport" "no"; 132 | BA_DEF_DEF_ "GenMsgFastOnStart" 0; 133 | BA_DEF_DEF_ "DiagUudtResponse" "false"; 134 | BA_DEF_DEF_ "DiagUudResponse" "False"; 135 | BA_DEF_DEF_ "DiagState" "no"; 136 | BA_DEF_DEF_ "DiagResponse" "no"; 137 | BA_DEF_DEF_ "DiagRequest" "no"; 138 | BA_DEF_DEF_ "DBName" ""; 139 | BA_ "Manufacturer" "Vector"; 140 | BA_ "NmType" "NmAsr"; 141 | BA_ "BusType" "CAN"; 142 | BA_ "Baudrate" 500000; 143 | BA_ "NmAsrWaitBusSleepTime" 2000; 144 | BA_ "DBName" "test"; 145 | 146 | BA_ "GenMsgSendType" BO_ 1537 0; 147 | BA_ "GenMsgCycleTime" BO_ 1537 10; 148 | BA_ "GenMsgSendType" BO_ 1538 0; 149 | BA_ "GenMsgCycleTime" BO_ 1538 10; 150 | 151 | BA_ "GenSigStartValue" SG_ 1537 EngineSpeed 0; 152 | BA_ "GenSigStartValue" SG_ 1538 EngineTorque 0; 153 | 154 | VAL_ 1537 EngineSpeedValidity 1 "Valid" 0 "Invalid" ; 155 | 156 | --------------------------------------------------------------------------------