【问题标题】:Import Workspace value to Simulink将工作区值导入 Simulink
【发布时间】:2017-03-26 02:47:49
【问题描述】:

我是 matlab 新手。在在线搜索的帮助下,我编写了 MODBUS RTU 代码来从我的设备中获取数据。我想将此数据导入 simulink 以进行进一步的 DSP 分析。下面是我从串口获取 MODBUS RTU 数据的 matlab 代码。

instrreset;
clear all; 
close all; 
clc; 

s = serial('COM4');    
set(s,'BaudRate',115200,
      'DataBits',8,
      'StopBits',1,
      'Parity','None','Timeout',1);
fopen(s);

request = uint8(hex2dec(['01'; '03'; '00'; '00'; '00'; '02'; 'C4'; '0B']));
ts = timeseries('mySeries'); % Updated
while(1)
    fwrite(s, request);    
    outdec = fread(s,9);
    y = typecast(uint8([outdec(7) outdec(6) outdec(5) outdec(4)]),'int32');
    z = datevec(datetime('now')); % Updated
    ts = timeseries(y, z); % Updated
    disp(y);
end

fclose(s);
delete(s);
clear s
disp('STOP')

在 while 循环中,我不断获取变量 y 中的 modbus 值。现在我想在 simulink 中使用这个值。我将每 100 毫秒获取一次数据,或者您可以说我的采样频率为 10 赫兹。任何帮助将不胜感激。

我的主要目标是设计最适合我的应用的数字滤波器。

提前致谢。

【问题讨论】:

  • 阅读这些链接,如果它在您的情况下不起作用,请告诉我们:)
  • Okies 根据您的链接,我制作了一个 ts 对象,并用我的值和日期向量填充它。然后我在simulink中导入了它。这么好。现在如何将这些数据连续发送到 simulink ?在 matlab 中,我的数据被填充到时间序列的 ts 对象中。关于循环模拟的任何想法,以便数据更改是实时的!!!
  • 我修改后的代码 s = serial('COM4'); set(s,'BaudRate',115200,'DataBits',8,'StopBits',1,'Parity','None','Timeout',1);开放(S);请求 = uint8(hex2dec(['01';'03';'00';'00';'00';'02';'C4';'0B'])); ts = timeseries('mySeries'); datetime.setDefaultFormats('default','dd-MM-yyyy hh:mm:ss.SSS') while(1) fwrite(s, request); outdec = fread(s,9); y = typecast(uint8([outdec(7) outdec(6) outdec(5) outdec(4)]),'int32'); x = 日期时间; z = datevec(datetime('now')); ts =时间序列(y,z); disp([datestr(x) [' ',num2str(y)]]);结束

标签: matlab simulink


【解决方案1】:

你真的应该把它写成一个 m-code S-Function,在块 mdlInitialize 函数期间执行你的(一次性)设置代码;您在块 mdlTerminate 函数中的(一次性)终止代码;以及 mdlUpdate 函数中循环的内容。然后,Simulink 将在模型的每个时间步查询/读取您的 COM 端口。

但是,如果您希望由 MATLAB 代码驱动,则需要强制 Simulink 模型更新 while 循环内的 From Workspace 块。假设块中变量的名称是ts,那么执行以下操作就足够了:

set_param(NameOfFromWorkspaceBlockAsString,'VariableName','ts');

这将迫使模型每次都查找变量ts,并从该变量(您刚刚更新)中获取值。

但是,我怀疑使用 From Workspace 块是否是正确的方法。该块使用变量中的时间来确定何时应在模型中使用该值。由于now 约为 736779.5,因此您的模型必须运行该时间段才能使用数据。

我怀疑你真的只是想使用Constant 块,并将常量的值更改为y 的新值(不包括时间戳)。 尽管根据我的第一条评论,正确的方法是使用 S-Function。

【讨论】:

  • Simulink 附带了很多演示。在命令行输入sfundemos;打开 m-code S-Function 演示;查看模板和各种示例。
猜你喜欢
  • 2016-07-02
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2014-06-05
相关资源
最近更新 更多