В этом примере показано, как использовать автономную диаграмму Stateflow®, чтобы смоделировать компонент синхронизации системы координат и обнаружения символа в системе связи. Автономные диаграммы реализуют классическую семантику графика с MATLAB® как язык действия. Можно программировать график при помощи полной функциональности MATLAB, включая те функции, которые ограничиваются для генерации кода в Simulink®. Для получения дополнительной информации смотрите, Создают диаграммы Stateflow для Выполнения как Объекты MATLAB.
В этом примере вход к системе связи состоит из двоичного сигнала нулей, и единицы получили каждые 10 миллисекунд. Входной сигнал может содержать любую комбинацию:
Импульс на 770 мс (77 последовательных единиц), чтобы отметить начало и конец системы координат данных и гарантировать системную синхронизацию.
Импульс на 170 мс (17 последовательных единиц), чтобы указать на символ A.
Импульс на 470 мс (47 последовательных единиц), чтобы указать на символ B.
Файл sf_frame_search.sfx
задает автономную диаграмму Stateflow, которая реализует этот протокол связи. График состоит из двух внешних состояний в параллельном разложении. Initialize
утвердите сбрасывает значение локальных данных symbol
в начале каждого шага выполнения. Search
состояние содержит логику, которая задает алгоритм обнаружения символа. Когда это состояние обнаруживает один из импульсов, позволенных протоколом связи, имя соответствующего символа хранится как symbol
и отображенный в Окне Команды MATLAB. Параллельное разложение позволяет графику предварительно обработать входные данные. Для получения дополнительной информации смотрите Разложение состояния.
Чтобы отследить длину импульса через несколько шагов выполнения, график использует count
оператор. Этот оператор упрощает проект графика путем избавления от необходимости ручной счетчик. Например, условие [count(pulse)==17]
охраняет исходящий переход от NewFrame
подсостояния. Это условие становится верным когда данные
pulse
один для 17 последовательных шагов выполнения. В этом случае, переходы графика к CouldBeA
подсостояние. Если этот переход сопровождается входом нуля, то график указывает прием символа A и переходы назад к NewFrame
подсостояние. В противном случае, переходы графика к SearchForB
состояние, от который условие [count(pulse)==29]
поиски еще 29 единиц, чтобы отметить символ B.
В sf_frame_tester.m
скрипта MATLAB, пример кода генерирует короткий сигнал, состоящий из нескольких допустимых импульсов и одной ошибки передачи. Ошибка состоит из импульса на 470 мс, который является слишком длинным, чтобы представлять символ A и слишком короткий, чтобы представлять символ B.
f = sf_frame_search('pulse','0'); % create chart object sendPulse(f,77); % frame marker sendPulse(f,17); % A sendPulse(f,47); % B sendPulse(f,37); % transmission error sendPulse(f,47); % B sendPulse(f,17); % A sendPulse(f,77); % frame marker delete(f); % delete chart object
function sendPulse(f,n) % Send a pulse of n ones and one zero to chart object f.
for i = 1:n step(f,'pulse',1) printDot(1) end
printDot(0) step(f,'pulse',0)
function printDot(x) persistent k if isempty(k) k = 1; end
if x == 0 fprintf('\n'); k = 1; elseif k == 50 fprintf('.\n'); k = 1; else fprintf('.'); k = k+1; end end end
Выполнение скрипта приводит к этим результатам в Окне Команды MATLAB:
.................................................. ........................... frame ................. A ............................................... B ..................................... error ............................................... B ................. A.................................................. ........................... frame