我正在尝试使用所有者名称(String)和插值方法 smoothness (String)读取多个文件(csv,2列)。通过使用记录,我在Dymola中获得了一个很好的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;
运行它的代码:
model Test_Strings_System
Test_Strings test_Strings(x={"a","b","c","d"});
end Test_Strings_System;
现在,如果我尝试使用记录:
record MyRecord2
parameter String name = "NoName";
end MyRecord2;
并调整模型(仅第一个参数行 MyRecord2 x [:] 并且在for循环中 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;
如果我将for循环中的k或j固定为给定的数字(假设为3),那么它可以工作,但取决于它是否在算法或方程式部分内(参见代码中的注释)。
我有灵活的数组大小的类似问题,但仍然不明白如何解决它。 我必须使用功能吗? 如何使用根据外部数据定义的灵活数组大小,在模拟之前选择作为参数(例如表的长度)? 或者在这种情况下是其他地方的问题?
感谢。
答案 0 :(得分: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;