Problem with scripting discrete estimator

Greeting to all Plecs users,

I’m an electrical engineering student and I’m new to PLECS simulations.

I have some trouble with implementing some discrete equations in a C-script. I have a set of continuous equations:

and instead of modeling them with existing block (transfer functions, gains, summation points etc.) I would like to implement them into a C-script as a set of discrete equations with a non fixed sampling time (I would use the non fixed step from PLECS simulation):

Unfortunaly, when starting the simulation I always get an error that says a derivative is infinite or NaN and is pointing to the C-script in PLECS’ model of a synchronous machine that I’m using.

Could someone of You guys be so kind and check my C-script which is attached and see where is the problem, I suppose I wrote something wrong in C or defined some DiscState variables wrong.

Thank You very much for Your answers and precious time,

Nardi

C-script estimator.plecs (6.44 KB)

If you connect your C-Script with a Display block, you will find that the second output is indeed NaN. NaN and Inf values typically arise due to divisions by 0: 0/0 yields NaN, any non-zero number divided by 0 yields +/-Inf.

The culprit in your C code is this line:

current_value_delta = atan(current_value_psi_mq/current_value_psi_md);

You need to check whether “current_value_psi_md” is zero and in this case calculate “current_value_delta” in a different way.

Dear Wolfgang,

Thank You very much for Your answer.

I’m not really sure if division by zero is the problem here. I tested the discrete esimator (in this C-script) outside my original control structure. In fact, I used my continuos estimator in the control structure and I just took the signals to the discrete estimator and looked a his outputs with displays. I didn’t give me any error, and I got the same values as I would get with the continuos estimator.

But when I delete the continuos one, a implement the discrete one in my control structure it gives me an error. :confused:

Now I did all these calculations in major steps by adding if (IsMajorStep) before these calulations, and it work everything without an error but the signals are not very precise. :confused: