Автономный график Stateflow® является классом MATLAB®, который задает поведение конечного автомата. Автономные графики реализуют классическую семантику графика с MATLAB как язык действия. Можно программировать график при помощи полной функциональности MATLAB, включая те функции, которые ограничиваются для генерации кода в Simulink®. Для получения дополнительной информации смотрите, Создают диаграммы Stateflow для Выполнения как Объекты MATLAB.
Этот пример показывает, как использовать автономную диаграмму Stateflow, чтобы смоделировать компонент синхронизации кадра и обнаружения символа в системе связи. Вход к системе состоит из двоичного сигнала нулей, и единицы получили каждые 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
sf_frame_Tester
.................................................. ........................... frame ................. A ............................................... B ..................................... error ............................................... B ................. A.................................................. ........................... frame