チャート オブジェクトを使用した通信プロトコルのモデル化
この例では、スタンドアロンの Stateflow® チャートを使用して、通信システム内のフレーム同期およびシンボル検出コンポーネントをモデル化する方法を説明します。スタンドアロンのチャートは、MATLAB® をアクション言語として Classic チャートのセマンティクスを実装します。Simulink® でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用してチャートをプログラミングできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
シンボル検出アルゴリズムの実装
この例では、通信システムへの入力は 10 ミリ秒おきに受信する 0 と 1 のバイナリ信号で構成されます。入力信号には、以下のいずれかの組み合わせを含めることができます。
データのフレームの最初と最後をマークし、システム同期を確保する 770 ms のパルス (77 個の連続した 1)
シンボル A を示す 170 ms のパルス (17 個の連続した 1)
シンボル B を示す 470 ms のパルス (47 個の連続した 1)
ファイル sf_frame_search.sfx
は、この通信プロトコルを実装するスタンドアロンの Stateflow チャートを定義します。チャートは、パラレル構造の 2 つの外側のステートで構成されます。Initialize
ステートは、各実行ステップの開始時にローカル データ symbol
の値をリセットします。Search
ステートには、シンボル検出アルゴリズムを定義するロジックが含まれています。このステートが、通信プロトコルで許可されているいずれかのパルスを検出すると、対応するシンボルの名前が symbol
として保存され、MATLAB コマンド ウィンドウに表示されます。パラレル構造により、チャートは入力データを前処理できます。詳細については、ステート構造を使用した排他的モードとパラレル モードの定義を参照してください。
いくつかの実行ステップを通してパルスの長さを追跡するために、チャートはcount
演算子を使用します。この演算子を使用すると手動カウンターが不要になるため、チャートを簡単に設計できます。たとえば、条件 [count(pulse)==17]
は、サブステート NewFrame
からの出力遷移を保護します。この条件は、連続する 17 の実行ステップに対してデータ pulse
が 1 である場合に真となります。この場合、チャートは CouldBeA
サブステートに遷移します。この遷移の後に 0 が入力される場合、チャートはシンボル A の受信を登録し、遷移して NewFrame
サブステートに戻ります。それ以外の場合は、チャートは SearchForB
ステートに遷移し、そこから条件 [count(pulse)==29]
がシンボル B をマークする追加の 29 個の 1 を検索します。
スタンドアロンのチャートの実行
MATLAB スクリプト sf_frame_tester.m
では、サンプル コードによって、いくつかの有効なパルスと 1 つの伝達エラーで構成される短い信号が生成されます。エラーは 470 ms のパルスで構成されますが、これはシンボル A を表すには長すぎ、シンボル B を表すには短すぎます。
%% Test Symbol Detection Algorithm % Generate a short signal consisting of several valid pulses and one % transmission error. 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
シミュレーション中、チャート アニメーションによりアルゴリズムの実行時の動作が視覚的に示されます。