Instanz-DB an SCL übergeben

hub

Level-1
Beiträge
251
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich rufe in einem SCL-Baustein einen FB (z.B. CONT_C) auf.
Dieser FB braucht natürlich einen Instanz-DB
z.B.: CONT_C.DB81(...);
oder CONT_C.ReglerDB1(...);
Funktioniert soweit.

Wenn ich den SCL-Baustein jedoch öfters verwenden will, kann ich den DB nicht absolut angeben. Es wird ja jedesmal ein anderer Instanz-DB benötigt.
Der DB, bzw. die DB-Nr müßte über einen Bausteineingang übergeben werden.
z.B.:
VAR_INPUT
ReglerDB : ???;
END_VAR
CONT_C.???(...);

Ist das irgendwie möglich ?
Wenn ja, wie ?
(Wenn möglich, ohne Multiinstanzen)

hub.
 
Probiere es mal mit:

VAR_INPUT
ReglerDB : CONT_C;
END_VAR

ReglerDB(...);

Das wäre ja ähnlich wie bei den Multiinstanzen, bin mir aber nicht sicher ob es geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
an dem Problem habe ich auch schon einmal herumgeknuspert. Sogar mit Siemens dazu Rücksprache gehalten.
In AWL könntest du es so machen, wie du willst - in SCL leider (und für mich unverständlicherweise) nicht.

Bleibt dir also wirklich nur die Multi-Instanz - aber ist das denn wirklich ein Nachteil ?

Gruß
LL
 
Ja, das funktioniert. Danke.
Die Definition (ReglerDB:CONT_C) muß jedoch im VAR-Block stehen.
Im VAR_INPUT-Block funktioniert die Definition leider nicht.

Dies setzt voraus, das mein SCL-Baustein ein FB ist.

Vielleicht gibt es auch eine Lösung, die in einer FC funktioniert ?

hub.
 
@Larry Laffer
Ich weiß nicht, ob bei Multiinstanz das Parametriertool für den Regler noch funktioniert.
hub.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Lösung mit dem FB hat den Nachteil, dass sich der Instanz-DB folgendermasen zusammensetzt:
- SCL-Baustein-Eingänge
- SCL-Baustein-Ausgänge
- Reglerdaten

Die Reglerdaten sollten wegen dem Regler-Parametriertool in einen eigenem DB bleiben.

Werd es jetzt mal, wie LL schreibt, in AWL probieren.

hub.
 
Ja funktioniert auch.

Ich hab jetzt die AWL-Variante probiert und werd wohl dabei bleiben.

Vorteile:
- als FC realisierbar
- Standard-DB für Reglerdaten

Danke an alle.
hub.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

das andere würde auch gehen. Du müsstest halt nur als IN Parameter (der DB) in einen ANY Pointer wandeln und diesen am Bausteinanfang in einen Dummy Instanz DB kopieren. Am Bausteinende (FC) kopierst Du den Dummy wieder zurück in den ANY-Pointer.

Fertig.

Gruss Daniel
 
Hi Larry,

gerne :D

Code:
TYPE UDT1
// 
// Datenstruktur CONT_C
//
  STRUCT
    COM_RST : BOOL ;  //complete restart
    MAN_ON : BOOL  := TRUE;  //manual value on
    PVPER_ON : BOOL ;  //process variable peripherie on
    P_SEL : BOOL  := TRUE;  //proportional action on
    I_SEL : BOOL  := TRUE;  //integral action on
    INT_HOLD : BOOL ;  //integral action hold
    I_ITL_ON : BOOL ;  //initialization of the integral action
    D_SEL : BOOL ;  //derivative action on
    CYCLE : TIME  := T#1S;  //sample time
    SP_INT : REAL ;  //internal setpoint
    PV_IN : REAL ;  //process variable in
    PV_PER : WORD ;  //process variable peripherie
    MAN : REAL ;  //manual value
    GAIN : REAL  := 2.000000e+000;  //proportional gain
    TI : TIME  := T#20S;  //reset time
    TD : TIME  := T#10S;  //derivative time
    TM_LAG : TIME  := T#2S;  //time lag of the derivative action
    DEADB_W : REAL ;  //dead band width
    LMN_HLM : REAL  := 1.000000e+002;  //manipulated value high limit
    LMN_LLM : REAL ;  //manipulated value low limit
    PV_FAC : REAL  := 1.000000e+000;  //process variable factor
    PV_OFF : REAL ;  //process variable offset
    LMN_FAC : REAL  := 1.000000e+000;  //manipulated value factor
    LMN_OFF : REAL ;  //manipulated value offset
    I_ITLVAL : REAL ;  //initialization value of the integral action
    DISV : REAL ;  //disturbance variable
    LMN : REAL ;  //manipulated value
    LMN_PER : WORD ;  //manipulated value peripherie
    QLMN_HLM : BOOL ;  //high limit of manipulated value reached
    QLMN_LLM : BOOL ;  //low limit of manipulated value reached
    LMN_P : REAL ;  //proportionality component
    LMN_I : REAL ;  //integral component
    LMN_D : REAL ;  //derivative component
    PV : REAL ;  //process variable
    ER : REAL ;  //error signal
    sInvAlt : REAL ;  
    sIanteilAlt : REAL ;  
    sRestInt : REAL ;  
    sRestDif : REAL ;  
    sRueck : REAL ;  
    sLmn : REAL ;  
    sbArwHLmOn : BOOL ;  
    sbArwLLmOn : BOOL ;  
    sbILimOn : BOOL  := TRUE;  
  END_STRUCT
END_TYPE

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

DATA_BLOCK DB10  FB41
//
// Dummy DB
// Instanz-DB FB41
//
BEGIN

END_DATA_BLOCK

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

FUNCTION FC1 : VOID

VAR_INPUT
  DB_Nr : INT;    //DB-Nr CONT_C
END_VAR

VAR_TEMP
  tAnyDB : ANY;
    _AnyDB AT tAnyDB : STRUCT
      ID : BYTE;
      DataTyp : BYTE;
      Count : WORD;
      DBNr : WORD;
      BytePointer : DWORD;
    END_STRUCT;
  tAnyDummy : ANY;
    _AnyDummy AT tAnyDummy : STRUCT
      ID : BYTE;
      DataTyp : BYTE;
      Count : WORD;
      DBNr : WORD;
      BytePointer : DWORD;
    END_STRUCT;
   tRetVal : INT; 
END_VAR

BEGIN
  
  //Any-Pointer auf DB zusammenstellen
  _AnyDB.ID := B#16#10;                 //Muss so sein
  _AnyDB.DataTyp := B#16#2;             //Datentyp Byte
  _AnyDB.Count := W#16#7E;              //Anzahl 126 Bytes
  _AnyDB.DBNr := INT_TO_WORD(DB_Nr);    //DB
  _AnyDB.BytePointer := DW#16#84000000; //Pointer auf DBX0.0
  
  //Any-Pointer auf Dummy-DB zusammenstellen
  _AnyDummy.ID := B#16#10;                 //Muss so sein
  _AnyDummy.DataTyp := B#16#2;             //Datentyp Byte
  _AnyDummy.Count := W#16#7E;              //Anzahl 126 Bytes
  _AnyDummy.DBNr := W#16#A;                //Dummy DB-Nr 10
  _AnyDummy.BytePointer := DW#16#84000000; //Pointer auf DBX0.0
  
  //DB-Struktur in Dummy-DB kopieren
  tRetVal := BLKMOV(SRCBLK := tAnyDB, DSTBLK := tAnyDummy);
   
  //Bausteinaufruf CONT_C mit Dummy Instanz-DB
  CONT_C.DB10();

  //Dummy-DB in DB-Struktur kopieren
  tRetVal := BLKMOV(SRCBLK := tAnyDummy, DSTBLK := tAnyDB);
  
END_FUNCTION

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Daniel,
leider bin ich mir im Augenblick nicht so sicher, wie ich den Beitrag kommentieren soll ... aber stimmt - das wäre eine mögliche Lösung - ich muß aber gestehen, dass sie mir NICHT gefällt ... :cry:

Gruß
LL
 
naja ... das :
Code:
 //DB-Struktur in Dummy-DB kopieren
  tRetVal := BLKMOV(SRCBLK := tAnyDB, DSTBLK := tAnyDummy);
   
  //Bausteinaufruf CONT_C mit Dummy Instanz-DB
  CONT_C.DB10();

  //Dummy-DB in DB-Struktur kopieren
  tRetVal := BLKMOV(SRCBLK := tAnyDummy, DSTBLK := tAnyDB);
... ist aber vielleicht auch Geschmacksache ... :cool:
 
Zurück
Oben