直播推薦
企業(yè)動(dòng)態(tài)
- 誠(chéng)邀共赴!虹潤(rùn)與您相約第33屆多國(guó)儀器儀表展
- 從電網(wǎng)到芯片:優(yōu)化AI數(shù)據(jù)中心的能源效率
- “燈塔”引領(lǐng),AI賦能丨生命科學(xué)行業(yè)的數(shù)字化進(jìn)階之路
- 皓天試驗(yàn)設(shè)備:山東訂單如期啟程 車間忙碌映證實(shí)力
- 生產(chǎn)環(huán)節(jié)高達(dá)1500個(gè)應(yīng)用案例:igus將低成本自動(dòng)化技術(shù)落地自家工廠
- 虹潤(rùn)打造智能客服 “五可”化解客戶痛點(diǎn)
- 東方鼎晨攜手GE Vernova成功舉辦Proficy HOT U技術(shù)培訓(xùn)
- 客戶盛贊皓天快速溫變?cè)O(shè)備:精準(zhǔn)高效,服務(wù)專業(yè)
推薦展會(huì)
從1980年代,Kvaser就開始CAN產(chǎn)品的研發(fā),在相關(guān)產(chǎn)品開發(fā)領(lǐng)域有近40多年的經(jīng)驗(yàn),對(duì)CAN和相關(guān)總線技術(shù)有著非常深入的研究。我們將分享一些有趣的發(fā)現(xiàn)和一些特定情況的技術(shù)處理,歡迎關(guān)注!
所有人的電腦上都有Microsoft Office,平時(shí)我們用它列表和計(jì)算,除此之外,它還可以被用來進(jìn)行CAN總線數(shù)據(jù)收發(fā)的工作,進(jìn)而輔助你進(jìn)行其他工作。本文就分享如何巧用Excel進(jìn)行該操作。
我們可以利用Windows電腦上的Microsoft Office Excel進(jìn)行如下操作:
?從工作表中的任意單元格向CAN總線發(fā)送數(shù)據(jù)
?以工作表的任意單元格從CAN總線接收數(shù)據(jù)
Kvaser CANlib可用于Visual Basic for Applications (VBA)。此多功能庫支持Kvaser的所有適配器,并輔助你編寫高級(jí)和創(chuàng)新的解決方案。
有這么多其他語言可以用,為什么還要使用VBA呢?
首先,如果你平時(shí)使用Microsoft Office,那么使用它會(huì)更容易。Excel使用廣泛,通過VBA,你可應(yīng)用Excel的所有功能,以及你自己的創(chuàng)意和創(chuàng)新想法。另外,使用Excel不會(huì)產(chǎn)生額外成本,也更方便與他人或其他公司分享數(shù)據(jù)。
本文我們會(huì)簡(jiǎn)要介紹如何在Microsoft Excel中使用CANlib、VBA向CAN總線發(fā)送/接收數(shù)據(jù)。
應(yīng)用此方法,你需要:
根據(jù)本文的步驟,你需要使用Kvaser CANlib和Excel VBA。任意版本的Microsoft Office都可以,但是Office 2010,因?yàn)閂BA 7是在2010年推出的。64位和32位Office均可使用。本文中,使用的是Office 365和Excel(版本2202 Build 16.0.14931.20116)64位。
你還需要安裝“用于Windows的Kvaser驅(qū)動(dòng)程序”。請(qǐng)聯(lián)系廣州智維版本CANlib并依照其步驟進(jìn)行安裝。如果你需要進(jìn)一步使用CANlib,我們建議下載Kvaser CANlib SDK。
VBA介紹
VBA(Visual Basic for Applications)是Visual Basic的一種宏語言,是在其桌面應(yīng)用程序中執(zhí)行通用的自動(dòng)化(OLE)任務(wù)的編程語言。主要能用來擴(kuò)展Windows的應(yīng)用程序功能,特別是Microsoft Office軟件。它也可以說是一種應(yīng)用程式視覺化的 Basic 腳本。
VBA是Microsoft編程語言Visual Basic 6的一個(gè)子集,它使用同一編輯器的精簡(jiǎn)版本以及類似的調(diào)試功能。因此,如果你了解VB6,也就能了解VBA的使用方法。Visual Basic是為了簡(jiǎn)化編程而創(chuàng)建的,VBA編程的過程不難,使用它就類似于用英語的語句來告訴電腦該做什么。
將活動(dòng)文檔另存為 “New Document Name.docx”
需要注意的是,VBA是單線程的,這意味著它將一次執(zhí)行一個(gè)任務(wù)。(請(qǐng)參閱下文“VBA示例”中的“多任務(wù)處理”內(nèi)容)
默認(rèn)情況下,Office不顯示“開發(fā)工具”選項(xiàng)卡,你必須通過如下步驟啟用它:
1??從“File文件”選項(xiàng)卡中,選擇“Options選項(xiàng)”打開對(duì)話框。
2??選擇對(duì)話框左側(cè)的“Customize Ribbon自定義功能區(qū)”。
3??在對(duì)話框左側(cè)的“Choose Commands From從中選擇命令”中,選擇“Common Commands常用命令”。
4??在右側(cè)的“Customize the ribbon自定義功能區(qū)”中,從下拉列表中選擇“Main Tab主選項(xiàng)卡”,然后選擇“Developer開發(fā)工具”復(fù)選框。
5??選擇OK。
從“開發(fā)工具”選項(xiàng)卡,你可以打開編輯器并創(chuàng)建按鈕、下拉菜單等?;蛘撸憧梢栽贠ffice應(yīng)用程序中使用快捷鍵:ALT+F11。
如果你還是不了解如何操作,可以在網(wǎng)上進(jìn)行VBA示例搜索,即使需求不相同,你也能從中參考到類似的步驟。
VBA實(shí)例
個(gè)示例將顯示當(dāng)某個(gè)單元出現(xiàn)更改時(shí)如何作出反應(yīng),并將該值發(fā)送到CAN總線。
在VBA編輯器中,雙擊你需要對(duì)其作出反應(yīng)的單元格所在的工作表,然后選擇該工作表的“更改(Change)”步驟。

每當(dāng)該工作表中發(fā)生更改時(shí),都會(huì)執(zhí)行工作表更改事件,將其縮小到特定的一個(gè)單元格,我使用VBA中的Intersect()函數(shù)。此函數(shù)確定更改的單元格是否與我們指定的單元格“匹配”。為了簡(jiǎn)化此示例,我假設(shè)工作表處于活動(dòng)狀態(tài),并且我們要發(fā)送的值介于0-255之間。有關(guān)canWrite中使用的參數(shù),以及如何從CAN總線接收數(shù)據(jù)的更多信息,請(qǐng)見下一個(gè)示例。
在另一個(gè)示例中,我已將一個(gè)記錄文件導(dǎo)入Excel(在此示例中,它是一個(gè).ASC文件)。我這樣做只是為了向CAN總線發(fā)送數(shù)據(jù)。

當(dāng)然,你的數(shù)據(jù)可以是來自任何地方的,在VBA中打開一個(gè)文件,也可以在Excel中編寫幾個(gè)具體應(yīng)發(fā)送的幀等。
在這里,不會(huì)深入探討CANlib,這個(gè)示例主要是啟發(fā)你可以如何利用VBA和CANlib。在本文,我將演示如何使用Kvaser CANlib從Excel中的任意單元格發(fā)送數(shù)據(jù),以及如何以Excel中的任意單元格接收數(shù)據(jù)。
編碼
CANlib API - 和句柄聲明
這些聲明是必要的,以便指定哪些dll調(diào)用可用,并指出此dll的位置。通過Kvaser的安裝程序安裝時(shí),CANlib32.dll位于系統(tǒng)路徑中。這就是說你不必指定它的具體位置。
[ Public | Private ] Declare Sub name Lib “l(fā)ibname” [ ( [ arglist ] ) ]
[ Public | Private ] Declare Function name Lib “l(fā)ibname” [ ( [ arglist ] ) ] [ As type ]
使用Private表明,只有在聲明它的模塊中才能訪問它。
Kvaser CANlib SDK目前不包含任何VB或VBA聲明,因此你必須根據(jù)需要編寫這些聲明。
有任何問題,你可以聯(lián)系我們的技術(shù)支持人員,本文結(jié)尾處提供了。
調(diào)用 CANlib API
初始化CANlib并獲取可用通道數(shù)
在使用任何其他函數(shù)之前,必須先調(diào)用canInitializeLibrary函數(shù)。它將初始化驅(qū)動(dòng)程序。
canGetNumberOfChannels, 此函數(shù)將返回電腦中可用CAN通道的數(shù)量。虛擬通道包括在此通道數(shù)中。
準(zhǔn)備工作表以讀取一些設(shè)備信息
在這里,我們給個(gè)位置添加一個(gè)新的工作表,并在該工作表的單元格B1中寫入可用通道數(shù)。
讀取每個(gè)可用通道的一些設(shè)備信息
在這里,我們查看每個(gè)可用的通道,并詢問設(shè)備的序列號(hào),并且我們將其寫入每個(gè)通道的第二列中的新行(即B)。
打開通道,設(shè)置參數(shù)并啟動(dòng)總線
在這里,我們打開個(gè)和第二個(gè)通道,以獲得所有其他調(diào)用所需的句柄。我們繼續(xù)準(zhǔn)備這兩個(gè)打開的通道,為它們?cè)O(shè)置相同的比特率。
為讀取數(shù)據(jù)準(zhǔn)備工作表
這里我們準(zhǔn)備一個(gè)工作表來存儲(chǔ)讀取的數(shù)據(jù)。我首先刪除“讀取數(shù)據(jù)(Read data)”表,如果它已經(jīng)存在。然后我創(chuàng)建此工作表并命名,同時(shí)添加一些標(biāo)題注釋,以便更好地理解輸出內(nèi)容。
發(fā)送、接收和填充單元格
首先確定要讀取的工作表已激活。在我的示例中,我將導(dǎo)入數(shù)據(jù)的工作表命名為TestLog,并將其設(shè)置為L(zhǎng)istObject變量。我這樣做是為了在獲取要發(fā)送的值時(shí)更容易循環(huán)操作,這樣我可以使用工作表的標(biāo)題來指定我正在讀取的列。個(gè)循環(huán)設(shè)置為讀取導(dǎo)入數(shù)據(jù)的整個(gè)范圍。我讀取數(shù)據(jù)長(zhǎng)度代碼(dlc)值,以了解還要讀取和稍后發(fā)送的字節(jié)數(shù)。第二個(gè)循環(huán)迭代數(shù)據(jù)字節(jié),將它們從文本格式的十六進(jìn)制轉(zhuǎn)換為十進(jìn)制值,并將值存儲(chǔ)在字節(jié)數(shù)組中。
然后,通過調(diào)用CANlib函數(shù)canWrite,將CAN數(shù)據(jù)的字節(jié)數(shù)組與報(bào)文id(在本例中為行號(hào))和數(shù)據(jù)長(zhǎng)度代碼(dlc)一起發(fā)送。
DoEvents可以更輕松地停止正在運(yùn)行的宏。DoEvents函數(shù)允許中斷執(zhí)行代碼,并允許計(jì)算機(jī)處理器同時(shí)運(yùn)行其他任務(wù)。使用DoEvents會(huì)延長(zhǎng)執(zhí)行時(shí)間,但另一方面,它也會(huì)讓宏停止運(yùn)行。
canReadWait從接收緩沖區(qū)讀取報(bào)文。如果沒有可用的報(bào)文,則該函數(shù)將等待報(bào)文到達(dá)或超時(shí)。
最后,用該讀取值填充之前創(chuàng)建的“讀取數(shù)據(jù)”工作表并使用報(bào)文id指定單元格行。通過在寫入單元格時(shí)使用命名工作表,我不必激活該工作表(Worksheets(“Read data”). Cells (Row, Column).Value),同時(shí)能保持保存導(dǎo)入數(shù)據(jù)的工作表處于活動(dòng)狀態(tài)。
操作后清理
canBusOff把指定句柄關(guān)閉。如果同一通道上沒有其他句柄處于活動(dòng)狀態(tài),則也將把此通道關(guān)閉。canUnloadLibrary將釋放分配的內(nèi)存,卸載已加載的DLL canlib32.,并取消初始化數(shù)據(jù)結(jié)構(gòu)。
結(jié)果
本示例的結(jié)果如下圖所示:

如果選擇將輸出數(shù)據(jù)格式化為十六進(jìn)制,這樣更便于比較,然后將單元格格式化為文本: ws.Columns(“A:I”).NumberFormat = “@”,當(dāng)將值放入這些單元格時(shí),需要進(jìn)行如下轉(zhuǎn)換:Cells(col, row).Value = CStr(Hex(MyDecValue))。
但在本次操作中,為了讓后續(xù)分析更方便,我選擇了十進(jìn)制。(也可以使用十六進(jìn)制值,但有時(shí)需要進(jìn)行轉(zhuǎn)換,因?yàn)閂BA和Excel中的圖表對(duì)象需要其值為十進(jìn)制格式。)
可使用Excel圖表可視化數(shù)據(jù),例如:

圖表可以在VBA代碼中生成,也可以在以后使用Excel的工具欄生成。 32位與64位Microsoft Office 兩個(gè)Office版本都可用,但VBA版本7中添加了一些新的64位功能。 VBA中除數(shù)據(jù)類型Byte外,沒有無符號(hào)數(shù)據(jù)類型。但這并不是不可行 – 可以在VBA中讀取無符號(hào)值,例如本例介紹了如何對(duì)2147483647以上的值使用雙精度類型。 多任務(wù)處理 VBA是單線程的,這意味著它將一次執(zhí)行一個(gè)任務(wù)。仍然可以創(chuàng)建一個(gè)線程或使用回調(diào)函數(shù),如CANlib中的kvSetNotifyCallback,但我不建議這樣做。如果關(guān)閉一個(gè)線程并在主線程中等待,則創(chuàng)建一個(gè)線程是可以的,但創(chuàng)建更多線程或嘗試寫入主線程外的單元格,可能會(huì)導(dǎo)致Excel凍結(jié)并關(guān)閉。為了避免麻煩和花費(fèi)額外時(shí)間,建議保持它的簡(jiǎn)單性和主線程。 對(duì)于那些有使用VBA經(jīng)驗(yàn)的用戶,有一些方法可以解決這個(gè)問題,例如從代碼中的循環(huán)中啟動(dòng)一個(gè)新的Excel實(shí)例,并從該新實(shí)例調(diào)用主工作簿中的一個(gè)過程。 我的建議是保持在主線程里。 結(jié)論 在本文中,我們簡(jiǎn)要介紹了如何在Microsoft Excel中使用CANlib和VBA向CAN總線發(fā)送和從CAN總線接收數(shù)據(jù)。希望此示例可讓你了解如何操作可行,并輔助你進(jìn)一步分析數(shù)據(jù)或編寫解決方案。
免責(zé)聲明
- 凡本網(wǎng)注明"來源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://www.decaoba.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
- 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
- 本網(wǎng)轉(zhuǎn)載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來源,并自負(fù)版權(quán)等法律責(zé)任。
- 如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
2026杭州國(guó)際人形機(jī)器人與機(jī)器人技術(shù)展覽會(huì)
展會(huì)城市:杭州市展會(huì)時(shí)間:2026-05-14