2017-06-21 6 views
1

複数のファイル(CSV、2列)を所属名(文字列)と補間方法の平滑度(文字列)で読み込もうとしています。レコードを使用することにより、私はDymolaはで素敵なGUIを取得: GUIモデル内の柔軟な配列サイズがレコード内にありません - 拡張に失敗しました

は私の問題を説明するために、ここでは単純化したモデルである:

model Test_Strings 
    parameter String x[:]; 
    parameter Integer k = size(x,1); 
    Integer i; 

initial algorithm 
    i := 0; 
    Modelica.Utilities.Streams.print(String(i)); 
    Modelica.Utilities.Streams.print(String(k)); 

equation 

algorithm 
    when sample(1,1) then 
     i :=pre(i) + 1; 
     Modelica.Utilities.Streams.print(String(i)); 

     for j in 1:k loop 
     Modelica.Utilities.Streams.print(x[j]); 
     end for; 
    end when; 
end Test_Strings; 

次のように、このためのGUIはなります enter image description here

それを実行するコード:

model Test_Strings_System 
    Test_Strings test_Strings(x={"a","b","c","d"}); 
end Test_Strings_System; 

これは、consoル: enter image description here

今、私はレコードを使用しようとすると:モデル(最初のパラメータだけラインを

record MyRecord2 
    parameter String name = "NoName"; 
end MyRecord2; 

をそして適応MyRecord2のX [:]とループのX [内J]が変更.nameのは):内部エラー::

model Test_Strings2 
    parameter MyRecord2 x[:]; 
    parameter Integer k = size(x,1); 
    Integer i; 

initial algorithm 
    i := 0; 
    Modelica.Utilities.Streams.print(String(i)); 
    Modelica.Utilities.Streams.print(String(k)); 

equation 

algorithm 
    when sample(1,1) then 
    i :=pre(i) + 1; 
    Modelica.Utilities.Streams.print(String(i)); 

    for j in 1:k loop // k must be fixed number if equation 
     Modelica.Utilities.Streams.print(x[j].name); // j must be fixed number if algorithm 
    end for; 
    end when; 
end Test_Strings2; 

それから私は、変換エラーを取得した文字列を拡張することができませんでした。 enter image description here

私は与えられた数のforループ内のKまたはJを修正する場合、それが動作する(のが3を言わせて)、それは、アルゴリズムや数式セクション内だ場合によっては(コード内のコメントを参照してください)。

私はフレキシブルなアレイサイズで同様の問題を抱えていましたが、それを解決する方法はまだ分かりません。 関数を使用する必要がありますか? 外部データに応じて定義され、シミュレーションの前にパラメータとして選択された柔軟な配列サイズ(テーブルの長さなど)を使用するにはどうすればよいですか? この場合、他の場所の問題ですか?

ありがとうございました。

答えて

1

あなたが目に見えるパラメータとしてレコードの配列を持つようにモデルを変更するが、内部(後Dymolaは2017年とでテスト)文字列の配列を使用することができます。

model Test_Strings2 
    parameter MyRecord2 x[:]; 
    parameter Integer k = size(x,1); 
    Integer i; 
protected 
    parameter String s[:]=x.name; // Hack 
initial algorithm 
    i := 0; 
    Modelica.Utilities.Streams.print(String(i)); 
    Modelica.Utilities.Streams.print(String(k)); 

equation 

algorithm 
    when sample(1,1) then 
    i :=pre(i) + 1; 
    Modelica.Utilities.Streams.print(String(i)); 

    for j in 1:k loop 
     Modelica.Utilities.Streams.print(s[j]); 
    end for; 
    end when; 
end Test_Strings2; 
関連する問題