错误写入文本文件
2视图(30天)
显示旧的评论
东
2011年9月26日
大家好!
我想模型结果输出到一个文本文件在运行模拟。万博1manbetx但文本文件的值是不同的与真实值与工作区中的值(比较)。我也使用烈性黑啤酒结果导出到一个垫子文件和比较结果的文本文件:垫文件中的值在工作区中值是一样的。我也知道这是真值。但文本文件中的值是不同的。例如工作区和mat文件中的值是0.9913,但是在文本文件是1.012。但事实上,真正的值不超过1。仿真时,文本文件中的值总是大于实际值。请帮助我。
4评论
Fangjun江
2011年9月26日
良好的实验!见//www.tianjin-qmedu.com/matlabcentral/answers/15982-how-to-store-output-data-from-a-sim万博1manbetxulink-model-to-a-text-file。
把你的代码我们可以算出来。我也感兴趣。只是想看看它是可能的。
东
2011年9月26日
在模型的输出,我与代码功能使用万博1manbetx
函数(sys, x0, str, ts) = sfwritetext (t, x, u,标志)
开关国旗,
% % % % % % % % % % % % % % % % % %
%初始化%
% % % % % % % % % % % % % % % % % %
%初始化状态,样品时间和状态排序字符串。
例0
(sys, x0, str, ts) = mdlInitializeSizes;
% % % % % % % % % % %
%输出%
% % % % % % % % % % %
% s函数的返回输出块。
案例3
sys = mdlOutputs (t, x, u);
% % % % % % % % % % % % % % % % % % %
%未处理的旗帜%
% % % % % % % % % % % % % % % % % % %
情况下{1、2、4、9}
sys = [];
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%意想不到的旗帜(错误处理)%
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%为未处理的标志值返回一条错误消息。
否则
错误([= ' '未处理的标志,num2str(国旗)]);
结束;
% timestwo结束
%
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
% mdlInitializeSizes
%返回大小、初始条件和样品时间的功能。
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%
函数(sys, x0, str, ts) = mdlInitializeSizes ()
大小= simsizes;
大小。NumContStates = 0;
大小。NumDiscStates = 0;
大小。NumOutputs = 1;%动态大小
大小。NumInputs = 1;%动态大小
大小。DirFeedthrough = 1;%有直接引线
大小。NumSampleTimes = 1;
sys = simsizes(大小);
str = [];
x0 = [];
t = 0 [1];%继承采样时间
% mdlInitializeSizes结束
%
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
% mdlOutputs
% s函数的返回的输出向量
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%
函数sys = mdlOutputs (t, x, u)
fid = fopen (' value.txt ', ' w ');
sys =流(fid, % f, u);
文件关闭(fid);
答案(3)
Fangjun江
2011年9月26日
我只是确认与fopen(文件,“w”),文件的内容将书写过度。所以你只会得到最后一个值,不是目的。
可能会有一种不参选fopen()和fclose()在每一个时间步。但最简单的方法是编写附加的文本文件模式。使用fopen(文件,“在”)。
16条评论
东
2011年9月27日
书写过度是我的目的。因为当运行模拟,其他程序读取文本文件中的值不断和传递真正的机器控制。
我使用fopen(文件,“+”)或frintf (1 ' % f ' u)在屏幕上看到输出结果。但结果是我之前说的一样。
我也不过是你说”的方法将需要硬盘访问在每一个时间步,甚至打开和关闭文件在每个时间步”但这样,的值必须永远小于工作区中的值。因为写作文本文件中的值总是低于当前值在模型的输出。万博1manbetx
Fangjun江
2011年9月27日
@Tung,它不应该发生。
让你的s函数输入一个常数,例如,1。
常数的值写入文本文件,盖写或附加检查文本文件的修改日期和时间,以确保它是最新的更新文件。
还流(1 ' % f \ n ' u)命令窗口。你是说命令窗口中显示的值是不正确的?
东
2011年9月27日
如果我输入功能一个常数,它将盖写的前一个值。最新更新的值是正确的。这是相同的使用fprintf (1 ' % f \ n ' u)命令。总是如此的静态计算。这是动态计算。
我发现错误的价值观是价值观的原因写的S-funtion(流()命令)在工作区或垫文件太超过。例如,样品时间是0.01秒,如果仿真软件运行在0.1秒,我们将有11个价值观:万博1manbetx
真正的结果(工作区,垫文件):
0 0.0323669344980132 0.0657510988130542 0.100519139757348 0.134300252466615 0.161020802808427 0.189548037935473 0.217621290771149 0.245709502694545 0.272320032018139 0.299432452531348
但结果在使用流()命令将:
0.000000 0.000000 0.001569 0.008778 -0.097553 -0.165451 0.032367 0.039412 0.043499 0.052341 0.062057 0.089179 0.065751 0.073395 0.077500 0.082114 0.059340 0.066505 0.100519 0.106275 0.108107 0.155264 0.217676 0.212041 0.134300 0.141728 0.144117 0.145211 0.107391 0.097592 0.161021 0.165293 0.167748 0.197785 0.238145 0.243443 0.189548 0.196110 0.199292 0.201392 0.176475 0.179310 0.217621 0.222631 0.225193 0.247602 0.269238 0.272540 0.245710 0.251596 0.253537 0.263359 0.235320 0.216378 0.272320 0.277122 0.279697 0.300493 0.320633 0.325022 0.299432
我不知道,什么是错误的,当输出文本文件
Fangjun江
2011年9月27日
似乎每个六元素的文本文件匹配的真正价值。
> > NewValue = TextValue(1:6:结束);
[TrueValue; NewValue]
ans =
0 0
0.0324 - 0.0324
0.0658 - 0.0658
0.1005 - 0.1005
0.1343 - 0.1343
0.1610 - 0.1610
0.1895 - 0.1895
0.2176 - 0.2176
0.2457 - 0.2457
0.2723 - 0.2723
0.2994 - 0.2994
东
2011年9月28日
@Jan西蒙
如果我写的所有数据从开始到停止仿真,不难找到真值作为Fangjun发现。但在这里,更新价值和盖写前一个值。因此,在这种方式,如何迫使流()命令写值后的文本文件,每6模型的输出值?万博1manbetx请帮助我。
另一件事,我不明白是我设置固定的,因此输出值也只有11值为什么会有超过11价值观?
Fangjun江
2011年9月28日
@Tung,这是未知的,我渴望找到。我认为你是在最好的位置来为我们找到它了。
仍然试图编写附加的文件模式。模拟仅运行一个短的时间内的数据不会让红毯成为主导。
沃尔特提到,你可能是一个向量输入,你检查了吗?
当我说“固定的一步”,我的意思是解算器的类型是固定的步骤和解决“离散”。有可能对你选择“离散”解算器吗?
使用流(…)在同一时间吗?命令窗口显示11的数据点,或66数据点吗?
东
2011年9月28日
谢谢你的发现和评论。现在,我找到解决这个问题的方法。如果我找到我会发布在这里。
如果在附加模式编写文件,之前的值转移到机器,我可以使用其他语言(C, VB)选择一个真正的文件中的值。但我想解决这个问题通过使用Matlab,这意味着在文本文件中只有真正价值,并且每个瞬间的时间只有一个文本文件的价值。这将会很容易下处理。
你是一个即时的时间价值。我以这种方式使用
模型连续状态所以不能选择解算器是“离散”
我使用流()在两个独立的时间,和他们都显示66数据点
1月
2011年9月27日
代码不插入空格后写一个号码:“sys =流(fid, % f, u)”。但你的数据包含空间:“0.000000 0.000000 0.001569…”。你没有把原始代码或运行另一个程序。
请在流中设置一个断点行发现,发生了什么。
1评论
东
2011年9月28日
谢谢你的观察。对于接收以上值,代码
函数sys = mdlOutputs (t, x, u)
fid = fopen (value.txt, ' + ');
sys =流(fid, % f \ t, u);
文件关闭(fid);
或
函数sys = mdlOutputs (t, x, u)
sys =流(% f \ t, u);
1月
2011年9月26日
如何创建文本文件?这似乎是显而易见的,有一个错误在这个例程。
[编辑]读完你的评论显示代码:
流工作正常。所以你不是要你但是x,或者你写的文件
当前的
文件夹中,但这不是你期待的文件夹。然后文件与“错误”的值是由早期版本写的。
更好的路径添加到输出文件并检查FOPEN的成功在每一个案例:
fid = fopen (fullfile (tempdir“value.txt”),' w ');
如果fid < 0,错误(“不能打开的文件”);结束
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。