Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Wie kann man übersichtlich DBs im FB als IN aufrufen?

  1. #1
    Registriert seit
    01.01.2009
    Ort
    Niedersachsen
    Beiträge
    813
    Danke
    180
    Erhielt 79 Danke für 75 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe folgendes vor.

    Ich habe einen FB und möchte in diesem FB öfters verschiedene Adressen von zwei verschiedenen DBs ansprechen.

    Als Beispiel:


    Schnittstelle:

    IN: DB_CAQ_PLC // Datentyp: Block_DB
    IN: DB_PLC_CAQ // Datentyp: Block_DB

    Netzwerk 1: (in FUP)

    U DB_CAQ_PLC [DBX0.0]
    = DB_PLC_CAQ [DBX0.0]


    Netzwerk 2: (in FUP)

    L DB_CAQ_PLC [DBW2]
    T DB_PLC_CAQ [DBW2]

    Leider nimmt STEP7 diesen Befehl nicht an.
    Ich habe leider in der STEP7-Hilfe nichts finden können.
    Und hier in den FAQ ist mein spezieller Fall nicht beschrieben (jedenfalls habe ich nichts passendes gefunden).

    Hat jemand einen Hinweis, wie ich so einen Befehl realisieren kann, oder einen Hinweis, wo in den FAQ ich die passende Erklärung finde?
    Gruß Jan

    Wer fragt, bekommt Antworten.
    Zitieren Zitieren Wie kann man übersichtlich DBs im FB als IN aufrufen?  

  2. #2
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    STEP7 kennt keine "teilindirekten" DB-Zugriffe, das heißt, Du musst Dir ganz klassisch mit AUF [DB] helfen.
    Gruß
    Michael

  3. Folgender Benutzer sagt Danke zu M-Ott für den nützlichen Beitrag:

    Jan (06.02.2012)

  4. #3
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    Mit dem Datentyp "Block_DB" kannst du nicht auf DB-Elemente zugreifen.

    Du könntest damit allenfalls den DB öffnen in alter S5-Manier und dann über Adresse auf DB-Elemente zugreifen.

    z.B.

    AUF DB_CAQ
    U DBX0.0

    Wenn du symbolisch bleiben willst, dann kannst du das z.B. über den Datentyp "STRUCT" machen. Dazu definierst du in deinem DB eine Struktur "STRUCT" und legst in den Eingangsdaten des FB´s ebenfalls solch eine Struktur an.
    Das ganze hat aber denn Nachteil, dass du dabei die komplette Struktur quasi doppelt anlegst (1x im Global-DB und einmal im Instanz-DB des FB) - das bläht natürlich in gewisser Form das Programm auf.

    Am elegantesten löst man sowas mit einem Any-Pointer.
    Dabei wird die Datenstruktur des Global-DB´s dem FB per Any-Pointer mitgeteilt. Im FB hohlt man sich dann die Struktur des Global-DB´s und kopiert sich diese in den TEMP-Bereich.
    Dann kann man im FB symbolisch weiter programmieren.

    Den Any-Pointer musst du aber im FB mit etwas Code auflösen. Dazu findest du hier im Forum aber bestimmt ein paar Beispiele und Beschreibungen.

  5. Folgender Benutzer sagt Danke zu uncle_tom für den nützlichen Beitrag:

    Jan (06.02.2012)

  6. #4
    Jan ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2009
    Ort
    Niedersachsen
    Beiträge
    813
    Danke
    180
    Erhielt 79 Danke für 75 Beiträge

    Standard

    Aber man darf doch immer nur einen DB aufrufen, oder nicht?

    Ich wage zu behaupten, dass dieser Befehl nicht funktionieren würde:

    AUF DB_CAQ_PLC
    AUF DB_PLC_CAQ

    U DBX0.0
    = DBX0.0

    Wie kann ich denn meine Befehle in FUP schreiben?
    In AWL wäre klar.

    AUF DB_CAQ_PLC
    U DBX0.0
    AUF DB_PLC_CAQ
    = DBX0.0

    Aber das Programm sollte möglichst in FUP und Übersichtlich geschrieben werden.
    Gruß Jan

    Wer fragt, bekommt Antworten.

  7. #5
    Jan ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2009
    Ort
    Niedersachsen
    Beiträge
    813
    Danke
    180
    Erhielt 79 Danke für 75 Beiträge

    Standard

    @uncle-tom

    Ich werde deinen Vorschlag mal ausprobieren.

    Danke.
    Geändert von Jan (06.02.2012 um 08:08 Uhr) Grund: Antwortgeber verwechselt.
    Gruß Jan

    Wer fragt, bekommt Antworten.

  8. #6
    Jan ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2009
    Ort
    Niedersachsen
    Beiträge
    813
    Danke
    180
    Erhielt 79 Danke für 75 Beiträge

    Standard

    Zitat Zitat von uncle_tom Beitrag anzeigen
    Mit dem Datentyp "Block_DB" kannst du nicht auf DB-Elemente zugreifen.

    Du könntest damit allenfalls den DB öffnen in alter S5-Manier und dann über Adresse auf DB-Elemente zugreifen.

    z.B.

    AUF DB_CAQ
    U DBX0.0

    Wenn du symbolisch bleiben willst, dann kannst du das z.B. über den Datentyp "STRUCT" machen. Dazu definierst du in deinem DB eine Struktur "STRUCT" und legst in den Eingangsdaten des FB´s ebenfalls solch eine Struktur an.
    Das ganze hat aber denn Nachteil, dass du dabei die komplette Struktur quasi doppelt anlegst (1x im Global-DB und einmal im Instanz-DB des FB) - das bläht natürlich in gewisser Form das Programm auf.

    Am elegantesten löst man sowas mit einem Any-Pointer.
    Dabei wird die Datenstruktur des Global-DB´s dem FB per Any-Pointer mitgeteilt. Im FB hohlt man sich dann die Struktur des Global-DB´s und kopiert sich diese in den TEMP-Bereich.
    Dann kann man im FB symbolisch weiter programmieren.

    Den Any-Pointer musst du aber im FB mit etwas Code auflösen. Dazu findest du hier im Forum aber bestimmt ein paar Beispiele und Beschreibungen.
    Habe mir die Beschreibung in der FAQ angesehen.
    Wenn ich das richtig sehe, muss ich für jeden Datenpunkt einen einzelnen Pointer bauen, was ich aber nicht möchte, weil wir hier von über 200 einzelnen Datenpunkten reden.
    Da wird der Baustein extrem aufgebläht und unübersichtlich.
    Gibt es eine Möglichkeit, nur einen Pointer für den DB zu machen, um die Adresse z.b. so anzusprechen?

    U P#DB_POINTER [DBX0.0]
    L P#DB_POINTER [DBW2]

    Es wäre kein Problem, wenn ich die DB-Nummer in einem bestimmten Format an den FB schreiben müsste.
    BLOCK-DB, INT, HEX, etc.

    Ich möchte nur nicht einen Pointer für jede einzelne Variable erzeugen.
    Gruß Jan

    Wer fragt, bekommt Antworten.

  9. #7
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    wie bereits oben erläutert.

    Du bräuchtest 2 Any-Pointer für deine 2 Global-DB Bereiche. Diese beiden DB-Bereiche müsstest du dann auf TEMP-Bereiche des FB´s umkopieren und am Ende des FB´s wieder zurücksichern auf die Global-DB´s (z.B. mit BLKMOVE).

    Es gibt auch noch die Möglichkeit mit 2 geöffneten DB´s zu arbeiten, indem man das DI-Register also quasi den Instanz-DB mit verwendet.
    Wenn dir die Symbolik nicht so wichtig ist, wäre das vielleicht eine Möglichkeit.

    z.B.

    AUF DI[#DI_Nr]
    L DIX0.0

    Dabei müsstest du deine DB-Nummer aber direkt als INT übergeben - der Datentyp Block_DB geht hier natürlich nicht.

    Weiterhin musst du aber zwingend vor solchen Operationen das Instanz-DB Register sichern und anschliessend wiederherstellen.

    L DINO
    T #SaveDINr

    ....

    AUF DI[#SaveDINr]


    Du kannst auch noch mit den beiden Adressregistern (AR1, AR2) zaubern.
    Das AR2 musst du aber ebenfalls sichern und wiederherstellen - sonst gibt´s evtl. böse Überaschungen.

  10. Folgender Benutzer sagt Danke zu uncle_tom für den nützlichen Beitrag:

    Jan (06.02.2012)

  11. #8
    Jan ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2009
    Ort
    Niedersachsen
    Beiträge
    813
    Danke
    180
    Erhielt 79 Danke für 75 Beiträge

    Standard

    Ich habe eine ganz andere Idee.

    Wie wäre es, wenn ich in dem FB Absolute Adressen verwende z.B. (DB511.DBX0.0) / (DB512.DBX0.0)

    Wenn dann meine zu verwendende DB-Nummern anders sind; z.B. DB411 und DB412, dann kann ich doch einfach DB511 mit BLOCKMOVE in DB411 und DB412 mit BLOCKMOVE in DB 512 schieben und brauche meinen FB nicht zu ändern, sondern muss nur an den zwei BLOCKMOVES die entsprechende DB-Nummer ändern.

    Somit könnte ich im FB in FUP übersichtlich direkt adressieren, weil ich keine Pointer benötige.

    Dann fallen auch Fehlerquellen wie z.B. sichern des Registers weg.

    Was hälst du von der Idee?
    Gruß Jan

    Wer fragt, bekommt Antworten.

  12. #9
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    Es wäre hilfreich, wenn Deine Signale in der gleichen Reihenfolge wären, dann könntest Du die FB-Schnittstelle mit einem UDT aufrufen und extern als auch intern symbolisch arbeiten.
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  13. #10
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MCerv Beitrag anzeigen
    Es wäre hilfreich, wenn Deine Signale in der gleichen Reihenfolge wären, dann könntest Du die FB-Schnittstelle mit einem UDT aufrufen und extern als auch intern symbolisch arbeiten.
    das hab ich ja oben schon beschrieben dass man mittels STRUCT oder eben einem UDT auch arbeiten kann. Dann hast du aber die doppelten Daten in der CPU (1x im Global-DB und einmal im Instanz-DB).

    Zitat Zitat von Jan Beitrag anzeigen
    Was hälst du von der Idee ?
    Nicht viel - da dies nicht besonders elegant gelöst ist. In einem mehrfach zu verwendenden FB sollte man keine absoluten Adressen bei globalen Variablen verwenden.

Ähnliche Themen

  1. Wie kann man CP443-5 als Slave definieren?
    Von Taddy im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.07.2011, 14:44
  2. Wie kann man eine*.sym_xml Datei öffnen
    Von HK09 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 06.07.2010, 08:35
  3. Broadcast-wie kann man das programmieren/nutzen
    Von Holger Levetzow im Forum Feldbusse
    Antworten: 1
    Letzter Beitrag: 26.05.2010, 11:10
  4. Wie kann man in Deutschland obdachlos werden ?
    Von trinitaucher im Forum Stammtisch
    Antworten: 8
    Letzter Beitrag: 09.02.2007, 00:39
  5. Wie kann man auf ein MP zugreifen.....
    Von Frustrated im Forum HMI
    Antworten: 2
    Letzter Beitrag: 19.12.2006, 14:24

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •