TIA Anfänger: aufruf von mehreren Bausteinen führt zur FehlfunktionHabs aller

Fr33man

Level-1
Beiträge
14
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Abend,

ich bin zwar schon länger angemeldet, hab bisher allerdings noch nicht viel mit Step7/TIA machen können. Doch in zukunft brauch ich das öfter mal auf Arbeit und dachte mir, so als Training könnte ich ich doch mal was Programmieren. Und damit diese Zeit vielleicht nicht einfach nur Übung ist sonder auch gleich was Sinnvolles bei raus kommt hab ich ich an die Erstellung von zwei Bausteinen gemacht:

Betriebsstundenzähler mit zwei einstellbaren Servicemeldungen
Störmelder mit zwei Delay-Zeiten (Start/Betrieb)

Jeder Baustein für sich alleine im OB1 mit UC aufgerufen funktioniert im PLCSIM Tadellos. Aufruf klappt, Ausgaben klappen, alles gut *Freu-wie-a-schnitzel*

Jetzt sollen die natürlich nicht alleine vor sich her dümpeln, die müssen ja irgendwann mal zusammen in einem großen Programm laufen und für meinetwegen >3 Antriebe die Stunden zählen und Störmeldungen abfragen.

Also beide zusammen ins Projekt und beide im OB1 Aufgerufen. Doch Halt! Was ist nun Los?!

Plötzlich spinnen beide total rum. Die internen Zähler und deren Ausgaben nehmen utopische Zahlen an und das gesamte Verhalten des Bausteins ist total bekloppt...

Nur warum? Was mache ich Falsch??

Habs mal angehangen.

Wäre für jeden Tipp dankbar!

Gruß
 

Anhänge

  • BSZ und SM.zip
    1,2 MB · Aufrufe: 10
Hi,

Programmieren an sich ist mir nicht Fremd, jedoch habe ich bisher noch nie so tiefgreifend mit Step7/TIA gearbeitet um diese grundlegenden Dinge mit zu bekommen die man für die Erstellung eines kompletten Programms braucht.
Deshalb glaube ich, dass ich mir erst ein mal ein paar Sachen erklären lassen muss um meinen Wissensstand auf die Probe zu stellen.


Meine Annahmen: (Bitte richtigstellen falls falsch)
FC - Funktion - Ein Stück Software, vorwiegend bestehend aus:

-von "außen" zu füllenden Variablen deren interner Merker nur lokal gelesen oder beschrieben werden kann,
-nach "außen" führenden Variablen deren interer Merker nur lokal gelesen oder beschrieben werden kann,
-interne, temporäre Variablen, die nach jedem Aufruf ihren Wert verlieren,
-in dem auch mit globalen Merkern gearbeitet werden kann, jedoch - um universell zu bleiben - nicht sollte.
-viele viele male im gesamten Programm aufgerufen werden kann da jeder Aufruf mit individuellen Daten geschieht.

Dessen Variablen werden über dessen Menü "Bausteinschnittstelle" symbolisch benannt, klassifiziert(Bool, real, int,..) und kategorisiert (const, temp, in, out,..)
Ein DB ist für einen FC nicht notwendig, da seine Daten ausschließlich über seine Schnittstellen laufen, die wiederum mit Merkern Verknüpft sind, die entweder dem Aufrufenden FB und dessen DB zugehören oder ein globaler Merker genutzt wird.


Fragen zum FC:

1. Kann man eine Schnittstellen-Variable erstellen, die nicht zwangsweise von außen verknüpft werden muss?
  • Bsp. Betriebsstundenzähler: Es könnten mehrere Serviceintervalle eingestellt werden, nach deren Ablauf ein FC-Ausgang gesetzt wird. Benötigt jetzt von den Vorhandenen zb. 3 Servicetimern nur einer. Kann man nicht einfach die anderen zwei nicht benötigten weg lassen? Sonst müsste man ja immer einen Merker erstellen und im FB der FC zuweisen, der dann sowieso ins nichts führt. (NULL-Merker für solche zwecke?!)

2. Sollte man für Zählervariablen (zb. var := var +1; ) keine OUT- oder TMP- Variablen nehmen?

  • Mir kams so vor, als wenn das zu Problemen führt, wenn man eine Zählervariable als OUT festlegt



FB - Funktionsbaustein:

- besitzt einen eigenen Datenbaustein, in dem er seine gewonnen Werte speichern, "veröffentlichen", wieder lesen kann
- ruft u.U. mehrere FC´s auf, füllte diese mit Daten, ließt daraus die Ergebnisse, speichert sie, usw.

Fragen zum FB:
  1. Warum braucht man überhaupt einen DB? Er kann seine Werte doch auch in globalen Merkern schreiben. Ist ein DB auch nach einem STOP noch mit den alten Daten gefüllt ein Merker nicht?
  2. Wenn ein DB wichtig ist, warum kann man einen FB auch ohne aufrufen?



Allgemein:
So wie ich bisher mitbekommen habe, erfordert ein FB bei dem Aufruf mit CALL im OB1 einen zugehörigen DB. Ein FC, über CALL im OB1 aufgerufen hingegen listet mir automatisch unter diesem Aufruf eine Tabelle mit den programmierten Ein-/Ausgängen auf.
Ich nehme an, dass letztes dem Aufruf des FC´s über einen FB gleich kommt. In FUP muss da ja dann auch jeder Programmierte Ein-/Ausgang des FC´s mit einem Merker zb. Beschaltet werden. In AWL sieht das dann halt entsprechend so aus.


Gibt es bei der Erstellung solcher FB´s und FC´s irgendwelche Regelungen?
Z.B: Steht FB33 immer für einen bestimmten Baustein? (vergleichbar mit: OB30 - 38 = Weckalarme)




So, mehr fällt mir auf die schnell dazu nicht ein.
Ich weiß; sind bestimmt einige Anfängerfragen dabei. Aber ihr/du musst sie ja nur mit "Ja, richtig" beantworten, wenns stimmt und sooo viel ist da jetzt hoffentlich nicht falsch :D

Danke jedenfalls jetzt schon für deinen Einsatz ;)


Ich sehe das du den FC3 Störmelder in ein FB aufgerufen hast mit UC , aber kein Instanzdatenbausteinaufruf dazu gemacht hast.
Mach doch mal den Aufruf in OB1 mit CALL "Störmelder".

Um damit eine Erstellung eines DB´s zu bezwecken?
Wenn ich
Code:
Call "Störmelder"
in OB1 schreibe, dann erstellt er mir keinen DB sonder zeigt mir nur eine Tabelle an.



btw. Hab gerade das Hilfesystem entdeckt. Da steht so einiges ja viel genauer beschrieben, als wie ich es von anderen Programmen gewohnt bin :D
Muss ich wohl doch mal durchlesen.

Aber für heute mach ich Schluss.. In Russland is schon spät :)

Gn8
 
FC:
Nein, alle Ein- , Aus- und Ein/Ausgänge (IN, OUT, INOUT) müssen verschaltet werden.
Und die Ein-/Ausgänge sind nicht mit Merkern verbunden sondern liegen in einem internen Speicher (Stack).

FB:
1.
Ja kann man, aber wenn Du einen FB 2x verwendest, dann greifst Du zweimal auf den gleichen Merker zu.
Ein DB behält seinen Inhalt, solange Du die MMC nicht entfernst oder überschreibst.
2.
Kann man, sollte man nicht. Der Aufruf UC ist für Anwender nicht sinnvoll, ich kenne den nur als AWL Umsetzung von FUP oder KOP (und die packen auch vorher die Instanzen in die Adressregister)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

Mit Hilfe eurer Tipps hab ichs soweit am laufen.

Jetzt gleich die nächste Frage:

Ich hab einen OUT- .. heißt das Formalparameter? als Bool. Dort kann ich jetzt einen Merker setzen, der mir auch ordentlich beschrieben wird. Doch wie stelle ich es an, wenn ich nach diesem Ausgang noch eine Bitverknüpfung setzen will? (ein UND zb.) geht das gar nicht?

Hab gedacht, vielleicht braucht man für sowas einen anderen Datentyp als Ausgang und bin auf den merkwürdigen Typ "AT" gestoßen. Was soll der? Wenn ich den setze, dann wirds wieder Bool, nur mit dem unterschied, das der Ausgang an sich in der FUP-Ansicht verschwindet und in der Bausteinschnittstelle hinter meiner Symbolik der Name der Symbolik in der liste davor mit "AT" angezeigt wird.

Gruß
 
Hab gedacht, vielleicht braucht man für sowas einen anderen Datentyp als Ausgang und bin auf den merkwürdigen Typ "AT" gestoßen. Was soll der? Wenn ich den setze, dann wirds wieder Bool, nur mit dem unterschied, das der Ausgang an sich in der FUP-Ansicht verschwindet und in der Bausteinschnittstelle hinter meiner Symbolik der Name der Symbolik in der liste davor mit "AT" angezeigt wird.
Mit AT kann man in SCL eine Zweitdefinition einer Variablen erstellen. Z.B. kannst Du ein Word definieren und mit AT zusätzlich als Array of Bool [1..16]
So kannst Du auf sowohl auf das Wort als auch auf die einzelnen Bits zugreifen.
 
Ich hab einen OUT- .. heißt das Formalparameter? als Bool. Dort kann ich jetzt einen Merker setzen, der mir auch ordentlich beschrieben wird. Doch wie stelle ich es an, wenn ich nach diesem Ausgang noch eine Bitverknüpfung setzen will? (ein UND zb.) geht das gar nicht?
Direkt am Baustein-Ausgang geht das nicht. Man muß mit der am BOOL-Ausgang angeschlossenen Variable eine separate Verknüpfung machen. (Für die Zwischenvariable kann man TEMP-Variablen nehmen.)

Bei FB kann man das Zuweisen des Ausgangs auf eine Zwischenvariable weglassen (also Ausgang nicht beschalten) und bei der Verknüpfung direkt den FB-Instanz-Ausgang angeben: U "FB_Instanz_1".Outparameter, U #Timer_1.Q, ...

Harald
 
Zurück
Oben