直流電源的 CAN 通信設(shè)置與實踐
EA Elektro-Automatik作為全球儀器行業(yè)領(lǐng)導(dǎo)者Tektronix旗下的大功率直流電源品牌,憑借其產(chǎn)品功能強大、性能穩(wěn)定可靠等優(yōu)勢,被廣泛應(yīng)用于多個行業(yè),尤其在汽車電子、新能源及工業(yè)控制等領(lǐng)域備受青睞。
EA 電源產(chǎn)品支持選配 CAN 通信模塊 IF-AB-CAN,以實現(xiàn)與 CAN 總線的無縫通信。本文將以某客戶的電池充放電項目為例,詳細介紹如何將 EA 雙向直流電源配置為 CAN 總線網(wǎng)絡(luò)中的一個節(jié)點,并實現(xiàn)遠程控制與實時監(jiān)控。誠摯感謝高望來先生為本文提供了寶貴的素材,并在專業(yè)領(lǐng)域給予支持。
CAN 通信基礎(chǔ)知識
CAN(Controller Area Network,控制器局域網(wǎng))是一種廣泛應(yīng)用于高實時性分布式控制系統(tǒng)的串行通信協(xié)議,最早由德國Bosch公司于1983年開發(fā),旨在解決傳統(tǒng)多線束布線方式帶來的復(fù)雜性與高成本問題。CAN 總線具備高可靠性、低成本、高效傳輸和靈活組網(wǎng)等特點,被廣泛用于汽車電子、工業(yè)控制、機器人、航空航天、醫(yī)療設(shè)備及能源管理系統(tǒng)等領(lǐng)域。
在 CAN 總線網(wǎng)絡(luò)中,每個 ECU(電子控制單元)作為一個節(jié)點,通過總線實現(xiàn)與其他節(jié)點的通信。下圖展示了典型的 CAN 總線連接結(jié)構(gòu):
CAN 數(shù)據(jù)幀的結(jié)構(gòu)如下圖所示。在實際應(yīng)用中,發(fā)送數(shù)據(jù)時需重點關(guān)注仲裁段、控制段及數(shù)據(jù)段。
仲裁段
EA 電源產(chǎn)品默認設(shè)有三個基礎(chǔ) ID(BASEID),位于數(shù)據(jù)幀的仲裁段,用于消息識別與仲裁:
■ 000h:用于寫入對象,消息類型為Send_ Object
■ 001h:用于查詢對象,消息類型為Query_ Object
■ 002h:用于讀取對象,消息類型為Read_ Object
這些基礎(chǔ) ID 通常用于應(yīng)答式通信。例如,使用000h可發(fā)送 “Normal Sending” 類指令,如開啟遠程控制、設(shè)置電壓、啟動輸出等;而 001h 可用于查詢電壓等參數(shù)。
此外,還有用于循環(huán)讀取和發(fā)送指令的基礎(chǔ) ID:
■ 100h系列:用于循環(huán)讀取,如:
100h:讀取狀態(tài)
101h:讀取實際值(電壓、電流、功率等)
102h:讀取設(shè)定值
■ 200h系列:用于循環(huán)發(fā)送,如:
200h:遠程控制與輸出控制
201h:設(shè)置電源設(shè)定值
202h:設(shè)置負載設(shè)定值
控制段
控制段中的 DLC(Data Length Code)用于指定數(shù)據(jù)字節(jié)數(shù)。例如,在設(shè)置遠程開啟時若數(shù)據(jù)部分為5字節(jié),則 DLC 應(yīng)設(shè)為5。某些 CAN 通信軟件(如 PCAN-View)支持手動設(shè)置 DLC,如下表所示:
部分軟件默認 DLC 為 8,即數(shù)據(jù)段為 8 字節(jié)。若實際數(shù)據(jù)不足 8 字節(jié),則低位以 0 填充。
數(shù)據(jù)段
本文以 8 字節(jié)標準幀為例。不同基礎(chǔ) ID 對應(yīng)的數(shù)據(jù)內(nèi)容有所差異,但均表示對特定寄存器進行讀寫操作,具體方法將在 “實踐” 部分展開。
二
硬件與連接準備
EA 雙向直流電源及其它 EA 系列產(chǎn)品可通過選配 EA-IF-CAN 通信模塊(型號:EA-IF-AB-CAN,訂貨號:35400111)接入 CAN 總線。該模塊支持 CAN 2.0 A/B 標準,最高傳輸速率 1 Mbit/s,接口為 9 針 D-Sub 公頭。
若要通過電腦對電源進行控制與監(jiān)視,需額外配置USB-CAN通信模塊,使電腦也成為CAN總線上的一個節(jié)點。若USB-CAN模塊未內(nèi)置120Ω終端電阻或未啟用電阻開關(guān),則需在EA電源的CAN設(shè)置中開啟終端電阻。
三 軟件準備
■ Windows系統(tǒng):可選用PCAN-View、PCAN-Explorer或Vector公司的CANoe等軟件。
■ Linux系統(tǒng):可通過candump命令接收消息,cansend命令發(fā)送消息。
四
實踐操作
在 Windows 環(huán)境下使用 PCAN-View 進行通信
安裝驅(qū)動及軟件后,在設(shè)備管理器確認硬件識別正常。
打開PCAN-View,點擊菜單欄中的 “Client → Connect” 進行連接設(shè)置,之后通過 “Transmit → New Message” 編輯并發(fā)送CAN消息。
1. 寫入單個寄存器(Write Single Register)
以 EA PSB 10080-120 2U 雙向直流電源(80V, 120A, 3kW)為例,常見操作如下:
Message | DLC | Data | 說明 |
000h | 5 | 019201FF00 | 開啟遠程控制(0192為寄存器地址,F(xiàn)F00表示“開”) |
000h | 5 | 01F40123D7 | 設(shè)置電壓為14V(01F4為寄存器地址,23D7為16進制電壓值) |
000h | 5 | 01F50101C4 | 設(shè)置電源電流為1A(01F5為寄存器地址,01C4為電流值) |
000h | 5 | 01F30101C4 | 設(shè)置負載電流為1A(01F3為寄存器地址,01C4為電流值) |
000h | 5 | 019501FF00 | 打開電源輸出(0195為寄存器地址,F(xiàn)F00表示“開”) |
200h | 6 | 02B5147B0000 | 設(shè)置電壓與電流(02B5代表電壓,147B代表電流) |
以第一行命令為例,“01 92”對應(yīng)的是遠程控制的寄存器,“01”代表寄存器數(shù)量1,“FF 00”代表該寄存器的值:“開”。
電壓值的換算公式如下:
Voltage_hex = voltage_value × 52428 / nominal_voltage
以14V為例:
14 × 52428 / 80 = 9175(十進制)→ 轉(zhuǎn)十六進制為23D7。
2. 寫入多個寄存器
(Write Multiple Registers, WMR)
該操作常用于函數(shù)發(fā)生器設(shè)置,例如設(shè)置一個時長為6秒、幅值為10V的任意波形:
Message | DLC | Data | Description |
000h | 5 | 019201FF00 | 遠程控制開啟,01 92為寄存器地址。 |
000h | 5 | 035301FF00 | 激活函數(shù)發(fā)生器任意波,選擇電壓設(shè)置 |
000h | 8 | 03 84 10 FF 00 00 00 00 | 設(shè)置序列1的交流初始值為00 00 00 00 |
000h | 8 | 03 84 10 FE 00 00 00 00 | 設(shè)置序列1的交流結(jié)束值為00 00 00 00 |
000h | 8 | 03 84 10 FD 00 00 00 00 | 設(shè)置序列1的交流初始頻率值為00 00 00 00 |
000h | 8 | 03 84 10 FC 00 00 00 00 | 設(shè)置序列1的交流結(jié)束頻率值為00 00 00 00 |
000h | 8 | 03 84 10 FB 00 00 00 00 | 設(shè)置序列1的交流相位角值為00 00 00 00 |
000h | 8 | 03 84 10 FA 41 20 00 00 | 設(shè)置序列1的直流初始值為41 20 00 00 |
000h | 8 | 03 84 10 F9 41 20 00 00 | 設(shè)置序列1的直流結(jié)束值為41 20 00 00 |
000h | 8 | 03 84 10 F8 4A B7 1B 00 | 設(shè)置序列1的直流結(jié)束值為4A B7 1B 00 |
000h | 5 | 035B010001 | 設(shè)置初始序列為序列1 |
000h | 5 | 035C010001 | 設(shè)置結(jié)束序列為序列1 |
000h | 5 | 035D010005 | 設(shè)置循環(huán)5次 |
000h | 5 | 035E01FF00 | 提交序列設(shè)置 |
000h | 5 | 01F501CCCC | 設(shè)置電流限制值,此處CC CC為額定值 |
000h | 5 | 01F601CCCC | 設(shè)置功率限制值,此處CC CC為額定值 |
000h | 5 | 035201FF00 | 運行該任意波 |
由于函數(shù)發(fā)生器中任意波的每一個序列設(shè)置,需要 32 個字節(jié),放置在 16 個寄存器中,也就是每個寄存器容納 2 個字節(jié)。實際在通過 CAN 標準幀對寄存器設(shè)置時,每個標準幀(8 個字節(jié))的后 4 個字節(jié)或字符(表格紅色字體),即為序列設(shè)置值,因此需要發(fā)送 8 個標準幀。具體幀的結(jié)構(gòu)如下:
詳解:以表格中“03 84 10 FA 41 20 00 00”為例?!?3 84” (10進制為900)是起始寄存器(Start reg.),通過該寄存器,可以對函數(shù)發(fā)生器中任意波的序列1進行設(shè)置。如要設(shè)置序列2, 則起始寄存器為 0x0394,也就是增加0x10個,對應(yīng)10進制數(shù),就是16個。
因設(shè)置值需要16個寄存器存放,Nr. of regs to write 也就是 0x10。
在 CAN 總線上,無法保證按照發(fā)送順序接收,因此引入一個標記 Marker 字節(jié)來解決此問題。
將一個超過4字節(jié)的信息,比如32字節(jié)的信息,分成8次發(fā)送,需要為每一個CAN標準幀做標記(Mark),按照倒序排列,第一個幀標記為FF,第八個幀為F8。這樣在接收方收到這些幀后,能正確按照排序組裝。舉例中的標記Marker為 “FA” ,表示第六。
設(shè)置值需符合 IEEE754 浮點數(shù)格式,可使用在線工具
(如https://www.h-schmidt.net /FloatConverter /IEEE754.html)進行轉(zhuǎn)換,或通過Python代碼實現(xiàn):
coding=utf-8
import struct
def float_to_hex():
try:
# 提示用戶輸入一個浮點數(shù)
float_value = float(input("請輸入一個浮點數(shù):"))
# 將浮點數(shù)轉(zhuǎn)換為IEEE 754的32位十六進制表示
hex_representation = struct.pack('>f', float_value).hex().upper()
# 輸出大寫十六進制字符串
print ("對應(yīng)的十六進制表示是: 0x" + hex_representation)
except ValueError:
print("輸入無效,請輸入一個有效的浮點數(shù)。")
if __name__ == "__main__":
float_to_hex()
3. 使用 PCAN-Explorer 導(dǎo)入 DBC 文件
PCAN-Explorer支持導(dǎo)入DBC文件,可更直觀地解析與發(fā)送消息。用戶可在項目視圖中導(dǎo)入為特定型號(如PSB 10080-120 2U)預(yù)定義的DBC文件,提升配置效率。
在 Linux 環(huán)境下進行 CAN 通信
首先設(shè)置CAN總線波特率:
sudo ip link set CAN0 up type can bitrate 500000
接收總線數(shù)據(jù):
candump CAN0
示例輸出:
CAN0 101 [6] 23 D4 00 46 00 26
CAN0 101 [6] 23 D6 00 48 00 26
…
發(fā)送控制指令:
cansend CAN0 000#019201FF00 # 遠程打開
cansend CAN0 000#01F40123D7 # 設(shè)置電壓為14V
cansend CAN0 000#01F50101C4 # 設(shè)置電流為1A
cansend CAN0 000#019501FF00 # 打開輸出
結(jié)語
通過上述設(shè)置與操作,用戶可順利將EA雙向直流電源集成到CAN網(wǎng)絡(luò)中,實現(xiàn)靈活的遠程控制與實時監(jiān)控。合理運用CAN通信功能,將顯著提升測試自動化程度與系統(tǒng)集成效率。
技術(shù)支持