直流电源的 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”为例。“03 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通信功能,将显著提升测试自动化程度与系统集成效率。
技术支持