Step 7 DB vom InstanzDB im FB aufrufen SCL

DiGo1969

Level-2
Beiträge
139
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte in einem FB-Baustein eine fertigen Siemensbaustein (P_PCV - Datenaustausch mit CP340) beschalten. Die Daten möchte ich aber nicht in einen Globalen DB schreiben, sondern in den InstanzDB meines FB.
Wie komme ich an den DB vom InstanzDB um diesen an den DB_NO einzutragen?

Code:
InstandzDB_P_RCV(EN_R:= true
            ,R:= false
            ,LADDR:= PEW_Start
            ,DB_NO :=  // IN: INT
            ,DBB_NO :=  // IN: INT
            );
   := InstandzDB_P_RCV.NDR; // OUT: BOOL
   := InstandzDB_P_RCV.ERROR; // OUT: BOOL
   := InstandzDB_P_RCV.LEN; // OUT: INT
   := InstandzDB_P_RCV.STATUS; // OUT: WORD

CPU: S7-400 / Step7


LG Dirk
 
Du kannst die P_SEND und P_RCV Bausteine als Multiinstanz in dein eigene FB 'einbetten'.
Dann sind die Instanze integriert in die Instanz-DB für dein FB.
Es wird nicht notwendig die Instanz-DBs für P_SEND oder P_RCV zu 'beschalten'.
Einfach Variabeln in das VAR Bereich deklarieren als P_SEND und P_RECV.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry,
das habe ich nicht verstanden....
Vermutlich habe ich mich auch schlecht ausgedrückt.

Ich möchte einen VAR-Bereich in meinem SCL-FB angeben, in den die gelesenen Daten übergeben werden.

Code:
VAR
   Daten:  ARRAY[0..8000] of Byte;
END_VAR

Im P_RCV muss ich ja nun irgendwas an den
DB_NO := // IN: INT
DBB_NO := // IN: INT
eintragen

LG Dirk
 
Ich hatte die P_SEND und P_RCV Bausteine nicht.
Ich habe nun die Handbuch zu CP340 durchgeblicht, und es scheint tatsächlich dass die P_SEND und P_RCV Bausteine nicht multi-instanziert werden können. Mann muss die DB-Nummer und Byte-Adresse manuell spezifizieren. Bei andere Bausteine werden die Daten als ANY Pointer übergeben.

Du musst tatsächlich diese Werte manuell aussuchen und eintippen.
 
Du hast mehrere Möglichkeiten:
Spendiere Deinem Programm einfach einen eigenen Global-DB für den Empfangspuffer, so wie es für P_RCV eigentlich vorgesehen ist.
Oder Du könntest Deinem FB die beim Aufruf verwendete IDB-Nummer als INPUT übergeben.
Oder mache Dir einen AWL-FC, der L DINO / T #RET_VAL ausführt
Oder kopiere die Adresse einer Instanzvariable in einen Anypointer und entnehme die DB-Nummer aus dem Anypointer.

Nächstes Problem: Wie kommst Du halbwegs sauber an einen Wert für DBB_NO?

Code:
FUNCTION "GetIDBNo" : INT
TITLE =Nummer des aktuellen IDB holen
VERSION : 0.1

BEGIN
NETWORK
TITLE =

      L     DINO;
      T     #RET_VAL;

END_FUNCTION
Code:
FUNCTION_BLOCK FBxxx
VAR_TEMP
  AnyPointer : ANY;
  AtAny AT AnyPointer : STRUCT
    ID : BYTE;
    Typ : BYTE;
    Anzahl : INT;
    DB_Nr : INT;
    Ptr : DWORD;
  END_STRUCT;
  iDINO : INT;
  iDBAny : INT;
END_VAR
VAR
  InstanzVar : BOOL;
END_VAR

BEGIN

//A: IDB Nr mit AWL-FC aus DINO lesen
  iDINO := GetIDBNo();

//B: IDB Nr aus Anypointer lesen
  AnyPointer := InstanzVar; //Adresse einer Instanzvariable in Anypointer eintragen
  iDBAny := AtAny.DB_Nr;    //DB_Nr aus Anypointer
END_FUNCTION_BLOCK

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wollte nur noch meine Lösung mitteilen:

Code:
VAR
    InstandzDB_P_RCV:           P_RCV;
    Daten:                      ARRAY[0..8190] OF BYTE;
END_VAR


VAR_TEMP
    tPointer_Struct_1:      STRUCT
        tID:                    BYTE;                               // ID für ANY (10 hex = S7-Format)
        tDataTyp:               BYTE;                               // ID für ANY (02 hex = es wird mit Bytes gearbeitet)
        tLaenge:                INT;                                // Anzahl Daten
        tDB_Nummer:             INT;                                // DB der im ANY Pointer benutzt wird
        tByte_Bit:              DWORD;                              // Byte und Bit
                            END_STRUCT;                             //
    tPointer_1 AT tPointer_Struct_1: ANY;                           // ANY-Pointer zur Struktur

    tID:                    BYTE;                                   // ID für ANY (10 hex = S7-Format)
    tDataTyp:               BYTE;                                   // ID für ANY (02 hex = es wird mit Bytes gearbeitet)
    tLaenge:                INT;                                    // Anzahl Daten
    tDB_Nummer:             INT;                                    // DB der im ANY Pointer benutzt wird
    tByte_Bit:              DWORD;                                  // Byte und Bit
    tStartAdresse:          INT;                                    // tByte_Bit ind Startadresse umgerechnet
END_VAR


LABEL
END_LABEL






BEGIN

// BD und Startadresse suchen
        tPointer_1:= Daten;                                             // DB auslesen
            tID:=        tPointer_Struct_1.tID;
            tDataTyp:=   tPointer_Struct_1.tDataTyp;
            tLaenge:=    tPointer_Struct_1.tLaenge;
            tDB_Nummer:= tPointer_Struct_1.tDB_Nummer;
            tByte_Bit:=  tPointer_Struct_1.tByte_Bit;
            tStartAdresse:= DWORD_TO_INT(SHR(IN := tByte_Bit AND 16#00ffffff, N := 3));
 
Zurück
Oben