首页 文章

将工作区值导入Simulink

提问于
浏览
0

我是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 回答

  • 1

    你真的应该把它写成一个m代码的S函数,你的(一次性)设置代码在块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函数 .

相关问题