Команда инициализации Simulink Mask и RuntimeObject - PullRequest
0 голосов
/ 05 октября 2019

Вот код для инициализации моей маски. Я хочу использовать его для изменения цвета в соответствии с выходными данными одного из блоков

systems = find_system(gcb,'LookUnderMasks' , 'on', 'FollowLinks','on', 'SearchDepth', 1,'regexp','on','Name','Multi');
rto=get_param(systems{1,1},'RuntimeObject')
if rto.OutputPort(1).Data == 1
    set_param(gcb,'BackgroundColor','red')
else
    set_param(gcb,'BackgroundColor','green')
end

. Когда я нажимаю ОК, я получаю Error: Dot indexing is not supported for variables of this type

* 1006. * Когда я использую keyboard для отладки, я получаю
K>> rto

rto =

    handle

Кажется, что он не может получить объект времени выполнения, но когда я делаю это, находясь в режиме отладки

rto=get_param(systems{1,1},'RuntimeObject');

во время отладки я все понял

rto =

    Simulink.RunTimeBlock

1 Ответ

1 голос
/ 05 октября 2019

Ваш подход не сработает. Инициализация маски происходит во время инициализации модели, и в этот момент выходные данные блока могут даже не иметь значения. Даже если код, который вы показывали, действительно выполнялся, потому что инициализация маски не происходит во время симуляции, цвет вашего блока не изменился бы при изменении значения сигнала.

Единственный способ сделать это (т.е. изменитьцвет блока) должен иметь код, который выполняется на каждом временном шаге в процессе симуляции. Обычно это достигается с помощью S-функции. Ниже приведена очень простая S-функция, которая изменит цвет подсистемы, в которой она находится, на основе значения входного сигнала блока.

enter image description here

Код в S-функции:

function msfcn_times_two(block)
% Level-2 MATLAB file S-Function for times two demo.
%   Copyright 1990-2009 The MathWorks, Inc.

setup(block);

%endfunction

function setup(block)

%% Register number of input and output ports
block.NumInputPorts  = 1;
block.NumOutputPorts = 1;

%% Setup functional port properties to dynamically
%% inherited.
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;

%% Set block sample time to inherited
block.SampleTimes = [-1 0];

%% Set the block simStateCompliance to default (i.e., same as a built-in block)
block.SimStateCompliance = 'DefaultSimState';

%% Run accelerator on TLC
block.SetAccelRunOnTLC(true);

%% Register methods
block.RegBlockMethod('Outputs',                 @Output);

%endfunction

function Output(block)

if block.InputPort(1).Data < -0.5
    set_param(get_param(block.BlockHandle,'Parent'),'BackgroundColor','red')
elseif block.InputPort(1).Data < 0.5
    set_param(get_param(block.BlockHandle,'Parent'),'BackgroundColor','green')
else
    set_param(get_param(block.BlockHandle,'Parent'),'BackgroundColor','blue')
end
%endfunction
...