Step 7 SCL Zugriff auf Teil eines UDT

dentech

Level-1
Beiträge
577
Reaktionspunkte
39
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe folgende Kombination

Code:
VAR_IN_OUT
    Behaelter : ARRAY [0..6] OF UDT1410;    //Array mit den Behälterdaten
END_VAR

Jetzt möchte ich auf einen Teil des UDT zugreifen,

Behaelter[0].Pos := 1

so funktioniert das nicht,

kennt jemand ne Lösung?
 
Zuletzt bearbeitet:
Es kommen folgende Fehlermeldungen:

- Die Komponente ist nicht vorhanden
- Fehlerhafte Variable, der Punkt ist nicht zulässig

mich interessiert ob das so überhaupt geht? Oder ob dem Compiler intern die Struktur des UDT bekannt sein muß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es kommen folgende Fehlermeldungen:

- Die Komponente ist nicht vorhanden
- Fehlerhafte Variable, der Punkt ist nicht zulässig

mich interessiert ob das so überhaupt geht? Oder ob dem Compiler intern die Struktur des UDT bekannt sein muß.

Soweit ich weiss muss die Struktur bekannt sein, du kannst nicht einfach einen ganzen DB dranhängen und dann einen Array indizieren.

Du kannst aber einen einzelnen Array von dem DB in deiner Funktion aufrufen. du warst auch schon auf dem richtigen Weg:
Code:
VAR_IN_OUT
    Behaelter : ARRAY [0..6] OF UDT1410;    //Array mit den Behälterdaten
END_VAR

Stimmt, du musst aber einen DB erstellen indem du den Array 0..6 OF UDT1410 hast und fügst den Array im OB ein. (am einfachsten per Drag and Drop aus dem Detailfenster)

Gruss Automatio
 
Nachtrag

Ich zitiere einfach mal PN/DP
Das erste Byte im DB ist Byte 0, die Nummer des Byte/Word/DWord ergibt sich aus dem Byte, an dem das Byte/Word/DWord beginnt, z.B. DBD4 liegt auf DBB4 bis DBB7
Code:
 0 : DBB0   DBW0   DBD0
 1 : DBB1   DBW0   DBD0
 2 : DBB2   DBW2   DBD0   DBD2
 3 : DBB3   DBW2   DBD0   DBD2
 4 : DBB4   DBW4   DBD4   DBD2
 5 : DBB5   DBW4   DBD4   DBD2
 6 : DBB6   DBW6   DBD4   DBD6
 7 : DBB7   DBW6   DBD4   DBD6
 8 : DBB8   DBW8   DBD8   DBD6
 9 : DBB9   DBW8   DBD8   DBD6
10 : DBB10  DBW10  DBD8
11 : DBB11  DBW10  DBD8

Harald

Damit kannst du also doch an die Daten kommen, ohne die Struktur im FB zu spezifizieren.
Habe ich aber selber noch nicht ausprobiert, dabei helfen dir sicher die Profis! :)
 
- Die Komponente ist nicht vorhanden
- Fehlerhafte Variable, der Punkt ist nicht zulässig

Ist der UDT bekannt? Also ist dieser im Step7 Projekt vorhanden?

Du kannst auf UDT Inhalte zugreifen aus SCL

Das UDT muss einfach vorhanden sein und Korrekt sein.

Code:
FUNCTION Testfunktion : VOID


VAR_IN_OUT
  Test : ARRAY[0..10] OF Test_UDT;  
    
END_VAR




VAR_TEMP
    // temporäre Variablen


END_VAR
Test[0].Pos := 2;
Test[0].Ar[1] := 4;
    ;


END_FUNCTION

Code:
TYPE "Test_UDT"
VERSION : 0.1




  STRUCT 	
   POS : INT ;	
   POS_2 : INT ;	
   Ar : ARRAY  [0 .. 10 ] OF INT ;	
  END_STRUCT ;	
END_TYPE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt, du musst aber einen DB erstellen indem du den Array 0..6 OF UDT1410 hast und fügst den Array im OB ein. (am einfachsten per Drag and Drop aus dem Detailfenster)

Zum Übersetzen ist das überhaupt nicht nötig.
Sein Problem dürfte einzig und alleine sein das irgendwo der Syntax nicht stimmt. Also irgendwo Strichpunkt, Doppelpunkt etc vergessen oder UDT nicht korrekt.

mfg René
 
- Die Komponente ist nicht vorhanden
- Fehlerhafte Variable, der Punkt ist nicht zulässig
Beziehen sich die beiden Fehlermeldungen auf die selbe Zeile (die selbe Anweisung)?
Was steht vor und nach der Zeile "Behaelter[0].Pos := 1;" ?
Gibt es in der Symboltabelle ein globales Symbol "Behaelter"? --> kommen die Fehler auch, wenn Du das Symbol bei IN_OUT umbenennst (z.B. "io_Behaelter")?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, magst Du uns ein bisschen detaillierter aufklären, wie falsch genau die Syntax sein muß, damit der SCL-Compiler beide Fehlermeldungen ausspuckt?
Es kommen folgende Fehlermeldungen:

- Die Komponente ist nicht vorhanden
- Fehlerhafte Variable, der Punkt ist nicht zulässig

Harald
 
Ja kann ich, sorry.

Habe vorher so drauf zugegriffen:

Code:
Behaelter[0].Pos := 1

Richtig wäre aber so gewesen:

Code:
Behaelter[1].Server.Gruppe = 0
 
Zurück
Oben