問題タブ [s-function]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Simulink SFunction Builder バス入力値
カスタム S-Function ブロックでバス システムにアクセスして使用する方法を理解しようとしています。S-Function Builder を使用して、入力がなく、バス出力が 1 つある非常に基本的な S-Function を作成しました。Bus は double 型の 1 つのフィールドのみで構成される構造体です。これは問題なく動作します。
いいえ、バス入力が 1 つあり、出力がない、新しく作成されたブロック (これも S-Function Builder の助けを借りて) にその出力を接続しようとしました。を使用して、構造体内の唯一のフィールドの値をコンソールに書き込む必要がありますmexPrintf
。ただし、値は常に 0 (ゼロ)
出力ラッパー関数で最初のブロックの出力をそのように設定しました(正常に動作します):
そして、次のように他のブロック内の入力値を取得しようとします(常に0を出力します):
simulink - カスタム システム ターゲット ファイルで条件付きで有効化された rtwoptions (Simulink Coder)
カスタム システム ターゲット ファイル (STF) を作成し、構成が必要な RTW オプションをいくつか追加しています。一部のオプションは他のオプションに依存しており、構成方法によって意味がある場合と意味がない場合があります。これらの場合、条件付きで無効にしたいと思います(グレー表示)。
これまでのところ、私はこのようなものを持っています(MATLAB R2014aを使用)
ドキュメンテーションによると、MATLAB 関数を呼び出すことによる条件付き rtwoption のようなものがありますが、別のオプションに依存させたいと考えています。
これはコード生成 --> [レポート] タブで実装されているため、可能である必要があります ([レポートを開く] は、[レポートの作成] を有効にした場合にのみ有効になります)。
この条件の構文は何ですか? 「tlc変数」を使用できますか?
c++ - 「多数の」信号でバスをコンパイルする方法は?
大規模なネストされたバスを送信したい c++ SFunction を含む simulink モデルがありますが、約 10 分後にヒープ領域不足エラーでコンパイラがクラッシュします。
バスには、その内部に 9 つのバスと、それらの内部にさらにバスのセットがあり、合計 49 のバスと 490 の信号がツリー内にあります。完全なバス定義を生成しましたが、それらはすべてグローバル ワークスペースにあります。また、ヘッダーを使用する 49 個のバスのそれぞれで、ヘッダー ファイルに完全な構造定義も生成しました。
この SFunction の自動生成されたソースは、約 24000 行です。
この SFunction のコンパイルは、パス 2 のヒープ領域が不十分であると不平を言って、長い間失敗します。Visual C++ 2010 Express に同梱されているコンパイラを使用しています。
バスを 1 つずつ要素で満たす実験を行ったところ、コンパイル時間がほぼ指数関数的に増加し、障害が発生することがわかりました。このサイズのバスでコンパイルする方法はありますか?
matlab - 2 次元ルックアップ テーブルの S 関数、「sfix_look1_dyn.mex32」と同様
「sfix_look1_dyn.mex32」ファイルに関する情報が必要です。現在、マスクされた関数ブロックの助けを借りて、この mex ファイルを使用しています。このブロックは、1 D ルックアップ関連の計算にのみ使用しています。しかし、2Dルックアップテーブルに同様の種類のロジックを使用したい場合、同じmexファイルを使用することは可能ですか? 基本的に、2Dルックアップでテーブルデータの値を入力として与えることができるようにする方法があることを知りたいです。
c - Simulink:レベル 2 の s-function でローカル変数を使用する方法は?
C で Simulink S-Function (レベル 2) を作成しました。結果のブロックには、1 つの出力と 1 つのパラメーターがあります。このパラメーターは、ブロックをセットアップした直後に、ファイル スコープで定義される変数に格納されます。
mdlInitializeSizes 内で割り当て、その値に対していくつかの操作を行います。
私の問題は、変数 MASK_INDEX がグローバルで、同じタイプのすべてのブロック間で共有されているように見えることです。したがって、すべてのブロックで同じ値を保持します。
回避策として、毎回リロードして操作をやり直します。次に例を示します。
毎回これをすべて繰り返す必要がないように、真の「ローカル変数」を取得するにはどうすればよいですか?
time - Simulink の現在のシミュレーション時間を表示する
皆さん!
Simulink の現在のシミュレーション時間を表示しようとしています。私の場合、一度 load_system を使用するとシステムが表示されないことに注意する必要があります。シミュレーションがどのように進行しているかを知ることは非常に役立ちます。
そのためには、関数「ssGetT」を使用する必要があることを読みました。それを実装するために、S-Function ビルダー ブロックを使用していますが、成功しました。つまり、現在のシミュレーション時間を取得できました。
ただし、進行状況バーまたはメッセージ ボックスまたはその他の方法で表示する方法がわからないため、この時点で引っ掛かります。重要、S-Function Builder で C 環境から表示します。
他に方法があればお願いします。=)
誰かが私を助けてくれれば、本当に感謝しています。
c++ - マイナー タイム ステップで修正されていないメモリ ブロックの代替案はありますか?
メモリ ブロックを介して CMEX S-Function に供給されるいくつかの入力を含むモデルがあり、S-Function はこれらの入力に基づいて出力を提供し、それらの入力は S-Function にフィードバックされます。古典的な代数ループのシナリオ。私たちのソルバーは通常可変時間ステップであるため、これを防ぐためにメモリ ブロックを使用していました。
Mathworks のドキュメントによると、Memory ブロックと Unit Delay ブロックも、出力に関してマイナー タイム ステップで固定されています。入力は離散でも連続でもかまいませんが、出力はメジャータイム ステップでのみ連続であり、マイナー タイム ステップでは固定されます。
ここで、さまざまな理由から、モデル内のすべてがマイナー タイム ステップとメジャー タイム ステップで更新されることが重要です。PWork ベクトルを使用して状態点の前の値を保存し、使用する CMEX S-Function に転送する方法を思いつきました。これにより、代数ループの発生が防止され、マイナー タイム ステップでの連続性も保証されますが、私が望むほどエレガントではありません。
誰か別の提案はありますか?
PS: 余談ですが、ソルバーが Fixed Step であるか Variable Step であるかに関係なく、Memory ブロックを使用する方が良いと思います。これは、内部的に Fixed Step ソルバーの Unit Delay ブロックになるためです。この仮定は正しいですか?
c++ - Simulink が検出する人為的な代数ループにどのように対処すればよいですか?
これは、ややオープンエンドの質問を扱う、少し複雑な問題です。StackOverflow がこの慣習に眉をひそめていることは承知していますが、おわかりのように、それを小さな部分に分解するのは私には困難です。
CMEX S-Function (を使用してコンパイル) を使用して呼び出される C++ コードがありlegacy_code
ます。マイナータイム ステップで S-Fn が連続するようにラッパー ファイルを手動で変更しました。これは重要です。マイナー ステップで修正すると、関数の出力が滑らかな線ではなく階段状に変化することがわかったからです。連続化してから、この問題は解決しました。
残念ながら、入力信号と S-Function (代数ループを解くために使用していた) の間のメモリ ブロックがマイナー タイム ステップで固定されていることを後で発見しました。私は以前、継続的な選択肢があるかどうかについて (ここで)質問しましたが、質問が埋もれてしまったようです。
代わりに、このMathworks のドキュメントを参照しました。彼らは、PWork ベクトルを使用して、S-Function の連続する呼び出し間で値をメモリに永続的に保持できると主張しています。このベクトルを使用してこれを行うことができました: 1. 次のステップのために現在の時間ステップの値を保存します 2. 次のステップで古い値を使用します 3. 計算後、古い値を現在の値に更新します 4. 繰り返します
要するに、メモリ ブロックの機能を内部的に複製しました。ここで、Memory ブロックを削除して、Initial Condition ブロックに置き換えることができると考えました。残念ながら、これを行うと、代数ループの警告が表示されます。さて、私のモデルは時々解決し、時には解決しません。
2 つのケースを以下に概略的に示します。
S-Function
とS-Function2
CMEX オブジェクトです。
おそらくCMEX関数は代数ループ診断コードに密集しており、Simulinkは実際には実際の代数ループではなく人工的なものだけであることを認識できませんか?
私の質問は、代数ループが実際に存在しないことを Simulinkに伝えるためにできることはありますか? そのような場合に何をすべきかについて、ある種のベストプラクティスはありますか?
*編集: 回路図は不正確で、モデルを適切に表していませんでした。更新しました
c++ - Simulink では、mdlUpdate も直接フィードスルーとしてカウントされますか?
直接フィードスルーを持たないように設定した CMEX S-Function への入力ポートがあります。ただし、mdlUpdate
関数呼び出しで入力ポートからの信号を使用しようとすると、セグメンテーション違反でクラッシュし、最も可能性の高い原因は入力ポートの直接フィードスルー ステータスの設定が正しくないことであることが通知されます。
mdlUpdate ALSO での入力信号の使用は直接フィードスルーとしてカウントされますか?