exponenta event banner

Указание времени выборки S-функции

Сведения о времени образца

Вы можете указать поведение S-функций в образце времени в mdlInitializeSampleTimes. Ваша S-функция может наследовать скорости из блоков, которые управляют ею, или определять собственные скорости.

Можно указать коэффициенты S-функций (т.е. время выборки) как

  • Время выборки на основе блоков

  • Время выборки на основе порта

  • Время выборки на основе гибридных блоков и портов

С учетом времени выборки на основе блоков S-функция задает набор рабочих скоростей для блока в целом во время фазы инициализации моделирования. При использовании времени выборки на основе порта функция S-function определяет время выборки для каждого входного и выходного порта по отдельности во время инициализации. Во время фазы моделирования, с учетом времени выборки на основе блоков, S-функция обрабатывает все входы и выходы каждый раз, когда происходит попадание выборки для блока. В отличие от этого, с учетом времени выборки на основе порта блок обрабатывает конкретный порт только в том случае, если для этого порта происходит попадание пробы.

Например, рассмотрим две частоты дискретизации, 0,5 и 0,25 секунды соответственно:

  • В методе на основе блоков выбор 0.5 и 0.25 направляет блок на выполнение входов и выходов с шагом 0.25 секунды.

  • В способе на основе портов установка входного порта в 0.5, а выходного порта в 0.25 заставляет блок обрабатывать входные сигналы с частотой 2 Гц и выходные сигналы с частотой 4 Гц.

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

В некоторых приложениях S-функциональному блоку может потребоваться внутренняя работа с одной или несколькими скоростями дискретизации при вводе или выводе сигналов с другими скоростями. Гибридный блочно-портовый метод задания частоты дискретизации позволяет создавать такие блоки.

В типичных приложениях задается только одно время выборки на основе блоков. Расширенные S-функции могут требовать указания времени выборки на основе портов или нескольких блоков.

Время выборки на основе блоков

S-функции C MEX определяют информацию о времени выборки на основе блоков в

В следующих двух разделах описывается, как задать время выборки на основе блоков для S-функций C MEX. В третьем разделе представлен простой пример задания времени выборки в mdlInitializeSampleTimes. Подробный пример см. в разделе mixedm.c.

Задание количества выборок в mdlInitialitySize

Чтобы настроить S-функцию для времени выборки на основе блоков, используйте

ssSetNumSampleTimes(S,numSampleTimes);

где numSampleTimes > 0. Это говорит подсистеме Simulink ®, что ваша S-функция имеет время выборки на основе блоков. механизм вызываетmdlInitializeSampleTimes, которая, в свою очередь, устанавливает время выборки.

Установка времени образца и определение вызовов функций в mdlInitialitySampleTimes

mdlInitializeSampleTimes указывает две части информации о выполнении:

  • Время выборки и смещения - In mdlInitializeSampleTimes, необходимо указать период выборки и смещение для каждого времени выборки с помощью ssSetSampleTime и ssSetOffsetTime. Если применимо, можно вычислить соответствующий период выборки и смещение перед их установкой, например, вычисляя наилучшее время выборки для блока на основе параметров диалогового окна S-функции, полученных с помощью ssGetSFcnParam.

  • Вызовы функций - Входящие mdlInitializeSampleTimes, использовать ssSetCallSystemOutput для указания элементов вывода, выполняющих вызовы функций. Посмотритеsfun_fcncall.c Пример и Реализация функциональных подсистем вызова с S-функциями для объяснения этой S-функции.

Время выборки задается парами [sample_time, offset_time], использование этих макросов

ssSetSampleTime(S, sampleTimePairIndex, sample_time)
ssSetOffsetTime(S, offsetTimePairIndex, offset_time)

где sampleTimePairIndex и offsetTimePairIndex начинается с 0.

Допустимыми временными парами выборки являются (значения верхнего регистра являются макросами, определенными в simstruc.h):

[CONTINUOUS_SAMPLE_TIME,  0.0                       ]
[CONTINUOUS_SAMPLE_TIME,  FIXED_IN_MINOR_STEP_OFFSET]
[discrete_sample_period,  offset                    ]
[VARIABLE_SAMPLE_TIME  ,  0.0                       ]

Кроме того, можно указать, что время выборки наследуется от управляющего блока, и в этом случае S-функция может иметь только одну пару времени выборки.

[INHERITED_SAMPLE_TIME,  0.0                       ]

или

[INHERITED_SAMPLE_TIME,  FIXED_IN_MINOR_STEP_OFFSET]

Примечание

Если S-функция наследует время выборки, следует указать, безопасно ли использовать S-функцию в ссылочной модели, т.е. модели, на которую ссылается другая модель. Дополнительные сведения см. в разделе Указание образца модели для наследования по времени.

Следующие рекомендации могут помочь в определении времени выборки:

  • Непрерывная функция, которая изменяется во время незначительных шагов интеграции, должна регистрировать [CONTINUOUS_SAMPLE_TIME, 0.0] время выборки.

  • Непрерывная функция, которая не изменяется во время незначительных шагов интеграции, должна регистрировать [CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET] время выборки.

  • Дискретная функция, изменяющаяся с заданной скоростью, должна регистрировать дискретную временную пару выборок.

    [discrete_sample_period, offset]
    

    где

    discrete_sample_period > 0.0
    

    и

    0.0 <= offset < discrete_sample_period
    
  • Дискретная функция, которая изменяется с переменной скоростью, должна регистрировать дискретную переменную ступень [VARIABLE_SAMPLE_TIME, 0.0] время выборки. В S-функциях C MEX mdlGetTimeOfNextVarHit вызывается функция для получения времени следующего попадания выборки для дискретной задачи с переменным шагом. VARIABLE_SAMPLE_TIME может использоваться только с решателями с переменным шагом.

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

  • Функция, которая изменяется по мере изменения ее входных данных, даже во время незначительных шагов интеграции, должна регистрировать [INHERITED_SAMPLE_TIME, 0.0] время выборки.

  • Функция, которая изменяется по мере изменения входных данных, но не изменяется во время второстепенных шагов интеграции (т.е. удерживается во время второстепенных шагов), должна зарегистрировать [INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET] время выборки.

Проверка попадания пробы во время выполнения (в mdlOutputs или mdlUpdate), используйте ssIsSampleHit или ssIsContinuousTask макро. Например, используйте следующий фрагмент кода для проверки непрерывного попадания пробы:

if (ssIsContinuousTask(S,tid)) {
}

Чтобы определить, имеет ли третья (дискретная) задача попадание, используйте следующий фрагмент кода:

if (ssIsSampleHit(S,2,tid) {
}

Модуль Simulink всегда назначает индекс 0 к непрерывной частоте выборки, если она существует, однако вы получаете неправильные результаты при использовании ssIsSampleHit(S,0,tid).

Пример: mdlInitialitySampleTimes

В этом примере указывается, что существует два дискретных времени выборки с периодами 0,01 и 0,5 секунды.

static void mdlInitializeSampleTimes(SimStruct *S)
{
  ssSetSampleTime(S, 0, 0.01);
  ssSetOffsetTime(S, 0, 0.0);
  ssSetSampleTime(S, 1, 0.5);
  ssSetOffsetTime(S, 1, 0.0);
} /* End of mdlInitializeSampleTimes. */

Задание времени выборки на основе портов

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

Для использования времени выборки на основе порта в S-функции C MEX необходимо указать количество времени выборки на основе порта в S-функции. mdlInitializeSizes способ:

ssSetNumSampleTimes(S, PORT_BASED_SAMPLE_TIMES)

Необходимо также указать время выборки для каждого входного и выходного порта в S-функции. mdlInitializeSizes с использованием следующих макросов

ssSetInputPortSampleTime(S, idx, period)
ssSetInputPortOffsetTime(S, idx, offset)
ssSetOutputPortSampleTime(S, idx, period)
ssSetOutputPortOffsetTime(S, idx, offset)

Вызов ssSetNumSampleTimes может быть помещен до или после того, как время выборки на основе порта фактически указано в mdlInitializeSizes. Однако, если ssSetNumSampleTimes не настраивает S-функцию для использования времени выборки на основе порта, любое время выборки, установленное для портов, будет игнорироваться.

Для любого данного порта можно указать

Указание наследуемого времени образца для порта

Чтобы указать, что время выборки порта наследуется в S-функции C MEX, mdlInitializeSizes метод должен установить свой период равным -1 и его смещение до 0. Например, следующий код определяет наследуемое время выборки для первого входного порта C MEX S-функции:

ssSetInputPortSampleTime(S, 0, -1);
ssSetInputPortOffsetTime(S, 0, 0);

При указании времени выборки на основе порта модуль Simulink вызывает mdlSetInputPortSampleTime и mdlSetOutputPortSampleTime для определения скоростей наследуемых сигналов.

После определения всех тарифов система вызывает mdlInitializeSampleTimes. Даже несмотря на то, что в данный момент нет необходимости инициализировать время выборки на основе порта, подсистема вызывает этот метод, чтобы дать вашей S-функции возможность сконфигурировать соединения «функция-вызов». Таким образом, функция S должна обеспечивать реализацию этого метода независимо от того, использует ли она время выборки на основе порта или соединения вызова функции. Хотя можно предоставить пустую реализацию, ее можно использовать для проверки соответствия времени выборки, унаследованного блоком во время распространения времени выборки. Использовать ssGetInputPortSampleTime и ssGetOutputPortSampleTime в mdlInitializeSampleTimes для получения значений наследуемого времени выборки. Например, следующий код в mdlInitializeSampleTimes проверяет, унаследовал ли первый вход S-функции время непрерывной выборки.

if (!ssGetInputPortSampleTime(S,0)) {
    ssSetErrorStatus(S,"Cannot inherit a continuous sample time.")
};

Примечание

Если указано, что порты S-функций наследуют время выборки, следует также указать, безопасно ли использовать S-функцию в ссылочной модели, т.е. модели, на которую ссылается другая модель. Дополнительные сведения см. в разделе Указание образца модели для наследования по времени.

При записи кода TLC для генерации встроенного кода из S-функции и если код TLC содержит Outputs необходимо изменить код TLC, если выполняются следующие условия:

  • Выходной порт имеет постоянное значение. Он использует или наследует время образца Inf.

  • S-функция является многоскоростной S-функцией или использует время выборки на основе порта.

В этом случае код TLC должен генерировать код для порта вывода с постоянным значением с помощью функции OutputsForTID вместо функции Outputs. Дополнительные сведения см. в разделе Указание постоянного времени выборки (INF) для порта.

Чтобы предотвратить наследование портами времени выборки Inf, задайте опцию SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME в коде S-функции. В этом случае можно использовать функцию TLC. Outputs для создания кода для портов вывода с постоянным значением.

Задание постоянного времени выборки (Inf) для порта

Если функция S использует время выборки на основе порта, она может установить время выборки, равное Inf на любом из его портов. Время выборки на основе порта Inf означает, что сигнал, входящий или выходящий из порта, остается постоянным.

Чтобы сделать вывод порта постоянным значением, S-функция должна:

  • Использовать ssSetOptions в своем mdlInitializeSizes метод добавления поддержки для времени выборки Inf:

    ssSetOptions(S,SS_OPTION_ALLOW_CONSTANT_PORT_SAMPLE_TIME);
    

    Примечание

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

  • Установите время выборки порта на Inf и его смещение до 0, например,

    ssSetInputPortSampleTime(S,0,mxGetInf());
    ssSetInputPortOffsetTime(S,0,0);
    
  • Сдать на хранение mdlOutputs является ли метод tid аргумент равен CONSTANT_TID и если это так, установите значение выходного порта, если он является выходным портом.

Пример создания портов, выводящих постоянное значение, см. в разделе sfun_port_constant.c, исходный файл для sfcndemo_port_constant пример.

При записи кода TLC для генерации встроенного кода из S-функции и если код TLC содержит Outputs измените код TLC, если выполняются все эти условия:

  • Выходной порт имеет постоянное значение. Он использует или наследует время образца Inf.

  • S-функция является многоскоростной S-функцией или использует время выборки на основе порта.

В этом случае код TLC должен генерировать код для порта вывода с постоянным значением с помощью функции OutputsForTID вместо функции Outputs. Функция OutputsForTID генерирует выходной код для компонента S-функции с постоянным значением. При настройке модели для создания многозадачного кода OutputsForTID также генерирует выходной код для периодических компонентов S-функции.

Например, просмотр файла TLC sfun_port_constant.tlc для C S-функции sfun_port_constant.c в модели sfcndemo_port_constant. В модели вход блока S-Function2 имеет постоянное значение на протяжении всего моделирования. В S-функциональном коде первый выходной порт наследует время выборки входного порта, поэтому выходной порт также имеет постоянное значение. Код S-функции непосредственно определяет постоянное значение для второго выходного порта.

В коде TLC, если порт имеет постоянное значение, функция Outputs не создает код для первого выходного порта. Функция не генерирует код для второго выходного порта ни при каких обстоятельствах, поскольку этот порт всегда имеет постоянное значение.

Для этой S-функции OutputsForTID генерирует код для выходных портов, имеющих постоянное значение. Генератор кода вызывает функцию OutputsForTIDи задает аргумент tid к идентификатору задачи, который соответствует постоянным значениям. Только если идентификатор задачи выходного порта соответствует постоянным значениям,OutputsForTID затем создайте код для порта.

Настройка времени выборки на основе портов для использования в запускаемых подсистемах

Для использования S-функции C MEX в запускаемой подсистеме необходимо выполнить следующие задачи.

  • Использовать ssSetOptions в mdlInitializeSizes метод, указывающий, что S-функция может выполняться в запускаемой подсистеме:

    ssSetOptions(S, 
    SS_OPTION_ALLOW_PORT_SAMPLE_TIME_IN_TRIGSS);
    
  • Установите все его порты наследуемыми (-1) или постоянное время выборки (Inf) в его mdlInitializeSizes способ.

  • Обработка наследования инициированного времени выборки в mdlSetInputPortSampleTime и mdlSetOutputPortSampleTime способы следующим образом.

    Поскольку порты S-функций наследуют свое время выборки, механизм Simulink вызывает либо mdlSetInputPortSampleTime или mdlSetOutputPortSampleTime во время распространения времени выборки. Макрос ssSampleAndOffsetAreTriggered может использоваться в этих методах для определения наличия S-функции в запускаемой подсистеме. Если S-функция действительно находится в запускаемой подсистеме, любой вызываемый метод должен устанавливать время выборки и смещение порта, для которого она вызывается INHERITED_SAMPLE_TIME (-1).

    Установка времени выборки порта и смещение обоих для INHERITED_SAMPLE_TIME указывает на то, что инициируется время выборки порта, т.е. он выдает выходной сигнал или принимает входной сигнал, только когда запускается подсистема, в которой он находится. Затем метод должен также установить время выборки и смещения всех других входных и выходных портов S-функции, чтобы иметь либо инициированное, либо постоянное время выборки (Inf), в зависимости от того, что уместно, например,

    static void mdlSetInputPortSampleTime(SimStruct *S,
                                          int_T portIdx,
                                          real_T sampleTime
                                          real_T offsetTime)
    {
        /* If the S-function resides in a triggered subsystem,
           the sample time and offset passed to this method
           are both equal to INHERITED_SAMPLE_TIME. Therefore,
           if triggered, the following lines set the sample time
           and offset of the input port to INHERITED_SAMPLE_TIME.*/
    
        ssSetInputPortSampleTime(S, portIdx, sampleTime);
        ssSetInputPortOffsetTime(S, portIdx, offsetTime);
        
        /* If triggered, set the output port to inherited, as well */
    
        if (ssSampleAndOffsetAreTriggered(sampleTime,offsetTime)) {
            ssSetOutputPortSampleTime(S, 0, INHERITED_SAMPLE_TIME);
            ssSetOutputPortOffsetTime(S, 0, INHERITED_SAMPLE_TIME);
    
            /* Note, if there are additional input and output ports
               on this S-function, they should be set to either
               inherited or constant at this point, as well. */
        }
    }

    Нет возможности для S-функции, находящейся в запускаемой подсистеме, предсказать, вызовет ли механизм Simulink mdlSetInputPortSampleTime или mdlSetOutputPortSampleTime для установки времени выборки порта. По этой причине оба метода должны иметь возможность правильно устанавливать время выборки для всех портов, поэтому подсистема должна вызывать только один из методов в один раз.

  • В mdlUpdate и mdlOutputs, использовать ssGetPortBasedSampleTimeBlockIsTriggered проверить, находится ли S-функция в запускаемой подсистеме, и если да, то использовать соответствующие алгоритмы для вычисления ее состояний и выходов.

Посмотрите sfun_port_triggered.c, исходный файл для sfcndemo_port_triggered пример модели для примера создания S-функции, которая может использоваться в запускаемой подсистеме.

Примеры времени на основе гибридных блоков и портов

Гибридный метод назначения времени выборки объединяет методы на основе блоков и на основе портов. Вы сначала указываете, в mdlInitializeSizes, общее количество скоростей, с которыми работает ваш блок, включая как блочные, так и входные и выходные скорости, используя ssSetNumSampleTimes.

Затем вы устанавливаете SS_OPTION_PORT_SAMPLE_TIMES_ASSIGNED опция, использование ssSetOptions, чтобы сообщить модулю моделирования, что вы собираетесь использовать метод на основе портов, чтобы указать скорости портов ввода и вывода по отдельности. Далее, как и в методе на основе блоков, можно указать периоды и смещения всех ставок блока, как внутренних, так и внешних, с помощью

ssSetSampleTime
ssSetOffsetTime

Наконец, как и в методе на основе портов, можно указать скорости для каждого порта с помощью

ssSetInputPortSampleTime(S, idx, period)
ssSetInputPortOffsetTime(S, idx, offset)
ssSetOutputPortSampleTime(S, idx, period)
ssSetOutputPortOffsetTime(S, idx, offset)

Следует отметить, что каждая из назначенных скоростей портов должна совпадать с одной из ранее объявленных скоростей передачи блоков. Пример S-функции см. в разделе mixedm.c.

Примечание

Если вы используете SS_OPTION_PORT_SAMPLE_TIMES_ASSIGNED , ваша S-функция не может наследовать время выборки. Вместо этого необходимо указать скорость, с которой работает каждый входной и выходной порт.

Многоскоростные S-функциональные блоки

В многоскоростном блоке S-Function можно инкапсулировать код, определяющий каждое поведение в mdlOutputs и mdlUpdate функции с инструкцией, которая определяет, произошло ли попадание пробы. В C MEX S-функции ssIsSampleHit определяет, является ли текущее время совпадением выборки для указанного времени выборки. Макрос имеет следующий синтаксис:

ssIsSampleHit(S, st_index, tid)

где S является SimStruct, st_index определяет конкретный временной индекс выборки и tid - идентификатор задачи (tid является аргументом для mdlOutputs и mdlUpdate функции).

Например, эти операторы в C MEX S-функции указывают три раза выборки: один для непрерывного поведения и два для дискретного поведения.

ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
ssSetSampleTime(S, 1, 0.75);
ssSetSampleTime(S, 2, 1.0);

В mdlUpdate функция, следующая инструкция инкапсулирует код, который определяет поведение для времени выборки 0,75 секунды.

if (ssIsSampleHit(S, 1, tid)) {
}

Второй аргумент, 1, соответствует второму времени выборки, 0,75 секунды.

Используйте следующие строки для инкапсуляции кода, определяющего поведение для непрерывного попадания пробы:

if (ssIsContinuousTask(S,tid)) {
}

Пример определения времени выборки для непрерывного блока

В этом примере определяется время выборки для непрерывного блока.

/* Initialize the sample time and offset. */
static void mdlInitializeSampleTimes(SimStruct *S)
{
  ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
  ssSetOffsetTime(S, 0, 0.0);
}

Необходимо добавить этот оператор в mdlInitializeSizes функция.

ssSetNumSampleTimes(S, 1);

Пример определения времени выборки для гибридного блока

В этом примере определяется время выборки для гибридного блока S-Function.

/* Initialize the sample time and offset. */
static void mdlInitializeSampleTimes(SimStruct *S)
{
  /* Continuous state sample time and offset. */
  ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
  ssSetOffsetTime(S, 0, 0.0);

  /* Discrete state sample time and offset. */
  ssSetSampleTime(S, 1, 0.1);
  ssSetOffsetTime(S, 1, 0.025);
}

Во второй выборке смещение вызывает вызов модуля Simulink mdlUpdate функция в эти моменты времени: 0,025 секунды, 0,125 секунды, 0,225 секунды и так далее, с приращениями 0,1 секунды.

Следующий оператор, который указывает, сколько раз образца определено, также появляется в mdlInitializeSizes функция.

ssSetNumSampleTimes(S, 2);

Многоскоростные S-функции и вычисления времени выборки

Для решателей с фиксированным шагом Simulink использует целочисленную арифметику, а не арифметику с плавающей запятой для вычисления совпадений по времени выборки. Следовательно, время задачи кратно целому числу соответствующих периодов времени выборки.

Этот метод вычисления становится важным, если рассмотреть возможность выполнения булевой логики на основе времени задачи в многоскоростных S-функциях. Например, рассмотрим S-функцию, которая имеет два времени выборки. Тот факт, что (ssIsSampleHit (S, idx1) = = true & & ssIsSampleHit (S,idx2) = true, не гарантирует, что ssGetTaskTime (S, idx1) = = ssGetTaskTime (S, idx2).

Синхронизация многоскоростных S-функциональных блоков

Если задачи, выполняющиеся с различными скоростями, должны совместно использовать данные, необходимо убедиться, что данные, созданные одной задачей, являются действительными при доступе другой задачи, выполняемой с другой скоростью. Вы можете использовать ssIsSpecialSampleHit макро в mdlUpdate или mdlOutputs процедура многоскоростной S-функции для обеспечения достоверности совместно используемых данных. Этот макрос возвращает true если попадание в выборку произошло с одной частотой, и попадание в выборку также произошло с другой частотой на том же шаге времени. Таким образом, это позволяет задаче с более высокой скоростью предоставлять данные, необходимые задаче с более низкой скоростью, со скоростью, которую может обеспечить задача с более низкой скоростью. При использовании ssIsSpecialSampleHit , более медленное время выборки должно быть целым числом, кратным более быстрому времени выборки.

Предположим, например, что модель имеет входной порт, работающий с одной скоростью (с индексом времени выборки 0), и выходной порт, работающий с более низкой скоростью (с индексом времени выборки 1). Кроме того, предположим, что порт вывода должен выводить значение, текущее на входе. Следующий пример иллюстрирует использование этого макроса.

if (ssIsSampleHit(S, 0, tid) {
  if (ssIsSpecialSampleHit(S, 0, 1, tid) {
     /* Transfer input to output memory. */
     ...
  }
}

if (ssIsSampleHit(S, 1, tid) {
   /* Emit output. */
   ...
}

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

Обратите внимание, что задачи с более высокой скоростью всегда выполняются перед задачами с более низкой скоростью. Таким образом, задача ввода в предыдущем примере всегда выполняется перед задачей вывода, гарантируя, что действительные данные всегда присутствуют в порту вывода.

Указание образца модели для наследования по времени

Если S-функция C MEX наследует время выборки из блоков, управляющих ею, то S-функция должна указать, могут ли ссылочные модели, содержащие S-функцию, наследовать время выборки из родительской модели. Если вывод S-функции не зависит от наследуемого времени выборки, используйте ssSetModelReferenceSampleTimeInheritanceRule макрос для установки правила наследования времени выборки S-функции в значение USE_DEFAULT_FOR_DISCRETE_INHERITANCE. В противном случае задайте для правила значение DISALLOW_SAMPLE_TIME_INHERITANCE запретить наследование времени выборки для ссылочных моделей, которые включают S-функции, выходы которых зависят от унаследованного времени выборки, и тем самым избежать непреднамеренных ошибок моделирования.

Примечание

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

Если вы не уверены, зависит ли существующий вывод S-функции от наследуемого времени выборки, проверьте, вызывает ли он какой-либо из следующих макросов C:

  • ssGetSampleTime

  • ssGetInputPortSampleTime

  • ssGetOutputPortSampleTime

  • ssGetInputPortOffsetTime

  • ssGetOutputPortOffsetTime

  • ssGetInputPortSampleTimeIndex

  • ssGetOutputPortSampleTimeIndex

или функции TLC:

  • LibBlockSampleTime

  • CompiledModel.SampleTime

  • LibBlockInputSignalSampleTime

  • LibBlockInputSignalOffsetTime

  • LibBlockOutputSignalSampleTime

  • LibBlockOutputSignalOffsetTime

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

Пример правила наследования образца времени

В качестве примера S-функции, которая не позволяет ссылочной модели наследовать свое время выборки, рассмотрим S-функцию, которая имеет следующее mdlOutputs способ:

static void mdlOutputs(SimStruct *S, int_T tid) {
    const real_T *u = (const real_T*) 
    ssGetInputPortSignal(S,0);
    real_T       *y = ssGetOutputPortSignal(S,0);
    y[0] = ssGetSampleTime(S,tid) * u[0];
}

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

ssSetModelReferenceSampleTimeInheritanceRule
(S, DISALLOW_SAMPLE_TIME_INHERITANCE);

См. также

| |

Связанные темы