Matlab / Simulink CAN 通讯学习

参考:【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 / Simulink CAN 通讯学习_第1张图片

Matlab / Simulink CAN 通讯学习_第2张图片

双击后登录自己的账号,并选择自己的matlab版本

Matlab / Simulink CAN 通讯学习_第3张图片

 搜索peak支持包框选后下一步

Matlab / Simulink CAN 通讯学习_第4张图片

Matlab / Simulink CAN 通讯学习_第5张图片

等待下载完成

开始安装:下载完成之后去软件的安装文件夹 E:\Matlab2021b\AnZhuangMuLu\bin\win64

找到“SupportSoftwareInstaller.exe”,双击安装

Matlab / Simulink CAN 通讯学习_第6张图片

输入账号密码后将自动找到你下载的安装包,框选上,点击下一步继续

Matlab / Simulink CAN 通讯学习_第7张图片

等待安装完成

Matlab / Simulink CAN 通讯学习_第8张图片

 打开Matlab的管理附加功能

 Matlab / Simulink CAN 通讯学习_第9张图片

 可以观察到安装成功Matlab / Simulink CAN 通讯学习_第10张图片

 插上PCAN在 Matlab 命令行窗口中输入canChannelList 可以看到

Matlab / Simulink CAN 通讯学习_第11张图片

插上PCAN后也会在命令行窗口自动弹出如下信息,表示安装大功告成

Matlab / Simulink CAN 通讯学习_第12张图片

 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 模块中

Matlab / Simulink CAN 通讯学习_第13张图片

模块介绍

CAN Configuration

Matlab / Simulink CAN 通讯学习_第14张图片

Matlab / Simulink CAN 通讯学习_第15张图片

默认情况下,Acknowledge mode 为 Normal。在此模式下,通道可以正常接收和传输报文,也可以在网络上执行其他任务,例如确认报文和创建错误帧。要观察网络上的所有报文活动并执行分析,而不影响网络状态或行为,请选择 Silent。在 Silent 模式下,通道只能接收报文而不能传输报文

 CAN Receive

Matlab / Simulink CAN 通讯学习_第16张图片

Matlab / Simulink CAN 通讯学习_第17张图片

 f() 输出端口是 Function-Call 子系统的触发器。如果模块接收到新报文,则会从这个端口触发 Function-Call。然后,可以连接到 Function-Call Subsystem (Simulink) 以解包(unpack)并处理报文。

因此,一般使用 CAN Receive 时会搭配使用Simulink的Ports & Subsystems库中的Function-Call Subsystem模块构建CAN Message pack子系统,在子系统内部进行解包(unpack)并处理报文。

Matlab / Simulink CAN 通讯学习_第18张图片

Matlab / Simulink CAN 通讯学习_第19张图片

Matlab / Simulink CAN 通讯学习_第20张图片

  CAN Unpack(解包)

 Matlab / Simulink CAN 通讯学习_第21张图片

对于手动或 CANdb 指定的信号,默认输出信号数据类型为 double。要指定其他类型,请使用 Signal Specification (Simulink) 模块。该模块可支持以下输出信号数据类型:single、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 和 boolean。该模块不支持定点类型。 

Matlab / Simulink CAN 通讯学习_第22张图片

输出的数据格式:

        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 格式指定三个输出如下:

Matlab / Simulink CAN 通讯学习_第23张图片

Matlab / Simulink CAN 通讯学习_第24张图片

 CAN Pack (将单个信号打包到 CAN 报文中)

Matlab / Simulink CAN 通讯学习_第25张图片

Matlab / Simulink CAN 通讯学习_第26张图片

 CAN Pack 模块默认有一个输入端口。模块输入的数量是动态的,取决于您为模块指定的信号数量。例如,如果您的模块有四个信号,则它有四个模块输入。

该模块支持以下输入信号数据类型:single、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 和 boolean。该模块不支持定点数据类型。

生成代码以将模型部署到目标。如果信号信息包含大于 32 位长度的有符号或无符号整数,则不支持代码生成。

Matlab / Simulink CAN 通讯学习_第27张图片

 CAN Transmit  (将 CAN 报文传输到所选 CAN 设备) 

Matlab / Simulink CAN 通讯学习_第28张图片

使用示例如下:

Matlab / Simulink CAN 通讯学习_第29张图片

你可能感兴趣的:(matlab)