Help - Search - Members - Calendar
Full Version: Dynamic simulations with Dymola/OpenModelica?
Modelica Forum > Modelica > Modelica
LRRH
Hi all!
I'm new to MODELICA and I'm wondering which way is best to enable my models to react on user input during runtime?
I already took a short look into the OpenModelica runtime environment and implemented some methods to receive simple commands over a socket and set model parameters during runtime. But instead of modifying the runtime environment, maybe it would be better to use external functions in the model itself???

Kind regards,
LRRH
wagner
Hello LRRH,

if you're using Dymola you can use the UserInteraction Library? With this library a user can interact with simulated model during runtime. I'm using it and it's working quite well. You can use buttons, switches, textfields for inputs and lamps, plot etc as outputs. If you have access to Dymola you should give it a try.

For another problem I needed to attach a control algorithm written in C# to the simulation. This time I implemented a socket based communication in C which was included as an external function in one of my models. It's also possible and not to complicated.


Regards,

wagner
jce
Hi wagner,

I'm using Dymola 6.0a. But where can I find the UserInteraction Library? When searching in Google/Modelica Library I only find hints that it is currently under development by Dynasim.

Thanks,
jce

UPDATE: Forget it! I found it in the DYMOLA Library folder... #-) Thanks!
wagner
Hi jce,

you can find the userinteraction library (and other libraries) in the "Modelica\Library\" subfolder of your dymola installation directory. Ther are two versions of the userinteraction library, one for modelica 1.6 the other one for modelica 2.2.

Regards

Florian
jce
Hi Florian,

thanks for the tip. I found it already yesterday and tried some examples. The problem is now that you seem to need the Dymola Realtime-Extension to use it. Otherwise you can't slowdown your simulation as needed! Unfortunately, I don't have it... :-(

Is there another way, without the Realtime Extension?

Best regards,
Jonathan
Pfeifferle
QUOTE(wagner @ Jul 18 2006, 05:23 PM) *

For another problem I needed to attach a control algorithm written in C# to the simulation. This time I implemented a socket based communication in C which was included as an external function in one of my models. It's also possible and not to complicated.
Regards,


Hello wagner!
I'm also interested in dynamic simulations with (Open)Modelica over socket based communication. Is it possible to have a look at your mentioned solution (Just as an example to start with...)?

Regards,
Pfeifferle
wagner
Hello Pfeifferle,

I tried to design a simple example that uses TCP sockets to exchange data between the simulation and external programs. In this example a quite simple manufacturing plant with two conveyors and one workpiece is controlled by an external control algorithm written in C#.

The control application is implemented as a TCP server to which the simulation can connect to during runtime. Once the connection is established the simulation sends information (in this case sensor signals about the position of the workpiece) to the server which calculates new output signals for the actuators in the simulation. The output signals are send back to the simulation via the TCP connection.

While the server is performing the control algorithm the simulation is waiting for the response of the server, which means simulation time is not increasing and there's no need for a realtime option.

A trace of the basic communication act is attached to this post.

The socket communication part for Modelica is written in c and consists of one c-file and its corresponding header file. I made five functions that encapsulate the functionality for different steps in the communication process. The basic:
- If you want to use sockets in c you first have to startup the network library of windows which is done by startUP().
- Before you can interchange data you have to create the TCP socket which is done by createSocket(IPAddress, port) where IPAddress is as string with the destination IP-Address and port is an int eger with the destination port.
- For sending a message (which is a string) you call sendMessage (message).
- For receiving a message (which is a string) you call message=receiveMessage()
- When you are finished with communication you shut down the network library by cleanUP()

In Modelica you have to write wrapper functions to use the c functions. In the attached Modelica model you will find these in the package Socket.Communication. The wrapper functions have the same name like the c functions and have the same parameters.

The Model Socket.Communication.Socket represents the TCP socket which is created in the initial simulation step.

To exchange dynamic messages (messages with varying content) one needs to define additional functions to build the message strings since in Modelica non-constant strings can not be handeled outside functions. These functions are situated in the package Socket.Control. They are not situated in Socket.Communication since they are problem specific to the simulation task.

The Model Socket.Control.ExternalConveyorControl manages the actual communication between the simulation and the external conveyor controller. Since the simulation would slow down extremly if in each simulation step communication over the socket would be performed, a communication act is triggered by a sample instruction inside the Socket.Control.ExternalConveyorControl model.

The TCP serves is written in C#. There are only two classes (Program and ConveyorControl).
The method main in Program is the main entry point. Here a TCP-Server socket is created that waits for incoming connection requests. Once a connection request arrives a new Thread of class ConveyorControl is created which manages the communication and the control task. The control task is described by control which is the entry point of the thread.

I tested the simulation and the external control using Dymola 6.0d with Visual Studio 2005 compiler. To run the external C# program you need the .NET Framework V2.x by Microsoft. Since I'm not using OpenModelica I don't know if it works using OpenModelica. But in principle it should be possible with some minor adjustments. On my PC it was necessary to manually copy the wsock32.lib and msvcrt.lib to the directory of the Modelica model. Of course one also needs the homebrew socket Library (socket.lib and its header file socket.h) attached to this post to use its functionality in the directory as well.

I hope you can get it running.

Regards,

Florian


Click to view attachmentClick to view attachmentClick to view attachmentClick to view attachment[attachmenti
d=23]Click to view attachment
jce
Hi Florian,

thx for sharing your ideas. However, it seems the attached Modelica file you are mentioning got messed up by the forum software and is missing. Could you please post it again?

Best regards,
Jonathan
wagner
Hello Jonathan,

I fixed the broken link to Socket.mo.

Regards

Florian
Jawhar
QUOTE(wagner @ Nov 13 2006, 09:04 AM) *

Hello Jonathan,

I fixed the broken link to Socket.mo.

Regards

Florian


Hello wagner,

Very good example to understand the TCP communication using sockets.

I have a simple question: is it possible to send values and no strings using TCP socket from Dymola to external programs? receiveMessage and senMessage use only messages which are strings. is it possible to send values, integers or reals for example?

I think that we can use the function string() as you made.. more explication about the function string()?
Best regards,

Jawhar
wagner
Hello Jawhar,

you can send anything you like in a tcp message. The tcp protocol does not give any restrictions on the content transmitted. In my opinion, the easiest way to transfer data is sending text messages. This has two major advantages:

1. The content of the messages is human readable.
2. One doesn't need to define an encoding.

If you just want to send a single value use my sendMessage function and use as message content the value transformed to a string using the string()-function of Modelica. string(Real value), string(Boolean value) and string (Integer value) simply give back the value as a text variable.

Attached to this post you'll find a sample package which provides an example experiment with a plant to be controlled. A controller is not implmented but the control value is to be calculated in an external program that is connected via the TCP-socket. There are 2 new functions which are dedicated to send and receive single values. Just take a look at it. Additionally you'll find the C# source of a simple PI-Controller that is able to control the plant.

To run the example you need the .lib, .c and .h files of my post above. I've tested the code using Dymola 6.0d wit Visual Studio 2005 compiler. If you have problems running the example just ask me again.

Regards

Florian
Jawhar
Hi Florian,

I have parsed your code and it seems working, but when i have tested there are not exchange of data between the c# program and the modelica model. the values of Etat1.x and Etat2.z does'nt change and stay equal to 0.

I am using Microsoft Visual C# .NET 2003 version 7.1 and Dymola version 6.0d. I have run the c# program at first because we create the tcp server at first and after i run the dymola program.. but no exchange of data..

Thank you for sharing your ideas.

Best regards,

Jawhar
wagner
Hello Jawhar,

if you have a firewall running (probably the windows firewall on windows xp), did you enable reception and transmission of packages on the right port (12345)?

regards

Florian
wagner
Hello Jawhar,

another question: How long time did you simulate? The first communication takes place after 1 s simulation time. If not done already, try to simulate more than a few seconds.

Regards

Florian
Jawhar
I think that i had to use the Visual Studio 2005 compiler because i had used the 2003 compiler. So, i have installed the visual studio 2005 with Framework version 2.x. When i compile the Program.cs i obtain this code warning :

QUOTE

Microsoft ® Visual C# 2005 Compiler version 8.00.50727.42
pour Microsoft ® Windows ® 2005 Framework version 2.0.50727
Copyright © Microsoft Corporation 2001-2005. Tous droits réservés.

Program.cs(13,36): warning CS0618:
'System.Net.Sockets.TcpListener.TcpListener(int)' est obsolète : 'This
method has been deprecated. Please use TcpListener(IPAddress localaddr,
int port) instead. http://go.microsoft.com/fwlink/?linkid=14202'
Program.cs(50,17): warning CS0168: La variable 'ex' est déclarée, mais jamais
utilisée


Probably there is a problem with the function TcpListener.. I haven't a good knowledge in C# language. My idea is to use a c++ external program.

Any suggestion ? Thank you very much.

Ps: I have disabled the windows firewall..

Best regards,
Jawhar
wagner
Hello Jawhar,

attached to this post you'll find a new version of the program.cs file. Now I use a non deprecated version of the TcpListener, but I don't think that this is the problem.

I included some debug messages which are written to the text-screen. The program should start with "Waiting for client" and when you start the simulation you should see "Client accepted". Otherwise the TCP connection is not established. When the simulation finishes you get an exception message, but this is normal since the tcp socket is closed by the simulation.


Regards

Florian

Click to view attachment
Click to view attachment
Jawhar

Thank you florian.

I have a problem.. probably of installation of visual studio 2005.

When i simulate the modelica model, i see this message error:

QUOTE
Compiling and linking the model (Visual C++).

May 16, 2007 15:02:00

Environment variable MSVCDir does not point to the VC++ installation directory.
MSVCDir is C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7.


Error generating Dymosim.


I haven't an environment variable MSVCDir.
I created it and i put the path to Visual studio 2005. As you see this variable pointed to a path that doesn't exist..because i have uninstalled MV studio 2003.
When i make a command in the prompt command:
echo %MSVCDir%

I obtain this result: D:\Visual studio\VC

But when i simulate with dymola, the error message is the same "Environment variable MSVCDir does not point to the VC++ installation directory.
MSVCDir is C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7. "

Any idea?

Thank you.

Best regards,

Jawhar
wagner
Hello Jawhar,

did you try to use the custom option in the compiler dialog of dymola?

On my computer it looks like this in Dymola 6.1

Click to view attachment

I think you also need to install the Platform Devlopment Kit for Visual Studio 2005 to be able to compile C code for Windows. Did you do this?

Regards

Florian

Jawhar
QUOTE(wagner @ May 16 2007, 01:55 PM) *

Hello Jawhar,

did you try to use the custom option in the compiler dialog of dymola?

On my computer it looks like this in Dymola 6.1

Click to view attachment

I think you also need to install the Platform Devlopment Kit for Visual Studio 2005 to be able to compile C code for Windows. Did you do this?

Regards

Florian


Thank you very much Florian. You are very kind. I have changed the compiler in the experimentation setup.
Now it's working.. and i will test your last program. It's very interesting what you do.

Best regards,

Jawhar.
wagner
Hello Jonathan,

do you still want to use the UserInteraction library without Dymola real time option? Today I published an open source real time option for Dymola. You can find some details in this post. Maybe it is usefull for you.

Regards

Florian


QUOTE(jce @ Jul 27 2006, 09:30 AM) *

Hi Florian,

thanks for the tip. I found it already yesterday and tried some examples. The problem is now that you seem to need the Dymola Realtime-Extension to use it. Otherwise you can't slowdown your simulation as needed! Unfortunately, I don't have it... :-(

Is there another way, without the Realtime Extension?

Best regards,
Jonathan

jce
Hi Florian,

thanks for the tip. I'm going to have a look at it, but first, I need a working Dymola license again... sad.gif

My diploma thesis is finished and my trial license is now expired, let's see...

Best regards,
Jonathan
Jawhar
QUOTE(wagner @ Nov 10 2006, 05:17 PM) *

Hello Pfeifferle,

I tried to design a simple example that uses TCP sockets to exchange data between the simulation and external programs. In this example a quite simple manufacturing plant with two conveyors and one workpiece is controlled by an external control algorithm written in C#.

The control application is implemented as a TCP server to which the simulation can connect to during runtime. Once the connection is established the simulation sends information (in this case sensor signals about the position of the workpiece) to the server which calculates new output signals for the actuators in the simulation. The output signals are send back to the simulation via the TCP connection.

While the server is performing the control algorithm the simulation is waiting for the response of the server, which means simulation time is not increasing and there's no need for a realtime option.

A trace of the basic communication act is attached to this post.

The socket communication part for Modelica is written in c and consists of one c-file and its corresponding header file. I made five functions that encapsulate the functionality for different steps in the communication process. The basic:
- If you want to use sockets in c you first have to startup the network library of windows which is done by startUP().
- Before you can interchange data you have to create the TCP socket which is done by createSocket(IPAddress, port) where IPAddress is as string with the destination IP-Address and port is an int eger with the destination port.
- For sending a message (which is a string) you call sendMessage (message).
- For receiving a message (which is a string) you call message=receiveMessage()
- When you are finished with communication you shut down the network library by cleanUP()

In Modelica you have to write wrapper functions to use the c functions. In the attached Modelica model you will find these in the package Socket.Communication. The wrapper functions have the same name like the c functions and have the same parameters.

The Model Socket.Communication.Socket represents the TCP socket which is created in the initial simulation step.

To exchange dynamic messages (messages with varying content) one needs to define additional functions to build the message strings since in Modelica non-constant strings can not be handeled outside functions. These functions are situated in the package Socket.Control. They are not situated in Socket.Communication since they are problem specific to the simulation task.

The Model Socket.Control.ExternalConveyorControl manages the actual communication between the simulation and the external conveyor controller. Since the simulation would slow down extremly if in each simulation step communication over the socket would be performed, a communication act is triggered by a sample instruction inside the Socket.Control.ExternalConveyorControl model.

The TCP serves is written in C#. There are only two classes (Program and ConveyorControl).
The method main in Program is the main entry point. Here a TCP-Server socket is created that waits for incoming connection requests. Once a connection request arrives a new Thread of class ConveyorControl is created which manages the communication and the control task. The control task is described by control which is the entry point of the thread.

I tested the simulation and the external control using Dymola 6.0d with Visual Studio 2005 compiler. To run the external C# program you need the .NET Framework V2.x by Microsoft. Since I'm not using OpenModelica I don't know if it works using OpenModelica. But in principle it should be possible with some minor adjustments. On my PC it was necessary to manually copy the wsock32.lib and msvcrt.lib to the directory of the Modelica model. Of course one also needs the homebrew socket Library (socket.lib and its header file socket.h) attached to this post to use its functionality in the directory as well.

I hope you can get it running.

Regards,

Florian
Click to view attachmentClick to view attachmentClick to view attachmentClick to view attachment[attachmenti
d=23]Click to view attachment


I tested your application and it worked fine. I tried to use socket under OpenModelica, i done many changes and it worked fine.

when you say, simulation time is not increasing, i am not ok! I think that the simulation time increase, but you send data to the server only after 0.1s and you receive data from the server only after 0.1s.. so the simulation time is increasing but we choose to send and receive data at stepped timed events. i think that we can't say that the simulation is waiting for response from server..

What you mean by realtime option? if you use realtime option you will not use stepped timed event to send and receive data? Can you give more explanation?

Best regards,

Jawhar
wagner
Hello Jawhar,

when yu take a look at the Modelica code in the Model ExternalConveyorControl you'll see this when clause:

CODE

sampled:=sample(0, samplingRate);

when (sampled and time >0) then
    sendInputSignalVector(digitalInputs);
    digitalOutputs:=receiveOutputSignalVector();
end when;


Each time the sampled-event is being generated a vector with the input signals is sent via TCP to the external controller (sendInputSignalVector(digitalInputs)). Afterwards the simulation is waiting for the respone TCP packet to get the output signal settings (receiveOutputSignalVector()).

The receiveOutputSignalVector-function is not returning until a TCP packet has been received, i.e. the simulation time is not increasing. This is a matter of my implementation of the receiveMessage-function in the package Socket.Communication.

Regarding real time
The topic originally was about reacting on user inputs without having the real time option of Dymola. In my post I just wanted to say, that since the simulation does not progress when waiting for the TCP packet there's no need for additional synchronization between simulation and controller.

Regards

Florian
Jawhar
QUOTE(wagner @ Dec 10 2007, 09:05 AM) *

Hello Jawhar,

when yu take a look at the Modelica code in the Model ExternalConveyorControl you'll see this when clause:

CODE

sampled:=sample(0, samplingRate);

when (sampled and time >0) then
    sendInputSignalVector(digitalInputs);
    digitalOutputs:=receiveOutputSignalVector();
end when;


Each time the sampled-event is being generated a vector with the input signals is sent via TCP to the external controller (sendInputSignalVector(digitalInputs)). Afterwards the simulation is waiting for the respone TCP packet to get the output signal settings (receiveOutputSignalVector()).


The receiveOutputSignalVector-function is not returning until a TCP packet has been received, i.e. the simulation time is not increasing. This is a matter of my implementation of the receiveMessage-function in the package Socket.Communication.

Regarding real time
The topic originally was about reacting on user inputs without having the real time option of Dymola. In my post I just wanted to say, that since the simulation does not progress when waiting for the TCP packet there's no need for additional synchronization between simulation and controller.

Regards

Florian


Hello Florian,

I think that the simulation is waiting for the TCP packet because you use a blocking socket. When we use a blocking socket, the simulation is waiting for the respone TCP packet to get the output signal.

We can use non blocking sockets, if the simulation didn't receive a response from sockets, it didn't remain blocked and waiting for a response..

in C++ under linux we can use this code:

CODE
int Sock_SetBlockMode (int socket, bool blocking)
{
   int flags;
   int r;
    
   flags = fcntl (sock, F_GETFL);
    
   if (blocking == true)
      r = fcntl (sock, F_SETFL, flags & ~O_NONBLOCK);    
   else
      r = fcntl (sock, F_SETFL, flags | O_NONBLOCK);    
    
   return r;
}


i will test this after Christmas holiday..

Correct me if i'm wrong.

Best regards,

Jawhar
wagner
Hello Jawhar,

you are right. If you're using non blocking sockets the simulation time is increasing.

Happy xmas

Florian
dragos
Hello all,

I've tried the socket communication and the realtime module and all worked fine. A good job Florian.

I would like to know if any of you have tried to make the modelica simulation the TCP server and to have clients that connects to it (for example to control differents components from differents clients). What could be the problems of this method?

Best regards,
Dragos
dragos
Second question:

I'm using also Dymola and I have modified the client, so I have several clients (one per component I want to control). In your example, you close the connected client when another client comes (the thread). Or I can see that even that I received 3 connections from 3 clients, only one works. Like the other 2 clients are using the same connection like the first. Is there a problem of connections? Or the modelica doesn't make different TCP clients.

Dragos

wagner
Hello Dragos,

that I close the suspend the client handler thread in my Server-Application is just for ease of use in the example. You can restart the simulation as often as you like without restarting the server. Of course you could easily modify this behaviour by removing the following lines from the Program.cs code:

CODE

if (controlThread!=null)
    if (controlThread.IsAlive)
        controlThread.Suspend();


For your application I would suggest to keep the simulation as the client and to implement a new server application which works as simulation proxy. A first TCP connection is used to transfer sensor and actuator signals between simulation and proxy. The server then stores an image of the process (image of sensor and image of actuator signals). Your controllers can access the simulation proxy server via a second TCP connection and request the current process image of sensor signals and modify the process image of actuator signals.

Click to view attachment

Regards

Florian
dragos
Thaks Florian for the reply.

I created a new server application where I have all controls for my simulation. My simulation is using Modelica Fluid library and what I want to do is to control the valves from an external application. I already done it by using DDE. What I would like now is to transfer all using sockets. So, each valve has source a tcp client that will connect to a server (the server is not important where it is) and will take the state from it. Now, I have only one server with all valves and I want to connect several clients from modelica to server.

The problem until now is that I don't receive as many clients as I have. Is like modelica is using only one variable for the sockets. So I thought to modify your C functions and to add an array of SOCKET. Could you tell me how could I recompile the socket.c to create the lib? I'm using also Visual Studio 2005.

Regards,
Dragos
wagner
Hi Dragos,

sorry for the late answer, but I didn't see your reply till now. Did you manage to recompile the socket.c? If you have problems, you should try to directly include the c-file in the modelica functions instead of linking to a library.

The library I attached to this topic was created using Visual C++ 6.0. If you also have this compiler I can send you the project file.

Regards

Florian
dragos
Hello Florian,

I succeded to recompile socket.c with visual studio 2008 and create the library. Now it does what I need. For who is interested in the use of multiple clients I attached the files to be used. In Communication.mo you can find the modelica functions to call.

Socket.pos retains the position in the socket array. So, an example to call in your program : Communication.sendMessage(socket.pos, message);

Dragos
Jawhar
Hi wagner,

I need your help wacko.gif

I have 2 programs: a modelica simulation and an external program in C++. I use TCP sockets to communicate between the 2 programs.

During the simulation, the C++ program sends a request to modelica simulation to freeze. I send a tcp request with the word "sleep" and duration to sleep. The modelica simulation sleeps. When i send another request to activate the modelica simulation it failed and it's logic because sleep function is a blocking function.

The idea is to freeze and activate the modelica simulation when i want. So here i have 2 problems:

- First problem: sleep function is blocking and i can't stop its execution.

-Second problem: In Modelica simulation i use time steps to send and receive data (like you do exactly). the problem is that between two steps my external program can send a tcp request to the simulation sad.gif is there any idea to receive external tcp request instantly.

I have two ideas but i'am unsure unsure.gif Solution for the first problem will be a non blocking sleep (i don't know if this exists). Solution for the second problem may be implementing the TCP server under Modelica and implementing the client in the external C++ program (reverse).

Any idea or suggestion will be welcome.

Best regards,
Jawhar
Roland
Hello Jawhar,

the idea with the non blocking sleep should work. I must admit that I didn't take the time to look at your code, but what you could do in general is to not sleep the whole time at once but many times for a very short time.

CODE
int startTime = <get current time>
while (true) {
    if (<get current time> >= startTime + sleepTime)
        break;
    <receive new messages, ...>
    if (wake)
        break;
    sleep(1);
}


The sleep(1) only causes the program to not use 100% of the CPU.

Maybe this helps.
Roland
wagner
Hello Jawhar, hello Roland,

I agree with the idea of Roland. To get a better real time behaviour I would propose to use a shared memory concept instead of TCP communication, as the overhead is much less. Take a look a the following image:

Click to view attachment

I already developed a shared memory DLL that I successfuly used in Modelica before, but yesterday I didn't get it running anymore. I will try to figure out the problem and will post a solution later.

Regards

Florian
Jawhar
Hello wagner and Roland,

Thanks for answering.

I agree with the two ideas. The function sleep(1) uses a lot of CPU.. i haven't test it yet but it seems a solution for my problem.

Otherwise, i am trying to use blocking and non blocking socket.. while a recv is used with a blocking socket the simulation is freezed. when the recv is used within a non blocking socket, the simulation still runs.

I would to create an external function which changes the mode of socket from non blocking to blocking and from blocking to non blocking.

More information about the shared memory, it seems very interesting. (possible problem of writing and reading in same time unsure.gif )..

Any suggestion or idea is welcome..

Regards,
Jawhar
Jawhar
I founded a solution biggrin.gif

I used a socket and i change its flag from blocking to non blocking and in the other side.. It works fine. I stopped my simulation without using sleep function. i controlled also the simulation from an external program.. i freezed it and i run it at any moment. I can't put all the code.. but the idea is to do this:

CODE

Real value;
Real blockactiv(start=0);



equation

SampleEvent = sample(0,0.1);

when SampleEvent then
a= sendMessage(String(din));
end when;

value = receiveMessage(); //non blocking socket receives data instantly (real-time for IHM).. (no sampling)

algorithm

when value >=1 then

blockactiv:= recMsgBlock(); // freeze the simulation when receive a message from the external program

end when;


so in the socket.c i have this:

CODE

//receive a string through non blocking socket instantly
double receiveMessage()
{
    
        x=0;
        fcntl(sockfd, F_SETFL, O_NONBLOCK);
        
     if (recv(sockfd,receiveBuffer,100,0)>0 && receiveBuffer == "stop")//freeze the simulation
            {    
            x= x+1;
            }
     return x;
}

//receive a string through blocking socket (freeze the simulation)
double recMsgBlock()
{    
        x=0;
        int flags;
  
    
        flags = fcntl (sockfd, F_GETFL);
        fcntl (sockfd, F_SETFL, flags & ~O_NONBLOCK); //set to block socket
     if (recv(sockfd,receiveBuffer,100,0)>0 && receiveBuffer == "wakeup")// run again the simulation
            {    
            x= x+1;
            }
     return x;
}


I tested this in OpenModelica under linux. It works fine correctly..

Regards,
Jawhar
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2012 Invision Power Services, Inc.