Main Content

カスタム リンク タイプ

メモ

要件管理インターフェイス (RMI) は従来の機能を提供します。R2022a 以降では、slreq.refreshCustomizations を使用してください。詳細については、要件およびリンクのカスタム タイプの定義を参照してください。

カスタム要件リンク タイプの作成

この例では、カスタム リンク タイプを仮のドキュメント タイプ (拡張子が .abc のテキスト ファイル) に実装します。このドキュメントでは、要件項目は専用のテキスト文字列「Requirement::」で識別され、その後にスペースが 1 つ続き、さらにその後に要件項目が引用符 (") に囲まれて表示されます。

ここでは、ドキュメント インデックスを作成し、すべての要件項目の一覧を生成します。Simulink® モデルから要件ドキュメントに移動すると、MATLAB® エディターでドキュメントが開き、適切な要件の行が表示されます。

カスタム要件リンク タイプを作成するには、次の手順に従います。

  1. カスタム リンク タイプを実装する関数を作成し、MATLAB パス上に保存します。

    この例では、ファイルは rmicustabcinterface.m で、インストール時に組み込まれる ABC ファイルを実装する関数 rmicustabcinterface が保存されています。

  2. この関数を表示するには、MATLAB プロンプトで以下を入力します。

    edit rmicustabcinterface

    ファイル rmicustabcinterface.m が MATLAB エディターで開きます。このファイルの内容は次のとおりです。

    function linkType = rmicustabcinterface
    %RMICUSTABCINTERFACE - Example custom requirement link type
    %
    % This file implements a requirements link type that maps 
    % to "ABC" files.
    % You can use this link type to map a line or item within an ABC
    % file to a Simulink or Stateflow object.
    %
    % You must register a custom requirement link type before using it.
    % Once registered, the link type will be reloaded in subsequent
    % sessions until you unregister it.  The following commands
    % perform registration and registration removal.
    %
    % Register command:   >> rmi register rmicustabcinterface
    % Unregister command: >> rmi unregister rmicustabcinterface
    %
    % There is an example document of this link type contained in the
    % requirement demo directory to determine the path to the document
    % invoke:
    %
    % >> which demo_req_1.abc
    
    %  Copyright 1984-2010 The MathWorks, Inc.
    
        % Create a default (blank) requirement link type
        linkType = ReqMgr.LinkType;
        linkType.Registration = mfilename;
    
        % Label describing this link type
        linkType.Label = 'ABC  file (for demonstration)';
    
        % File information
        linkType.IsFile = 1;
        linkType.Extensions = {'.abc'};
    
        % Location delimiters
        linkType.LocDelimiters = '>@';
        linkType.Version = '';             % not required
    
        % Uncomment the functions that are implemented below
        linkType.NavigateFcn = @NavigateFcn;
        linkType.ContentsFcn = @ContentsFcn;
    
    
    function NavigateFcn(filename,locationStr)
        if ~isempty(locationStr)
            findId=0;
            switch(locationStr(1))
            case '>'
                lineNum = str2num(locationStr(2:end));
                openFileToLine(filename, lineNum);
            case '@'
                openFileToItem(filename,locationStr(2:end));
            otherwise
                openFileToLine(filename, 1);
            end
        end
    
    
    function openFileToLine(fileName, lineNum)
        if lineNum > 0        
            if matlab.desktop.editor.isEditorAvailable
                matlab.desktop.editor.openAndGoToLine(fileName, lineNum);
            end
        else
            edit(fileName);
        end
    
    
    function openFileToItem(fileName, itemName)
        reqStr = ['Requirement:: "' itemName '"'];
        lineNum = 0;
        fid = fopen(fileName);
        i   = 1;
        while lineNum == 0
            lineStr = fgetl(fid);
            if ~isempty(strfind(lineStr, reqStr))
                lineNum = i;
            end;
            if ~ischar(lineStr), break, end;
            i = i + 1;
        end;
        fclose(fid);
        openFileToLine(fileName, lineNum);
    
    
    function [labels, depths, locations] = ContentsFcn(filePath)
        % Read the entire file into a variable
        fid = fopen(filePath,'r');
        contents = char(fread(fid)');
        fclose(fid);
    
        % Find all the requirement items
        fList1 = regexpi(contents,'\nRequirement:: "(.*?)"','tokens');
    
        % Combine and sort the list
        items = [fList1{:}]';
        items = sort(items);
        items = strcat('@',items);
    
        if (~iscell(items) && length(items)>0)
         locations = {items};
         labels = {items};
        else
         locations = [items];
         labels = [items];
        end
    
        depths = [];
  3. カスタム リンク タイプ ABC を登録するには、次の MATLAB コマンドを入力します。

    rmi register rmicustabcinterface

    ABC ファイルのタイプが外向きリンク エディターの [ドキュメント タイプ] ドロップダウン リストに表示されます。

  4. 拡張子が .abc のテキスト ファイルを作成します。このファイルには、Requirement:: という文字列でマークされた複数の要件項目が含まれています。

    インストールに付属のサンプル ファイルを使用すると便利です。このサンプル ファイルは matlabroot\toolbox\slvnv\rmidemos\demo_req_1.abc です。demo_req_1.abc の内容は次のとおりです。

    Requirement:: "Altitude Climb Control"
    
    Altitude climb control is entered whenever:
    |Actual Altitude- Desired Altitude | > 1500 
    
    Units:
    Actual Altitude - feet
    Desired Altitude - feet
    
    Description:
    
    When the autopilot is in altitude climb 
    control mode, the controller maintains a 
    constant user-selectable target climb rate.  
    
    The user-selectable climb rate is always a 
    positive number if the current altitude is 
    above the target altitude.  The actual target 
    climb rate is the negative of the user 
    setting. 
    
    End of "Altitude Climb Control">
    
    
    Requirement:: "Altitude Hold"
    
    Altitude hold mode is entered whenever:
    |Actual Altitude- Desired Altitude | < 
      30*Sample Period*(Pilot Climb Rate / 60) 
    
    Units:
    Actual Altitude - feet
    Desired Altitude - feet
    Sample Period - seconds
    Pilot Climb Rate - feet/minute
    
    Description:
    
    The transition from climb mode to altitude 
    hold is based on a threshold that is 
    proportional to the Pilot Climb Rate.  
    
    At higher climb rates the transition occurs 
    sooner to prevent excessive overshoot. 
    
    End of "Altitude Hold"
    
    
    Requirement:: "Autopilot Disable"
    
    Altitude hold control and altitude climb 
    control are disabled when autopilot enable 
    is false.
    
    Description:
    
    Both control modes of the autopilot 
    can be disabled with a pilot setting.
    
    ENd of "Autopilot Disable"
    
    
    Requirement:: "Glide Slope Armed"
    
    Glide Slope Control is armed when Glide 
    Slope Enable and Glide Slope Signal 
    are both true. 
    
    Units:
    Glide Slope Enable - Logical
    Glide Slope Signal - Logical
    
    Description:
    
    ILS Glide Slope Control of altitude is only 
    enabled when the pilot has enabled this mode 
    and the Glide Slope Signal is true.  This indicates 
    the Glide Slope broadcast signal has been 
    validated by the on board receiver. 
    
    End of "Glide Slope Armed"
    
    
    Requirement:: "Glide Slope Coupled"
    
    Glide Slope control becomes coupled when the control 
    is armed and (Glide Slope Angle Error > 0) and 
     Distance < 10000 
    
    Units:
    Glide Slope Angle Error - Logical
    Distance - feet
    
    Description:
    
    When the autopilot is in altitude climb control 
    mode the controller maintains a constant user 
    selectable target climb rate.  
    
    The user-selectable climb rate is always a positive 
    number if the current altitude is above the target 
    altitude the actual target climb rate is the 
    negative of the user setting. 
    
    End of "Glide Slope Coupled"
  5. aero_dap3dof モデルを開きます。MATLAB コマンド ラインで以下のように入力します。

    openExample('simulink_aerospace/DevelopingTheApolloLunarModuleDigitalAutopilotExample')
    Apollo Lunar Module Descent Animation アニメーションを閉じます。

  6. aero_dap3dof モデルで、Reaction Jet Control サブシステムを右クリックして [要件][[外向きリンク] ダイアログを開く] を選択します。

    外向きリンク エディターが開きます。

  7. [新規] をクリックして、新しい要件リンクを追加します。[ドキュメント タイプ] ドロップダウン リストに [ABC file (for demonstration)] オプションが表示されます。

  8. [ドキュメント タイプ][ABC file (for demonstration)] に設定し、matlabroot\toolbox\slvnv\rmidemos\demo_req_1.abc ファイルを参照します。ブラウザーには拡張子が .abc のファイルしか表示されません。

  9. 要件ドキュメント内の特定の場所を指定するには、[場所] フィールドを使用します。

    この例では、関数 rmicustabcinterface は要件で使用する 2 種類の場所区切り記号を指定しています。

    • > — ファイル内の行番号

    • @ — 名前付きの項目 (ブックマーク、関数、HTML アンカーなど)

    メモ

    要件で使用する場所区切り記号の他の種類については、rmi リファレンス ページを参照してください。

    [ドキュメント タイプ] を [ABC file (for demonstration)] に設定すると、[場所] ドロップダウン リストにはこれらの 2 種類の場所区切り記号が必ず表示されます。

  10. [行番号] を選択します。番号として 26 と入力します。これは demo_req_1.abcAltitude Hold 要件の行番号です。

  11. [説明] フィールドに「Altitude Hold」と入力して、要件を名前で識別できるようにします。

  12. [適用] をクリックします。

  13. Altitude Hold 要件が Reaction Jet Control サブシステムにリンクしていることを確認します。サブシステムを右クリックし、[要件][1. "Altitude Hold"] を選択します。

ドキュメント インデックスの作成

"ドキュメント インデックス" には、特定のドキュメント内にあるすべての要件が一覧表示されます。MATLAB では、ドキュメント インデックスを作成するため、ファイル I/O 関数を使用して要件ドキュメントの内容を MATLAB 変数に読み取ります。RMI は要件項目の一覧を抽出します。

この例の要件ドキュメント demo_req_1.abc では、文字列 Requirement:: を使用した 4 つの要件が定義されています。ABC ファイルにドキュメント インデックスを生成するため、rmicustabcinterface.m ファイルの関数 ContentsFcn によって要件名を抽出し、それぞれの名前の前に @ を挿入します。

demo_req_1.abc ファイルの [外向きリンク: Reaction Jet Control] ダイアログ ボックスの [ドキュメント インデックス] タブをクリックします。関数 ContentsFcn により、ドキュメント インデックスが自動的に生成されます。

カスタム リンク タイプの実装

カスタム リンク タイプを実装するには、次の手順に従います。

  1. カスタム リンク タイプ テンプレートに基づいて MATLAB 関数ファイルを作成します (カスタム リンク タイプ関数を参照)。

  2. カスタム リンク タイプ ファイルをカスタマイズして、リンク タイプ プロパティと、カスタム リンク タイプに必要なカスタム コールバック関数を指定します (リンク タイプ プロパティを参照)。

  3. rmi コマンドの 'register' オプションを使用して、カスタム リンク タイプを登録します (カスタム リンク タイプの登録を参照)。

カスタム リンク タイプを作成する理由

組み込み型の要件ドキュメントをリンクする他に、要件管理インターフェイス (RMI) でカスタム タイプの要件ドキュメントを登録することもできます。その後、モデルからこれらのタイプのドキュメントへの要件リンクを作成できるようになります。

カスタム リンク タイプを使用すると、次のことができます。

  • 市販の要件追跡ソフトウェアの要件項目にリンクする

  • 社内のデータベース システムにリンクする

  • RMI が対応していないドキュメント タイプにリンクする

カスタム リンク タイプ API を使用すると、MATLAB 関数を定義して、Simulink モデルとカスタム タイプの要件ドキュメントの間にリンクを設定することができます。また、これらの関数ではモデルとドキュメントの間でのリンク作成や移動もできます。

たとえば、移動時には要件ドキュメントを開いて特定の要件レコードを検索します。モデル内でリンクされているオブジェクトのコンテンツ メニューでカスタム リンクをクリックすると、Simulink ではカスタム リンク タイプ ナビゲーション関数を使用してドキュメントを開き、実装の内容に基づいてターゲットの要件を強調表示します。実装されているナビゲーション関数は、使用可能な API を使用して要件ストレージ アプリケーションと通信します。

通常、MATLAB はオペレーティング システムのシェル コマンドを実行するか、ActiveX® 通信を使用して、ナビゲーション要求を外部アプリケーションに送信します。

または、要件がテキストまたは HTML ファイルのカスタム バリアントとして保存されている場合、組み込みのエディターまたは Web ブラウザーを使用して要件ドキュメントを開くことができます。

カスタム リンク タイプ関数

MATLAB 関数ファイルを作成するには、次の場所にあるカスタム リンク タイプ テンプレートを使用します。

matlabroot\toolbox\slrequirements\linktype_examples\linktype_TEMPLATE.m

カスタム リンク タイプ関数には、次のような条件があります。

  • MATLAB パス上にあり、かつ一意の関数名とファイル名をもたなければなりません。

  • 入力引数を必須とすることはできません。

  • 要件リンク タイプ クラスのインスタンスである単一の出力引数を返さなければなりません。

組み込みリンク タイプの同様のファイルを確認するには、matlabroot\toolbox\slrequirements\linktype_examples\ にある次のファイルを確認します。

linktype_rmi_doors.m
linktype_rmi_excel.m
linktype_rmi_html.m
linktype_rmi_text.m

カスタム リンク タイプの登録

次のように MATLAB 関数ファイルの名前を rmi コマンドに渡して、カスタム リンク タイプを登録します。

rmi register mytargetfilename

登録されたリンク タイプは外向きリンク エディター[ドキュメント タイプ] ドロップダウン リストにエントリとして表示されます。基本設定フォルダー内のファイルに、登録されたリンク タイプの一覧があります。そのため、カスタム リンク タイプは MATLAB を実行するたび読み込まれます。

カスタム リンク タイプを使用してリンクを作成すると、関数ファイルで指定された登録名などのリンク プロパティが保存されます。このようなリンクに移動しようとすると、RMI はリンク タイプを登録リストと照合して解決します。リンク タイプが見つからない場合、エラー メッセージが表示されます。

以下の MATLAB コマンドを使用するとリンク タイプを削除できます。

rmi unregister mytargetfilename

カスタム リンク タイプの同期

RMI のカスタム リンク タイプを実装すると、要件管理アプリケーション (RM アプリケーション) で Simulink オブジェクトから要件へのリンクの確立が可能になり、Requirements Toolbox™ 関数を使用して RM アプリケーションと Simulink の間にリンクの同期を実装できます。その後、RM アプリケーション環境内でリンクの確認および管理を行うことができると同時に、変更が Simulink に伝播されます。

まず、RM アプリケーションで対象となる Simulink オブジェクトを表すサロゲート オブジェクトを作成します。次に、Simulink 側に存在するリンクと一致するよう、これらのサロゲート オブジェクトと RM アプリケーションに保存されている他の項目との間のトレーサビリティ リンクを確立するプロセスを自動化します。RM アプリケーションで新しい関連付けを修正または作成した後、Simulink に変更を逆伝播することができます。カスタム要件ドキュメントのリンクの同期は、Requirements Toolbox を使用して実装します。ただし、この機能は RM アプリケーションで利用できる自動化の API およびプロセス間通信の API に応じて異なります。RM アプリケーションと Simulink との間のリンクの同期を実装するには、以下の Requirements Toolbox 関数を使用します。

次のように、Simulink オブジェクトの完全なリストを取得し、サロゲート モジュールに含めることを検討できます。

[objHs, parentIdx, isSf, objSIDs] = rmi...
('getObjectsInModel', modelName);

このコマンドでは、以下が返されます。

  • objHs、数値ハンドルの完全なリスト

  • objSIDs、セッションから独立した対応する Simulink ID の完全なリスト

  • isSf、どのリストの位置がどの Stateflow® オブジェクトに対応するかを示す logical 配列

  • parentIdx、モデルの階層構造情報を提供するインデックス配列

RM アプリケーションでサロゲート オブジェクトを作成する場合、objHs 値は Simulink セッション間で維持されないため、objHs 値ではなく objSIDs 値を保存する必要があります。

RM アプリケーション側に保存する Simulink オブジェクトの名前とタイプの情報は次のように取得します。

[objName, objType] = rmi('getObjLabel', slObjectHandle);

Simulink オブジェクトのリンクのクエリは、次のように数値ハンドルまたは SID のいずれかを指定して行います。

linkInfo = rmi('getLinks', slObjectHandle)
linkInfo = rmi('getLinks', sigBuildertHandle, m)
% Signal Builder group "m" use case.
linkInfo = rmi('getLinks', [modelName objSIDs{i}]);

linkInfo はリンクの属性が含まれる MATLAB 構造体です。詳細については、関数 rmi のリファレンス ページを参照してください。

RM アプリケーションから更新されたリンク情報を取得した後、更新された値を linkData のフィールドに入力し、変更を Simulink に伝播します。

rmi('setLinks', slObjectHandle, linkData)

Microsoft Excel ワークブックとの同期を実装する MATLAB スクリプトの例については、以下を参照してください。

edit([matlabroot '/toolbox/slrequirements/...
linktype_examples/slSurrogateInExcel.m'])

モデル例 slvnvdemo_fuelsys_officereq に対してこの MATLAB スクリプトを実行し、そのモデルの Excel® ワークブックのサロゲートを生成できます。