www.gusucode.com > vnt 源码程序 matlab案例代码 > vnt/demoVNT_FilteringCANMessages.m

    %% CAN Channel Message Filtering
% This example shows you how to use CAN message filters to allow
% only messages that contain specified identifiers to pass through a
% channel. It uses Vector Virtual CAN channels connected in a loopback 
% configuration.
%
% Copyright 2009-2014 The MathWorks, Inc.

%%  Create Transmitting and Receiving Channels
% One channel will transmit messages the other. Filters are set on the
% receiving channel.
txCh = canChannel('Vector', 'Virtual 1', 1);
rxCh = canChannel('Vector', 'Virtual 1', 2);

%% Create Messages
% These messages are sent to the receiving channel multiple times
% throughout the example. Note that one of the messages has an 
% extended identifier.
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);

%% Receive Messages on an Open Filter
% Set the channels online, transmit the messages, and receive them. Note
% that all messages sent were received. The filter settings on a newly
% created channel are fully open for both standard and extended identifiers.
start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs1 = receive(rxCh, Inf)
stop(rxCh);
stop(txCh);

%% 
% Plot the identifiers of the received messages to see that all
% messages sent were received by the channel.
plot(1, [rxMsgs1.ID], '.')
h_gca = gca;
h_gca.XTick = 0:1:2;
h_gca.XTickLabel = {'', 'Transmit 1', ''};
axis([0 2 0 2047])
xlabel('Message Transmits')
ylabel('CAN Identifiers')

%% Receive Messages on a Configured Filter
% Use the |filterAllowOnly| command to specify messages to receive by CAN
% identifier and identifier type.
filterAllowOnly(rxCh, [500 2000], 'Standard');

%%
% Display the channel to view the configured state of the message filters.
rxCh

%%
% Transmit the messages again to the receiving channel. Note that fewer 
% messages were received this time.
start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs2 = receive(rxCh, Inf)
stop(rxCh);
stop(txCh);

%%
% Add the new receive data to the plot to see which messages are blocked 
% by the filter. The message with the extended identifier was 
% numerically supposed to be blocked, but it passed the filter because the
% filter was only configured for standard identifiers.
plot(1, [rxMsgs1.ID], '.', 2, [rxMsgs2.ID], '.');
h_gca = gca;
h_gca.XTick = 0:1:3;
h_gca.XTickLabel = {'', 'Transmit 1', 'Transmit 2', ''};
axis([0 3 0 2047])
xlabel('Message Transmits')
ylabel('CAN Identifiers')

%% Reset the Message Filter
% You can reset the message filters to their default open state with the 
% |filterAllowAll| command.
filterAllowAll(rxCh, 'Standard');

%%
% Display the channel to view the configured state of the message filters.
rxCh

%%
% Transmit and receive a third time to see that all messages are 
% once again passing through the filter and into the channel.
start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs3 = receive(rxCh, Inf)
stop(rxCh);
stop(txCh);

%%
% With the new data added to the plot, observe that the first and third
% transmits are identical as the message filters were fully open in both
% cases.
plot(1, [rxMsgs1.ID], '.', 2, [rxMsgs2.ID], '.', 3, [rxMsgs3.ID], '.')
h_gca = gca;
h_gca.XTick = 0:1:4;
h_gca.XTickLabel = {'', 'Transmit 1', 'Transmit 2', 'Transmit 3', ''};
axis([0 4 0 2047])
xlabel('Message Transmits')
ylabel('CAN Identifiers')

%% Filter Messages By Name
% The |filterAllowOnly| command can also reference messages by name when 
% using a CAN database file.
db = canDatabase('demoVNT_CANdbFiles.dbc');
rxCh.Database = db;
filterAllowOnly(rxCh, 'EngineMsg');
rxCh

%% Blocking All Messages of a Specific Type
% The |filterBlockAll| command lets you quickly set the filter to block all
% messages of either standard or extended identifier type.
filterBlockAll(rxCh, 'Extended');
rxCh