主要内容

在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,)“OutputFormat”“时间表”
rxMsgs1 =5×8的时间表时间ID扩展名称数据远程信号长度错误  ____________ ____ ________ __________ ___________________ ______ ____________ _____ ______ 0.018764秒250假{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.018768秒500假{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.018772秒1000假{0 x0 char} {[0 0 00 0 0 0 0]} 8 {0x0 struct} false false 0.018775 sec 1500 true {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false 0.018779 sec 2000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false

停止接收和发送信道。

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

绘制接收消息的标识符,以查看通道是否接收了所有发送的消息。

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

图中包含一个轴对象。axis对象包含5个类型为line的对象。

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

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

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

显示FilterHistory属性,以查看已配置的消息筛选器状态。

rxCh。FilterHistory
ans = '标准ID过滤器:只允许|扩展ID过滤器:允许所有'

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

开始(rxCh);开始(txCh);传输(txCh txMsgs);暂停(0.5);rxMsgs2 = receive(rxCh, Inf,)“OutputFormat”“时间表”
rxMsgs2 =3×8的时间表时间ID扩展名称数据远程信号长度错误  ____________ ____ ________ __________ ___________________ ______ ____________ _____ ______ 0.012735秒500假{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.012747秒1500真{0 x0 char} {[0 0 0 0 0 0 0 0]} {0 x0 struct} 8假假0.012751秒2000假{0 x0 char} {[0 0 00 0 0 0 0]} 8 {0x0 struct} false false

停止接收和发送信道。

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

将新接收的数据添加到图中,以查看哪些消息通过了过滤器。带有扩展标识符1500的消息不会被过滤器阻止,因为过滤器仅为标准标识符配置。

阴谋(1,rxMsgs1。ID,“x”2 rxMsgs2。ID,“x”);甘氨胆酸h_gca =;h_gca。XTick = 0:1:3;h_gca。XTickLabel = [""“传输1”“传送2”""];xlabel([0 3 0 2047])“信息传递”) ylabel (“标识符”

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

重置消息过滤器

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

filterAllowAll (rxCh“标准”);

显示FilterHistory属性,以查看已配置的消息筛选器状态。

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

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

开始(rxCh);开始(txCh);传输(txCh txMsgs);暂停(0.5);rxMsgs3 = receive(rxCh, Inf,)“OutputFormat”“时间表”
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”""];xlabel([0 4 0 2047])“信息传递”) ylabel (“标识符”

图中包含一个轴对象。axis对象包含13个类型为line的对象。

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

filterAllowOnly命令还可以在使用dbc文件时根据名称过滤消息。只允许带有名称的消息EngineMsg

db = canDatabase (“demoVNT_CANdbFiles.dbc”);rxCh。数据库=数据库;filterAllowOnly (rxCh“EngineMsg”);rxCh。FilterHistory
ans = '标准ID过滤器:只允许|扩展ID过滤器:允许所有'

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

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

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

停止通道

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

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

关闭DBC-File

通过从工作空间中清除它的变量来关闭对dbc文件的访问。

清晰的db