使用Modelica的软件在环模式

使用Modelica的软件在环模式,modelica,Modelica,如何使用工厂的Modelica(OpenModelica,jModelica)和控制器的C/C++例程实现控制系统设计的软件在环。你可以建议什么方法? 我认为外部C函数会有所帮助,但它们似乎有一些限制,因此它们应该遵守引用透明性属性,即为相同的输入返回相同的值(不应该有内部状态) 在这种情况下,调用外部C函数的问题不适用。的确,Modelica限制了函数在连续方程中的使用,因此函数必须为相同的参数返回相同的值。在这些情况下,您必须找到一种方法将状态传递到函数中,并让它返回新状态(如果您希望满足此

如何使用工厂的Modelica(OpenModelica,jModelica)和控制器的C/C++例程实现控制系统设计的软件在环。你可以建议什么方法?
我认为外部C函数会有所帮助,但它们似乎有一些限制,因此它们应该遵守引用透明性属性,即为相同的输入返回相同的值(不应该有内部状态)

在这种情况下,调用外部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子句是调度程序的表示,因为它不包含任何状态事件(例如,与齿轮编码器或其他异步中断类似)模拟器可以调度所有这些函数调用,而不必重复它们。

您打算如何为控制器实现调度程序?这是一个按固定时间间隔(例如每16毫秒)调度的控制器,还是一个可由电厂内的状态事件异步调用的控制器?或者,您是否认为控制器是连续运行的(即连续数学模型)。我很确定你想做的事情可以在Modelica中实现。但我需要确切地了解你的想法。谢谢你的回复,迈克尔!是的,我希望我的控制器例程以正常的间隔执行。它的例程应该提供来自modelica的过程变量,它应该输出影响modelica中模型的控制动作(信号)。谢谢Michael的解决方案!我要试试看!Modelica语言规范不保证
when sample()
每次调用函数一次。系统方程的ODE表示可能是这样,但系统方程的DAE表示肯定不能保证。正确的实现将使用Modelica语言规范3.3的cloked/synchronous特性中的示例运算符。