Block_DB übergibt kein DB

Nordischerjung

Level-2
Beiträge
835
Reaktionspunkte
115
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich bastel und probiere gerade etwas rum, da ich etliche Fehlermeldungen für 8 Heizzonen auswerten muss.
Nun möchte ich die DBs als Block_DB an den FB übergeben.
Aber im FB wird kein DB geöffnet, warum?

CPU Vipa 315SN, anbei Bilder FB99 Online und OB1 der Aufruf.
Der geöffnete DB ist immer 0, schreibe ich direkt im FB den DB rein (Auf DB61) funktioniert es natürlich
 

Anhänge

  • FB99.jpg
    FB99.jpg
    228,5 KB · Aufrufe: 69
  • OB1.jpg
    OB1.jpg
    60,1 KB · Aufrufe: 36
Zugriff im multiinstanzfähigen FB (Bausteinversion 2) auf einen Parameter vom Typ BLOCK_DB schlägt den DB 0 auf. Nachfolgende Datenzugriffe bringen die CPU in STOP. Bei TIMER, COUNTER, BLOCK_FC, BLOCK_FB wird auch immer T 0, Z 0, FC 0 bzw. FB 0 verwendet.

... step7 hilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kämpfe hier immer noch mit Multi.. :rolleyes:

Kann man folgendes vereinfachen?
NW1
Code:
      L     P##_p_fehler_fuehler        // IN_OUT Stör DB Pointer
      LAR1  
      L     W [AR1,P#0.0]               // erstes Wort des Pointers enthält die DB-Nr.
      T     #DB_Nr_Pointer              // DB Nr Störungs DB

      L     D [AR1,P#2.0]               // Bereichskennung. Byte u. Bitadresse 
      T     #Pointert_Bit
      LAR1                              // Pointer AR1
      LAR2                              // Pointer AR2
      L     P#16.0                      // + 16 Byte, da Quittbit um 16 Byte versetzt
      +AR2
NW2
Code:
      AUF   DB [#DB_Nr_Pointer]         // Auf DB Störung ermittelt aus IN_OUT Pointer

      U     #fehler_zone_1[0]           // DBX14.0 auf Temp übertragen s. NW Kommentar NW 3
      S      [AR1,P#0.0]                // Setze Störbit Bit x.0

      UN     [AR1,P#0.0]                // UN Störbit x.0
      R      [AR2,P#0.0]                // Reset Quittierbit x+16.0

      U      [AR2,P#0.0]                // Quittierbit
      UN    #fehler_zone_1[0]           // keine Fehler mehr
      R      [AR1,P#0.0]                // Störbit
NW3
Code:
      U     #fehler_zone_2[0]           // DBX14.0 auf Temp übertragen s. NW Kommentar NW 3
      S      [AR1,P#0.1]                // Setze Störbit Bit x.0


      UN     [AR1,P#0.1]                // UN Störbit x.0
      R      [AR2,P#0.1]                // Reset Quittierbit x+16.0

      U      [AR2,P#0.1]                // Quittierbit
      UN    #fehler_zone_2[0]           // keine Fehler mehr
      R      [AR1,P#0.1]                // Störbit
Das ganze muss ich 8 mal aufrufen, für jede Zone.
Des weiteren muss ich noch 7 weitere Fehler so auswerten.
Im NW 1 P##p_fehler_fuehler wird dann ein anderer Pointer
# fehler_zone_1[0] ist ein Array of Bool, in dem stehen die Bits für die entsprechenden Fehler z.B. Bit 0 = Fühler defekt, Bit 1 = Fühler falsch verdrahtet usw. denn habe ich für jede Zone

Kann man das ganze irgend wie geschickter lösen oder muss ich tatsächlich 64x STRG+C und STRG+V und alles händisch ändern :eek:.
Ich hab es auch schon mit Loop versucht, aber ich habe gerade ein knick in den Gehirnwindungen. Mir scheint mir fehlt mindestens ein LAR3. Oder denke ich zu kompliziert?
 
Hallo,
ich stolpere gerade über dieses Ding ...
Ich glaube du bringst mit der Multi-Instanz-Geschichte etwas durcheinander. Das folgende wäre wahrscheinlich das, was du eigentlich haben willst aber anscheinend nicht so machst :
Code:
Call FB8 , DB11
 
Call FB8 , DB 12
 
Call FB8 , DB13
 
etc.
... von irgendwelchen Beschaltungen des FB mal abgesehen.
Das kannst du so machen, wenn alles, was du dir "merken" will in dem FB in dem I-DB des FB abgelegt wird - das sind dann deine Variablen im STAT-Bereich desselben.
Ferner müßtest du dann alle Informationen, die der FB von "aussen" benötigt über die Schnittstelle desselben (also die IN's und OUT's und IN_OUT's) übergeben.

Ist es das ... oder denkst du an etwas völlig anderes ...?

Gruß
Larry
 
Ich glaube du bringst mit der Multi-Instanz-Geschichte etwas durcheinander.
:D Ne ich glaube nicht, ich weiß das ich mehrmals den gleichen FB aufrufen kann mit IDB im IDB des übergeordneten FB usw.
Eigentlich wollte ich es nicht so verschachteln, 1 FB Störungen, in dem FB 4 FBs Störung Extruder in den FBs jeweils 56 FBs nur für die Heizung.
Ich dachte es würde mit einer Schleife oder so einfacher werden.
Wenn ich dann doch auf FBs gehen muss, wie übergebe ich dann diese Pointer geschichte, NW 1 bleibt in dem FB und NW 2 wird ein eigener?
 
Na gut,

ich habe 4 Extruder mit je 8 Heizungen. Jede Heizung hat 7 verschiedene Fehlermeldungen die ich auswerten möchte.
Diese liegen als Bit im DBW14 des jeweiligen DBs vor.
z.B. DB61.DBX14.0 == Fühlerbruch, DB61.DBX14.1 == Fühler falsch angeschlossen usw.
Das möchte ich so kurz wie möglich auswerten. Am besten ein lockeren Zweizeiler *ROFL*
Des wegen dachte ich an einer Schleife oder so, aber ich weiß Zykluszeit...
ich dachte mir, da frag ich euch SPS Gurus mal, welchen weg ihr gehen würdet.
 
Wenn Du dass ganze als Multiinstanz machst, wird es sehr aufwendig, da Du das AR2 verwendest (AR2 in FB ist - gelinde gesagt - Mist).

Zu Deinen Fehlermeldungen: Das kannst Du wahrscheinlich vereinfachen indem Du wortweise verknüpfst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... da hatte ich jetzt mit etwas komplett anderem gerechnet ...:rolleyes:

Aber OK ...
Ich würde auch irgend etwas mit dem WORT machen - z.B. es in ein gleichartig aufgebautes Lokalwort (oder besser eine Lokal-Struktur) umladen und von da aus weiter verarbeiten. Das wird dann zwar vielleicht kein 2-Zeiler - aber man kann es auch in ein paar Wochen noch verstehen ...

Gruß
Larry
 
Das möchte ich so kurz wie möglich auswerten. Am besten ein lockeren Zweizeiler.
Die Schleife könnte doch so aussehen:
Code:
    L 61
xxx:T #DBNR
    AUF [#DBNR]
    L DBB 14
    L 1111111
    OW
    L 0
    <>I
    S #Fehler
    L #DBNR
    +1
    L 68
    >I
    TAK
    SPB AUS
    SPA xxx
AUS:NOP 0
OK, sind auch mehr wie zwei Zeilen. ;)
 
Zuletzt bearbeitet:
Na gut,

ich habe 4 Extruder mit je 8 Heizungen. Jede Heizung hat 7 verschiedene Fehlermeldungen die ich auswerten möchte.
Diese liegen als Bit im DBW14 des jeweiligen DBs vor.
z.B. DB61.DBX14.0 == Fühlerbruch, DB61.DBX14.1 == Fühler falsch angeschlossen usw.
Das möchte ich so kurz wie möglich auswerten. Am besten ein lockeren Zweizeiler *ROFL*
Des wegen dachte ich an einer Schleife oder so, aber ich weiß Zykluszeit...
ich dachte mir, da frag ich euch SPS Gurus mal, welchen weg ihr gehen würdet.


Hi,

also ich frage erstmal ob ich es richtig verstehe. Du willst einen FB als Multiinstanz der dir die 4x8x7 Meldungen organisiert?

Wir haben nen Multiinstanzfähigen Ventilbaustein und der übergibt 16 Meldungen ans Panel.

Wie wäre es also wenn du einen FB der Multiintanzfähig ist für eine Heizung bastelst der dir die 7 Meldungen anschuppst.

Diese Multiinstanz rufst 8 mal in einem anderen FB auf Heizung1 bis Heizung8 und diesen FB mit DB kopierst dir dann 4 mal und ruck zuck hast dann dein Projekt.

Bei uns als Beispiel 4 Filter mit 8 Ventilen mit je 16 Meldungen.
Gleiches Prinzip....

Die Daten anbindung ans Panel machst mit einer Struktur und nem Bildbaustein.
Geht enorm schnell und du verbrätst nur eine Variabel...

Wenn du fragen ahst, immer raus damit :)
kann dir auch ein Beispiel schicken...

:ROFLMAO:ROFLMAO:ROFLMAO:ROFLMAO:ROFLMAO:ROFLMAO:cool::cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich bastel und probiere gerade etwas rum, da ich etliche Fehlermeldungen für 8 Heizzonen auswerten muss.

Dafür könntest dir dann nen FC basteln der dir die X(4 in deinem Fall) Instanz DBs "durchsucht" ( die Fehlermeldungen stehen dann immer an gleicher stelle).

Evtl. ist diese Möglichkeit ja was für dich....
 
Hi,

also ich frage erstmal ob ich es richtig verstehe. Du willst einen FB als Multiinstanz der dir die 4x8x7 Meldungen organisiert?
Genau so...
Wie wäre es also wenn du einen FB der Multiintanzfähig ist für eine Heizung bastelst der dir die 7 Meldungen anschuppst.

Diese Multiinstanz rufst 8 mal in einem anderen FB auf Heizung1 bis Heizung8 und diesen FB mit DB kopierst dir dann 4 mal und ruck zuck hast dann dein Projekt.
Und genau das dachte ich, könnte man kürzer machen. Darum auch meine Frage :D
Die Daten anbindung ans Panel machst mit einer Struktur und nem Bildbaustein.
Geht enorm schnell und du verbrätst nur eine Variabel...
Die Datenanbindung hab ich ja schon
Wenn du fragen ahst, immer raus damit :)
kann dir auch ein Beispiel schicken...

Beispiele sind immer gut...:ROFLMAO:

Wenn Du dass ganze als Multiinstanz machst, wird es sehr aufwendig, da Du das AR2 verwendest (AR2 in FB ist - gelinde gesagt - Mist).

Aber dafür hab ich doch...
Code:
      L     DBNO                        // DB-Register
      T     #DB_Register
      TAR1                              // AR1-Register
      T     #AR1_Register
      TAR2                              // AR2-Register
      T     #AR2_Register
Code:
      AUF   DB [#DB_Register]           // DB-Register
      L     #AR1_Register               // AR1-Register
      LAR1  
      L     #AR2_Register               // AR2-Register
      LAR2
im ersten und letzten NW. Nicht gut???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Paule
aber damit sehe ich doch nicht welches Bit True ist
Stimmt, allerdings wollte ich mehr auf die Schleife hinweisen:
Ich dachte es würde mit einer Schleife oder so einfacher werden.
Aber du schreibst ja:
Ich dachte wegen Referenzliste und so,
Dann geht je 61 für DB61 natürlich gar nicht.
Hast Recht, mir ist ein symbolischer Bezug auch enorm wichtig.

Mal ein anderer Ansatz:
Das wird doch alles nur so umständlich durch das Quittierbit.
Ist das bei Euch so üblich / Standard?
Wäre nicht eine Quittierung durch die SPS einfacher?
 
Aber dafür hab ich doch...
Code:
      L     DBNO                        // DB-Register
      T     #DB_Register
      TAR1                              // AR1-Register
      T     #AR1_Register
      TAR2                              // AR2-Register
      T     #AR2_Register
Code:
      AUF   DB [#DB_Register]           // DB-Register
      L     #AR1_Register               // AR1-Register
      LAR1  
      L     #AR2_Register               // AR2-Register
      LAR2
im ersten und letzten NW. Nicht gut???
Bedingt: Jedesmal, wenn Du auf IN, OUT, INOUT, oder STAT zugreifst, musst Du das AR2 zurückschreiben, am Ende des Bausteins ist es unwichtig.
Das AR1 musst Du im Prinzip nicht sichern, zumindestens nicht für das System, sondern höchstens für Dich selbst.
 
Mal ein anderer Ansatz:
Das wird doch alles nur so umständlich durch das Quittierbit.
Ist das bei Euch so üblich / Standard?
Wäre nicht eine Quittierung durch die SPS einfacher?
Eigentlich hat es sich so bei mir zum Stil entwickelt, hab dieses System mal bei HvdR gesehne hier im Forum, fand ich recht gut und hab es dann so ähnlich aufgezogen. Du weißt doch: " Never change a running system" :ROFLMAO:
Aber ich bin für Neuerungen immer zu haben. Wie meinst du das denn, mit quittieren in der SPS?
 
Zurück
Oben