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

Ergebnis 1 bis 9 von 9

Thema: Block_DB für FB Parameter verwenden

  1. #1
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo
    ich möchte in einem FC ein SFB aufrufen und ein Block_DB übergeben bzw. die Parameter des SFB sollen auf diesen Block_DB zugriefen

    OB1:
    Call FC1
    BlockDBSFB:= DB12 // DB für SFB12
    BlockDBSpeicher:=DB250 // dient als Speicher bereich

    FC1:
    Call SFB12, #BlockDB12
    REQ :="DatenDB".SendReq //DB250.DBX1316.0
    R :="DatenDB".SendReset //....
    ID :=W#16#1000
    R_ID :=DW#16#0 //for ASCII and 3964(R) always zero
    DONE :="DatenDB".SendDone
    ERROR :="DatenDB".SendError
    STATUS:="DatenDB".SendStatus
    SD_1 :=P#DB250.DBX 23.0 WORD 20 // Anypointer soll auch auf BlockDBSpeicher zugreifen
    LEN :="DatenDB".LEN

    Anstelle von "DatenDB" (DB250) soll der verweis auf das BlockDBSpeicher gemacht werden.
    REQ:= BlockDBSpeicher.DBX1316.0
    SD_1:= P#BlockDBSpeicher.DBX23.0 Word 20

    Dies hat den hintergrund das der FC1 geschütz werden soll aber durch die Weitergabe der DBnummer mit jeder beliebigen DBnummer gearbeitet werden kann.

    Vor dem CALL SFB arbeite ich mit AUF DB[#vari] somit kann ich auf ein Variablen DB zugreifen aber wie geht das bei dem CALL SFB aufruf.
    Um konflikte zu vermeiden Lade / Trans ich vor jedem CALL SFB & AUF DB... , das Adressregister1&2 in eine Tempvari.
    Ich möchte die DBs Variabel halten!

    Gruß Erick
    Geändert von MC_DARKSTONE (26.05.2015 um 12:00 Uhr)
    Zitieren Zitieren Block_DB für FB Parameter verwenden  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Hallo,
    der Datentyp Block_DB lässt keine Rückschlüsse auf den wirklich übergebenen DB bzw. dessen Aufbau zu.
    Somit kannst du den so, wie von dir gewünscht, nicht einsetzen (Daten_DB).
    Beim SFB12 funktioniert das deswegen, da der Aufruf die Brauchbarkeit des übergebenen DB's zur Entwicklungszeit nicht gegencheckt. Das macht dann erst die CPU und wenn es da dann nicht passt dann geht halt die in Stop.

    Das, was du vorhast, ist m.E. nur machbar, wenn du auf der Schnittstelle den Datentyp als DB250 bzw. seinen symbolischen Namen angeben würdest ...

    Gruß
    Larry

  3. #3
    MC_DARKSTONE ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Wenn ich das richtig verstehe kann ich für den IDB von SFB12 nicht den Block_DB verwenden "CALL SFB12, #BlockDBSFB"

    Für die Parameter des SFB12 bekomme ich nur ein variablen DB wenn ich diesen mit einem festen Symbolischen namen deklariere. "DatenDB"

    Was mache ich mit dem AnyPointer?
    Wenn ich diesen wie hier http://www.sps-forum.de/faq/12923-an...atentypen.html beschrieben erstelle, wie kann ich diesen dann übergeben?
    // ------------------------
    // AnyPointer erstellen P#DB250.DBX.23.0 WORD 20
    // ------------------------

    L B#16#10 //10h für s7
    T "DatenDB".DBB1400
    L B#16#4 //Typ BYTE
    T "DatenDB".DBB1401
    L 20 //Anzahl (Wiederholungsfaktor)
    T "DatenDB".DBW1402
    L 250 // Datenbaustein 250
    T "DatenDB".DBW1404 //
    L 23 //Anfangsadresse
    SLD 3 //Pointer bauen
    T "DatenDB".DBD1406
    L B#16#84 //Speicherbereich (hier DB)
    T "DatenDB".DBB1406

    So sollte ab "DatenDB".DBB1400 ein Anyointer stehen aber wie übergebe ich diesen an den SFB12
    Gruß Erick

  4. #4
    MC_DARKSTONE ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Wie gesagt, ich möchte Direkteadressierung vermeiden da der Benutzer selbst entscheiden soll welcher DB er verwenden möchte bzw. welcher DB noch frei ist.

    Ich könnte über den Operandenvorrang auf die Symbolische stellen somit kann ich den DB250 umbenen in DB290 und die zuweisung bleibt gleich.
    Aber dies geht nur zum test denn später soll nur ein DB mit einem Array deklariert werden ohne infos/symbole.

    Am besten wäre eine Lösung in der ich DatenDB.DBX1316.0 schreiben könnte oder wenn ich mit Pointer arbeiten könnte was mir aber ROT makiert wird

    AUF DB [#nummer]
    ...
    CALL SFB12, ????
    REQ:= DatenDB.DBX1316.0 // fehler
    REQ:= DBX [AR1, P#0.0] // fehler

    Hinzu kommt das der DB vom Anypointer variable bleibt sowie der IDB vom SFB12
    Ich könnte den AnyPointer zwar selbst konstruieren und in den DatenDB speichern aber wie gebe ich diesen dann im CALL SFB12 an
    Geändert von MC_DARKSTONE (26.05.2015 um 14:48 Uhr)

  5. #5
    MC_DARKSTONE ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi Larry,
    ich habe es nun so gemacht das ich nicht mehr dem "datenDB" arbeite sindern mit temp.
    Nun habe ich aber das Problem das ich den Anypointer nicht zuweisen kann.
    Ich möchte über den FC aufruf ein Anypointer "AnyX" übergeben und diesen dann an den SFB weiter geben.
    CALL FC
    AnyX:=P#DB....

    // innerhalb des FC
    CALL SFB 12 DB12
    .....
    SD_1:=#AnyX // fehler

    "Deklarationsberecih der Aktualseite VAR_INPUT passt nicht zum formalen Deklarationsbereich VAR_IN_OUT des Formalparameters SD_1"
    Wenn ich AnyX als IN_OUT angebe geht es auch nicht, nur wenn AnyX als Temp deklariert ist.

    Kann ich die VAR_INPUT "AnyX" auf ein TEMP "AnyXX" transferieren?
    Ich habe es hiermit versucht:
    L P#AnyX
    T P#AnyXX //fehler

    Gruß
    Erick

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Du mußt den ANY von IN nach TEMP kopieren, dann kannst Du den Temp-ANY an Bausteinaufrufe weitergeben.
    Code:
          L     P##IN_ANY
          LAR1
          L     P##TEMP_ANY
          LAR2
    
          L     D [AR1,P#0.0]
          T     D [AR2,P#0.0]
          L     W [AR1,P#4.0]
          T     W [AR2,P#4.0]
          L     D [AR1,P#6.0]
          T     D [AR2,P#6.0]
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren FC: ANY von IN nach TEMP kopieren  

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Zitat Zitat von MC_DARKSTONE Beitrag anzeigen
    Dies hat den hintergrund das der FC1 geschütz werden soll aber durch die Weitergabe der DBnummer mit jeder beliebigen DBnummer gearbeitet werden kann.
    Du könntest Deinen Baustein einfach als (multiinstanzfähigen) FB erstellen, da brauchst Du keinen Schmier-DB übergeben.

    Das könnte dann vermutlich sogar so professionell aussehen, daß Du den Programmcode nicht hinter einem Bausteinschutz verstecken musst...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Larry Laffer (29.05.2015)

  9. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Ich sehe das so wie Harald.
    Was spricht dagegen, dass was zusammen gehört, auch zusammengehörig zu erstellen ?
    In einen FB kannst du ja sogar weitere FB's in die Instanz integrieren und brauchst so keine zusätzlichen "externen" DB's mehr (die ja auch von deinem Kunden korrekt erstellt werden wollen).

    Gruß
    Larry

  10. #9
    MC_DARKSTONE ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.01.2015
    Beiträge
    25
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke Harald

Ähnliche Themen

  1. TON ET Parameter speichern / verwenden für weiteren TON
    Von Breakstuff im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 13.10.2013, 14:12
  2. Antworten: 2
    Letzter Beitrag: 22.11.2012, 14:32
  3. Step 7 Zeit für Zähler verwenden
    Von slot23 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 17.04.2012, 21:07
  4. Antworten: 9
    Letzter Beitrag: 15.12.2010, 12:27
  5. Block_DB typ als parameter übergeben ?
    Von michdan im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 19.02.2007, 17:59

Stichworte

Lesezeichen

Berechtigungen

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