В этом случае проблема с вызовом внешних функций C не применяется. Это правда, что Modelica ограничивает использование функций в непрерывных уравнениях , так что функция должна возвращать одно и то же значение для тех же аргументов. В этих случаях вы должны найти способ передать состояние в функцию и вернуть ей новое состояние (если вы хотите удовлетворить это требование «чистоты»). Очевидно, что это довольно утомительно делать с кодом C (вам нужно будет передать состояние, назначить все переменные состояния (возможно, глобальные), запустить ваш код, затем извлечь значения всех переменных состояния и вернуть их).
К счастью для вас, вам не нужно беспокоиться об этом. Причина в том, что ваша функция должна вызываться только из предложения when. Если вы запускаете предложение when на основе времени (например, с помощью функции sample (...)), я уверен, что вам гарантировано, что функция будет вызываться только один раз в каждый момент времени.
По сути, ваша установка будет выглядеть примерно так:
algorithm
when sample(0, sample_rate) then
u := controllerEvaluation(x, y, t);
end when;
Таким образом, вы можете передавать время, необходимые состояния, x и входы y (или u, в зависимости от вашей перспективы) в контроллер, и вы возвращаете команду контроллера на завод, u.
В этом контексте предложение when является представлением вашего планировщика и, поскольку оно не включает в себя какие-либо события состояния (как вы, например, сделали бы с помощью датчика зубчатого колеса или другого асинхронного прерывания), симулятор может планировать все эти вызовы функций без риска повторения.