我是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赫兹。任何帮助都将不胜感激。
我的主要目标是设计最适合我的应用的数字滤波器。
提前致谢。
答案 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函数。