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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: SCL auf Strukturelemente eines zur Laufzeit bekannten DBs zugreifen

  1. #1
    Registriert seit
    06.11.2008
    Beiträge
    76
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    ich habe da mal wieder eine Frage:
    Gibt es eine Möglichkeit innerhalb einer SCL-Funktion auf Strukturvariablen eines DBs zuzugreifen, der erst zur Laufzeit bekannt ist (INPUT Block_DB)?
    GGf. Struktur (UDT) an FC übergeben?

    Konkretes Problem:
    Um in einem Hochregallager die Sollposition zu bestimmen, stehen mir die Fachkoordinaten zur verfügung. In einem DB habe ich die entsprechenden Positionsdaten hinterlegt.
    Dabei habe ich eine UDT100 "Fachdaten" mit folgenden Elementen angelegt:
    BIT Struct
    gesperrt BOOL
    belegt BOOL
    bitxy
    .
    .
    .
    X Struct
    Position DINT
    Offset DINT
    Y Struct
    Position DINT
    Offset DINT

    Jetzt möchte ich in einem SCL-Baustein wie folgt auf die Datenbausteinvariablen zugreifen:
    FUNCTION FC100 : INT


    VAR_INPUT
    Ii_XFach : INT;
    Ii_YFach : INT;
    END_VAR


    VAR_OUTPUT
    Odi_XPosition : DINT;
    Odi_YPosition : DINT;
    END_VAR


    VAR_IN_OUT
    IOdi_XOffset : DINT;
    IOdi_YOffset : DINT;
    IOw_Bits : WORD;
    END_VAR




    // Anweisungsteil
    Odi_XPosition := Idb_Regal.Fach[Ii_XFach,Ii_YFach].X.Position;
    Odi_YPosition := Idb_Regal.Fach[Ii_XFach,Ii_YFach].Y.Position;


    FC100 := 100;
    END_FUNCTION

    Dass das so nicht geht ist mir bewusst. Im Anweisungsteil kennt das Programm ja den DB und damit die Datenstruktur nicht. Trotzdem soll der DB variabel bleiben und ich will halt direkt auf die Positionwerte anhand der Fachkoordinaten zugreifen. Das muss doch gehen. Hat da jemand eine Idee?

    vielen Dank im Voraus.

    Gruß

    MFreiberger
    _____________________________________________
    "Von nichts kommt was" von B. Trüger
    Zitieren Zitieren SCL auf Strukturelemente eines zur Laufzeit bekannten DBs zugreifen  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    die wahrscheinlich einfachste und schnellste Variante ist das errechnen der ersten Byteadresse anhand der gegebenen Datenstruktur und das Erstellen eines dementsprechenden ANY-Pointers.
    Damit ist es dann möglich den Datenblock in eine temporäre Struktur zu kopieren, zu bearbeiten und zurück zu kopieren.

    Stichworte: ANY, AT, SFC20
    Geändert von vierlagig (29.07.2014 um 14:51 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    06.11.2008
    Beiträge
    76
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Moin vierlagig,

    also doch mit Adressberechnung arbeiten. Ich hatte halt gedacht, ich könnte SCL entsprechend nutzen um über die Angabe mit der Fachnummer als Index auf die entsprechenden Variablen zuzugreifen.
    Wenn es nur mit Adressberechnung und Pointer zerlegen geht, gehe ich doch wieder zurück zu AWL

    Gruß

    MFreiberger
    _____________________________________________
    "Von nichts kommt was" von B. Trüger

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von MFreiberger Beitrag anzeigen
    Wenn es nur mit Adressberechnung und Pointer zerlegen geht, gehe ich doch wieder zurück zu AWL
    sehr Symphathisch!

    du könntest die Daten im STAT Bereich des FB ablegen. dann sollte der Zugriff funktionieren und die Daten sind im Instanz-DB verfügbar
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    MFreiberger (16.07.2014)

  6. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    du könntest dem FC via IN_OUT den UDT100 auf der Schnittstelle übergeben. Dann "kennt" das System den Partner und du müßtest auch so programmieren können, wie du es vorhast.

    Gruß
    Larry

  7. #6
    Registriert seit
    06.11.2008
    Beiträge
    76
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Moin Larry Laffer,

    das habe ich nicht ganz verstanden. Wie weise ich meinem DB den UDT zu? Oder muss ich die den UDT auch vor dem Aufruf in SCL programmieren?

    Es gibt nämlich das Problem, dass die "Kompostierung" des Programms nicht ohne Fehler durchläuft. U.a. "Ungültige Variable".


    Gruß

    MFreiberger
    Geändert von MFreiberger (17.07.2014 um 07:44 Uhr) Grund: Ergänzung
    _____________________________________________
    "Von nichts kommt was" von B. Trüger
    Zitieren Zitieren Kompilieren  

  8. #7
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    wo kommt der DB eigentlich her?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #8
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Hast Du in Deinem Datenbaustein ein Array[0..x] of UDT 100 kannst du diese per Index an einen Funktionsbaustein übergeben.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  10. #9
    Registriert seit
    06.11.2008
    Beiträge
    76
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Moin vierlagig,

    mein DB sieht so aus:

    Code:
    Fach	ARRAY[1..100,1..20]			
    	"Fachdaten"
    und meine UDT so:

    Code:
    BIT	STRUCT			
    gesperrt	BOOL	FALSE	Das Fach ist gesperrt	
    belegt	BOOL	FALSE	Das Fach ist belegt	
    SetOffsetX	BOOL	FALSE	Die neuen Offsetwerte für die X-Position übernehmen	
    SetOffsetY	BOOL	FALSE	Die neuen Offsetwerte für die X-Position übernehmen	
    bit12	BOOL	FALSE		
    bit13	BOOL	FALSE		
    bit14	BOOL	FALSE		
    bit15	BOOL	FALSE		
    bit0	BOOL	FALSE		
    bit1	BOOL	FALSE		
    bit2	BOOL	FALSE		
    bit3	BOOL	FALSE		
    bit4	BOOL	FALSE		
    bit5	BOOL	FALSE		
    bit6	BOOL	FALSE		
    bit7	BOOL	FALSE		
    	END_STRUCT			
    X	STRUCT			
    Position	DINT	L#0		
    Offset	DINT	L#0		
    	END_STRUCT			
    Y	STRUCT			
    Position	DINT	L#0		
    Offset	DINT	L#0		
    	END_STRUCT

    Dann müsste ich ja innerhalb der FC immer die Feldgröße anpassen, wenn es unterschiedlich große Regale gibt, oder?

    Gruß

    MFreiberger
    _____________________________________________
    "Von nichts kommt was" von B. Trüger

  11. #10
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MFreiberger Beitrag anzeigen
    Dann müsste ich ja innerhalb der FC immer die Feldgröße anpassen, wenn es unterschiedlich große Regale gibt, oder?
    global, als Systemparameter zur Verfügung stellen
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

Ähnliche Themen

  1. Antworten: 11
    Letzter Beitrag: 22.04.2014, 17:16
  2. Antworten: 6
    Letzter Beitrag: 30.01.2013, 00:19
  3. SCL: Auf Bits eines Word zugreifen.
    Von Aksels im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.10.2011, 17:10
  4. Antworten: 0
    Letzter Beitrag: 08.02.2006, 13:37
  5. Zugreifen auf 4 Bit eines Eingangsworts
    Von Anonymous im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 16.01.2006, 10:28

Lesezeichen

Berechtigungen

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