TIA S7-1200 Amperestunden Zähler

Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
#statIn := #statIn / 2.0;             //ab hier enthält statIn die mittlere Höhe des Trapez
Nein! Auch das ist schon WunschDenken. Nicht einmal das passt, weil bereits der vergurkte Wert in #statLastIn draufaddiert wurde anstelle des vorherigen Wertes der normierten/skalierten ProzessVariablen.
 
Ein Teufelskreis ;)
Selbst im allerersten Durchlauf mit aktivem #enable (wenn in #statLastIn noch nicht der vergurkte Wert drin steht) enthält #statIn da NICHT die mittlere Höhe des Trapez, sondern nur die halbe rechte Höhe (wegen dem anderen Fehler mit der Zweisung von 0.0 an #statLastIn bei #enable = false).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir haben 2004 von einer Fachfirma eine Anlage gekauft, welche das, was ich nun bauen möchte, bereits realisiert. Mit einer Siemens C7 (dürfte auf S-300 basieren?). Da habe ich mir eben mal das Programm angesehen und welch Überraschung, auch hier existiert schon diese falsche numerische Integration. Jetzt erklärt sich auch das abnormale Betriebsverhalten, vorallem die Störung im Schichtaufbau. Da je nach anliegendem Strom der Fehler wie in Haralds Simulation mehr oder weniger dominant wird. Auch beim Soll- und Ist-Wert Vergleich wurde gepfuscht. Der Ist-Wert wird nach Normierung und Skalierung in INT umgewandelt und dann mit dem INT Wert verglichen. Entsprechend dem Rundungsfehler komtm es dann zu Sprüngen in der Parametrierung des Ausgangs.

Aktuell fehlt noch der Messumformer, den Rest der Testanlage ist bereits zusammengebaut, dann kann die Programmierung los gehen.
 
In des OSCAT LIB gibt es auch einen Integrator:

https://github.com/simsum/oscat/blob/master/INTEGRATE.EXP

Code:

Code:
FUNCTION_BLOCK INTEGRATE
VAR_INPUT
    E : BOOL := TRUE;
    X : REAL;
    K : REAL := 1.0;
END_VAR
VAR_IN_OUT
    Y : REAL;
END_VAR
VAR
    X_last : REAL;
    init: BOOL;
    last: DWORD;
    tx: DWORD;
END_VAR

(*read system time *)
tx := T_PLC_MS();

IF NOT init THEN
    init := TRUE;
    X_last := X;
ELSIF E THEN
    Y := (X + X_LAST) * 0.5E-3 * DWORD_TO_REAL(tx-last) * K + Y;
    X_last := X;
END_IF;
last := tx;

END_FUNCTION_BLOCK

Die Systemzeit "tx" wird wie folgt wermittelt:

Code:
FUNCTION T_PLC_MS : DWORD
VAR CONSTANT
    debug : BOOL := 0;
    N : INT := 0;
    offset : DWORD := 0;
END_VAR
VAR
    tx : TIME;
END_VAR

(*
version 1.2    16. nov 2008
programmer     hugo
tested by    oscat

T_PLC_MS reads the internal PLC timer and return the time, it has the advantage to be able to set a debug mode 
and speed up the counter to test the plc timer overrun which occurs every 50 days respectively 25 days at siemens S7
this routine also allows to correct the behavior of s7 where the internal plc counter will not count all 32 bits.

*)
(* @END_DECLARATION := '0' *)
tx := TIME();
T_PLC_MS := TIME_TO_DWORD(Tx);
(* hier muss die korrektur für step7 stattfinden
plctime muss den vollen wertebereich von time ausnutzen:
wenn bei step7 time -24tage bis plus 24 tage ist dann muss der timer auch beim Überlauf auf -24tage springen 
und auf keinen fall auf 0 !!!!
für siemens muss ein weiterer fb im main eingebunden werden der sicherstellt das alle 32 bits durchgezählt werden.
es kann nur ein fb sein den er muss sich das oberste (32te) bit merken.
oder etwa spring s7 bei Überlauf auf -24 tage????? dann wäre keine korrektur nötig.
*)
IF debug THEN
    T_PLC_MS := (SHL(T_PLC_MS,N) OR SHL(DWORD#1,N)-1) + OFFSET;
END_IF;

(* revision history
hm    14.9.2007    rev 1.0
    original version

hm    12. nov 2007    rev 1.1
    added temporaray variable tx because some compilers could not handle time() as an argument

hm    16. nov. 2008    rev 1.2
    initialized constants with 0 for compatibility reasons
*)
END_FUNCTION

Erklärung aus dem Manual:

Im Normalbetrieb liest der Baustein mit der Funktion TIME() den internen
Timer der SPS aus und liefert diesen zurück. Der Interne Timer der SPS
nach IEC Norm hat 1 Millisekunde Aufösung.
Eine weitere Eigenschaft von T_PLC_MS ist ein Debug-Modus, der es er-
laubt den Überlauf des SPS internen Timers zu testen und die erstellte
Software entsprechend sicher zu verifzieren. Der interne Timer jeder SPS
hat unabhängig von Hersteller und Art der Implementierung nach einer
festen Zeit einen Überlauf. Das heißt, er läuft gegen FF..FFFF (höchster
Wert der im entsprechenden Typ gespeichert werden kann) und beginnt
dann wieder bei 000..0000. bei Standard SPS Timern beträgt diese Über-
laufzeit 2^32 -1 Millisekunden, was in etwa 49,71 Tagen entspricht. Da es
sich bei diesem Timer um einen in Hardware implementierten Timer han-
delt kann auch sein Anfangswert nicht gesetzt werden, sodass er nach
dem Einschalten der SPS immer bei 0 anfängt und bis zum Maximalwert
hoch läuft. Nach erreichen des Maximalwertes entsteht dann der berüch-
tigte Timer-Überlauf, der fatale Auswirkungen in der Anwendungssoftware
hervor ruft, aber nur extrem schwer getestet werden kann.
T_PLC_MS bietet mehrere Möglichkeiten zum Testen des Überlaufs und
zeitabhängiger Software. Mit der Konstante DEBUG kann der Test-Modus
eingeschaltet werden und dann mittels der Konstanten N und Ofset der
Timer ab einem bestimmten Wert beginnen, damit gezielt der Überlauf ge-
testet werden kann ohne die 49 Tage abzuwarten. Ofset legt hierbei den
Wert fest, der zum internen Timer addiert wird. Mit der Konstanten N wird
festgelegt, um wie viele Bits der interne Timer Wert nach links verschoben
wird und dabei die unteren N Bits mit 1 gefüllt werden. Mit N kann dadurch
die Geschwindigkeit des internen Timers um die Faktoren 2,4,8,16 usw. er-
höht werden.
T_PLC_US bietet also alle Möglichkeiten zum Test zeitabhängiger Software,
sowohl für die Problematik des Überlaufs, als auch für sehr langsame zeit-
abhängige Funktionen.

Die Konstanten DEBUG, N und OFFSET wurden absichtlich nicht als Eingän-
ge der Funktion implementiert um eine versehentliche Fehlbedienung zu
vermeiden.
 
Zuletzt bearbeitet:
Das ist die Codesys-Version der Bausteine, die funktionieren so nicht richtig in S7-CPU.
- die erste Integralfläche ab enable (E) wird nicht korrekt berechnet
- es wird nicht beachtet, daß System Time lesen in S7-CPU nur 0 .. 2.147.483.647 ms liefert

Hier ein Integrator für S7-300/400/1500-CPU
(S7-1200/1500 können auch LREAL verwenden, S7-1200 hat allerdings kein TIME_TCK() und müsste RUNTIME() verwenden):
Code:
FUNCTION_BLOCK INTEGRATE
TITLE = 'INTEGRATE'
//Das Integral vom Eingangswert X ermitteln mit Trapezregel.
VERSION : '1.0'
AUTHOR  : PN_DP

VAR_INPUT
    enable : BOOL := FALSE;
    cycle1 : BOOL := TRUE;  //TRUE im 1.Zyklus CPU STOP/RUN
    reset  : BOOL := FALSE; //Reset Y:=0.0
    X : REAL; //Eingangswert
END_VAR
VAR_IN_OUT
    Y : REAL; //Integral
END_VAR
VAR
    X_last : REAL;
    t_last: TIME;
    init_done : BOOL := FALSE; //möglichst nicht remanent, oder im 1.Zyklus CPU STOP/RUN auf 0, oder cycle1 benutzen
END_VAR
VAR_TEMP
    t_x : TIME;     //System Time jetzt
    dt_ms_r : REAL; //Delta t (ms) zu letztem Durchlauf
END_VAR

BEGIN

(* read system time (ms) *)
t_x := TIME_TCK(); //S7-CPU: 0 .. 2.147.483.647 ms mit Überlauf zu 0 (bei RUN/STOP und nach ca. 25 Tagen)

IF reset THEN //Nullen des Integrals
    Y := 0.0;
END_IF;

(* im 1. Zyklus CPU STOP/RUN oder neu laden des IDB: nur t_last und X_last merken *)
IF NOT(init_done) OR cycle1 OR reset THEN
    init_done := TRUE;
//    Y := 0.0;    //bei Laden des IDB lieber kein Reset
//    X_last := X; //wird sowieso immer gemacht; t_last ebenso
ELSIF enable THEN
    (* Delta t (ms, REAL) zu letztem Durchlauf, mit Korrektur bei Überlauf system time *)
    dt_ms_r := DINT_TO_REAL(DWORD_TO_DINT( DINT_TO_DWORD(TIME_TO_DINT(t_x - t_last)) AND 16#7FFF_FFFF ));
    (* Integrieren mit Trapezregel *)
    Y := (X + X_last) * 0.5 * 0.001 * dt_ms_r + Y; //0.001: ms-->s
END_IF;
X_last := X;
t_last := t_x;

END_FUNCTION_BLOCK

(*
// cycle1 im 1. OB1-Zyklus z.B. so (AWL):
      L     #OB1_SCAN_1
      L     3
      <>I
      =     "IDB_INTEGRATE".cycle1
*)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und hier der selbe Integrator für S7-1200

Für die Zeitmessung wird die Anweisung RUNTIME verwendet. Leider dokumentiert Siemens anscheinend nirgendwo, wann genau der für RUNTIME verwendete Systemtimer überläuft und wie man die dann gelieferte negative Zeitdifferenz korrigiert. Die TIA Hilfe schreibt: "Diese (negativen) Runtimewerte sind zu ignorieren." (!) :ROFLMAO: Wie stellt sich Siemens das vor? :roll:

Ich habe mit PLCSIM V13 SP1 festgestellt, daß da der Überlauf alle ca. 1696,725 Sekunden (ca. 28 Minuten) kommt und daß mit diesem Korrekturwert beim Überlauf sehr plausible Werte rauskommen. Vielleicht kann mal jemand an einer echten S7-1200 (und S7-1500?) überprüfen, ob der Überlauf da zur selben Zeit kommt. Weiß/ahnt jemand wo diese Magic Number ca. 1696,725 Sekunden herkommt, und vielleicht welcher Wert der exakte Korrekturwert ist?

(die 4 braunen Zeilen werden vom Integrator nicht benötigt, die sind nur für die Erforschung des Überlauf-Korrekturwertes)
Code:
FUNCTION_BLOCK "INTEGRATE"
TITLE = 'INTEGRATE'
AUTHOR : PN_DP
VERSION : 1.0
//Das Integral vom Eingangswert X ermitteln mit Trapezregel.

VAR_INPUT
   enable : Bool := FALSE;
   cycle1 : Bool := TRUE;   // TRUE im 1.Zyklus CPU STOP/RUN
   reset : Bool := FALSE;   // Reset Y:=0.0
   X : Real;   // Eingangswert
END_VAR
VAR_IN_OUT
   Y : LReal;   // Integral
END_VAR
VAR
   X_last : LReal;
   t_last : LReal;
   init_done : Bool := FALSE;   // möglichst nicht remanent, oder im 1.Zyklus CPU STOP/RUN auf 0, oder cycle1 benutzen
[COLOR="#A52A2A"]   Runtime_overflow : UInt;     // Test: Zähler RUNTIME()-Überläufe[/COLOR]
[COLOR="#A52A2A"]   t_max : LReal;               // Test: höchste erreichte RUNTIME()-Startzeit[/COLOR]
END_VAR
VAR_TEMP
   dt_s_r : LReal;   // Delta t (s) zu letztem Durchlauf
END_VAR
BEGIN
// INTEGRATE für S7-1200/S7-1500, getestet mit PLCSIM V13 SP1 als CPU 1215C Firmware V4.1

(* Zeit (s) seit letztem Aufruf *)
#dt_s_r := RUNTIME(#t_last);

[COLOR="#A52A2A"]IF #t_last > #t_max THEN #t_max := #t_last; END_IF; //Testcode: ca. Überlaufzeitpunkt ermitteln und merken[/COLOR]

IF #dt_s_r < 0.0 THEN  //hat RUNTIME() einen Überlauf? kommt alle ca. 1696.725 s ~ 28 Minuten vor (PLCSIM V13 SP1)
    #dt_s_r := #dt_s_r + 1696.726;  //empirisch ermittelter Korrekturwert 1696.725 s + 1 ms vorsichtshalber
[COLOR="#A52A2A"]    #Runtime_overflow := #Runtime_overflow + 1;  //Testcode: RUNTIME()-Überlaufzähler[/COLOR]
END_IF;

IF #reset THEN //Nullen des Integrals
    #Y := 0.0;
END_IF;

(* im 1. Zyklus CPU STOP/RUN oder neu laden des IDB: nur t_last und X_last merken *)
IF NOT(#init_done) OR #cycle1 OR #reset THEN
    #init_done := TRUE;
//    Y := 0.0;    //bei Laden des IDB lieber kein Reset
//    X_last := X; //wird sowieso immer gemacht; t_last ebenso
ELSIF #enable THEN
    (* Integrieren mit Trapezregel *)
    #Y := (#X + #X_last) * 0.5 * #dt_s_r + #Y;
END_IF;
#X_last := #X;


// cycle1 mit Systemmerker "FirstScan" beschalten
// RUNTIME() hat irgendwann Überlauf (liefert dann <0.0)! System Time für RUNTIME() läuft weiter während CPU STOP!
// TIA V15 SP1 Hilfe sagt schwammig: Die Anweisung "Laufzeitmessung" verwendet einen internen hochfrequenten Zähler
// um die Zeit zu berechnen. Wenn der Zähler überläuft, gibt die Anweisung Werte <= 0.0 zurück. Dies kann für
// S7-1200-CPUs mit Firmware Stand <V4.2 bis zu einmal pro Minute vorkommen. Diese Runtimewerte sind zu ignorieren. (!)
// Mit TIA PLCSIM V13 SP1 empirisch ermittelter Überlaufzeitpunkt (siehe t_max): ca. 1696.725 s

END_FUNCTION_BLOCK

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soll das SCL in einen OB mit Cyclic interrupt ?
Bei Aufruf in einem Cyclic interrupt kann man am besten kontrollieren, ob er richtig rechnet (und hat mir geholfen bei den Überläufen den Korrekturwert auszurechnen, weil ich da ja weiß welche Zeit rauskommen muß).
Der Baustein ist aber extra so programmiert daß er in schwankenden Intervallen aufgerufen werden kann, auch z.B. im OB1 in jedem Zyklus.

Harald
 
Bei mir auf einer realen 1510 wird die Bedingung IF #t_last > #t_max THEN nicht true, obwohl t_last schön hochläuft und t_max = 0.
Habe ich noch nicht genug Kaffee intus...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nach etwas mehr Kaffee behaupte ich mal: der Wert ist als LReal interpretiert viel zu klein, um mit der Vergleichsoperation benutzt zu werden.
Der Baustein läuft bei mir jetzt über eine Stunde ohne übergelaufen zu sein.
t_last steht bei hex 16#0000_034D_5675_B594 oder Zeit LT#1H_30S_697MS_919US_892NS, als Gleitpunkt ungültig.
Wenn ich jetzt hex 16#7FFF_FFFF_FFFF_FFFF entsprechend umrechne, würde der Überlauf nach knapp 292,5 Jahren kommen. Damit könnte ich recht entspannt leben.

EDIT:
Zum eigentlichen Thema: ich habe für "Produktverfolgung" einen Integrator gebaut, der mir aus der Istgeschwindigkeit eines Förderbandes und der Zeit aus TIME_TCK einen Weg integriert. Ich hatte den Überlauf bei TIME_TCK ursprünglich aber nicht beachtet. Das passiert alle 24 Tage (zuminderst in der Größenordnung). Wenn der Überlauf während einer bestimmten Situation kam, hat die Anlage etwas gemacht, was ich dem Betreiber nie geglaubt habe. Die Fehlersuche hat dann doch einige Anläufe gebraucht...
 
Zuletzt bearbeitet:
Mit First Scan am cycle 1 Eingang zählt es.
Der Überlauf kommt aller 85.8xxx Sekunden vor.

Wie bekomme ich nun das verwendete Zeitintervall heraus? Wenn ich einen imaginären Wert von 10 Ampere am Eingang X anlege sind das wohl 10A*1µs pro Zyklus?
Müßte also einen 10 Hz Taktmerker an Enable anlegen und den Y-Wert in einer Variablen aufaddieren und durch 10 dividieren, dann hätte ich Ampere-Sekunden - richtig?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Überlauf kommt aller 85.8xxx Sekunden vor.
Mist, dann ist das womöglich schlimmstenfalls in jeder CPU und jeder Firmwareversion (und in PLCSIM) anders, und deswegen will Siemens sich nicht festlegen und das Überlauf-Verhalten exakt dokumentieren? "Einfach ignorieren" ist aber auch keine Lösung!

Wie bekomme ich nun das verwendete Zeitintervall heraus?
Das Zeitintervall muß man nicht wissen, der FB misst das selber mit RUNTIME (bis auf die (ungelöste) Überlauf-Macke)
Wenn Du 10.0 A am Eingang X anlegst und 10 Sekunden lang den Eingang enable aktivierst, dann gibt der FB nach den 10 Sekunden ungefähr den Wert 100.0 As an Y aus.

Müßte also einen 10 Hz Taktmerker an Enable anlegen und den Y-Wert in einer Variablen aufaddieren und durch 10 dividieren, dann hätte ich Ampere-Sekunden - richtig?
Du kannst einen Taktmerker + P-Flanke an enable anlegen, oder den FB in einem "Cyclic Interrupt" alle 100 ms aufrufen, oder ganz einfach im OB1 in jedem Zyklus aufrufen - der FB liefert am Ausgang Y das Integral Einheit_von_X * Sekunden, also z.B. X in Ampere (A) ergibt Y in AmpereSekunden (As)

Am besten und genauesten finde ich die Variante, den FB in einem "Cyclic Interrupt" alle 100 ms aufzurufen und die Zeitmessung (mit dem grindigen RUNTIME) ganz wegzulassen. Falls LREAL nicht über längere Zeit zu ungenau wird, dann kombiniert als LREAL-Vor-Integrierer + Ganzzahl-Zähler wie auf Seite 1 schon angesprochen.

Harald
 
Mist, dann ist das womöglich schlimmstenfalls in jeder CPU und jeder Firmwareversion (und in PLCSIM) anders, und deswegen will Siemens sich nicht festlegen und das Überlauf-Verhalten exakt dokumentieren? "Einfach ignorieren" ist aber auch keine Lösung!

Gilt aber nur für 1200er, auf den 1500ern funktioniert das.
Ich habe gerade keine 1200er zum Testen hier, werde das aber mal die Tage testen...
 
Nach etwas mehr Kaffee behaupte ich mal: der Wert ist als LReal interpretiert viel zu klein, um mit der Vergleichsoperation benutzt zu werden.
Ich denke, Du brauchst noch mehr Kaffee. Auch LREAL-Werte kann man miteinander vergleichen und feststellen, ob und welcher Wert der größere ist, wenn sie auch noch so mini-mini-minimal unterschiedlich sind.


Der Baustein läuft bei mir jetzt über eine Stunde ohne übergelaufen zu sein.
Mein V13SP1-PLCSIM für eine S7-1500 CPU läuft auch (noch) nicht über. Weil die S7-1500 die TIME_TCK-Anweisung haben, vermute ich mal, daß RUNTIME bei S7-1500 ebenfalls nach 2147483,647 s (ca. 24,8 Tage) überläuft und der Korrekturwert wäre in dem Fall +2147483,648


t_last steht bei hex 16#0000_034D_5675_B594 oder Zeit LT#1H_30S_697MS_919US_892NS, als Gleitpunkt ungültig.
Wenn ich jetzt hex 16#7FFF_FFFF_FFFF_FFFF entsprechend umrechne, würde der Überlauf nach knapp 292,5 Jahren kommen. Damit könnte ich recht entspannt leben.
Irgendwas läuft bei Dir verkehrt, vielleicht beobachtest Du falsch? t_last sind die Sekunden und Sekundenbruchteile seit Start des System timers und wird als LREAL von RUNTIME() geliefert - wenn da wirklich mal als Gleitpunkt ungültige Werte drin stehen würden, dann könnte man keiner von Siemens vorgefertigten Anweisung/Baustein mehr trauen, besonders nicht den so schlecht dokumentierten ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwas läuft bei Dir verkehrt, vielleicht beobachtest Du falsch? t_last sind die Sekunden und Sekundenbruchteile seit Start des System timers und wird als LREAL von RUNTIME() geliefert - wenn da wirklich mal als Gleitpunkt ungültige Werte drin stehen würden, dann könnte man keiner von Siemens vorgefertigten Anweisung/Baustein mehr trauen, besonders nicht den so schlecht dokumentierten ...
Harald

Ja, soweit so gut. Aber so sieht das bei mir aus:
Test_runtime.jpg

EDIT:
Warum wird das Bild verkleinert? Gibt es eine maximal zulässige Größe?

EDIT2:
Der Trace zeigt mir diesen Wert einen Exponenten von -315 an, der Wertebereich von LREAL hört aber aber E-308 auf. Das meinte ich mit "zu Klein"
 
Zuletzt bearbeitet:
so sieht das bei mir aus:
Hmm, komisch.
Welche TIA-Version hast Du, und welche CPU genau 6ES7510-... mit welcher Firmware-Version?
Mich wundert, daß in der Hex-Ansicht von t_last die obersten 16 Bit des LREAL alle 0 sind - so kleine LREAL können/dürften laut TIA-Hilfe gar nicht aus RUNTIME rauskommen. Kann es sein, daß das RUNTIME() bei Deiner CPU nicht LREAL liefert sondern TIME# oder LTIME# (Ganzzahl in ms oder ns oder was?)
Schreibt vielleicht ein anderer Programmteil in den IDB auf t_last?

Eigentlich müsste der Wert von t_last als Gleitpunktzahl z.B. 1234.567890.. angezeigt werden, der im Sekundenrhythmus vor dem Dezimalpunkt jeweils um 1 größer wird.
Wenn Du die Hex-Anzeige von t_last beobachtest, steigt der Wert da an einer bestimmten Ziffern-Stelle und links davor im Sekundenrhythmus um jeweils 1 an?

Wenn Du mit der rechten Maustaste rechts auf die orangene online-Wert-Anzeige 16#0000_033... hinter #t_last gehst: ist da als Anzeigeformat "Gleitpunkt" oder "Automatisch" eingestellt?

Wenn Du die Maus über das RUNTIME(#t_last) hältst, kommt da nach einer Weile ein gelber Tooltip mit "RUNTIME(lreal, Return: lreal )", oder kommt eine andere Funktions-Kurzbeschreibung?
Der Tooltip über RUNTIME, #t_last und #dt_s_r während Programm beobachten sollte die aktuellen Werte als Gleitpunktzahlen anzeigen.

Hast Du mal den gesamten Bausteine-Ordner "Software (Bausteine komplett übersetzen)" gemacht?


Warum wird das Bild verkleinert? Gibt es eine maximal zulässige Größe?
Ja, da gibt es Grenzen, die weiß ich aber nicht genau. Ich meine, ab 1000 Pixel Breite wird zwangsweise auf jpg-Format gewandelt und vielleicht ab 2000 Pixel wird das Bild verkleinert.

Harald
 
Hmm, komisch.
Welche TIA-Version hast Du, und welche CPU genau 6ES7510-... mit welcher Firmware-Version?
TIA V15.1
6ES7510-1SJ01-0AB0
V 2.6.0

Mich wundert, daß in der Hex-Ansicht von t_last die obersten 16 Bit des LREAL alle 0 sind - so kleine LREAL können/dürften laut TIA-Hilfe gar nicht aus RUNTIME rauskommen. Kann es sein, daß das RUNTIME() bei Deiner CPU nicht LREAL liefert sondern TIME# oder LTIME# (Ganzzahl in ms oder ns oder was?)
Die Info an den Beinchen des RUNTIME-Bausteins sagen auf beiden Seiten LReal, LWord

Schreibt vielleicht ein anderer Programmteil in den IDB auf t_last?
Nein. Ich hatte das Phänomen beim einfachen Aufruf von Runtime mit Merkern an den Beinchen und daraufhin deinen Baustein übernommen. Den IDB gab es vorher nicht.

Eigentlich müsste der Wert von t_last als Gleitpunktzahl z.B. 1234.567890.. angezeigt werden, der im Sekundenrhythmus vor dem Dezimalpunkt jeweils um 1 größer wird.
Wenn Du die Hex-Anzeige von t_last beobachtest, steigt der Wert da an einer bestimmten Ziffern-Stelle und links davor im Sekundenrhythmus um jeweils 1 an?
Ja, so sollte es sein, da bin ich ganz deiner Meinung. Und nein, die 8. Stelle von rechts etwa im 0,5s Takt

Wenn Du mit der rechten Maustaste rechts auf die orangene online-Wert-Anzeige 16#0000_033... hinter #t_last gehst: ist da als Anzeigeformat "Gleitpunkt" oder "Automatisch" eingestellt?
Führt in diesem Fall beides zur selben Darstellung. Deswegen hatte ich die Beobachtungstabelle mit in den Screenshot genommen.

Wenn Du die Maus über das RUNTIME(#t_last) hältst, kommt da nach einer Weile ein gelber Tooltip mit "RUNTIME(lreal, Return: lreal )", oder kommt eine andere Funktions-Kurzbeschreibung?
Der Tooltip über RUNTIME, #t_last und #dt_s_r während Programm beobachten sollte die aktuellen Werte als Gleitpunktzahlen anzeigen.
"RUNTIME(lreal, Return: lreal )" offline, die hex-Darstellung online.

Hast Du mal den gesamten Bausteine-Ordner "Software (Bausteine komplett übersetzen)" gemacht?
Ja, auch wenn ich die Notwendigkeit bisher nur bei HMI-Projekten hatte.

Ja, da gibt es Grenzen, die weiß ich aber nicht genau. Ich meine, ab 1000 Pixel Breite wird zwangsweise auf jpg-Format gewandelt und vielleicht ab 2000 Pixel wird das Bild verkleinert.

Harald
Ok, werde ich für das nächste Mal im Hinterkopf behalten...
 
Zurück
Oben