直流電源的 CAN 通信設置與實踐
EA Elektro-Automatik作為全球儀器行業領導者Tektronix旗下的大功率直流電源品牌,憑借其產品功能強大、性能穩定可靠等優勢,被廣泛應用于多個行業,尤其在汽車電子、新能源及工業控制等領域備受青睞。
EA 電源產品支持選配 CAN 通信模塊 IF-AB-CAN,以實現與 CAN 總線的無縫通信。本文將以某客戶的電池充放電項目為例,詳細介紹如何將 EA 雙向直流電源配置為 CAN 總線網絡中的一個節點,并實現遠程控制與實時監控。誠摯感謝高望來先生為本文提供了寶貴的素材,并在專業領域給予支持。
CAN 通信基礎知識
CAN(Controller Area Network,控制器局域網)是一種廣泛應用于高實時性分布式控制系統的串行通信協議,最早由德國Bosch公司于1983年開發,旨在解決傳統多線束布線方式帶來的復雜性與高成本問題。CAN 總線具備高可靠性、低成本、高效傳輸和靈活組網等特點,被廣泛用于汽車電子、工業控制、機器人、航空航天、醫療設備及能源管理系統等領域。
在 CAN 總線網絡中,每個 ECU(電子控制單元)作為一個節點,通過總線實現與其他節點的通信。下圖展示了典型的 CAN 總線連接結構:

CAN 數據幀的結構如下圖所示。在實際應用中,發送數據時需重點關注仲裁段、控制段及數據段。
仲裁段
EA 電源產品默認設有三個基礎 ID(BASEID),位于數據幀的仲裁段,用于消息識別與仲裁:
■ 000h:用于寫入對象,消息類型為Send_ Object
■ 001h:用于查詢對象,消息類型為Query_ Object
■ 002h:用于讀取對象,消息類型為Read_ Object
這些基礎 ID 通常用于應答式通信。例如,使用000h可發送 “Normal Sending” 類指令,如開啟遠程控制、設置電壓、啟動輸出等;而 001h 可用于查詢電壓等參數。
此外,還有用于循環讀取和發送指令的基礎 ID:
■ 100h系列:用于循環讀取,如:
100h:讀取狀態
101h:讀取實際值(電壓、電流、功率等)
102h:讀取設定值
■ 200h系列:用于循環發送,如:
200h:遠程控制與輸出控制
201h:設置電源設定值
202h:設置負載設定值
控制段
控制段中的 DLC(Data Length Code)用于指定數據字節數。例如,在設置遠程開啟時若數據部分為5字節,則 DLC 應設為5。某些 CAN 通信軟件(如 PCAN-View)支持手動設置 DLC,如下表所示:

部分軟件默認 DLC 為 8,即數據段為 8 字節。若實際數據不足 8 字節,則低位以 0 填充。
數據段
本文以 8 字節標準幀為例。不同基礎 ID 對應的數據內容有所差異,但均表示對特定寄存器進行讀寫操作,具體方法將在 “實踐” 部分展開。
二
硬件與連接準備
EA 雙向直流電源及其它 EA 系列產品可通過選配 EA-IF-CAN 通信模塊(型號:EA-IF-AB-CAN,訂貨號:35400111)接入 CAN 總線。該模塊支持 CAN 2.0 A/B 標準,最高傳輸速率 1 Mbit/s,接口為 9 針 D-Sub 公頭。

若要通過電腦對電源進行控制與監視,需額外配置USB-CAN通信模塊,使電腦也成為CAN總線上的一個節點。若USB-CAN模塊未內置120Ω終端電阻或未啟用電阻開關,則需在EA電源的CAN設置中開啟終端電阻。
三 軟件準備
■ Windows系統:可選用PCAN-View、PCAN-Explorer或Vector公司的CANoe等軟件。
■ Linux系統:可通過candump命令接收消息,cansend命令發送消息。
四
實踐操作
在 Windows 環境下使用 PCAN-View 進行通信
安裝驅動及軟件后,在設備管理器確認硬件識別正常。

打開PCAN-View,點擊菜單欄中的 “Client → Connect” 進行連接設置,之后通過 “Transmit → New Message” 編輯并發送CAN消息。

1. 寫入單個寄存器(Write Single Register)
以 EA PSB 10080-120 2U 雙向直流電源(80V, 120A, 3kW)為例,常見操作如下:
Message | DLC | Data | 說明 |
000h | 5 | 019201FF00 | 開啟遠程控制(0192為寄存器地址,FF00表示“開”) |
000h | 5 | 01F40123D7 | 設置電壓為14V(01F4為寄存器地址,23D7為16進制電壓值) |
000h | 5 | 01F50101C4 | 設置電源電流為1A(01F5為寄存器地址,01C4為電流值) |
000h | 5 | 01F30101C4 | 設置負載電流為1A(01F3為寄存器地址,01C4為電流值) |
000h | 5 | 019501FF00 | 打開電源輸出(0195為寄存器地址,FF00表示“開”) |
200h | 6 | 02B5147B0000 | 設置電壓與電流(02B5代表電壓,147B代表電流) |
以第一行命令為例,“01 92”對應的是遠程控制的寄存器,“01”代表寄存器數量1,“FF 00”代表該寄存器的值:“開”。
電壓值的換算公式如下:
Voltage_hex = voltage_value × 52428 / nominal_voltage
以14V為例:
14 × 52428 / 80 = 9175(十進制)→ 轉十六進制為23D7。
2. 寫入多個寄存器
(Write Multiple Registers, WMR)
該操作常用于函數發生器設置,例如設置一個時長為6秒、幅值為10V的任意波形:
Message | DLC | Data | Description |
000h | 5 | 019201FF00 | 遠程控制開啟,01 92為寄存器地址。 |
000h | 5 | 035301FF00 | 激活函數發生器任意波,選擇電壓設置 |
000h | 8 | 03 84 10 FF 00 00 00 00 | 設置序列1的交流初始值為00 00 00 00 |
000h | 8 | 03 84 10 FE 00 00 00 00 | 設置序列1的交流結束值為00 00 00 00 |
000h | 8 | 03 84 10 FD 00 00 00 00 | 設置序列1的交流初始頻率值為00 00 00 00 |
000h | 8 | 03 84 10 FC 00 00 00 00 | 設置序列1的交流結束頻率值為00 00 00 00 |
000h | 8 | 03 84 10 FB 00 00 00 00 | 設置序列1的交流相位角值為00 00 00 00 |
000h | 8 | 03 84 10 FA 41 20 00 00 | 設置序列1的直流初始值為41 20 00 00 |
000h | 8 | 03 84 10 F9 41 20 00 00 | 設置序列1的直流結束值為41 20 00 00 |
000h | 8 | 03 84 10 F8 4A B7 1B 00 | 設置序列1的直流結束值為4A B7 1B 00 |
000h | 5 | 035B010001 | 設置初始序列為序列1 |
000h | 5 | 035C010001 | 設置結束序列為序列1 |
000h | 5 | 035D010005 | 設置循環5次 |
000h | 5 | 035E01FF00 | 提交序列設置 |
000h | 5 | 01F501CCCC | 設置電流限制值,此處CC CC為額定值 |
000h | 5 | 01F601CCCC | 設置功率限制值,此處CC CC為額定值 |
000h | 5 | 035201FF00 | 運行該任意波 |
由于函數發生器中任意波的每一個序列設置,需要 32 個字節,放置在 16 個寄存器中,也就是每個寄存器容納 2 個字節。實際在通過 CAN 標準幀對寄存器設置時,每個標準幀(8 個字節)的后 4 個字節或字符(表格紅色字體),即為序列設置值,因此需要發送 8 個標準幀。具體幀的結構如下:

詳解:以表格中“03 84 10 FA 41 20 00 00”為例?!?3 84” (10進制為900)是起始寄存器(Start reg.),通過該寄存器,可以對函數發生器中任意波的序列1進行設置。如要設置序列2, 則起始寄存器為 0x0394,也就是增加0x10個,對應10進制數,就是16個。
因設置值需要16個寄存器存放,Nr. of regs to write 也就是 0x10。
在 CAN 總線上,無法保證按照發送順序接收,因此引入一個標記 Marker 字節來解決此問題。
將一個超過4字節的信息,比如32字節的信息,分成8次發送,需要為每一個CAN標準幀做標記(Mark),按照倒序排列,第一個幀標記為FF,第八個幀為F8。這樣在接收方收到這些幀后,能正確按照排序組裝。舉例中的標記Marker為 “FA” ,表示第六。
設置值需符合 IEEE754 浮點數格式,可使用在線工具
(如https://www.h-schmidt.net /FloatConverter /IEEE754.html)進行轉換,或通過Python代碼實現:
coding=utf-8
import struct
def float_to_hex():
try:
# 提示用戶輸入一個浮點數
float_value = float(input("請輸入一個浮點數:"))
# 將浮點數轉換為IEEE 754的32位十六進制表示
hex_representation = struct.pack('>f', float_value).hex().upper()
# 輸出大寫十六進制字符串
print ("對應的十六進制表示是: 0x" + hex_representation)
except ValueError:
print("輸入無效,請輸入一個有效的浮點數。")
if __name__ == "__main__":
float_to_hex()
3. 使用 PCAN-Explorer 導入 DBC 文件
PCAN-Explorer支持導入DBC文件,可更直觀地解析與發送消息。用戶可在項目視圖中導入為特定型號(如PSB 10080-120 2U)預定義的DBC文件,提升配置效率。


在 Linux 環境下進行 CAN 通信
首先設置CAN總線波特率:
sudo ip link set CAN0 up type can bitrate 500000
接收總線數據:
candump CAN0
示例輸出:
CAN0 101 [6] 23 D4 00 46 00 26
CAN0 101 [6] 23 D6 00 48 00 26
…
發送控制指令:
cansend CAN0 000#019201FF00 # 遠程打開
cansend CAN0 000#01F40123D7 # 設置電壓為14V
cansend CAN0 000#01F50101C4 # 設置電流為1A
cansend CAN0 000#019501FF00 # 打開輸出
結語
通過上述設置與操作,用戶可順利將EA雙向直流電源集成到CAN網絡中,實現靈活的遠程控制與實時監控。合理運用CAN通信功能,將顯著提升測試自動化程度與系統集成效率。






關注官方微信
