exponenta event banner

Устаревший код порта

Найти штаты

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

Контрольные признаки неявного продвижения являются инкрементированными переменными, такими как M=M+1 или X=X+0.05. Если в коде много таких конструкций и вы считаете нецелесообразным перекодировать источник, чтобы не «грести вперед», вам может понадобиться попробовать другой подход с помощью решателей с фиксированным шагом.

Если нецелесообразно находить все неявные состояния и отделять вычисления производных для двигателя Simulink ®, можно использовать другой подход, но вы ограничиваетесь использованием решателей с фиксированным шагом. Техника здесь состоит в том, чтобы вызвать код Фортрана из mdlUpdate поэтому код Fortran выполняется только один раз на этапе интеграции основного моделирования. Любые блочные выходы должны кэшироваться в рабочем векторе, чтобы mdlOutputs может вызываться так часто, как это необходимо, и выводить значения из рабочего вектора вместо повторного вызова подпрограммы Фортрана (что приводит к непреднамеренному опережению времени). Посмотрите sfuntmpl_gate_fortran.c для примера, в котором используются векторы DWork. Дополнительные сведения о назначении рабочих векторов типа данных см. в разделе Использование векторов DWork.

Время выборки

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

Сохранить данные

Если планируется использовать несколько копий этой S-функции в одной модели Simulink, необходимо выделить хранилище для каждой копии S-функции в модели. Рекомендуется использовать векторы DWork (см. DWork Vector Basics).

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

Использовать флинты при необходимости

Использовать флинты (с плавающей запятой ints) отслеживать время. Флинты (для IEEE-754 чисел с плавающей запятой) имеют полезное свойство не накапливать ошибку округления при сложении и вычитании флинтов. Использование переменных кремня в DOUBLE PRECISION хранение (с целочисленными значениями) позволяет избежать накопления ошибок округления, которые накапливались бы при объединении чисел с плавающей запятой тысячи раз.

DOUBLE PRECISION F 
      :
      :
F = F + 1.0 
TIME = 0.003 * F

Этот метод позволяет избежать общего сбоя в моделировании.

Рекомендации по работе в режиме реального времени

Поскольку в среде реального времени используется очень мало приложений Fortran, часто встречается код моделирования, несовместимый с средой реального времени. Распространенные сбои включают неограниченные (или большие) итерации и спорадические, но трудоемкие побочные вычисления. Вы должны иметь дело с ними напрямую, если вы планируете работать в реальном времени.

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