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