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.