Step 7 Zeiger an SCL-Baustein mit Struct im IN_OUT übergeben

BNick

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein SCL Baustein

Code:
FUNCTION FC998 : void

VAR_IN_OUT
    Eingangsbereich:STRUCT
        Test1:INT;
        Test2:REAL;
        Test3:WORD;
    END_STRUCT;
END_VAR


VAR_TEMP
    // temporäre Variablen


END_VAR


    // Anweisungsteil
    ;
  
END_FUNCTION

soll per awl so beschalten werden um mit den Daten im DB 41 zu arbeiten, mein Versuch:

Code:
CALL  FC   998      
INOUT:=p#db41.dbx0.0

wurde gleich mit Fehlermeldung:
Deklarationsbereich der Aktualseite passt nicht zum formalen Deklarationsbereich VAR_IN_OUT des Formalparameters INOUT
bestraft.

Wie wäre denn die richtige Vorgehensweise für meine Anwendung?

Gruß
 
Hallo,
am Besten geht es symbolisch - also z.B. so :
Code:
[CALL  FC   998      
INOUT:="MeinDB".meienStruktur
oder in AWL so :
Code:
CALL  FC   998      
INOUT:=p#db41.dbx0.0 Bytes 8
Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach das so.

Code:
TYPE "ANY_POINTER"
VERSION : 0.1


    STRUCT
        SyntaxID    : BYTE;
        Bereichstyp   : BYTE;
        Anzahl_Werte  : INT;
        DB_Nr    : INT;
        Startadresse   : DWORD;
    END_STRUCT;
END_TYPE

FUNCTION_BLOCK Obj_ABLUFTKLP
VAR_INPUT
    LS_PAR : ANY;  // Hier wird das Erste Wort aus dem DB aufgelegt
      POINTING AT LS_PAR : ANY_POINTER;
END_VAR

VAR_TEMP
   Ret : INT; // dummy für returns
   KLP : LS_ABL_KLP; // temporäre Variablen hier ein udt kann aber auch struct sein.
END_VAR

(*Pointer auf UDT schreiben zum arbeiten*)
  pointing.Bereichstyp := 2;   // Typ des Bereichs soll Byte sein (INT = 2)
  pointing.Anzahl_Werte := 22; // Länge des Pointers weil wir einen Any ohne Länge angeben wollen und wir die länge von UDT oder Struct ja wissen.
  Ret :=  BLKMOV(SRCBLK := LS_PAR ,DSTBLK := KLP);   

(*hier kommt das programm hin. z.B.*)
 KLP.OFFEN := TRUE;


(*Hier wird der Pointer zurückgeschrieben*)
Ret :=  BLKMOV(SRCBLK := KLP ,DSTBLK := LS_PAR);
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Larrys Lösung hab ich probiert, da bekomm ich einen Syntaxfehler. Liegt es daran das im DB die Struktur nicht angelegt ist? Es handelt sich dabei um einen automatisch generierten InstanzDB.

Kopieren wie vollmi wäre meine Notlösung, so wollt ichs eigentlich nicht machen.
 
Ähhh .... naja ... also geben muss es deine Struktur zum Adressieren natürlich schon.
Was heißt denn "automatisch generierter Instanz-DB" ? Der DB, der beim Aufrufen eines FB's angelegt wird ist genauso vorhanden und aufrufbar.
Für symbolische Adressierung muss es die Symbole natürlich geben (vor Allem der DB muss symbolisch deklariert sein).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also der DB41 ist automatisch generiert, der dazugehörige FB ist der FB41 CONT_C, den kann ich ja nicht ändern um eine Struktur reinzubringen. Ich dachte mit
Code:
[COLOR=#333333]CALL  FC   998      
[/COLOR][COLOR=#333333]INOUT:=p#db41.dbx0.0 Bytes 8[/COLOR]
kann ich einfach den Bereich angeben auf den ich zugreifen will, aber wie gesagt, mit der Eingaben bekomm ich Syntaxfehler.

Step7 V5.5 + SP3
 
Sorry - gerade erst gesehen ... bei dem ANY-Pointer den Plural weglassen :
Code:
CALL  FC   998      
[COLOR=#333333]INOUT:=p#db41.dbx0.0 [/COLOR][COLOR=#FF0000][B]Byte[/B][/COLOR][COLOR=#333333] 8[/COLOR]
Gruß
Larry
 
So wars geplant, wenn ich jetzt aber

Code:
CALL  FC   998
INOUT:=p#db41.dbx0.0 byte 8

führt wieder zur Fehlermeldung:

Deklarationsbereich der Aktualseit passt nicht zum formalen Deklarationsbereich VAR_IN_OUT des Formalparameters INOUT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich muss mich nochmals entschuldigen, da ich nicht alles komplett verinnerlicht hatte.
Wenn dein FC einen IN oder INOUT-Parameter vom Typ UDTxyz hat dann muss die Datenquelle selbst von dem gleichen Typ sein - das ist in deinem Fall ja gar nicht der Fall.
Du kannst hier also nur entweder den ganzen DB als Parametertyp und als Parameter übergeben oder die 3 Variablen, die dich in Wirklichkeit interessieren einzeln.
Tut mir leid für die vorherige Verwirrung ... 8) :(

Gruß
Larry
 
Zurück
Oben