Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

この例では、スタンドアロンの 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

シミュレーション中、チャート アニメーションによりアルゴリズムの実行時の動作が視覚的に示されます。

参考

関連するトピック