Инициализация стойких переменных в функциях MATLAB

Постоянная переменная является локальной переменной в MATLAB® функция, которая сохраняет свое значение в памяти между вызовами функции. Для генерации кода функции должны инициализировать постоянную переменную, если она пуста. Для получения дополнительной информации см. persistent.

При программировании функций MATLAB в таких ситуациях:

  • MATLAB Function блоки без прямого сквозного соединения

  • MATLAB Function блоки в моделях, которые содержат State Control блока в Synchronous способ

  • Функции MATLAB в Stateflow® графики, которые реализуют семантику машины Мура

Специализированная семантика влияет на то, как функция инициализирует свои постоянные данные. Поскольку инициализация должна быть независимой от входа в функцию, следуйте этим рекомендациям:

  • Функция инициализирует свои постоянные переменные только путем доступа к константам.

  • Поток управления функцией не зависит от того, происходит ли инициализация.

Для примера эта функция имеет постоянную переменную n.

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end
Этот тип инициализации приводит к ошибке, поскольку начальное значение n зависит от входа u и return оператор прерывает нормальный поток управления функцией.

Чтобы исправить ошибку, инициализируйте постоянную переменную, установив ее в постоянное значение и удалите return оператор. Для примера эта функция инициализирует постоянную переменную, не создавая ошибки.

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = 1;
    end
    
    y = n;
    n = n + u; 
end

Блок MATLAB function без прямого сквозного соединения

Эта модель содержит блок MATLAB function, который задает функцию fcn, описанная ранее. Область входа u - квадратная волна со значениями 1 и -1.

В блоке MATLAB function:

  • Начальное значение стойкой переменной n зависит от входа u.

  • The return оператор прерывает нормальный поток управления функцией.

Поскольку флажок Разрешить прямую обратную связь снят, инициализация приводит к ошибке.

Если вы изменяете функцию, чтобы она инициализировалась n независимо от входов, можно симулировать модель без ошибок.

Блок управления состоянием в синхронном режиме

Эта модель содержит блок MATLAB function, который задает функцию fcn, описанная ранее. Область входа u - квадратная волна со значениями 1 и -1.

В блоке MATLAB function:

  • Начальное значение стойкой переменной n зависит от входа u.

  • The return оператор прерывает нормальный поток управления функцией.

Потому что модель содержит блок State Control в Synchronous mode, инициализация приводит к ошибке.

Если вы изменяете функцию, чтобы она инициализировалась n независимо от входов, можно симулировать модель без ошибок.

Диаграмма Stateflow реализации семантики Мура

Эта модель содержит диаграмму Stateflow, которая реализует семантику машины Мура. График содержит функцию MATLAB, которая определяет функцию fcn, описанная ранее. Область входа u имеет значения 1 и -1, которые зависят от состояния графика.

В функции MATLAB:

  • Начальное значение стойкой переменной n зависит от входа u.

  • The return оператор прерывает нормальный поток управления функцией.

Поскольку график реализует семантику Мура, инициализация приводит к ошибке.

Если вы изменяете функцию, чтобы она инициализировалась n независимо от входов, можно симулировать модель без ошибок.

См. также

| | (HDL Coder) | (Simulink)

Похожие темы