参考:【Matlab】Simulink中CAN模块的使用(车辆网络工具箱)
Peak CAN与Matlab建立通信 & Simulink仿真接收CAN报文
【Matlab】Simulink中CAN模块的使用(车辆网络工具箱)
canChannelList | 有关可用 CAN 设备的信息 |
canChannel | 构造连接到指定设备的 CAN 通道 |
discard | 丢弃来自 CAN 通道的所有报文 |
configBusSpeed | 设置 CAN 通道的位定时速率 |
canSupport | 生成技术支持日志 |
canMessage | 基于用户指定的结构体构建 CAN 报文 |
pack | 将信号数据打包到 CAN 报文中 |
start | 将 CAN 通道设置为在线状态 |
transmit | 将 CAN 报文发送到 CAN 总线 |
replay | 从 CAN 总线重新传输报文 |
transmitConfiguration | 显示配置为自动传输的报文 |
transmitEvent | 将报文配置为基于事件传输 |
transmitPeriodic | 将报文配置为周期性传输 |
receive | 从 CAN 总线接收报文 |
attachDatabase | 将 CAN 数据库连接到报文以及 从报文中删除 CAN 数据库 |
stop | 将 CAN 通道设置为离线状态 |
unpack | 从 CAN 报文中解包信号数据 |
extractAll | 从报文数组中选择 CAN 报文的所有实例 |
extractRecent | 从报文数组中选择最新 CAN 报文 |
extractTime | 选择在指定时间范围内发生的 CAN 报文 |
canMessageImport | 从第三方日志文件导入 CAN 报文 |
canSignalImport | 将 CAN 日志文件导入解码的信号时间表中 |
canMessageTimetable | 将 CAN 报文转换为时间表 |
canSignalTimetable | 基于 CAN 报文时间表创建 CAN 信号时间表 |
在Matlab中使用PCAN还需要如下APP
但是在Matab的附加功能安装APP时会提示请续订您的软件维护服务
解决方法参考:MATLAB获取硬件支持包失败,显示请续订您的软件维护服务,解决办法,保姆教程
到官网离线下载支持包:Download Hardware Support Packages and Optional Features
双击后登录自己的账号,并选择自己的matlab版本
搜索peak支持包框选后下一步
等待下载完成
开始安装:下载完成之后去软件的安装文件夹 E:\Matlab2021b\AnZhuangMuLu\bin\win64
找到“SupportSoftwareInstaller.exe”,双击安装
输入账号密码后将自动找到你下载的安装包,框选上,点击下一步继续
等待安装完成
打开Matlab的管理附加功能
插上PCAN在 Matlab 命令行窗口中输入canChannelList 可以看到
插上PCAN后也会在命令行窗口自动弹出如下信息,表示安装大功告成
CAN通讯 Matlab 代码学习
发送CAN报文
% canChannelList %%%%% 发送CAN报文 %%%%% clear all; canch1 = canChannel('PEAK-System','PCAN_USBBUS1'); %构造连接到指定设备的 CAN 通道 configBusSpeed(canch1,250000);%设置波特率250k message1 = canMessage(101,false,8); %(id,extended,datalength) false为标准帧 构建 CAN 报文 transmitPeriodic(canch1,message1,'On',1); %canch,msg,'On',period 设置报文传送周期 Off禁用周期性传输 start(canch1); %pack(message,value,startbit,signalsize,byteorder) startbit:起始位 signalsize:数据长度 %Little Endian(小端序)是一种数据存储和表示的字节顺序。 %它指的是将多字节数据类型(如整数、浮点数)的最低有效字节存储在内存的最低地址处,而最高有效字节存储在内存的最高地址处。 pack(message1,int16(1),0,16,'LittleEndian'); %将 16 位整数值 1000 打包为 CAN 报文 pack(message1,int16(2000),16,16,'LittleEndian'); pack(message1,int16(2000),32,16,'LittleEndian'); message1.Data transmit(canch1,message1); %将 CAN 报文发送到 CAN 总线 stop(canch1);
接收CAN报文
% canChannelList %%%%% 接收CAN报文 %%%%% clear all; canch1 = canChannel('PEAK-System','PCAN_USBBUS1'); %构造连接到指定设备的 CAN 通道 configBusSpeed(canch1,250000);%设置波特率250k start(canch1); %将 'OutputFormat' 选项值指定为 'timetable' 可获得报文的时间表 message2 = receive(canch1,Inf,'OutputFormat','timetable');%通道 要接收的最大报文数{指定为正数值或 Inf(无穷)} %message2 = receive(canch1,Inf); %stop(canch1); %value = unpack(message2,0,16,'LittleEndian','int16');%%unpack(message,startbit,signalsize,byteorder,datatype) %unpack在这报错,因为message2包含了不同时间的报文 (Simulink中有仿真时间,可在Simulink中使用?)
在 Simulink 进行 CAN 通讯
CAN通讯模块在 Vehicle Network Toolbox 模块中
模块介绍
CAN Configuration
默认情况下,Acknowledge mode 为 Normal。在此模式下,通道可以正常接收和传输报文,也可以在网络上执行其他任务,例如确认报文和创建错误帧。要观察网络上的所有报文活动并执行分析,而不影响网络状态或行为,请选择 Silent。在 Silent 模式下,通道只能接收报文而不能传输报文。
CAN Receive
f() 输出端口是 Function-Call 子系统的触发器。如果模块接收到新报文,则会从这个端口触发 Function-Call。然后,可以连接到 Function-Call Subsystem (Simulink) 以解包(unpack)并处理报文。
因此,一般使用 CAN Receive 时会搭配使用Simulink的Ports & Subsystems库中的Function-Call Subsystem模块构建CAN Message pack子系统,在子系统内部进行解包(unpack)并处理报文。
CAN Unpack(解包)
对于手动或 CANdb 指定的信号,默认输出信号数据类型为 double。要指定其他类型,请使用 Signal Specification (Simulink) 模块。该模块可支持以下输出信号数据类型:single、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 和 boolean。该模块不支持定点类型。
输出的数据格式:
raw data:将数据输出为一个 uint8 向量数组。如果选择此选项,则只需指定报文的字段。其他信号参数字段不可用。此选项仅在模块上创建一个输出端口。
转换公式为:physical_value = raw_value * Factor + Offset
其中 raw_value 是解包的信号值,physical_value 是缩放的信号值。
manually specified signals:您可以指定数据信号。如果选择此选项,请使用 Signals 表来手动创建信号报文。模块上的输出端口数取决于您指定的信号数。例如,如果指定四个信号,则模块具有四个输出端口。CANdb specified signals:您可以指定包含数据信号的 CAN 数据库文件。如果选择此选项,请选择 CANdb 文件。模块上的输出端口数取决于 CANdb 文件中指定的信号数。例如,如果 CANdb 文件中的所选报文有四个信号,则您的模块有四个输出端口。
使用manually specified signals 格式指定三个输出如下:
CAN Pack (将单个信号打包到 CAN 报文中)
CAN Pack 模块默认有一个输入端口。模块输入的数量是动态的,取决于您为模块指定的信号数量。例如,如果您的模块有四个信号,则它有四个模块输入。
该模块支持以下输入信号数据类型:single、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 和 boolean。该模块不支持定点数据类型。
生成代码以将模型部署到目标。如果信号信息包含大于 32 位长度的有符号或无符号整数,则不支持代码生成。
CAN Transmit (将 CAN 报文传输到所选 CAN 设备)
使用示例如下: