RS-Flipflop als R und S einzeln

Mobi

Level-3
Beiträge
1.369
Reaktionspunkte
135
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich habe in einem Netzwerk ein RS-Flipflop dieses muss ich aufteilen, da ich sonst einen Fehler bekomme wegen dem Speicherbereich. Wenn ich jetzt das S und R einzeln mache, wie kann ich dann das machen, dass das R dominant ist wie bei einem RS? Oder ist das automatisch schon so?
Es handelt sich übriegens um eine S7-200 CPU226.
 
Hallo,
ich würde mal sagen : durch die Chronologie. Wenn das "R" als Befehl nach dem "S" kommt und beide sind ausführbar (was ist das dann für ein Code ?) dann würde das "R" über das "S" dominieren.

Gruß
Larry
 
Danke. Aber ich habe nun ein anderes Problem. Unzwar hab ich eine SBR mit einer Schrittkette drin. Diese SBR setze ich mehrmals im OB1 ein. Nun sollen die Schrittketten fast parallel laufen, aber das tun sie nicht, die laufen gleichzeitig. Woran kann das liegen? Jeder hat seine eigenen Sensoren zum weiterschalten dran. Und trotzdem laufen sie gleichzeitig (natürlich nicht genau gleichzeitig, weil das geht ja nicht). Es sollten eigentlich 2-3 Sekunden Unterschied sein. Weiß jemand woran das liegen könnte.
 
@fuss,
er arbeitet mit 'ner S7-200, also muss er LD am Anfang eines Netzwerkes verwenden.

@Mobi,
so wie Larry schon sagte, das R muss im späteren Netzwerk stehen, um dominant zu sein. Das bedeutet, das Du S und R für den gleichen Merker/Variable auch in mehreren Netzwerken verwenden kannst und immer der Befehl, der als Letztes ein High bekommt ist dominant.
Bei der S7-200 mußt Du beim Setzen/Rücksetzen immer noch zusätzlich angeben, wieviele Bits ab der angegebenen Adresse gesetzt werden.

Bsp:
Code:
NETWORK 1 //
LD E0.0
S M0.0,1

NETWORK 2 //
LD E0.1
R M0.0,1

NETWORK 3 //
LD E0.2
S M0.0,1

NETWORK 4 //
LD E0.3
R M0.0,1
Der Eingang E0.3 wäre für's Rücksetzen am höchstwertigsten, egal was die anderen Eingänge für'n Status haben.
Wenn E0.3 Null ist und E0.2 High dann ist dies dominant auch gegenüber dem Rücksetzen durch E0.1.


Zum 2. Problem - kann es sein, dass Du Timer im SBR hast und den SBR mehrfach aufrufst? Das funktionert bei der S7-200 so nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit dem Setzen und Rücksetzen weiß ich nun schon alles. Danke!
Die Flankenauswertung hab ich auch schon nach aussen verlagert. Timer sind keine drin.
Die Variablen sind alle lokal, also haben eine Raute vor.
 
Na im Netzwerk 1 ist halt ein AND mit den Startbedingungen, daran hängt dann ein S #SCHRITT1, welches auf OUT steht. #SCHRITT2 ist dann im Netzwerk 2 eine Weiterschaltbedingung, welches mit anderen Eingängen (#...) an einem AND hängen. And diesem hängt dann ein R #SCHRITT1 und S #SCHRITT2. Und das dann immerweiter. Halt eine Merker-Schrittkette.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich denke mal, die Schrittmerker müssen auf jeden Fall IN/OUT sein, sonst ist der aktuelle Schritt nach dem Zyklus ja wieder weg.
Die reinen OUTs werden in jedem Zyklus innerhalb des SBRs neu gebildet, ohne den Stand der Merker vom vorigen Zyklus zu berücksichtigen.

PS: Es ist meist günstiger, die Schrittkette rückwärts zu programmieren. Also erst Schritt 3, dann 2 und zum Schluß 1.
Vorwärts kann es passieren, das mehrere Schritte oder gar die gesamte Kette in einem Zyklus durchrauscht.
Beim Rückwärtsaufbau ist zwischen jedem Schritt immer mindestens ein Zyklus und somit werden Aktionen zwischen den Schritten meist besser erfasst.
 
Zuletzt bearbeitet:
Ich werds mal ausprobieren mit dem IN/OUT.
Also bei mir wird sie nicht durchrauschen, so schnell sind die Zylinder ja garnicht. *ROFL*
Außerdem läufts ja wenn ich für jedes eine eigne SBR mache ohne Lokalvariablen.
 
Also mit dem IN/OUT funktioniert es. Ist aber eigentlich nicht richtig so. Bei anderen SPSen funktioniert es.

Nun hab ich mal ein paar Zeiten reingemacht, um zu schauen ob das wenigstens läuft.
Aber auch nicht. Wenn die eine Zeit, läuft die andere in der anderen Schrittkette auch.
Hab mal ein Beispielprogramm im Anhang gepackt um das zu verdeutlichen.

Jetzt weiß ich, warum ich S7 nicht mag.
 

Anhänge

  • Schrittkettentest.zip
    2 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
@Mobi:
Du machst hier den Fehler zwischen Global-Variablen und Lokal-Variablen und temporären (nicht remanenten) Variablen nicht zu unterscheiden.
Wenn du das in deiner Phoenix-Steuerung machst (ich kenne das Gerärt nicht) wirst du bestimmt das gleiche Problem bekommen.
Aber - eine S7-200 ist auch keine S7 (auch wenns dran steht).
 
Ich unterscheide aber. In einem SBR sollten möglichst nur lokale drin sein, wie bei mir. Aber bei dem Timer kann ich das ja nicht ändern von global auf lokal. Hab es jetzt anders gelöst. Unzwar nutze ich den TON von Siemens. Wo man dann den aktuellen CV-Wert hat von dem Timer, diesen speicher ich mir zwischen in einer VDxx-Variable. Damit läuft es prima. Ich werd mal morgen früh das aktuelle Projekt hochladen.
 
Also mit dem IN/OUT funktioniert es. Ist aber eigentlich nicht richtig so. Bei anderen SPSen funktioniert es.
...
Ist richtig so!
Ein OUT ist beim Aufruf der SBR immer NULL und wird erst in der SBR bei entsprechenden Bedingungen gesetzt/berechnet (oder nicht) und dann nach aussen weitergegeben. Beim nächsten Aufruf wieder NULL ...
Beim IN/OUT wird der Zustand der Variable von außen in die SBR übernommen, weiterverarbeitet und anschließend der neue Zustand nach außen gegeben. Beim nächsten Aufruf wieder der Zustand von außen, weiterverarbeiten ...
Also wie sollten Deine Schrittmerker ihre Zustände behalten, wenn Du sie nicht außerhalb der SBR speicherst und beim nächsten Zyklus den letzten Zustand in der SBR wieder herstellst?
Wie das bei anderen CPU außer S7 ist kann ich nicht sagen, aber zumindest für mich macht das so Sinn. Wobei die 200er ja nicht mal von Siemens direkt ist, sondern mal extern eingekauft wurde. Deshalb auch die Programmierung mit MicroWin und nicht Step7.



...
Nun hab ich mal ein paar Zeiten reingemacht, um zu schauen ob das wenigstens läuft.
Aber auch nicht. Wenn die eine Zeit, läuft die andere in der anderen Schrittkette auch.
Hab mal ein Beispielprogramm im Anhang gepackt um das zu verdeutlichen.
So wie in Deinem Beispiel funktioniert es nicht, [Edit] wie Du ja schon selbst festgestellt hast. (Wer lesen kann ist klar im Vorteil, also nee Hucki!)[/Edit]
Du rufst den SBR 2x auf, aber innerhalb des SBR wird immer der gleiche Timer T37 (bzw. T38 ) verwendet. Wie soll ein Timer zwei Zeiten messen?

Du hast aber eine CPU 226. Damit stehen Dir die Befehle BGN_ITIME und CAL_ITIME zur Verfügung.
Wenn ein Timer gestartet werden soll (Flanke), speicherst Du mit BGN_ITIME die CPU-Zeit in eine Doppelinteger-Variable. Anschließend vergleichst Du, solange Deine Startbedingung weiter besteht, diese gespeicherte CPU-Zeit mit der aktuellen mittels CAL_ITIME. Die Differenz wird wieder in eine Doppelinteger als Millisekunden ausgegeben. Die Differenz kannst Du dann mit Deinen Vorgabewerten vergleichen und wenn die Zeit abgelaufen ist, Deine Aktionen auslösen.
Und alle diese Variablen können außerhalb der SBR gespeichert werden und die SBR somit für mehrfachen Aufruf mit verschiedenen Zeiten/Starts verwendet werden, wenn Du (wie bisher) innerhalb nur lokale Variablen verwendest.

Und wieder überlegen:
Sollen die Variablen nur reingeben werden; in der SBR vielleicht verarbeitet, aber nicht nach draußen weitergegeben werden nur - IN.
Soll der letzte Zustand der Variable in der SBR verarbeitet und der neue Zustand wieder draußen gespeichert werden - IN/OUT.
Soll eine Variable immer von NULL ausgehend bearbeitet werden und dann der neue Zustand nach draußen - OUT.


Such' mal hier nach "Vitasun". Da hat ich mal ein Programm für jemanden optimiert, so dass er nur eine SBR für mehrere verschiedene Sonnenbanken mit unterschiedlichen Zeiten nutzen konnte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja danke nochmal hucki für die ausführlich Erklärung. Eine SBR hat also das Verhalten von einem FC. Aber schade, dass es keine FB's gibt, die man dann instanzieren kann. Dann geht das auch mit den Merkern. Ist halt blöd das die Timer global sind. Dei 200er ist halt ne low-cost-Variante.
Ich bleib dann doch lieber bei meinen Phoenix-Steuerungen :D. Da kann ich auch die Flankenerkennung mit in einem Baustein packen.
 
...
Eine SBR hat also das Verhalten von einem FC. Aber schade, dass es keine FB's gibt, die man dann instanzieren kann. Dann geht das auch mit den Merkern. Ist halt blöd das die Timer global sind. Dei 200er ist halt ne low-cost-Variante.
Ich bleib dann doch lieber bei meinen Phoenix-Steuerungen :D. Da kann ich auch die Flankenerkennung mit in einem Baustein packen.
Ich mach' zwar selten was anderes als die 200er, aber ich bin der Meinung, auch im FB werden OUTs (zumindest bei S7) jedesmal mit NULL beginnend neu berechnet. Aber mit dem FC hast Du auf jeden Fall recht, denn Du hast ja keine statischen lokalen Variablen (und brauchst deshalb auch keinen Datenbaustein für die SBR).
Und auch bei der 200er kann man die Flankenerkennung in der SBR machen. Man braucht dann halt nur einen eigenen Flankenmerker (ich kann wieder nur mit S7 vergleichen und da braucht man den eh), den man von außen als IN/OUT an die SBR gibt.
Und der 3. Vergleich zur großen S7 - auch da sind die "normalen" Timer global. Man hat nur den Vorteil, dass man die als "Variable" an die/den Funktion/-sbaustein übergeben kann.
Oder man nimmt die IEC-Timer und die machen eigentlich genau dass, was ich mit BGN_ITIME und CAL_ITIME beschrieben habe, nur dass man's nicht "sieht".
 
Ich bin es halt gewohnt nach der IEC 61131 zu programmieren. Da werden dann auch die Zustände im FB gespeichert (und wenn man möchte auch remanent) und somit kann man dann auch ordentliche Schrittketten basteln. Kann man denn von einem fertigen Programm zur IEC-Version wechseln? Oder muss man das am Anfang irgendwo festlegen?
 
Zurück
Oben