Если используется решатель с переменным шагом, важно, чтобы все непрерывные состояния были идентифицированы в коде и помещены в вектор состояния 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, часто встречается код моделирования, несовместимый с средой реального времени. Распространенные сбои включают неограниченные (или большие) итерации и спорадические, но трудоемкие побочные вычисления. Вы должны иметь дело с ними напрямую, если вы планируете работать в реальном времени.
И наоборот, все еще хорошо проводить итеративные или спорадические вычисления, если сгенерированный код не используется для приложения реального времени.