Main Content

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

入力信号関数

LibBlockInputHasSymbolicWidth(portIdx)

指定されたブロック入力端子インデックスがシンボリック次元をもつ場合は 1 (true) を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputHasSymbolicWidth を参照してください。

LibBlockInputPortIndexMode(block, pidx)

目的

ブロックの入力端子のインデックス モードを決定します。

Arguments

block — ブロック レコード

pidx — 端子インデックス

戻り値

インデックス付けされていない端子の場合は ""。それ以外の場合は "Zero-based" または "One-based"

説明

block の入力端子がインデックス端子として設定され、そのインデックス ベースが 0 ベースまたは 1 ベースとしてマークされている場合、この情報は model.rtw ファイルに書き込まれます。LibBlockInputPortIndexMode はインデックス ベースをクエリして、入力端子のインデックス ベースに応じて異なるコードに分岐します。

%if LibBlockInputPortIndexMode(block, pidx) == "Zero-based"
  ...
%elseif LibBlockInputPortIndexMode(block, pidx) == "One-based"
  ...
%else
  ...
%endif

blkiolib.tlcLibBlockInputPortIndexMode を参照してください。

LibBlockInputPortIsContinuousQuantity(portIdx)

入力端子がコシミュレーション信号を受け入れるかどうかを返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputPortIsContinuousQuantity を参照してください。

LibBlockInputSignal(portIdx, ucv, lcv, sigIdx)

LibBlockInputSignal は、入力端子番号 (portIdx)、ユーザー制御変数 (ucv)、ループ制御変数 (lcv)、信号インデックス (sigIdx)、およびこの入力信号の取得元に基づいて、ブロック入力信号の参照を返します。

返される string 値は、式に対して有効な rvalue (右辺の値) です。ブロック入力信号は、他のブロック、状態ベクトル、または外部入力から取得することも、リテラル定数 (5.0 など) にすることもできます。

メモ

入力信号のアドレスにアクセスする目的では LibBlockInputSignal を使用しないでください。

返される値がリテラル定数になる可能性があるため、入力信号のアドレスにアクセスする目的では LibBlockInputSignal を使用しないでください。入力信号のアドレスにアクセスするには、LibBlockInputSignalAddr を使用します。LibBlockInputSignal を使用して信号のアドレスにアクセスすると、リテラル定数 (5.0 など) を参照することになります。

たとえば、以下は機能 "しません"

%assign u = LibBlockInputSignal(0, "", lcv, sigIdx)
x = &%<u>;

%<u> が値 4.95 をもつ不変信号を参照する場合、ステートメントは (プリプロセッサによって処理された後) 次のように生成されます。

x = &4.95;

または、入力信号のソースがグラウンドの場合、ステートメントは次のようになります。

x = &0.0;

これらはいずれもコンパイルできません。

LibBlockInputSignalAddr を使用することで、このような状況を回避します。

%assign uAddr = LibBlockInputSignalAddr(0, "", lcv, sigIdx)
x = %<uAddr>;

コード ジェネレーターは、アドレスによってアクセスされる信号とパラメーターを追跡し、それらをアドレス指定可能メモリに宣言します。

入力引数

次の表は、LibBlockInputSignal への入力引数をまとめたものです。

LibBlockInputSignal 引数

引数説明

portIdx

入力端子のインデックス (0 ベース) を指定する整数。

メモ:特定の組み込みブロックでは、portIdx は端子を識別する文字列 ("enable""trigger" など) にすることができます。

ucv

ユーザー制御変数。インデックス式または "" のいずれかの文字列でなければなりません。

lcv

ループ制御変数。インデックス式または "" のいずれかの文字列でなければなりません。

sigIdx

整数リテラルまたは以下の形式の文字列

%<tRealPart>Integer
%<tImagPart>Integer

たとえば、以下は信号の実数部と 5 から始まる信号の虚数部を示します。

"%<tRealPart>5"
"%<tImagPart>5"

一般的な使用法

LibBlockInputSignal の使用法は下記のカテゴリに分類されます。

直接インデックス.  ucv == "" および lcv == "" の場合、LibBlockInputSignalsigIdx で指定された要素のインデックス式を返します。

ループ ローリング/ループ展開.  この場合、lcv および sigIdx%roll 命令によって生成され、ucv"" でなければなりません。lcv に空でない値が許可されるのは、%roll 命令によって生成される場合と、Roller TLC ファイル (または、同じ変数/信号オフセット処理に準拠するユーザー提供の Roller TLC ファイル) を使用する場合だけです。さらに、lcv による LibBlockInputSignal の呼び出しは、"U" または特定の入力端子 ("u0" など) がロール変数引数を介して %roll 命令に渡される場合にのみ行われる必要があります。

次の例は、単一入力/単一出力端子の S-Function を示しています。

%assign rollVars  = ["U", "Y", "P"]
%roll sigIdx=RollRegions, lcv=RollThreshold, block, ...
    "Roller", rollVars
  %assign u = LibBlockInputSignal( 0, "", lcv, sigIdx)
  %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx)
  %assign p = LibBlockParameter(   0, "", lcv, sigIdx)
  %<y> = %<p> * %<u>;
%endroll

%roll 命令では、sigIdx は現在のロール領域の開始インデックスであり、lcv"" またはインデックス変数です。以下に有効な値の例を示します。

LibBlockInputSignal(0, "", lcv, sigIdx)    rtB.blockname[0]

LibBlockInputSignal(0, "", lcv, sigIdx)    u[i]

最初の例では、入力端子が他のブロックの出力に接続されており、かつ以下のようになっている場合、LibBlockInputSignalrtB.blockname[2] を返します。

  • %roll 命令によって生成されたループ制御変数 (lcv) が空であり、現在のロール領域がロールしきい値未満であることを示し、sigIdx0 である。

  • 入力端子の幅が 1 であり、この端子がスカラー拡張されていることを示す。

    sigIdx がゼロ以外の場合、rtB.blockname[sigIdx] が返されます。たとえば、sigIdx3 の場合、rtB.blockname[3] が返されます。

2 番目の例では、LibBlockInputSignal は、現在のロール領域がロールしきい値を超えており、入力端子幅が非スカラー (幅の広い) である場合、 u[i] を返します。この場合、Roller TLC ファイルは入力信号を指すローカル変数 u を設定し、現在の %roll 命令のコードは for ループ内に配置されます。

別の例として、各端子の幅が 1 以上で、少なくとも 1 つの端子の幅が 1 に等しい複数の入力端子をもつブロックを考えます。次のコードは、出力信号を入力信号の二乗和に設定します。

%assign y = LibBlockOutputSignal(0, "", "", 0)
%<y> = 0;

%assign rollVars = ["U"]
%foreach port = block.NumDataInputPorts - 1
  %roll sigIdx=RollRegions, lcv = RollThreshold, block, ...
    "Roller", rollVars
  %assign u = LibBlockInputSignal(port, "", lcv, sigIdx)
  %<y> += %<u> * %<u>;
  %endroll
%endforeach

LibBlockInputSignal の最初のパラメーターは 0 のインデックスが付けられているため、0 から開始し NumDataInputPorts-1 で終了するように foreach ループにインデックスを付ける必要があります。

ユーザー制御変数 (ucv) の処理.  これは高度なモードであり、通常は S-Function S の作成者が使用する必要はありません。

ucv != "" の場合、LibBlockInputSignal はユーザー制御変数インデックス式を使用して入力信号の rvalue を返します。制御変数インデックス式は次の形式を取ります。

rvalue_id[%<ucv>]%<optional_real_or_imag_part>

rvalue_id を取得するには、sigIdx の整数部分を確認します。sigIdx を指定する必要があるのは、このブロックへの入力が不連続である可能性があるためです。つまり、入力が複数の異なるメモリ領域 (信号ソース) から取得される可能性があり、ucv の対象領域を特定するために sigIdx が使用されます。また、sigIdx を使用して、信号の実数部と虚数部のどちらにアクセスするかを決定することもできます。

sigIdx の文字列部分から optional_real_or_imag_part を取得することができます (つまり、"re""im"、または "")。

lcv の値は無視され、sigIdx は、ucv が最初に指す入力信号の同じ要素を指す必要があることに注意してください。

LibBlockInputSignal をもつ ucv の扱いには注意が必要です。次のブロック線図のように、入力端子に入力される不連続な入力信号を考えます。

ucv をロバストに使用するには、1 のロールしきい値をもつ %roll 命令と、この入力信号に対するループヘッダー/トレーラーの設定がない Roller TLC ファイルを使用する必要があります。さらに、次の TLC コードのように、ROLL_ITERATIONS を使用して現在のロール領域の幅を決定する必要があります。

{
int i;

%assign rollVars  = [""]
%assign threshold = 1
  %roll sigIdx=RollRegions, lcv=threshold, block, ...
    "FlatRoller", rollVars
  %assign u = LibBlockInputSignal( 0, "i", "", sigIdx)
  %assign y = LibBlockOutputSignal(0, "i+%<sigIdx>", "", sigIdx)
  %assign p = LibBlockParameter( 0, "i+%<sigIdx>", "", sigIdx)
  for (i = 0; i < %<ROLL_ITERATIONS()>; i++) {
    %<y> = %<p> * %<u>;
  }
%endroll
}

FlatRoller にはループヘッダー/トレーラーの設定がないことに注意してください (rollVars は無視されます)。その目的は、ブロックの RollRegions をたどることです。あるいは、S-Function で以下を指定することで

ssSetInputPortRequiredContiguous(S, port, TRUE)

ブロックへの連続した入力信号を強制することもできます。

この場合、TLC コードは次のように単純化されます。

{
%assign u = LibBlockInputSignal( 0, "i", "", 0)
%assign y = LibBlockOutputSignal(0, "i", "", 0)
%assign p = LibBlockParameter(   0, "i", "", 0)

for (i = 0; i < %<LibBlockInputSignalWidth(0)>; i++) {
  %<y> = %<p> * %<u>;
  }
}

独自のローラーを作成し、そのインデックス付けが MathWorks 提供の Roller TLC ファイルの動作方法に準拠していない場合は、lcv の代わりに ucv を使用する必要があります。

入力引数の処理: ucv、lcv、および sigIdx

次のケースについて考えます。

関数 (ケース 1、2、3、4)戻り値の例
LibBlockInputSignal(0, "i", "", sigIdx)rtB.blockname[i]
LibBlockInputSignal(0, "i", "", sigIdx)rtU.signame[i]
LibBlockInputSignal(0, "", lcv, sigIdx)u0[i1]
LibBlockInputSignal(0, "", lcv, sigIdx)rtB.blockname[0]

返される値は、入力信号がブロック線図で何に接続されているか、関数がどのように呼び出されるか (たとえば、%roll 内からか、直接か) によって異なります。上記の例では、以下のようになります。

  • ucv"i" に設定して明示的な呼び出しを行うと、ケース 1 と 2 が発生します。

    ケース 1 は、sigIdx がブロック I/O ベクトル (つまり "i" が始まる最初の要素) を指す場合に発生します。たとえば、"i" をオフセット 5 から始まるように初期化する場合は、sigIdx == 5 を指定する必要があります。

    ケース 2 は、sigIdx が外部入力ベクトル (つまり "i" が始まる最初の要素) を指す場合に発生します。たとえば、"i" をオフセット 20 から始まるように初期化する場合は、sigIdx == 20 を指定する必要があります。

  • ケース 3 と 4 は同じ引数 lcvsigIdx を受け取りますが、戻り値は異なります。

    ケース 3 は、LibBlockInputSignal%roll 命令内で呼び出され、現在のロール領域がロールされている場合 (lcv != "") に発生します。

    ケース 4 は、LibBlockInputSignal%roll 命令内で呼び出され、現在のロール領域がロールされていない場合 (lcv == "") に発生します。

%roll 命令内で呼び出された場合、LibBlockInputSignalucvlcvsigIdx、現在のロール領域、および現在のロールしきい値をチェックして戻り値を決定します。変数 ucv が最も優先度が高く、lcv が次に優先度が高く、sigIdx が最も優先度が低くなります。つまり、ucv が指定された場合、それが使用されます (したがって、%roll 命令で呼び出された場合、通常は "" になります)。ucv が指定されず、lcvsigIdx が指定された場合、返される値は、現在のロール領域が for ループに配置されているか、または拡張されているかによって異なります。ロール領域がループに配置されている場合は lcv が使用されます。それ以外の場合は sigIdx が使用されます。

LibBlockInputSignal の直接呼び出し (%roll 命令内でも命令外でも) では、ucv および lcv"" として指定されている場合は sigIdx を使用します。

LibBlockInputSignal の例については、sfun_multiport.tlc を参照してください。

blkiolib.tlc も参照してください。

LibBlockInputSignalAddr(portIdx, ucv, lcv, sigIdx)

指定されたブロック入力端子信号のメモリ アドレスを示す文字列を返します。

入力信号のアドレスが必要な場合は、LibBlockInputSignal が返す文字列に "&" を付加するのではなく、LibBlockInputSignalAddr を使用する必要があります。たとえば、LibBlockInputSignal5 などのリテラル定数 (つまり、不変の入力信号) を返すことがあります。コード ジェネレーターは、LibBlockInputSignalAddr が不変の信号でいつ呼び出されたかを追跡し、その信号を、生成されたコードでリテラル定数 (アドレス指定不可能) として配置するのではなく、const データ (アドレス指定可能) として宣言します。

最後の入力引数 sigIdx はオーバーロードされないことに注意してください。これは、LibBlockInputSignal ではオーバーロードされます。したがって、入力信号が複素数の場合は、複素数コンテナーのアドレスが返されます。

幅の広い入力信号のアドレスを取得してユーザー関数に処理のために渡すには、以下を使用できます。

%assign uAddr = LibBlockInputSignalAddr(0, "", "", 0) 
%assign y = LibBlockOutputSignal(0, "", "", 0)
%<y> = myfcn(%<uAddr>);

blkiolib.tlcLibBlockInputSignalAddr を参照してください。

LibBlockInputSignalAliasedThruDataTypeName
(portIdx, reim)

指定されたブロック入力端子に対応するエイリアスされたスルー データ型 (int_T, ... creal_T など) の名前を返します。完全な信号の型名が必要な場合は、reim 引数を "" (空) と指定します。

たとえば、reim == "" で、最初の出力端子が実数と複素数の場合、dtname に配置されるデータ型名は creal_T になります。

%assign dtname = LibBlockInputSignalDataTypeName(0,"")

生の要素の型名が必要な場合は、reimtRealPart と指定します。たとえば、reim == tRealPart で、最初の出力端子が実数と複素数の場合、返されるデータ型名は real_T になります。

%assign dtname = LibBlockOutputSignalDataTypeName(0,tRealPart)

blkiolib.tlcLibBlockInputSignalAliasedThruDataTypeName を参照してください。

LibBlockInputSignalAllowScalarExpandedExpr(block,portIdx)

出力信号が幅の広い信号の場合でも、入力信号が式であることを許可します。この関数は、入力引数としてブロック レコードと端子インデックスを取ります。この関数は関数 BlockInstanceSetup 内から呼び出します。

blkio_api.tlcLibBlockInputSignalAllowScalarExpandedExpr を参照してください。

LibBlockInputSignalASCIIEscapedUnitExpr(portIdx)

指定されたブロック入力端子に対応する単位のエスケープされた名前を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputSignalASCIIEscapedUnitExpr を参照してください。

LibBlockInputSignalConnected(portIdx)

指定された入力端子が Ground ブロック以外のブロックに接続されている場合は 1 を返します。それ以外の場合は 0 を返します。

blkio_api.tlcLibBlockInputSignalConnected を参照してください。

LibBlockInputSignalDataTypeId(portIdx)

指定されたブロック入力端子のデータ型に対応する数値識別子 (id) を返します。

入力端子信号が複素数の場合、LibBlockInputSignalDataTypeId は信号の実数部 (または虚数部) のデータ型を返します。

blkiolib.tlcLibBlockInputSignalDataTypeId を参照してください。

LibBlockInputSignalDataTypeName(portIdx, reim)

指定されたブロック入力端子に対応するデータ型の名前 (int_T、...、creal_T など) を返します。

完全な信号の型名が必要な場合は、reim 引数を "" と指定します。たとえば、reim=="" で、最初の出力端子が実数と複素数の場合、dtname に配置されるデータ型名は creal_T になります。

%assign dtname = LibBlockInputSignalDataTypeName(0,"")

生の要素の型名が必要な場合は、reim 引数を tRealPart と指定します。たとえば、reim==tRealPart で、最初の出力端子が実数と複素数の場合、返されるデータ型名は real_T になります。

%assign dtname = LibBlockInputSignalDataTypeName(0,tRealPart)

blkiolib.tlcLibBlockInputSignalDataTypeName を参照してください。

LibBlockInputSignalDimensions(portIdx)

指定されたブロック入力端子の次元のベクトル ([2,3] など) を返します。

blkio_api.tlcLibBlockInputSignalDimensions を参照してください。

LibBlockInputSignalIsComplex(portIdx)

指定されたブロック入力端子が複素数である場合は 1 を返します。それ以外の場合は 0 を返します。

blkio_api.tlcLibBlockInputSignalIsComplex を参照してください。

LibBlockInputSignalIsExpr(portIdx)

入力信号が (変数に対して) 式の場合は 1 (true) を返します。それ以外の場合は 0 (false) を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputSignalIsExpr を参照してください。

LibBlockInputSignalIsFrameData(portIdx)

指定されたブロック入力端子がフレーム ベースである場合は 1 を返します。それ以外の場合は 0 を返します。

blkio_api.tlcLibBlockInputSignalIsFrameData を参照してください。

LibBlockInputSignalIsTrivialExpr(portIdx)

入力信号が (変数に対して) 自明な式の場合は 1 (true) を返します。それ以外の場合は 0 (false) を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputSignalIsTrivialExpr を参照してください。

LibBlockInputSignalLocalSampleTimeIndex
(portIdx)

指定されたブロック入力端子に対応するローカルのサンプル時間インデックスを返します。

blkiolib.tlcLibBlockInputSignalLocalSampleTimeIndex を参照してください。

LibBlockInputSignalNumDimensions(portIdx)

指定されたブロック入力端子の次元数を返します。

blkio_api.tlcLibBlockInputSignalNumDimensions を参照してください。

LibBlockInputSignalOffsetTime(portIdx)

指定されたブロック入力端子に対応するオフセット時間を返します。

blkiolib.tlcLibBlockInputSignalOffsetTime を参照してください。

LibBlockInputSignalSampleTime(portIdx)

指定されたブロック入力端子に対応するサンプル時間を返します。

blkiolib.tlcLibBlockInputSignalSampleTime を参照してください。

LibBlockInputSignalSampleTimeIndex(portIdx)

指定されたブロック入力端子に対応するサンプル時間インデックスを返します。

blkiolib.tlcLibBlockInputSignalSampleTimeIndex を参照してください。

LibBlockInputSignalSymbolicDimensions(portIdx)

指定されたブロック入力端子の次元数を返します。

blkiolib.tlcLibBlockInputSignalSymbolicDimensions(portIdx) を参照してください。

LibBlockInputSignalSymbolicWidth(portIdx)

指定されたブロック入力端子のシンボリック幅を返します。

blkiolib.tlcLibBlockInputSignalSymbolicWidth(portIdx) を参照してください。

LibBlockInputSignalWidth(portIdx)

指定されたブロック入力端子インデックスの幅を返します。

blkio_api.tlcLibBlockInputSignalWidth を参照してください。

LibBlockInputSignalUnitExpr(portIdx)

指定されたブロック入力端子に対応する単位の名前を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputSignalUnitExpr を参照してください。

LibBlockInputSignalUnitId(portIdx)

指定されたブロック入力端子の単位に対応する数値識別子 (id) を返します。この関数は、入力引数として端子インデックスを取ります。

blkio_api.tlcLibBlockInputSignalUnitId を参照してください。

blkio_api.tlcLibBlockInputSignalUnitExpLibBlockOutputSignalUnitId も参照してください。

LibBlockNumInputPorts(block)

ブロックのデータ入力端子の数を返します (制御端子は除きます)。

blocklib.tlcLibBlockNumInputPorts を参照してください。

関連するトピック