oscat.lib > oscat.lib fuer Step 7
CLK_PRG: fehlerhafter Startwert
psyche:
Sie dir mal das hier an :
http://www.oscat.de/community/index.php/topic,2244.msg11666.html#msg11666
Wenn du in deinem Programm dann noch IDB_STime.Init_happened auswertest, sollte das ganze fehlerfrei laufen.
mg:
--- Code: ---
--- Ende Code ---
Hallo Psyche
So wie ich das sehe empfiehlst Du die (obige) Lösung mit dem geänderten "init" UND mit deiner S_Time. Habe ich das richtig verstanden? Mir wäre das Lieb. Weil ich die S_Time gerne in diesen Baustein einbinden würde. Sonst habt man wieder x ähnliche Bausteine die derart (wie die S_Time) geändert werden müssen.
--- Code: --- "IDB_STIME"();
#tx := "IDB_STIME".tx;
IF #Q OR "IDB_STIME".init_happened THEN #last := #tx; END_IF;
--- Ende Code ---
Ich muß ehrlich sagen ich habe mich um die S_Time GAR NICHT gekümmert ich habs verwendet und (wie Du) erwartet daß es stimmt. Bisher hatte ich keine Probleme. Aber ich werde mal ein Projekt starten (im Moment nichts in Aussicht) wo ich die Änderungen einbinde und dann hätte ich auch ein paar Testergebnisse. Evtl. kann ich auch ein bestehendes ändern. Welche CPU wäre sinnvoll (1511, 1513, 315) könnte ich anbieten.
Danke Mg
psyche:
Hi,
STime ist die Wurzel allen Übels, weil es ja die Zeit für alle Zeit basierten Funktionen aufbereitet. Jeder Fehler der dort passiert, wird an nachfolgende Bausteine übergeben.
--- Code: ---FUNCTION_BLOCK CLK_PRG
TITLE = 'CLK_PRG'
//
//clk_prg uses the internal sps time to generate a clock with programmable period time.
//the period time is defined for 10ms .. 65s
//the first cycle after start is a clk pulse and then depending on the programmed period time a delay.
//every pulse is only valid for one cycle.
//the accuracy of clk_prg is depending on the accuracy of the system clock.
//
//uses: T_PLC_MS [FC64]
// STIME [FB64],IDB_STIME [DB64]
//
VERSION : '1.4'
AUTHOR : hugo
NAME : CLK_PRG
FAMILY : GENERAT
VAR_INPUT
PT : TIME := t#10ms;
END_VAR
VAR_OUTPUT
Q : BOOL := 0;
END_VAR
VAR
last : TIME;
tx: TIME;
END_VAR
VAR_TEMP
END_VAR
BEGIN
(* read system time *)
tx := DINT_TO_TIME(DWORD_TO_DINT("T_PLC_MS"()));
(* generate output pulse when next_pulse is reached *)
Q := tx - last >= pt OR tx - last < t#0ms;
IF Q THEN last := tx; END_IF;
(* revision hiostory
hm 25 feb 2007 rev 1.1
rewritten code for higher performance
pt can now be changed during runtime
hm 17. sep 2007 rev 1.2
replaced time() with t_plc_ms() for compatibility reasons
hm 25. oct. 2008 rev 1.3
optimized code
psyche 05.10.2014 rev 1.4
nearly completely revised because of bugs in init procedure
*)
END_FUNCTION_BLOCK
--- Ende Code ---
Ich würde es so machen, wenn du meinen STime benutzt.
Maximaler Fehler ist hier 2x PT. D.H. wenn während der Programmbearbeitung ein CPU Neustart oder ein IDB download stattfindet und PT= T#1s ist, kann die Periodendauer zwischen dem letzten Impus und dem neuen Impuls zwischen T#10ms und T#2s liegen.
Wenn deine Anlage das nicht ab kann, musst du IDB_STime.Init_happened verwenden um einen geführten Neustart zu erreichen.
Aber immer daran denken, Init_happened muss nach Verwendung manuell zurück gesetzt werden.
Welche CPU du verwendest ist egal, dass ist alles Hardware neutral.
Wenn du das testest, wäre feedback nett.
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln