Унаследованный код порта

Найдите Штаты

Если решатель переменного шага используется, очень важно, что все непрерывные состояния идентифицированы в коде и помещены в вектор состояния 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

Этот метод избегает распространенной ошибки в моделированиях.

Факторы в течение реального времени

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

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

Была ли эта тема полезной?