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

Найти состояния

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

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

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

Шаги расчета

Если код Фортрана имеет неявный размер шага в его алгоритме, коэффициентах и т.д., убедитесь, что вы зарегистрировали правильный дискретный шаг расчета в S-функции C 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

Этот метод избегает общего питфолла в симуляциях.

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

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

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