2

多くの Cs 関数を含む Simulink モデルを開発しています。簡単に処理するために、simulink-model のように cs-function で定数を使用したいと考えています。したがって、次のようなプリプロセッサ定数を含む c-header があります。

#define THIS_IS_A_CONSANT 10

そして、質問があります。たとえば、ワークスペース変数のような定数ソースで THIS_IS_A_CONSANT を使用できるように、これを Simulink に含めることはどのように可能ですか?

アレックスに感謝します。

4

1 に答える 1

7

Simulink には、定数や変数などを定義するカスタム C ヘッダー ファイルを含めることができる機能があります。しかし、私の知る限り (そして予想通り)、これは実際にはコードが生成されてコンパイルされる場合にのみ関係します。

したがって、ほとんどの場合、この特定の機能は、Simulink Coder を使用してモデルからスタンドアロンの実行可能ファイルを生成する場合にのみ関連します。たとえば、このリンクは、モデルのコンフィギュレーション パラメーターの下にあるカスタム ストレージ クラスおよび [コード生成 - カスタム コード] ペインでSimulink.Parameterオブジェクトを使用して、コード生成中に外部ヘッダー ファイルに格納されたパラメーターを含める方法を示しています。

Simulink ドキュメントのこのリンクは、 #defineカスタム ストレージ クラスを使用して同様の結果を得る方法を示しています。

ただし、シミュレーション中にヘッダー ファイルのコードを利用したいので、どちらも実際には問題を解決していないように思えます。

とはいえ、Simulink には Stateflow チャートや MATLAB Function ブロックなど、シミュレーション中に「内部で」コードを生成およびビルドする要素があることを考えると、(少なくとも仮説的には) いくつかの機能を使用できる可能性があります。上記の概念を使用して、シミュレーション中にこれらの要素の 1 つからヘッダー ファイルの値にアクセスします。たとえば、 [コンフィギュレーション パラメーター] の下の[シミュレーション ターゲット] -> [カスタム コード]ペインに移動し、[生成されたカスタム C コードを含める: ヘッダー]の下にテキスト#include "header.h"を含めるだけで、Stateflow チャートのプリプロセッサ マクロに正常にアクセスできました。ファイル. (この場合、header.h には、投稿に含めた C コードの行が含まれていました)

この機能をさらに拡張できるように思われますが、シミュレーション中のヘッダー ファイルへのアクセスに関する限り、これが実際に達成できた限界でした。たとえば、モデルをラピッド アクセラレータモードで実行すると、実際に内部でコードが生成およびビルドされることがわかっているため、シミュレーション中にヘッダー ファイルから値にアクセスできるようにするには、上記の手法を組み合わせて使用​​できるはずです。 . ただし、ラピッド アクセラレータ モードが生成するコードは、Simulink/Embedded Coder が行うのと同じように、これらの手法によって定義されたすべての設定を尊重していないように見えるため、コンパイル エラーが発生し続けました。(ただし、それを機能させるための創造的な設定の組み合わせが欠けているだけかもしれません)。

これが、C ヘッダー ファイルのインクルードに関する Simulink の機能 (および制限) の説明に役立つことを願っています。要約すると、上記のリンクによると、あなたが求めていることはほとんど可能ではありませんが、実際には...そうではありません.


したがって、ヘッダー ファイル内のプリプロセッサ #defineからワークスペース変数を作成できるようにすることだけが本当に必要な場合は、以前にコメントで提案されていたように、MATLAB スクリプトを使用してファイルを手動で解析するのがおそらく最も簡単です。これは、ヘッダー ファイルにロードし、各行を反復処理し、正規表現 (必要に応じて改善できます) を使用して#defineステートメントを解析し、 evalを呼び出して解析済みの変数から変数を作成する簡単なスクリプトです。入力。

filename = 'header.h';
pattern = '^\s*#define\s*(\w*)\s*(\d*\.?\d+)';
fid = fopen(filename);
tline = fgetl(fid);
while ischar(tline)
   tokens = regexp(tline, pattern,'tokens','once');
   if(numel(tokens) == 2)
       eval([tokens{1} ' = ' tokens{2}]);
   end
   tline = fgetl(fid);
end
fclose(fid);

モデルをロードするたびに実行されるように、このコードをコールバックに入れることができます。[ファイル] -> [モデル プロパティ] -> [モデル プロパティ] に移動し、[コールバック] タブをクリックして、必要なコールバック (モデルがロードされる直前に実行する場合は PreLoadFcn など) の下にコードを配置します。

于 2013-08-26T20:46:44.787 に答える