Posted 30 Apr 2020 Hi, I have a problem because a TON Timer instance in an ST program does not start running. Is this a known limitation on FX5U CPU's or ST Language in General ? On the internet are some discussions, and there is a person which says it works for FX CPU's:https://stackoverflow.com/questions/58463316/delay-timer-in-structured-text?noredirect=1&lq=1 But not for me.... And some discussions here in the forum:http://forums.mrplc.com/index.php?/topic/20864-plc-failing/http://forums.mrplc.com/index.php?/topic/37923-calling-a-timer-in-st-code/ The last one is interesting, but it did not helped in this simple case. For clarification, I created a very small program in GX Works3 (v1.057K) The FB instance in Picture 1 works very well if one sets M10 to True. The ST instance in Picture 2 does not start when setting M20 to True. Has anybody a clue? Any help welcome DWIM Share this post Link to post Share on other sites
Posted 30 Apr 2020 don't know about ST on Mitsi but... is it scanned? are you sure that Start is on (inside PoU, not M20)? if not problem is not the timer but type of parameter transfer so what is the type of transfer for parameter "Start"? If "VAR_INPUT" transfer type corresponds to ByVal (which i am pretty sure it does), then it will never change from FALSE to TRUE even if M20 does. changing signals must be transfered ByRef. easy way to test is is to make sure M20 is on when your sub is called. Or just remove timer and activate Hello directly by Start ByRef is usually represented by "VAR_INPUT_OUTPUT" or just "VAR_OUTPUT". Share this post Link to post Share on other sites
Posted 1 May 2020 Hi panic_mode First, I cannot remove the timer. I need one. The sample code is only for testing. I have a a more or less communication code and I do not want to scare everybody with it. I looked into your tips and went ahead and just replaced "Start" input with M20 altogether inside the ST block. Now, M20 is M20 is M20 is M20. Not? At least it lighted up in the code. I then changed the code a bit so i can toggle it during simulation. ==> It had no effect!!! ==> It seems in ST an Timer instances die after the code is finished after a scan. Then I tried to reference a global timer variable, did not helped. The only thing that worked was more or less to copy the line in the docs : My_Timer(M30,INT_TO_TIME(2000),Hello,ElapsedTime); With "My_Timer" is local TON or TON_10 variable, "Hello" is a standard output variable, "ElapsedTime" is a local variable inside the ST Functionblock. Well...that was obvious...... Share this post Link to post Share on other sites
Posted 1 May 2020 " It seems in ST an Timer instances die after the code is finished after a scan. " well, this is true for ALL programs (used language makes no difference). that is how computers work in general. task that need to run continously is placed into a loop. this is what PLC scan really is.... Share this post Link to post Share on other sites
Posted 4 May 2020 Well, you are right, sort of. In a function a variable dies. Yes. I just don't see how a timer can/is garbage collected after a scan. The mechanism is not clear to me in ST. The timer must be re-created. I have to call the whole constructor every time ==> My_Timer(M30,INT_TO_TIME(2000),Hello,ElapsedTime); If it would follow standard behaviour the timer would never fire because it is instanciated every time and start at time zero. It is a local variable, Not? Even more with global variable timers, which does not work too. It is not enough to use My_Timer.IN and My_Timer.Q inside a scan. This is just quirky. Share this post Link to post Share on other sites
Posted 5 May 2020 (edited) I think you are confusing Mitsubishi PLC programming with .Net or Java etc. There are no instances of objects created or destroyed (no reference types so nothing to garbage collect). When you use VAR_INPUT_OUTPUT its not referencing the variable but copying its value, then using it, then copying the result back to the original variable. As other have said the timer needs to be scanned all the time – no different than ladder. It's the same in other PLC's as well. For example below is a timer in Allen Bradley ST. If you commented out (or deleted) the timer on line 2 the timer would stop working. 1. DelayPumpStart.PRE := 5000; 2. TONR(DelayPumpStart); 3. DelayPumpStart.TimerEnable := ValveOpen_Verified_V45LEX; Edited 5 May 2020 by Nightfly Share this post Link to post Share on other sites
Posted 5 May 2020 exactly... this is not OO environment, programing style is procedural and on most systems (not just Mitsubishi) all data resources are already created (and initialized) so you just access them. for example you get fixed number of M devices for certain CPU. and fixed number of D registers.... some of them have special function so you need to check documentation. CPUs with more memory may offer larger blocks of data and possibility to trade size of one data type for another (within limits) or specify areas are backed up (retentive). an smaller CPUs all of this is fixed. Share this post Link to post Share on other sites
Posted 6 May 2020 Looking at your ST code, you never ran the timer. You simply put values at its input and looked at the output. The timer itself is not in your code. It would look something like this: TE_ON(In:=Start, PT:=t#10s) To leave the logic as you have it, simply add the execution of the timer. TE_ON() Then your line looking at the output would work fine. Pretty sure their manuals show this, I haven't done it on Mitsu in a few years, but this is how IEC structured text works. Share this post Link to post Share on other sites