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

Ergebnis 1 bis 7 von 7

Thema: Datensicht auf einen Datenbautein in SCL erstellen

  1. #1
    Registriert seit
    09.10.2012
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,
    Bin Neu in der SPS-Welt.
    Ist es möglich eine Sicht mit dem AT-Befehl auf einen Datenbaustein zu erstellen.
    Situation:

    UDT55:

    Struct
    A: Int;
    B; Int;
    MYARRAY[0..9] of byte;
    endStruct;


    DB55
    datensatz0: UDT55
    datensatz1: UDT55
    .
    .
    .

    Ich habe einen Datenbaustein DB55 mit ca 100 Datensätzen vom Typ UDT55 definiert.
    Ich möchte über einen Index auf einen bestimmten Datensatz, z.b. Datensatz[0] zugreifen können und dann MYARRAY mit einer Sicht lesen und schreiben können? Dies soll aber ohne Kopiervorgänge ablaufen.

    Ist dies möglich? Habe gelsen das man keine Sichten auf DB's erstellen kann.

    Gibt es wirklich keinen Weg?

    MfG
    Zitieren Zitieren Datensicht auf einen Datenbautein in SCL erstellen  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Warum legst du die Datensätze nicht einfach als Array of UDT55 an?

  3. #3
    DerDelphianer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.10.2012
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Thomas,

    Danke für die schnelle Antwort. Das kann ich nicht. Ich arbeite an einem Projekt in dem die meisten Sachen vorgegeben sind. somit kann ich an der Struktur des DB55 und der des UDT55 nichts ändern.
    MfG

  4. #4
    Registriert seit
    11.12.2009
    Beiträge
    2.115
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    in etwa so (aus dem Kopf)

    UDT_ARRAY := ARRAY_OF_UDT(100) AT DB55


    Dann kannst du auf UDT_ARRAY(index) zugreifen!


    Wenn du es nicht wirklich weiter hilft gucke ich Morgen mal drum, hab das Geschäftslaptop nicht daheim!

    Grüße

    Marcel

    P.S: Die Runden Klammern sind Eckig... bin zu Faul bei MacOS zu überlegen wie die Tastenkombi geht

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Also eine schöne Lösung komplett in SCL fällt mir da nicht ein. Wenn man einen kleinen Teil in AWL schreibt kann man aber was passables bauen.
    Den Baustein über den du auf die Daten per Array zugreifen willst legst du als FB an, welcher den Parameter
    Code:
    VAR_IN_OUT
      daten : ARRAY[0..99] of UDT55;
    END_VAR
    besitzt.

    Damit erreicht man dass dem FB die Daten als Zeiger übergeben werden. Das kann man daran erkennen dass im Instanz-DB die Variable "daten" 6 Bytes einimmt.
    Jetzt kann man den Parameter am Aufruf des FB aber nicht mehr symbolisch beschalten.
    Mit etwas AWL kann man aber tricksen, wenn man den Parameter "daten" beim Aufruf freilässt, und über den Instanz-DB den Pointer passend beschreibt:
    Code:
    AUF "datenStruct" // Dummy Befehl damit der DB geöffnet wird, erhält wenigstens einen Rest Symbolik und das Gebastel taucht in der Querverweisliste auf
    L DBNO // Nummer des DB laden
    T DB1.DBW 0  // Angenommen DB1 ist der Instanz-DB des oben erwähnten FBs
    L P#DBX0.0 // Startadresse von "datenStruct".Daten.Satz1 im DB
    T DB1.DBD2
    Die Adressen DB1.DBW0 und DB1.DBD2 sind abhängig von deinem Instanz-DB und der Adresse an der der Parameter "daten" in diesem DB liegt.

    Schön ist das nicht unbedingt, aber vielleicht kommt ja noch eine elegantere Lösung.

  6. #6
    Registriert seit
    11.12.2009
    Beiträge
    2.115
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Achso was ich gerade noch lese...

    Falls du keine AT-Sicht auf den DB machen kannst, dann mach ne Struktur die du im die ganzen UDTs legst, und nenn sie "Container" o.ä. und mach dann AT DB55_NAME.CONTAINER

    Grüße

    Marcel

  7. #7
    DerDelphianer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.10.2012
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Marcel,
    den Konstrukt ARRAY_OF_UDT gibt es nicht. Habe das so porbiert.

    FUNCTION SichtLesen : VOID
    VAR_TEMP
    UDT_ARRAY : ARRAY[0..2] OF UDT55;
    END_VAR
    UDT_ARRAY := ARRAY_OF_UDT[100] AT DB55
    END_FUNCTION

    Was meinst du mit dem Container. Könntest Du mir ein Codebeispiel schreiben ?



    Hi Thomas,
    Das mit dem AWL würde ich gern vermeiden wenn es geht. Wie gesagt, Ich bin noch blutiger Anfänger. Habe bis vor 2 Wochen nur in Hochsprachen wie Delphi und C# programmiert.
    MfG

Ähnliche Themen

  1. In Protool einen Zähler erstellen?
    Von Claudia1990 im Forum HMI
    Antworten: 12
    Letzter Beitrag: 30.05.2011, 18:59
  2. Codesys - Einen Text mit Erstellen
    Von Pepper im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 13.11.2009, 11:35
  3. UDT in SCL erstellen
    Von Felse im Forum Simatic
    Antworten: 33
    Letzter Beitrag: 11.09.2009, 09:39
  4. Einen FB erstellen!
    Von Domi55 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 19.03.2009, 18:03
  5. Antworten: 4
    Letzter Beitrag: 07.10.2006, 00:34

Lesezeichen

Berechtigungen

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