TIA Neueinsteiger: FUP zu SCL

shrimps

Level-1
Beiträge
422
Reaktionspunkte
49
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo in die Runde,
bin im Forum bisher nur bei Twincat aktiv gewesen und versuche nun TIA Step7 zu verstehen...

Bin daher hingegangen und habe erstmal die einfachste CPU genommen und mit FUP einen TON an einen CTU gehängt.
Dann auf Übersetzen, alles ausgebügelt und dann Simulation gestartet.
Anschl. die kleine Brille angeklickt und konnte nun prima über beiden Bausteinen alles exkat nachvollziehen > Prima.

Dann alles neu und ne 1500er ausgewählt.
Den OB1 gelöscht und mit SCL neu angelegt.
Den TON und den CTU eingedaddelt, übersetzt etc.
Dann etwas mehr geklickt wegen der anderen Simulation...
Dann lief die Sache wohl und trotz eingeschalteter Brille war rechts daneben erstmal nur der Q vom TON und überall FALSE.
Dann das Beobachtungsfenster gefunden, den TON mit ET und den CTU mit CV anzeigen lassen: TON timert sich korrekt hoch und startet wie gewollt,
ABER der CTU zählt nur Ab und Zu weiter ????

Vesrtehe ich überhaupt nicht ?

Als wenn der Impuls nur ab und an beim CTU ankommen würde ???

Was mache ich hier falsch ?

Nun feste Druff :D

LG
Shrimps
 
Vielleicht solltest du den Timer-Q nur einmal abfragen und zwischenspeichern. Evtl. setzt du den Timer mit der ersten Abfrage zurück. Die nächste Abfrage gibt schon wieder false zurück.
Nur so eine Idee ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Timer laufen asynchron zum OB1. Wenn man Timer mehrmals im OB1 abfragt dann kann das durchaus beim zweiten mal abweichende Ergebnisse liefern.

Zusätzlich läßt sich Siemens für die S7-1500 noch neuartige Verhaltensweisen und diverse Bugs einfallen, so daß man sich in Bezug auf Timer eisern an die Regeln halten muß:
- Timer im Zyklus nur ein einziges Mal unbedingt aufrufen
- Timer-Ausgänge in Zwischenvariablen sichern und dann mit diesem "Timer-Abbild" arbeiten
- Timer nicht mit sich selbst verknüpfen

http://www.sps-forum.de/simatic/77908-s7-1500-timer-resetieren.html
http://www.sps-forum.de/simatic/77290-tia-v13-bug.html

Harald
 
Naja, da du ja Beckhoff Erfahrung hast ... kann man ja von etwas Background ausgehen.

Bei der S7-300 mit SFB4 sowie den allermeisten IEC-Systemen (Beckhoff, Codesys etc.) ist ein TON ein ganz normaler FB welcher sich auch an alle Regeln eines FB hält.
Die wichtigste: Der FB verändert seinen Zustand ausschließlich beim Aufruf des FB, hier also z.B. "myTON();".
Bei Siemens und der S7-1500 ist das in Bezug auf die vermeintlichen IEC-Timer nun leider etwas anders.
Die Instanz wird bei jeden Zugriff auf die Timerinstanz aktualisiert, konkret bei Zugriff auf myTON.ET bzw. myTON.Q.

Dein SCL-Code dürfte nun also ungefähr so aussehen:
Code:
myTON( IN := NOT myTON.Q , PT := T#1s);
myCTU( CU := myTON.Q .... )

Hier passiert nun also folgendes, die Aktualisierung der Schnittstellen-IN-Parameter steht Codemäßig vor den Aufruf myTON(); woraus nun also folgt, das myTON.Q dann schon High wird vorm Aufruf des myTON(), woraus wiederum folgt, das myCTU dann schon wieder myTON.Q = False mitbekommt.
Ob und wie oft, myTON.Q beim Aufruf des myCTU nunt High ist, ist reiner statistischer Zufall.

Dein SCL-Code müsste nun also so aussehen:
Code:
myTON( IN := NOT xTimer , PT := T#1s, Q=> xTimer );
myCTU( CU := xTimer .... )
Was dann der von Holgero angesprochenen Zwischenvariable entspricht.

Mfg
Manuel
 
Zuletzt bearbeitet:
Hallo an alle,
erstmal besten Dank an die schnelle und ausführliche Hilfe !
Das habe ich alles soweit verstanden und versucht umzusetzen:
Code:
ORGANIZATION_BLOCK "Main"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_TEMP 
      xTimer : Bool;
   END_VAR


BEGIN
    "Timer1".TON(IN:= NOT #xTimer,
                 PT:= t#5s,
                 Q=>#xTimer);
    
    "Counter1".CTU(CU:=#xTimer,
                   R:= false,
                   PV:=0);
    
    "Impuls1".TP(IN:=#xTimer,
                 PT:=t#3s);
    
END_ORGANIZATION_BLOCK

Nun läuft er einmal los und dann nicht mehr ?
Wenn ich die xTimer als M1.0 anlege dann findet er sie nicht mehr ?
Hmm, bin noch zu Twincattig am Denken...

Bitte noch einen Tip
Danke
Shrimps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle,
erstmal besten Dank an die schnelle und ausführliche Hilfe !
Das habe ich alles soweit verstanden und versucht umzusetzen:
Code:
ORGANIZATION_BLOCK "Main"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_TEMP 
      xTimer : Bool;
   END_VAR


BEGIN
    "Timer1".TON(IN:= NOT #xTimer,
                 PT:= t#5s,
                 Q=>#xTimer);
    
    "Counter1".CTU(CU:=#xTimer,
                   R:= false,
                   PV:=0);
    
    "Impuls1".TP(IN:=#xTimer,
                 PT:=t#3s);
    
END_ORGANIZATION_BLOCK

Nun läuft er einmal los und dann nicht mehr ?
Wenn ich die xTimer als M1.0 anlege dann findet er sie nicht mehr ?
Hmm, bin noch zu Twincattig am Denken...
Temp ist am Anfang des Bausteins unbeschrieben zufällig bei S7-300, bzw. Null bei 1200/1500.

...findet er sie nicht mehr...?
Geht das auch in Deutsch?
 
Hallo MSB,
das verstehe ich nun nicht:
Wenn die xTimer beim Start Null ist (=False) dann ist ja alles richtig und deswegen startet das ganze ja auch einmal, aber dann übernimmt er das nicht mehr ?
Zur Definition: Wenn ich die xTimer aus der VAR_TEMP lösche und in der Standard-Variablentabelle definiere bekomme ich immer:
Der Operand #xTimer ist nicht definiert !
Das meinte ich mit "findet er sie nicht mehr ?"
Sorry für die Ausdrucksweise.
 
a) Du liest xTimer bevor du xTimer beschreibst = Vor Aufruf des Timers ist xTimer durch das Betriebssystem immer Low, danach dann nach der Zeitverzögerung immer High
So ähnlich wie Var in Funktionen bei Bechoff

b) Siemens verwendet in TIA eine unterschiedliche Prefix für Lokal und Globalvar
#xTimer = Lokal
"xTimer" = Global
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Variable in TEMP ist bei jedem Baustein-Aufruf zunächst 0 (S7-1500). TEMP-Variablen können sich nicht Werte bis zum nächsten Aufruf merken. Deshalb heißen die TEMP.
Weil Du Deine Variable xTimer in einem OB deklariert hast, ohne daß Du die bereits vorhandenen TEMP-Variablen deklariert hast, liegt die Variable vermutlich auch noch auf dem Speicherplatz einer anderen Variable (OB1_EV_CLASS ?), welche vom Betriebssystem beim OB-Aufruf mit einem Wert beschrieben wird.

Der Name einer globalen Variable darf nicht mit # anfangen. Variablen mit # am Anfang sind lokale Variablen und werden nicht in der globalen Variablentabelle gesucht. Lasse das # beim Bezug auf die globale Variable weg. Deklariere die Variable xTimer als BOOL in der Variablentabelle und schreibe in SCL "xTimer" in Hochkomma.
Code:
ORGANIZATION_BLOCK "Main"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

BEGIN
    "Timer1".TON(IN:= NOT [COLOR="#0000FF"]"xTimer"[/COLOR],
                 PT:= t#5s,
                 Q=>#xTimer);
    
    "Counter1".CTU(CU:=[COLOR="#0000FF"]"xTimer"[/COLOR],
                   R:= false,
                   PV:=0);
    
    "Impuls1".TP(IN:=[COLOR="#0000FF"]"xTimer"[/COLOR],
                 PT:=t#3s);
    
END_ORGANIZATION_BLOCK

Harald
 
Hallo PN/DP,
das wars !
Besten Dank !
Ich hatte die Temp onehin als "seltsam" angesehen, aber in Twincat kann ich ja auch VAR anlegen, nur in Step7 nicht...
Nun läuft der Timer sauber und der Zähler auch, ABER:
Der TP macht nichts ???

Geht hier auch wieder etwas "verloren" ?
In der Beocbachtungsliste sehe ich den Timer1.IN dauerhaft auf TRUE und der ET läuft nie los ?

Bevor ich nix verstehe, habe ich es nochmals in Twincat versucht und da rennt es wie gewünscht ?

LG
Hardy
 
Der TP macht nichts ???
Das sollte aber funktionieren, wenn Dein Programm im wesentlichen wie der korrigierte Code von #9 aussieht. Wie sieht Dein Programm jetzt aus?
Ist Dein Programm in die CPU geladen? Alles ist konsistent und "grün"?

In der Beocbachtungsliste sehe ich den Timer1.IN dauerhaft auf TRUE und der ET läuft nie los ?
Müsstest Du nicht Impuls1.ET beobachten?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Et und q beobachten bringt nix wenn dadran keine Variablen hängen. Dann wird der timer nicht aktualisiert.

Mindestens q muss im programm abgefragt werden.

Mit freundlichen Grüßen rené


Sent from my iPad using Tapatalk
 
Zuletzt bearbeitet:
Hallo Harald,
sorry vertippert:
Klar beobachte ich den "Impuls1".ET.
Alles grün beim Übersetzten und Laden, habe extra nochmal nen Neustart TIA gemacht...
Code:
ORGANIZATION_BLOCK "Main"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

BEGIN
    "Timer1".TON(IN:= NOT "xTimer",
                 PT:= t#5s,
                 Q=>"xTimer");
    
    "Counter1".CTU(CU := "xTimer",
                   R := false,
                   PV := 0);
    
    "Impuls1".TP(IN := "xTimer",
                 PT := t#3s);
    
END_ORGANIZATION_BLOCK
Status.JPG
Hmm, was ist daran noch falsch ?

LG
Hardy
 
Aus dem im Beitrag #3 verlinktem Thread:
Man kann die Timer übrigens auch nur beobachten wenn Q oder ET auch wirklich abgefragt wird. Nur IN und PT anhängen und dann über die Instanz beobachten funktioniert nicht. die Instanz wird dann nicht aktualisiert.

Hmm, eigentlich hat Siemens das Verhalten der Timer vermutlich deshalb geändert, um auch den ahnungslosen Programmierern Erfolgserlebnisse zu verschaffen ... doch wie man sieht, kommen Einsteiger nun erst recht nicht mit dem unlogischen Mist zurecht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Alle:
Prima, läuft nun wie gewünscht...

Hätte nicht gedacht, so kräftig vor die Wand zu laufen zwischen Twincat / TIA S7-300 und dann noch der Unterschied 1500er...

OK dann mal weiter zu den nächsten Sorgen und WinCC :cool:

LG
Shrimps
 
Dann eine Frage zu Updates:
Ich habe aktuell TIA Portal V13 SP1, Step7 Prof V13 Sp1, WinCC Advanced V13 Sp1 installiert.
Der Updatemanager bietet mir für Portal V113 Upd4 an ?

Soll ich das machen oder merke ich als Einsteiger das gar nicht...
(Oder gar andersrum und ein Bug weniger :D )

LG
Shrimps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, eigentlich hat Siemens das Verhalten der Timer vermutlich deshalb geändert, um auch den ahnungslosen Programmierern Erfolgserlebnisse zu verschaffen ... doch wie man sieht, kommen Einsteiger nun erst recht nicht mit dem unlogischen Mist zurecht.

Richtig geil siehts auch wenn ET bedingt abgefragt wird (If, For, Case etc.) und man dann in der Beobachtungstabelle ET beobachtet und dieser wild durch die Gegend springt (immer dann wenn die Bedingung mal erfüllt ist) ;)

mfG René
 
Zurück
Oben