S_VIMP in Funktion: Alle die Funktion verwendenen Ausgänge werden geschaltet

sbro

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Frohes Neues.

Ich nutze eine S7-300 zur Heimautomatisierung und bin Autodidakt. Vieles läuft schon doch eine Sache verstehe ich nicht. Vielleicht könnt Ihr mir ja die Augen öffnen.

Hintergrund:
Ich steuere meine Rollläden u.a. über einen Taster je Raum. Je Raum habe ich auch einen Funktionsbaustein erstellt, der im OB1 aufgerufen wird. Die Raum-Funktionsbausteine (z.B. FC5 Küche, FC6 Wohnen,...) rufen die Funktionsbausteine FC1 RolloRauf bzw FC2 RolloRunter mit den entsprechenden Übergabeparametern auf. Soweit so gut.
In FC1 bzw. FC2 verwende ich derzeit ziemlich trivial nur S_IMPULS. Vereinfacht gesagt, triggert ein Merker / Eingang den Impuls, der so lange läuft wie das Eingangssignal 1 ist. Im Umkehrschluss heißt dies aber, der Taster muss für die Laufzeit des Rollladens gehalten werden. Also wollte ich S_IMPULS durch S_VIMP ersetzen, dessen Ausgang auch bei Flankenwechsel während der Laufzeit 1 bleibt.

Problem:
Tausche ich nun S_IMPULS durch S_VIMP werden alle Ausgänge, die die Funktion verwenden, auf 1 geschaltet. Es fahren also alle Rollos runter, da ja FC5, FC6,... alle auf die gleiche "Basis"-Funktion zurückgreifen.
Versuchte Lösungen:
- Austausch S_VIMP durch SFB3 - keine Änderung der Symptome
- Merker statt Ausgang an Q von S_VIMP - ebenfalls nix.
- neues Projekt, neue Timer, Änderung von FC nach FB für Basis-Funktion (FC1,FC2)...

Kann mich jemand auf den richtigen Pfad führen? Irgendwas grundlegendes muss mir entgangen sein...
Vielen Dank und viele Grüße,Sascha
 
Nachtrag:
- CPU ist eine 315-2 DP
- Step 7 5.5

BeispielCode:
OB1:
Code:
CALL "Küche"

FC5: Küche
Code:
      U     "1 runter"      =     L      0.0
      BLD   103
      U     "1 rauf"
      =     L      0.1
      BLD   103
      U     "M1"
      =     L      0.2
      BLD   103
      U     "sch_kueche_rauf"
      =     L      0.3
      BLD   103
      U     "Alle Rauf"
      =     L      0.4
      BLD   103
      CALL  "FC kl Rollladen rauf"
       Rollo_Runter       :=L0.0
       Rollo_Rauf         :=L0.1
       Meldespeicher      :=L0.2
       Schalter_fuer_rollo:=L0.3
       AlleRauf           :=L0.4
       Rollo_faehrt_Rauf  :="r1_rauf"
      NOP   0

"FC kl Rollladen rauf"

Code:
      U(          O(    
      UN    #Rollo_Runter
      U     #Rollo_Rauf
      S     #Meldespeicher
      U     #Rollo_Runter
      R     #Meldespeicher
      U     #Meldespeicher
      )     
      O     #Schalter_fuer_rollo
      O     #AlleRauf
      )     
      L     S5T#20S
      SI    T      3
      NOP   0
      NOP   0
      NOP   0
      U     T      3
      =     #Rollo_faehrt_Rauf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du den FC Rolladen rauf mehrfach verwenden willst, mußt du auch jedesmal eine andere Zeit verwenden .
Gib im Aufruf die zeit mit an, als Eingangswert Timer.
 
Hm, leider negativ. Hier mal der simplifizierte Test-Code mit S_VIMP:

FC40: Küche (enthält zu Testzwecken zwei Taster, Küche und Bibliothek). FB30 ist nun der neue Basisbausten
NW1 -
Code:
    U     "sch_kueche_runter"      =     L      0.0
      BLD   103
      U     "sch_kueche_rauf"
      =     L      0.1
      BLD   103
      CALL  "TESTFKT: rollos ru VIMP" , DB30
       rX_runter_Eingang:=L0.0
       rX_rauf_Eingang  :=L0.1
       rX_timer         :=S5T#35S
       rX_runter        :="1 runter"
      NOP   0
NW2:
Code:
    U     "sch_bib_runter"      =     L      0.0
      BLD   103
      U     "sch_bib_rauf"
      =     L      0.1
      BLD   103
      CALL  "TESTFKT: rollos ru VIMP" , DB30
       rX_runter_Eingang:=L0.0
       rX_rauf_Eingang  :=L0.1
       rX_timer         :=S5T#2S
       rX_runter        :="7 runter"
      NOP   0

Und hier der Übeltäter FB30 mit VIMP und Timer als Übergabewert:
Code:
      U     #rX_runter_Eingang      UN    #rX_rauf_Eingang
      L     #rX_timer
      SV    T     10
      U     "emergencyStopRollos"
      R     T     10
      NOP   0
      NOP   0
      U     T     10
      =     #rX_runter

Schalte ich z.B. E3.0 werden die Merker "1 runter" und "7 runter" auf 1 gesetzt. Zeitgleich. Doof. Nachtrag: Schalte ich E3.0 (sch_kueche_runter) sind beide Merker 35s gesetzt. Schalte ich E1.7 (sch_bib_runter) sind es für beide nur die übergebenen 2s.

Vielen Dank und viele Grüße,
Sascha
 
Zuletzt bearbeitet:
Wenn es Dir nichts ausmacht, lade doch mal das komplette Projekt hoch. Da kann man Dir vielleicht besser helfen. Nur Schnipsel sind schön, vor allen Dingen nicht bei Mehrfach-Aufrufen von Bausteinen.
 
Hm, leider negativ. Hier mal der simplifizierte Test-Code mit S_VIMP:

FC40: Küche (enthält zu Testzwecken zwei Taster, Küche und Bibliothek). FB30 ist nun der neue Basisbausten

Dem FB30 übergibst du zweimal denselben Instanzdb (in NW1 und in NW2) ich nehme nicht an dass das so gewollt ist.

Keine absolute Adressierung innerhalb eines mehrfach aufgerufenen Bausteins.
Heisst, Kein!:
SI T 3
U M3.0
L DB12dbx0.0
etc.

Nur so:
U #xxx (xxx steht für das entsprechende Label)
SI #xxx

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super, danke, vielen Dank.

Ich nutze nun verschiedene Timer-Nummern und die Sache funktioniert zumindest für meine Testumgebung reibungslos.

Allerdings würde ich das gerne besser verstehen (wie erwähnt, Autodidakt:D).

- Warum kann bei bei Verwendung von S_IMPULS auf einen einzigen Timer zurückgreifen? Was ist hier der Unterschied?
- Was ist der Unterschied zwischen relativer u absoluter Adressierung? Was ist mit "Labels" gemeint?

Nochmal Danke,
Sascha
 
- Warum kann bei bei Verwendung von S_IMPULS auf einen einzigen Timer zurückgreifen? Was ist hier der Unterschied?

Du brauchst auch da verschiedene Timeradressen.

- Was ist der Unterschied zwischen relativer u absoluter Adressierung? Was ist mit "Labels" gemeint?

Absolute Adressen sind Adressen auf die du aus einem Baustein heraus direkt zugreifst also z.B. auf einen DB (db3.dbx0.0) Diese Adresse ist dann fest Ausprogrammiert in dem Baustein und in jedem Aufruf genau dieselbe. Ist allerdings etwas unklar ausgedrückt. Natürlich darf man aus so einem mehrfach aufgerufenen Baustein auch nicht Symbolisch auf eine externe Adresse zugreifen. In einem Mehrfach Aufgerufenen Baustein greift man immer nur auf die Deklarierten Variablen des Bausteins selber zu:
IN, OUT, IN_OUT, TEMP, STAT darin müssen diese Variablen deklariert werden (was ich vorher als Label bezeichnet habe)

Wenn du also einen Timer in deinem Baustein brauchst, deklarierst du im IN Variablenteil deines Bausteins eine Variable mit einem Namen z.B. Timer1 mit Datentyp "Timer"

Diesen Timer1 hängst du dann so an:
SI #Timer1

Wenn du deinen Baustein mit Call aufrufst hast du dann einen Parameter der Timer1 heisst daran kannst du dann die direkte Adresse des Timers anhängen

mfG René
 
Zurück
Oben