将工作区值导入Simulink

时间:2017-03-25 10:29:42

标签: matlab simulink

我是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赫兹。任何帮助都将不胜感激。

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

这会强制模型每次查找变量ts,并从该变量中获取值(您刚刚更新过)。

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

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