Step 7 Auswertung eines Bits für 2 funktionen

Der Dreschi

Level-1
Beiträge
77
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich hatte jat gestern schon mal Probleme die ich selber gelöst hatte.
Jetzt brauch ich aber mal einen Gedankenanstoß oder eine Lösung.

Bit 1 wird gesetzte, dann soll eine Zeit z.b. 10 sekunden laufen, beim nächsten setzen von dem Bit soll eine Zeit von 20 sekunden laufen. Beim nächsten setzen wieder 10 sekunden, also immer im Wechsel.

Ich benutze eine S7 1200.

Wer kann mir da weiterhelfen oder einen Tip geben.
Gruß
Christian
 
Eine Möglichkeit wäre:

1. Flanke des Bits erzeugen
2. 3 Merker (oder auch DB-Variablen) Bool, die heißen: "10_20_Sek", "10_Sekunden", "20_Sekunden"
3. a: wenn Flanke und "10_20_Sek" = False, dann Merker "10_Sekunden" setzen, Merker "10_20_Sekunden" setzen, Zeit laufen lassen, nach Ablauf der Zeit Merker "10_Sekunden" wieder rücksetzen.
3. b: wenn Flanke und "10_20_Sek" = True, dann Merker "20_Sekunden" setzen, Merker "10_20_Sekunden" rücksetzen, Zeit laufen lassen, nach Ablauf der Zeit Merker "20_Sekunden" wieder rücksetzen.

Abhängig davon, ob Merker "10_Sekunden" oder "20-Sekunden" True ist, entweder je eine andere Zeit (T1, T2) laufen lassen oder die Zeitvorgabe an der Zeitfunktion variable gestallten und den Wert entsprechend laden (Move-Funktion)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,
danke , aber ich stehe auf dem schlauch dann damit. Wenn du mir zeigen könntest wie das in KOP aussieht würd ich das vielleicht eher verstehen.

Ich habe jetzt selber was getipselt, weis aber nicht wie ich das aus dem TIA Portal als Bild speichern kann um es hier reinzusetzen.

Da muß ich erstmal schauen wie das geht.

Danke dir trotzdem schon mal.

Anhang anzeigen Baustein_7.pdf
 
Zuletzt bearbeitet:
... die Zeitvorgabe an der Zeitfunktion variable gestallten und den Wert entsprechend laden (Move-Funktion)
Ich würde da gar nicht so viele Bool Variablen verwenden, sondern direkt mit der negativen Flanke des Eingangsbits bzw. des Timers Ralles letzten Vorschlag umsetzen und die Zeitvorgabe umschalten.
 
Ich würde da gar nicht so viele Bool Variablen verwenden, sondern direkt mit der negativen Flanke des Eingangsbits bzw. des Timers Ralles letzten Vorschlag umsetzen und die Zeitvorgabe umschalten.

Leider weis ich nicht was er genau meint, weder wie ich das umsetzen muss. Ein Scrrenshot von sowas würde mir eventuell weiter helfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So in etwa (ungetestet):



Nicht vergessen, in den Eigenschaften der CPU unter "System- und Taktmerker" das Systemmerkerbyte wegen des "First-Scan"-Bits zu aktivieren.

PS: das dritte Netzwerk muss noch optimiert werden, weil er sonst immer auf 20 Sekunden setzt. :(
 
Zuletzt bearbeitet:
Ok, das werde ich mal testen, ich habe jetzt meine altes Projekt was noch unübersichtlicher ist angepast, das es erst mal läuft. Da muss ich erstmal durchblicken. Bin drei wochen im Urlaub ab morgen.
Soll erstmal laufen. Nachdem Urlaub gehts weiter, da werd ich das ganze Programm noch mal auf den Kopf stellen. Da wirds bestimmt noch jede menge fragen geben bezüglich optimierung.
Gruß
Christian
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So,
melde mich wieder. Fragen habe ich auch gleich. Ich bekomme das nict hin das umzusetzen. Hab nen neuen Baustein erzeugt und das mit den rauten in den beispielen nimmt der nicht. Das wird rot markiert, also irgendwas habe ich da falsch gemacht.
Was mache ich falsch.
Wäre nett wenn mir nochmal geholfen wird.


Edit:
Da ich wenig Programmierkenntnisse habe, habe ich jetzt noch nen Tutorial bei Siemens gefunden und versuche es das ganze nochmal in ner ruhigen Minute und wende mich dan mit konkreten Fragen an euch.
Gruß
Christian
 
Zuletzt bearbeitet:
Konnte mir Dein Projekt noch nicht ansehen, da ich unterwegs bin.
Aber wenn er bei Dir die Namen mit der Raute nicht nimmt, dann hast Du diese Symbole in der Schnittstelle des Bausteins nicht deklariert.
Die Schnittstelle lässt sich am oberen Rand des Programmeditors aufklappen. Schau mal in meine letzten Beiträge in Kutis letzten Thread, da findest Du einen Screenshot davon.
 
Zuletzt bearbeitet:
das mit den rauten in den beispielen nimmt der nicht. Das wird rot markiert, also irgendwas habe ich da falsch gemacht.

Hallo.

Es sind in dem Beispiel Lokal Variablen, die muss du oben im Deklarationsteil deines FBs erst "bekannt geben". Wenn dann Name und Typ korrekt sind, ist es dann im Netzwerk nicht mehr rot...
Du kannst dafür aber auch ertsmal einen Merker verwenden.

Gruß
DerMatze
 
Ja, da ist einiges falsch:

Du hast zwar die beiden lokalen Variablen "Zeitvorgabe" und "Zeitvorgabe neu" erstellt, aber diese haben das Format "bool" bzw. "byte". Beide sollen aber einen Inhalt vom Typ "Time" bekommen. Also musst Du das auch bei der Deklaration angeben.

Im Netzwerk 2 verwendest Du dann die falsche Flankenabfrage. Die von Dir gewählte ist eine Zuweisung, zu erkennen an der Klammer (). Du benötigst aber die Abfrage, gekennzeichnet durch ||. Dazwischen steht dann die Art der Flanke, die Du mit N für Negativ richtig gewählt hast.

PS: Ich hab' gerade gesehen, dass Du vermutlich mal das Taktmerkerbyte aktiviert hattest und dafür auch das MB0 angegeben war, wie jetzt für das Systemmerkerbyte. Dadurch gibt's für die Adresse M0.0 (und einige folgende) zwei Symbole, worüber natürlich auch gemeckert wird. Diese Symbole also löschen oder andere Adressen eintragen.


Ich könnte Dir das korrigierte Programm zwar jetzt hochladen, aber ich vermute mal, dass Du's erst mal noch selbst versuchen willst.
;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann gibt es noch 3 Sachen, die an meinem Beispiel oben nicht besonders gut gelöst sind und die Du dann gleich mit verbessern könntest:

1. Verwende ich als Flankenmerker für die negative Flanke des Timers einen Merker. In einem FB ist es aber besser, dafür eine lokale statische Variable vom Typ BOOL zu verwenden.

2. Der Timer hat jetzt einen eigenen Instanzdatenbaustein. Da er aber in einem FB verwendet wird, ist es m.M.n besser, diese Instanz in die Instanz des FBs mit einzubetten. Man spricht dann von einer Multiinstanz. Dazu wird eine weitere statische Variable vom Typ "IEC_Timer" erstellt und diese dem Timer anstatt des eigenen DBs zugewiesen. Dabei muss der Typ des Timers dann auch auf Multiinstanz umgestellt werden.
Noch einfacher ist es, den Timer noch mal neu einzufügen. Wenn bei den aufpoppenden Eigenschaften des Timers dann gleich Multiinstanz ausgewählt wird, legt TIA die statische Variable automatisch an und weist sie dem Timer zu.

3. Und um den FB komplett zu kapseln, sollte man auch den Starteingang I0.0 auf die Schnittstelle des FBs führen. Also eine lokale Input-Variable z.B. "Start Timer" anlegen und diese Variable auf den Freigabeeingang des Timers im Netzwerk 3 geben. Dann den Aufruf des FBs im OB1 aktualisieren und an den Eingang "Start Timer" des FBs dann den Eingang I0.0 schreiben.
 
So, theoretisch hats jetzt schon mal geklappt, nichts mehr rot, testen kann ich das widerum zuhause erst. Wenn ich das aber in ne 300 er reindattel, sollte das doch auch gehen zum testen oder gibts da die systemmerker in dem sinn nicht? Vlt sollte ich mir zum testen noch ne CPU holen :)

Edit: gerade gesehen das du geantwortet hast. Da sind sie wieder die böhmischen Dörfer
 
Hier mal in Bildern:

Erweiterte Schnittstelle


Verbessertes Programm


Aufruf FB




Es ist zwar nicht verboten, in FBs mit globalen Variablen (im Beispiel von Post#7 Merker und SPS-Eingang) zu arbeiten, aber es ist auch kein guter Programmierstil, weil der Baustein nicht in sich gekapselt ist. Besser ist es, innerhalb eines Bausteins nur lokale Variablen zu verwenden. Wenn ein Baustein mehrmals im Programm verwendet werden soll, ist diese Kapselung (meist, hier ist das Systemmerkerbit eine dieser Ausnahmen) sogar unumgänglich. Es ist also nicht verkehrt, sich diese Programmierweise gleich anzueignen.

Also sorry, dass ich das überhaupt erst anders aufgezeigt habe.
:oops: :cry:
 
Zuletzt bearbeitet:
Zurück
Oben