Multiinstanz FB funktioniert nicht

Bär1971

Level-1
Beiträge
220
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe einen FB geschrieben um per Steuerungsauftrag an einem OP Bilder umzuschalten. Diesen FB rufe ich in Multiinstanz auf. Wenn ich ihn nur einfach aufrufe, funktioniert es, wenn ich die Sollbildnummer per Hand ändere und den Baustein neu übertrage. (Oder funktioniert er da auch nur einmal?)

Wenn ich wie im folgenden Code den Baustein zweimal aufrufe, funktioniert die Umschaltung der Bilder exact ein je mal. Danach wird nur noch "0" ausgegeben als Steuerungsauftrag und Bildnummer.

Aufrufender FB:
der FB100 wurde im Vorkopf des FB´s als STAT-Variable angelegt:
Bildanwahl_HMI_1 / Datentyp FB100 / Adresse 2.0
Bildanwahl_HMI_2 / Datentyp FB100 / Adresse 16.0
Code:
 U     M     10.0
      SPBN  BLD2
      CALL  #Bildanwahl_HMI_1
       Bedingung    :=M10.0
       BildNr       :=10
       Timernummer  :=T50
       SollZeit     :=S5T#1S
       Steuerauftrag:=DB100.DBW14
       Bildanwahl   :=DB100.DBW16
      SPA   BLDE
BLD2: NOP   0
      U     M     10.1
      CALL  #Bildanwahl_HMI_2
       Bedingung    :=M10.1
       BildNr       :=100
       Timernummer  :=T51
       SollZeit     :=S5T#1S
       Steuerauftrag:=DB100.DBW14
       Bildanwahl   :=DB100.DBW16
      SPA   BLDE
BLDE: NOP   0

Und der FB100 selber:
Code:
      U     #Bedingung
      FP    #HM_Pos_Flanke
      L     #SollZeit
      SA    #Timernummer
      NOP 0
      U     #Timernummer
      SPBN  END1
      L     #BildNr
      T     #Bildanwahl
      L     51
      T     #Steuerauftrag
      SPA   END2
END1: L     0
      T     #Bildanwahl
      T     #Steuerauftrag
END2: NOP   0

Wer kann mir da etwas helfen?

Gruß vom Bärle
 
Hallo,
der Steuerungsauftrag hat seine eigenen Gesetze. Bevor du ihn aktivierst mußt du erst überprüfen, ob 0 drin steht - nur dann ist er überhaupt bereit. Du brauchst in dem Zusammenhang auch gar keinen Timer. Der Ablauf geht also so :
Steuerungsauftrag = 0
- dann neuen Auftrag erteilen.
- ist Auftrag wieder 0, dann ist der erteilte abgearbeitet und ein neuer möglich.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
 U     M     10.0
      SPBN  BLD2
      CALL  #Bildanwahl_HMI_1
       Bedingung    :=M10.0
       BildNr       :=10
       Timernummer  :=T50
       SollZeit     :=S5T#1S
       [COLOR=red][B]Steuerauftrag:=DB100.DBW14[/B][/COLOR]
[COLOR=red][B]      Bildanwahl   :=DB100.DBW16[/B][/COLOR]
      SPA   BLDE
BLD2: NOP   0
      U     M     10.1
      CALL  #Bildanwahl_HMI_2
       Bedingung    :=M10.1
       BildNr       :=100
       Timernummer  :=T51
       SollZeit     :=S5T#1S
      [COLOR=red][B] Steuerauftrag:=DB100.DBW14[/B][/COLOR]
[COLOR=red][B]      Bildanwahl   :=DB100.DBW16[/B][/COLOR]
      SPA   BLDE
BLDE: NOP   0

Und der FB100 selber:
Code:
      U     #Bedingung
      FP    #HM_Pos_Flanke
      L     #SollZeit
      SA    #Timernummer
      NOP 0
      U     #Timernummer
      SPBN  END1
      L     #BildNr
      T     #Bildanwahl
      L     51
      T     #Steuerauftrag
      SPA   END2
[COLOR=red][B]END1: L     0[/B][/COLOR]
[COLOR=red][B]     T     #Bildanwahl[/B][/COLOR]
[COLOR=red][B]     T     #Steuerauftrag[/B][/COLOR]
END2: NOP   0

Wer kann mir da etwas helfen?

Gruß vom Bärle
Hi Bärle,
Du überschreibst immer den gleichen Steuerungsauftrag wieder.
Darum funktioniert er nur einmal.
Den Steuerungsauftrag musst auch gar nicht zurücksetzen, das macht das Panel selbständig.
 
Hallo Larry,
Hallo Paule,

bin jetzt zu Hause und kann erst morgen früh weiterschauen.

Wegen der Zeit (welche ich dann nicht brauchen soll), es ist egal wie lange ich warte, ein neuer Auftrag lässt sich nicht im Panel aktivieren.

Wegen dem Überschreiben, wird ein Merker high wird die 0 ja nicht mehr transferiert. Sondern für die angegebene Zeit der Auftrag mit Bildnummer ausgelöst.

Oder hängt sich die Kiste auf, wenn der Auftrag nicht nur einen Zyklus lang high bzw aktiv ist?

Ich gebe mit der positiven Flanke also nur einen Zyklus lang die Bildnummer und die 51 aus? Hört sich ja einfach an *grins*. Werds morgen gleich mal versuchen.

Wenn Ihr noch was dazu wisst, ich sauge alle Infos auf wie ein trockener Schwamm...

Erstmal Danke natürlich und
Grüße vom Bärle
 
Wegen dem Überschreiben, wird ein Merker high wird die 0 ja nicht mehr transferiert. Sondern für die angegebene Zeit der Auftrag mit Bildnummer ausgelöst.
Ja, Du schreibst die "0" beim ersten Baustein nicht drauf wenn der Merker High ist, aber dafür beim zweiten Baustein. ;)
Wie gesagt, das zurücksetzen des Steuerungsauftrages macht das Panel wenn es mit der Arbeit fertig ist. Mal ein intelligenter Datenaustausch. :D
Einfach mit einer Flanke Deinen Befehl absetzen und wie Larry schon sagt, am besten das Steuerwort lesen und erst wieder beschreiben wenn es "0" hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau so werd ichs morgen früh gleich abändern und probieren.

Aber trotzdem die Frage, sind alle Merker low wird der FB100 kein einziges mal aufgerufen, dürfte damit auch keine 0 schreiben. Erst mit Merker = High wird der Baustein einmal aufgerufen. Nur ein "call..." ist dann ja aktiv. Und dort wird mit aktiver Flanke ja der Steuerungsauftrag abgesetzt bevor die Zeit abgelaufen ist und die 0 transferiert wird.

Aber trotzdem werd ichs morgen gleich mal so ändern wie ihr es gesagt habt.
(Ist Siemens, da muss man wohl nicht alles verstehen, auch wenns logisch erscheint...)

Gruß Bär
 
Aber trotzdem die Frage, sind alle Merker low wird der FB100 kein einziges mal aufgerufen, dürfte damit auch keine 0 schreiben. Erst mit Merker = High wird der Baustein einmal aufgerufen. Nur ein "call..." ist dann ja aktiv.
Ja, jetzt sehe ich es. Du springst ja drüber.
Wann nimmst Du denn dem Merker 10.0 wieder weg?
Bekommt der Timer es überhaupt mit das er fertig ist und wieder neu gestartet wird?
Nach dem selbst ein Baustein nur einmal funktioniert, wird vielleicht sogar das der Fehler sein.
 
Ja, jetzt sehe ich es. Du springst ja drüber.
Wann nimmst Du denn dem Merker 10.0 wieder weg?
Bekommt der Timer es überhaupt mit das er fertig ist und wieder neu gestartet wird?
Nach dem selbst ein Baustein nur einmal funktioniert, wird vielleicht sogar das der Fehler sein.

Wann der Merker weggenommen wird dürfte doch eigentlich unwichtig sein, da das ganze ja Flankengetriggert ist, oder nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wann der Merker weggenommen wird dürfte doch eigentlich unwichtig sein, da das ganze ja Flankengetriggert ist, oder nicht?
Nein, da der Baustein ja dann nicht mehr aufgerufen wird und die Zeit dann eventuell nicht merkt dass sie neu gestartet wird.
Der Merker (Bausteinaufruf) muss auf jeden Fall solange da sein bis die Zeit abgelaufen ist.
 
Nein, da der Baustein ja dann nicht mehr aufgerufen wird und die Zeit dann eventuell nicht merkt dass sie neu gestartet wird.
Der Merker (Bausteinaufruf) muss auf jeden Fall solange da sein bis die Zeit abgelaufen ist.

da ich den Merker mit Variable Steuern ausgelöst habe um den Baustein zu testen bevor ich stundenlang weiter programmiere, kann ich sagen, dass der Merker deutlich länger als eine Sekunde high war.
 
Also ich hab das jetzt mal probiert.
Alles was rot markiert ist, entfernen und dann funktioniert es.
Code:
[B][COLOR=red]    U     M     10.0   [/COLOR][/B]
[B][COLOR=red]    SPBN  BLD2[/COLOR][/B]
      CALL  #Bildanwahl_HMI_1
       Bedingung    :=M10.0
       BildNr       :=10
       Timernummer  :=T50
       SollZeit     :=S5T#1S
       Steuerauftrag:=DB100.DBW14
       Bildanwahl   :=DB100.DBW16
[COLOR=red][B]    SPA   BLDE[/B][/COLOR]
[COLOR=red][B]BLD2: NOP   0[/B][/COLOR]
[COLOR=red][B]    U     M     10.1[/B][/COLOR]
      CALL  #Bildanwahl_HMI_2
       Bedingung    :=M10.1
       BildNr       :=100
       Timernummer  :=T51
       SollZeit     :=S5T#1S
       Steuerauftrag:=DB100.DBW14
       Bildanwahl   :=DB100.DBW16
[B][COLOR=red]    SPA   BLDE[/COLOR][/B]
[B][COLOR=red]BLDE: NOP   0[/COLOR][/B]

Und der FB100 selber:
Code:
      U     #Bedingung
      FP    #HM_Pos_Flanke
      L     #SollZeit
      SA    #Timernummer
      NOP 0
      U     #Timernummer
      SPBN  END[COLOR=blue][B]2[/B][/COLOR] [COLOR=blue][B]// geändert[/B][/COLOR]
      L     #BildNr
      T     #Bildanwahl
      L     51
      T     #Steuerauftrag
[B][COLOR=red]     SPA   END2[/COLOR][/B]
[B][COLOR=red]END1:[/COLOR][COLOR=red] L     0[/COLOR][/B]
[B][COLOR=red]    T     #Bildanwahl[/COLOR][/B]
[B][COLOR=red]    T     #Steuerauftrag[/COLOR][/B]
END2: NOP   0
PS: Die Flanke ist Stat_VAR
und Bildanwahl und Steuerungsauftrag ist IN_OUT
aber ich denke das hast Du so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
oops, ne, Bildanwahl und Steuerungsauftrag hab ich auf nur OUT gesetzt......

Der Grundgedanke für die Sprungleiste war, das ich nur einen Timer benötige, hätte dann vielleicht 20-30 FB100-Aufrufe, aber nur den T50 benutzt. Aber wir haben ja schon gesagt, das die Zeitfunktion ganz raus kann. Das der einmalige Zyklusdurchlauf reicht und das das OP die DB-Adresse selbst wieder zurücksetzt.

Werds morgen früh gleich mal probieren. Die Zeitfunktion im FB100 zusätzlich zu deinen Änderungen rausnehmen und als VKE vor der Flankenbildung noch ne Abfrage auf Steuerungsauftrag = 0 integrieren.
 
Und zu guter letzt würde ich es so schreiben:
Code:
      L     #Steuerauftrag
      L     0
      ==I
      U     #Bedingung
      SPBN  ENDE
      L     #BildNr
      T     #Bildanwahl
      L     51
      T     #Steuerauftrag
      SET
      R    #Bedingung
ENDE: NOP   0
Jetzt kannst Du das sogar in eine FC schreiben. :D
 
Und zu guter letzt würde ich es so schreiben:
Code:
      L     #Steuerauftrag
      L     0
      ==I
      U     #Bedingung
      SPBN  ENDE
      L     #BildNr
      T     #Bildanwahl
      L     51
      T     #Steuerauftrag
      SET
      R    #Bedingung
ENDE: NOP   0
Jetzt kannst Du das sogar in eine FC schreiben. :D

Ist eine prima Lösung (auch Speichersparend). Aber wenn die Bedingung im Programm weiter angesteuert bleibt (und wenn nur sekunden, würde ja die Variable Bedingung wieder neu gesetzt und ohne Flankentriggerung würde der Baustein x-mal durchlaufen, oder nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist eine prima Lösung (auch Speichersparend). Aber wenn die Bedingung im Programm weiter angesteuert bleibt (und wenn nur sekunden, würde ja die Variable Bedingung wieder neu gesetzt und ohne Flankentriggerung würde der Baustein x-mal durchlaufen, oder nicht?
Ja klar, es kommt halt immer darauf an wie es im Programm genutzt oder verschaltet wird. Da gibt es natürlich selten die perfekte Lösung, einmal ist es so besser und ein andermal wieder so.
Mit dem Beispiel könntest Du die Flanke die die Bedingung setzt, im normalen Ablauf ansteuern. Brauchst also keinen Multi-FB nur für die Flanken, allerdings spricht da auch nichts dagegen.
Oder den Flankenmerker noch als Hilfsmerker übergeben.
Wie gesagt, gibt es sehr viele Möglichkeiten.
Das ist ja auch das schöne an dem Job. :D
 
Ich glaube das ist genau die richtige Lösung. Ich mach aus dem FB ein FC wie du ihn zuletzt vorgeschlagen hast und steuere ihn mit einer Bedingungsflanke an. Er wird nur einmal durchlaufen und die Flankenmerker nehmen auch nicht viel Speicher weg im aufrufenden FB. Das ist die sauberste und einfachste Lösung.

Warum einfach wenns auch kompliziert geht (sich an den Anfang des threads erinnert) *grins*

Vielen Dank nochmal für die großartige Hilfe.
 
Zurück
Oben