主要内容

在CAN通信中使用消息过滤器

此示例演示如何使用CAN消息筛选器仅允许包含指定标识符的消息通过通道。它使用以环回配置连接的MathWorks虚拟CAN通道。本示例描述了CAN网络的工作流程,但所演示的概念也适用于CAN FD网络。

创建发送和接收通道

创建一个用于发送消息的通道和另一个用于接收的通道。稍后将在接收通道上设置筛选器。

txCh=canChannel(“MathWorks”,“虚拟1”, 1)
DeviceVendor txCh =通道属性:设备信息:“MathWorks”设备:“虚拟1”DeviceChannelIndex: 1 DeviceSerialNumber: 0 ProtocolMode:“可以运行的状态信息:0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: [0 x0 datetime] FilterHistory:“标准ID过滤器:Allow All | Extended ID Filter: Allow All' Channel Information BusStatus: 'N/A' SilentMode: 0 TransceiverName: 'N/A' TransceiverState: 'N/A' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [] UserData: []
rxCh=canChannel(“MathWorks”,“虚拟1”, 2)
DeviceVendor rxCh =通道属性:设备信息:“MathWorks”设备:“虚拟1”DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode:“可以运行的状态信息:0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: [0 x0 datetime] FilterHistory:“标准ID过滤器:Allow All | Extended ID Filter: Allow All' Channel Information BusStatus: 'N/A' SilentMode: 0 TransceiverName: 'N/A' TransceiverState: 'N/A' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [] UserData: []

创建消息

在整个示例中创建一些要多次发送到接收通道的消息。请注意,一个消息具有扩展的标识符。

txMsgs(1) = canMessage(250, false, 8);txMsgs(2) = canMessage(500, false, 8);txMsgs(3) = canMessage(1000, false, 8);txMsgs(4) = canMessage(1500, true, 8);txMsgs(5) = canMessage(2000, false, 8);

接收不带筛选器的邮件

设置通道在线,在一个通道上发送消息,在另一个通道上接收消息。注意,所有发送的消息都收到了。默认情况下,未配置过滤器的新创建通道接收所有标准和扩展标识符。

开始(rxCh);开始(txCh);传输(txCh txMsgs);暂停(0.5);rxMsgs1 = receive(rxCh, Inf,)“输出格式”,“时间表”)
rxMsgs1=5×8的时间表(UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFalse{0x0 char}{[0 0 0 0 0 0 0 0]}8{0x0 struct}false 0.018768秒500 false{0x0 char}{[0 0 0 0 0 0]}8{0x0 struct}false 0.018772秒1000 false{0x0 char}{[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

停止接收和发送通道。

停止(rxCh);停止(txCh);

绘制接收到的消息的标识符,以查看所有发送的消息都被通道接收。

图(1,rxMsgs1.ID,“x”) h_gca = gca;h_gca。XTick = 0:1:2;h_gca。XTickLabel = ["",“传输1”,""];轴([020047])xlabel(“信息传递”) ylabel (“标识符”)

图中包含一个Axis对象。Axis对象包含5个line类型的对象。

使用由标识符配置的过滤器接收消息

使用仅限过滤器命令,根据CAN标识符和标识符类型只允许指定的消息。将接收通道配置为只接收带有标准标识符500和2000的消息。

filterAllowOnly (rxCh (500 2000),“标准”);

显示过滤史属性以查看消息筛选器的配置状态。

rxCh。过滤史
ans='标准ID筛选器:仅允许|扩展ID筛选器:允许所有'

再次将消息发送到接收通道。请注意,这次接收的消息较少。

开始(rxCh);开始(txCh);传输(txCh txMsgs);暂停(0.5);rxMsgs2 = receive(rxCh, Inf,)“输出格式”,“时间表”)
rxMsgs2=3×8的时间表UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFalse{0x0 char}{[0 0 0 0 0 0 0 0]}8{0x0 struct}false假0.012747秒1500真{0x0 char}{[0 0 0 0 0 0 0]}8{0x0 struct}false假0.012751秒2000假{0x0 char{[0 0 0 0]}8{0x0 struct}false false

停止接收和发送通道。

停止(rxCh);停止(txCh);

将新收到的数据添加到绘图中,以查看哪些消息通过了筛选器。筛选器未阻止扩展标识符为1500的消息,因为筛选器仅针对标准标识符进行了配置。

图(1,rxMsgs1.ID,“x”2 rxMsgs2。ID,“x”); h_gca=gca;h_gca.XTick=0:1:3;h_gca.XTickLabel=["",“传输1”,“传送2”,""];xlabel([0 3 0 2047])“信息传递”) ylabel (“标识符”)

图中包含一个axes对象。axes对象包含8个line类型的对象。

重置消息过滤器

使用将消息筛选器重置为默认状态filterAllowAll命令,以便允许所有标准标识符。

filterAllowAll (rxCh“标准”);

显示过滤史属性以查看消息筛选器的配置状态。

rxCh。过滤史
ans='标准ID筛选器:允许所有|扩展ID筛选器:允许所有'

第三次发送和接收,以看到所有消息再次通过过滤器并被接收通道接收。

开始(rxCh);开始(txCh);传输(txCh txMsgs);暂停(0.5);rxMsgs3 = receive(rxCh, Inf,)“输出格式”,“时间表”)
rxMsgs3=5×8的时间表时间ID扩展名称数据远程信号长度错误  ____________ ____ ________ __________ ___________________ ______ ____________ _____ ______ 0.029697秒250假{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.0297秒500假{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.029703秒1000假{0 x0 char} {[0 0 0 00 0 0 0]} 8 {0x0 struct} false false 0.029706 sec 1500 true {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false 0.029709 sec 2000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false

停止接收和发送通道。

停止(rxCh);停止(txCh);

将新数据添加到绘图中后,观察第一次和第三次传输是否相同,因为在这两种情况下,消息过滤器都完全打开。

图(1,rxMsgs1.ID,“x”2 rxMsgs2。ID,“x”,3,rxMsgs3.ID,“x”) h_gca = gca;h_gca。XTick = 0:1:4;h_gca。XTickLabel = ["",“传输1”,“传送2”,“传送3”,""]; 轴([0 4 0 2047])xlabel(“信息传递”) ylabel (“标识符”)

图中包含一个Axis对象。Axis对象包含13个line类型的对象。

使用按名称配置的过滤器接收消息

这个仅限过滤器命令还可以在使用DBC文件时按名称筛选消息。仅允许具有名称的消息引擎.

db=canDatabase(“demoVNT_CANdbFiles.dbc”);rxCh.Database=db;filterAllowOnly(rxCh,“EngineMsg”); 过滤历史
ans='标准ID筛选器:仅允许|扩展ID筛选器:允许所有'

阻止特定标识符类型的所有消息

这个filterBlockAll命令允许您轻松地设置过滤器以阻止所有标准或扩展标识符类型的消息。阻止所有带有扩展标识符的消息。

filterBlockAll (rxCh“扩展”); 过滤历史
ans = '标准ID过滤器:只允许|扩展ID过滤器:禁止所有'

停止通道

停止接收和发送通道,并将其从工作区中清除。

停止(rxCh);停止(txCh);清晰的rxChtxCh

关闭DBC-File

通过从工作区中清除DBC文件的变量来关闭对DBC文件的访问。

清晰的分贝