Если решатель переменного шага используется, очень важно, что все непрерывные состояния идентифицированы в коде и помещены в вектор состояния S-функции C для интегрирования вместо того, чтобы быть интегрированными кодом Фортран. Аналогично, все производные вычисления должны быть сделаны доступными отдельно, чтобы быть названными от mdlDerivatives
метод в S-функции C. Без этих шагов любой код Фортран с непрерывными состояниями не будет совместим с решателями переменного шага, если S-функция будет указана как непрерывный блок с непрерывными состояниями.
Контрольные знаки неявного продвижения являются постепенно увеличенными переменными, такими как M=M+1
или X=X+0.05
. Если код имеет многие из этих построений, и вы решаете, что это невозможно повторно закодировать источник, чтобы не к “храповику передают”, вы можете должны быть попробовать другой подход с помощью решателей фиксированного шага.
Если это невозможно найти все неявные состояния и выделить производные вычисления для Simulink® механизм, другой подход может использоваться, но вы ограничиваетесь использованием решателей фиксированного шага. Метод здесь должен вызвать код Фортран от mdlUpdate
метод так код Фортран только выполняется однажды на главный этап интеграции симуляции. Любой блок выходные параметры должен кэшироваться в векторе работы так, чтобы mdlOutputs
может быть назван как часто по мере необходимости и выводит значения от вектора работы вместо того, чтобы вызвать стандартную программу Фортрана снова (то, чтобы заставлять его непреднамеренно усовершенствовать время). Смотрите sfuntmpl_gate_fortran.c
для примера, который использует векторы DWork. Смотрите, Как Использовать Векторы DWork для получения дополнительной информации о выделении введенных данными векторов работы.
Если код Фортран имеет неявный размер шага в своем алгоритме, коэффициенты, и т.д., гарантируют, что вы указываете соответствующий дискретный шаг расчета в S-функции C mdlInitializeSampleTimes
метод и только изменяет выходные значения блока от mdlUpdate
метод.
Если вы планируете иметь несколько копий этой S-функции, используемой в одной модели Simulink, необходимо выделить устройство хранения данных для каждой копии S-функции в модели. Рекомендуемый подход должен использовать векторы DWork (см. Векторные Основы DWork).
Если вы планируете иметь только одну копию S-функции в модели, векторы DWork все еще обеспечивают большую часть передового метода для того, чтобы хранить данные. Однако другая альтернатива должна выделить блок памяти с помощью malloc
команда и хранилище указатель на ту память в векторе PWork (см. Элементарные Векторы работы). В этом случае необходимо не забыть освобождать память с помощью free
команда в S-функции mdlTerminate
метод.
Используйте кремни (ints
с плавающей точкой) следить за ходом времени. Кремни (для IEEE 754 численные данные с плавающей точкой) имеют полезное свойство не накопления ошибки округления при добавлении и вычитании кремней. Используя переменные кремня в
DOUBLE PRECISION
устройство хранения данных (с целочисленными значениями) избегает накопления ошибки округления, которое накопилось бы, когда числа с плавающей запятой добавляются вместе тысячи времен.
DOUBLE PRECISION F : : F = F + 1.0 TIME = 0.003 * F
Этот метод избегает распространенной ошибки в симуляциях.
Поскольку очень немного приложений Фортрана используются в окружении реального времени, распространено столкнуться с кодом симуляции, который несовместим с окружением реального времени. Общие отказы включают неограниченный (или большой) итерации и спорадические но интенсивные временем вычисления стороны. Необходимо иметь дело с ними непосредственно, если вы ожидаете запускаться в режиме реального времени.
С другой стороны это - все еще совершенно хорошая практика, чтобы иметь итеративные или спорадические вычисления, если сгенерированный код не используется для приложения реального времени.