TIA Step 7 Basic Aufruf Timer in Funktionsbaustein

moeggu

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich Arbeite gerade zum ersten mal an einem Projekt mit S7-1200 CPU 1214. Programmierung mit TIA Step 7 Basic V11

Ich habe folgendes Problem.

Ich habe einen Funktionsbaustein erstellt. In dem will ich nun 2 Einschaltverzögerungen programmieren. Welchen Timer muss ich hier verwenden?
Bei S7-300 habe ich das immer mit SFB4, 5 gemacht.

Ist das überhaupt möglich mit der S7-1200?


Vielen Dank, Gruss
 
Hallo,
die 1200er-Reihe ist nicht so mein Ding ... aber hast du es schon mal mit TON und TOF als Bausteintyp versucht ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich bereits probiert. Aber die TON's funken einander irgendwie rein.

Ist aber möglich das ich etwas falsch gemacht habe. Ist das erste mal mit 1200
 
Hi!

Wenn du in einem FB die IEC-Timer TON bzw. TOF aufrufst, erhält jeder dieser Timer eine eigene Instanz (auch bei mehrmaligem Aufruf von z.B. "TON").
Hierfür kannst du diese entweder als Multiinstanzaufruf deklarieren (werden dann im statischen Variablenbereich des FB deklariert) oder du weist globale Instanzdatenbausteine zu.
Ersteres ist bei einem FB fast immer die sauberere Lösung (Kapselung).

Das was du wahrscheinlich falsch gemacht hast ist, dass du beiden Timern die selbe Instanz zugewiesen hast.
Dadurch beeinflussen sie sich natürlich, da sie sich die Instanzdaten teilen - das haut natürlich nicht hin.


Gruß,

Ottmar
 
Zuletzt bearbeitet:
hallo Ottmar

Ich denke ich habe das schon richtig gemacht... Die IEC Timer bekommen ja automatisch imer eine andere Instanz
IEC_Timer_Instance
IEC_Timer_Instance1
IEC_Timer_Instance2
u.s.w.

Wen ich danach den Datenbaustein aufrufe sehe ich unter static jeden Zähler einzeln.

Kann ich im Datenbaustein die Adressierungen nicht anschauen? Und was ist der Unterschied zwischen einem Optimierten Funktionsbaustein und einem Standart? Ist da eventuell der Feheler?

Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann ich im Datenbaustein die Adressierungen nicht anschauen? Und was ist der Unterschied zwischen einem Optimierten Funktionsbaustein und einem Standart? Ist da eventuell der Feheler?

Die automatisch erzeugten DBs sind immer "optimiert", das ist richtig dass du dann keine Adresse siehst.

Die IEC Timer in der 1200 haben eine "Merkwürdigkeit" im Verhalten.
Wenn man sich beispielsweise mit einem IEC TON eine Sekundentaktflanke erzeugen möchte, und man den Ausgang Q der Timer-Instanz auf der IN negiert zurückführt, so läuft zwar der Timer in der eingestellten Zeit ab und wird nach Ablauf auch neu angestoßen, aber eine Abfrage des Signalzustandes von Ausgang Q in nachfolgenden Programmteilen zeigt nie ein 1-Signal.
Das funktioniert nur wenn man den Ausgang Q auf eine Hilfsvariable schaltet und dies auf den Eingang zurücklegt.

Den Grund für dieses Verhalten konnte ich mir noch nicht erklären. Für mich ist es ein Fehler in der Software (ob im TIA oder in der 1200er Firmware weiß nur Siemens).

Ich würde zumindest bei der 1200 aus dem Grund nie eine Instanzvariable auf einen Eingang des eigenen Bausteins zurückführen.
 
Hi

an dem eigenartigen Verhalten der Timer in der Simatic alt und neu habe ich auch schon gekaut. Inzwischen bin ich nicht mehr der Meinung, dass da was falsch läuft.

Das mit der Rückführung kann ich bestätigen.

In der alten Welt (300/400 und Step7 V5) wurde TON, TOF und TP durch SFB realisiert. Die haben eine Instanz, also einen DB. Man kann von immer und überall in diese Instanz reinschauen. Wenn man den SFB jedoch nicht aufruft, dann bewegt sich da auch nix. Beispiel: Man plaziere einen TP im OB35. Diesen parametriert man jedoch so, dass er nur alle 10 Sekunden dran kommt. Im OB1 schaut man auf die abgelaufene Zeit. Die wird nur alle 10 Sekunden aktualisiert. Wenn man also nun meint, dass man einen Impuls von 1 Sekunde braucht, dann klappt das natürlich nicht. Denn der OB35 aktualisiert den TON ja erst nach 10 Sekunden.

Wenn man eine Variablentabelle (VAT) verwendet und damit in die Instanz schaut, stell man ebenfalls fest, dass sich diese nur dann ändert, wenn der SFB aufgerufen wird, also alle 10s im diesem Beispiel.

Lassen wir so einen Quatsch mit mehreren OB mal und überlegen uns, was die Rückführung einer Instanzvariablen bedeutet. Wir haben einen SFB-Aufruf. D.h. die Eingangsparameter werden vor dem eigentlich Aufruf in die Instanz kopiert. Und nach dem Aufruf wieder raus.
Für den TON gilt: Ist der IN 0, dann ist das auch der Q. Siehe IEC61131 -- da kann Siemens nix für.
Der Timer startet mit der steigenden Flanke am IN. D.h. beim TON ist der Augang auf 0, denn die Zeit ist ja noch nicht abgelaufen.
Wenn dann die Zeit abgelaufen ist, dann wird der Ausgang 1. Für genau eine Zyklus lang, denn der Eingang wird ja wieder 0 und deswegen der Ausgang wieder 0.
Wenn du Glück hast, dann kannst du diesen einen Zyklus auch im Status sehen, meistens aber nicht. Man kann den Impuls aber sehr gut in einem Zähler (ADD mit EN :) fangen.

Also schon in der alten Welt muss man mit solchen Rückführungen sehr vorsichtig sein.


In der neuen Welt (1200/1500 und damit eben auch TIA) werden die nicht durch SFB realisiert. Es fehlt das EN und das ENO! Man kann das Q an eine Verknüpfung anschließen. Sowas ging mit Bausteinen noch nie und geht auch sonst immer noch nicht. Also TON, TOF und TP sind keine Bausteine mehr. Vermutlich so eine Sequenz wie beim alten Timer aus Step5 Zeiten (der mit BCD geladen wird -- grusel)
U links_vom_in
L PT
TON instanz
L instanz.ET
T wohinauchimmer
U instanz.Q
Wenn man das mit zwei OB macht, also z.B. alle 10 s den TON aufrufen und alle 2 Sekunden den ET oder den Q auslesen, stellt man fest, dass der ET auch immer eine aktuelle Zeit an zeigt. D.h. man kann ET und Q verwenden ohne, dass man ständig einen SFB zum aktualisieren aufruft. Immer wenn man nach der Zeit fragt, bekommt man die echt aktuelle.
Endlich misst ein Timer wirklich die Zeit!

Wenn man eine Variablentabelle (VAT) verwendet und damit in die Instanz schaut, stellt man ebenfalls fest, dass sich diese immer dann ändert, wenn der Q oder ET gelesen werden, bzw. wenn der TON, TOF oderTP aufgerufen wird, also alle 2s im Beispiel mit 10s und 2s OB Zyklen. Greift man im OB1 auf den Timer zu, so wird dieser mindestens mit Zykluszeit aktualisiert. Genaugenommer mit jedem lesenden Zugriff. (Kann man dadurch prüfen, dass man einen OB1 macht der 30ms braucht und innerhalb dieser 30ms mehrfach den ET holt und an verschiedenen Stellen speichert. So ein Timer misst wirklich die Zeit.

An dieser Verbesserung, scheint es jedoch nun zu liegen, dass man am Ausgang nix mehr bekommt. Ich stelle mir das so vor: Irgendwie ist da intern nun folgendes AWL
UN instanz.Q
L PT
TON instanz
L instanz.ET
T wohinauchimmer
U instanz.Q
Der Lesezugriff für Q vor dem TON aktualisiert den Timer. Damit kann der Timer abgelaufen sein, d.h. Q ist 0. Damit bekommst du jetzt wieder eine steigende Flanke am Eingang. Also fängt er wieder von vorne an, d.h. der Lesezugriff für Q hinter dem TON ist wieder 0.

Prüfen kann man das wenn man zwischen dem negierten Kontakt und dem IN einen Abzweig einbaut und dort mittels EN verschaltetem ADD einen Zähler einbaut. Ja, der zählt schön stabil. Während der Zähler hinten am Q nur sehr sehr sporadisch zählt. Aber auch der zählt. Immer dann, wenn du das Glück hast, dass die Zeit zwischen
L instanz.ET
T wohinauchimmer
U instanz.Q
abläuft. Wenn im OB1 sonst nix drin ist; bei meiner 1214 im verhältnis 1 zu 100. Je mehr im OB drin ist desto unwahrscheinlicher wird das.


Also die Rückführung von Instanzsignalen ist keine gute Idee. War es noch nie und wird es auch nie sein.


Siemens macht ja viele Fehler. Vor allem mit der Performance im TIA, darüber sei an andere Stelle laut und deutlich geklagt. Aber die neuen TIMER und die neuen COUNTER sind in Ordnung.
Auf der 1500 bekommt man 64Bit Zähler und Timer. Die Timer haben sogar eine bessere zeitliche Auflösung.
Die alten Timer und Counter, die noch mit gruseligen BCD Werten geladen werden hätten sie sich auf der 1500 jedoch sparen können. (Jetzt steinigen mich bestimmt die, die AWL Programme von der 300 auf die 1500 migireren :)
 
Zuletzt bearbeitet:
Ich hatte zur Timer-Thematik schonmal einen eigenen Thread aufgemacht, mit einem kleinen Testprogramm.
http://www.sps-forum.de/simatic/63330-seltsames-verhalten-der-ton-timer-bei-der-s7-1200-a.html

Das dumme ist nur dass man diesen Bausteinen von außen nicht ansehen kann wie sie funktionieren. Für mich ist alles erstmal eine Funktion oder ein Funktionsbaustein, von dem ich davon ausgehen können sollte, dass alles so funktioniert wie es die Logik anhand der Informationen die mir zur Verfügung stehen hergibt.
Ich habe schon bei den Siemens-Support Seiten nach Informationen gesucht, aber so richtig was offizielles findet man nicht.

Hingegen wurde wohl unterbunden dass man auf die Instanz-Variable RN einer TON-Timers zugreifen kann. Da frage ich mich aber, wenn es jetzt so einen Mechanismus wie "private" für Instanzvariablen zu geben scheint, warum stellt man dieses nicht dem SPS-Programmierer zur Verfügung?

Hingegen findet man dieses:
http://support.automation.siemens.com/WW/view/de/54684852?Datakey=47071380
Wenn ich das richtig sehe, ist nach einem Konvertierungslauf der EN auf mal wieder da!
Was auch falsch ist, dass das gezeigte Netzwerk auch in Step7 V5.x nicht funktionierte. Das funktioniert in FUP nämlich sehr wohl, nur KOP zickt da rum.
 
Hi

Eine TEMP-Variable für einen Timer einzusetzen ist ... Blödsinn :cool: Etwas, was nach Funktionsende nicht mehr da ist, ist im nächsten Zyklus nicht mehr da. Was ein C-Compiler auf den Stack legt, ist bei erneutem Aufruf der Funktion ja im Normalfall auch überschrieben. Es sein denn, man schreibt einen Test der sonst nix anderes macht ... ;)

Bei http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&objid=54684852&Datakey=47071380&caller=view hat sich der Siemens-Support wiedermal nicht mit Ruhm bekleckert, vielleicht war's Rum.

Bild 01 klappt auf einer 1200/1500 auf der 300/400 kommt gezeigte Meldung. Wenn da statt PLC_2 etwas stände, was auf die 300/400 hinweißt wäre es wohl klar.
Bild 02 klappt auf allen Siemens PLCs.
Bild 03 klappt nur auf der 300/400.

Die Kritik an der Konvertierung verstehe ich nicht. In der alten Welt sind der TON und die anderen SFB mit EN und ENO. In der neuen Welt sind es vermutlich mehere MC7.1 Befehle; EN/ENO fehlen. Schon klar, dass es da beim rumwuchten Probleme gibt. Ich finde es klasse, dass bei IEC-Timern (und Countern) die direkt an der Stromschiene hängen, bzw in FUP nicht weiter beschalten sind, der Umstieg ohne Anwendereingriff klappt. Wenn man sich jetzt Konstrukte ausdenkt, wie das gezeigte, welches in der einen Welt nicht möglich ist, dann knirscht es eben.

Siemens sollte sich natürlich fragen, warum es da überhaupt Unterschiede gibt. Warum tun die sich und uns Anwendern das an? Andererseits, die 1200/1500 sind bezüglich der Timer und Counter so viel besser und selbst der Umstieg von 300/400 auf 1200/1500 wird versucht. Leider muss da immer noch viel Hand anlegen.

Und was ich nun nicht mag, nicht verstehe, für einen Schmarrn halte, ist der Unterschied zwischen SCL und den anderen dreien bei der 1200/1500. In SCL muss man einen TON_TIME deklarieren. In KOP ein IEC_TIMER. Beides ist das Gleiche. In einem DB kann man ein Feld von IEC_TIMER machen und dann in verschiedenen KOP und FUP Funktionen verwenden. Man spart sich den ganzen Unfug mit TON_TIME, TOF_TIME, ... . Es ist möglich einen IEC_TIMER erst als TON und nachher als TOF zu verwenden. (Natürlich nicht gleichzeitig :ROFLMAO:). Man muss auch nicht für jeden Timer einen eigenständigen DB machen. Einer reicht für alles was nicht SCL ist. Nur SCL besteht darauf, dass man schon vorher TON, TOF, TP festlegt. Dabei wäre es doch so klar, man würde in SCL "der_db_mit_den_timern".das_feld[ #i ].TON schreiben. Noch schicker wäre der_db_mit_den_timern[ #i ].TON.

RN ... was'n das? Private Member ... vermutlich. Bei den alten BCD kodierten Timern gab es Flankenmerkerbits. Da hat man am besten die Finger von gelassen. Ich hab mal ein bischen mit dem RN gespielt. Soweit sie mich noch ließen. In der V12 geht da weniger als vorher. Das Zeitverhalten ist nicht gut. Also wirklich besser die Finger von lassen.

Vielleicht bekommen wir Anwender in einer späteren Version (V13/14/15) auch die Möglichkeit den Zugriff auf die Instanzvariablen eines FB zu bestimmen. Objektorientiereung wie sie CodeSys vormacht wär' doch was :)
 
Zurück
Oben