What I want to do in the code?
I want to create a function block that is made up out of 4 methods: start
, stop
, run
, calculate
. Start
method will call a run
method that has an while
loop that periodically calls calculate
method. The while loop inside the run
method will end only if the stop
method is called.
What I have tried already:
- When I call the
object.start()
I want it to start a cycle that will go as long as I don't call thestop
method.
timer(IN := triggerTimer, PT := T#0.1S);
trigger(CLK := timer.Q);
workingFlag := TRUE;
run();
- The cycle will be in the
run
method. Cycle will consist of a while loop conditioned viaworkingFlag
variable. WhenworkingFlag
isTrue
the the while loop will constantly trigger a timer structure which will every 0.1S call thecalculate
method.
WHILE workingFlag = TRUE DO
triggerTimer := TRUE; //Start timer
IF trigger.Q THEN //If timer expired execute code below ...
calculate();
triggerTimer := FALSE; //Reset the timer
END_IF;
END_WHILE
- Finally the
stop
method will just set theworkingFlag
toFalse
and theoretically it would end the cycle inrun
method.
workingFlag := FALSE;
What is the problem?
- After I call the
object.start()
my whole PC crashes. Therefor ... I think something is horribly wrong with my code (:
What I want to achieve with this?
- The object will be a PID controller. And I want in the main
program
just call thestart
method when I want it to regulate andstop
when I need it to shut down. - To this day I was calling manually the
calculate
method inside my main program with thetimer
that you can find in therun
method above. - My problem with this approach was that when I had more PID's (or another functions I needed to call periodically) the code got messy really quick.
- Therefor I wanted to create a function block that would have local
timers
and would be managing the periodical calling by itself.
So please any suggestions how to approach this problem?