ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

チャート オブジェクトを使用した通信プロトコルのモデル化

スタンドアロンの Stateflow® チャートは、有限ステート マシンの動作を定義する MATLAB® クラスです。スタンドアロンのチャートは、MATLAB をアクション言語として Classic チャートのセマンティクスを実装します。Simulink® でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用してチャートをプログラミングできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。

シンボル検出アルゴリズムの実装

この例では、スタンドアロンの 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 を表すには短すぎます。

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 コマンド ウィンドウに以下の結果が表示されます。
sf_frame_Tester
..................................................
...........................
frame
.................
A
...............................................
B
.....................................
error
...............................................
B
.................
A..................................................
...........................
frame

参考

関連するトピック