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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: SCL indirekte Adressierung von Strukturen

  1. #11
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Leider muß ich das jetzt nochmal machen, die letzte Version ging grad ebend verlustig

    Ich würde es nicht so kompliziert machen:

    Code:
    DATA_BLOCK DB21 
      STRUCT     
       Data : ARRAY  [0 .. 5 ] OF UDT 2;    
      END_STRUCT ;
    Du definierst ein Array aus der UDT2.
    Jetzt kannst du über einen Index zugreifen, wenn du nur einen Datenbaustein verwendest (DB21).

    Code:
    DB21.Data[Datenwort_Index].TimeSet := 567;
    Hast du mehrere DB (DB21,22,...) geht es so leider nicht.
    Du kannst dann nur audf Byte, Word oder Doppelwort zugreifen.

    Code:
    WORD_TO_BLOCK_DB(DB_Nummer_Word).DW[Datenwort_Index] := 1000;
    oder
    WORD_TO_BLOCK_DB(DB_Nummer_Word).DW10 := 1000;
    Wenn noch einer etwas Besseres weiß, wäre ich auch dankbar.
    Ob die Any-Pointer-Vaiante irgendwie zum Laufen zu bringen ist muß ich später mal testen, dazu sollte man sich aus jeden Fall das Compiler-Ergebnis in AWL anschauen, um zu sehen, was der Comiler eigenlich umsetzt.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  2. #12
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ach so, noch ein Zusatz:

    Code:
    pDaten   := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber];   // Pointerzuweisung erster Datensatz 
    
        FOR index:=1 TO DB20.Parameter.Number DO     // In der Schlaufe werden alle Datensätzte bearbeitet. 
            Daten.TimeSet    := 345        ;                // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann. 
            Daten.TimeActual := Daten.TimeActual + 1;       // Leider funktionieren die Pointer nicht. 
            IF Daten.TimeSet > Daten.TimeActual THEN 
                Daten.Length := 123; 
            END_IF; 
    
            pDaten := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber + (DB20.Parameter.Length * index)];    // Pointerzuweisung nächster Datensatz 
        END_FOR;
    Daten hat doch in diesen Code nichts mit pDaten zu tun, es gibt keine Verbindung zwischen beiden, die Deklaration

    Code:
    Daten               : UDT2; 
    pDaten AT Daten     : ANY;
    legt nur die Sicht fest.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #13
    Anonymous Gast

    Standard

    Das mit dem Array ist nicht optimal, da ich die Daten im restlichen Programm mit dem Namen z.B Data_1 zugreifen muss. Mit einem Array würde das restliche Programm somit sehr unübersichtlich.


    mfg

    Leo

  4. #14
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Verstehe ich nicht, statt

    Code:
     L    "Daten".Data_1.Timeset 
    
    schreibst du
    
      L     "Daten".Data[1].TimeSet
    [/code]
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #15
    Anonymous Gast

    Standard

    Das ist nur ein kleines Testprogramm für die indirekte Adressierung. Anschliessend sollte es z.B M251, M345, V213 usw. heissen.


    mfg Leo

  6. #16
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Verstehe immer noch nicht dein Problem.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #17
    Registriert seit
    13.03.2004
    Beiträge
    135
    Danke
    10
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo,

    da meine Challenge genau der damals beschriebenen entspricht und noch keine Lösung gefunden wurde, möchte ich diesen Thread noch mal hervor holen. Genau wie Anonymous möchte ich in immer gleicher Weise auf mehrere Instanzen eines UDT zugreifen. Ein Array wäre eine Lösung, aber dann hätten die Instanzen einen "nichtssagenden" Namen wie Motor[1] bis Motor[10]. Im Schaltplan sind diese aber mit M201, M302 etc. bezeichnet. Um die Übersichtlichkeit des Codes zu verbessern, wäre es sinnvoll, diese zu übernehmen.

    Läßt sich das in SCL machen?

    Gruß Hagen
    Im Zweifel, tue immer das richtige!

  8. #18
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Um die Übersichtlichkeit zu erhöhen kann man Kommentare an den Code schreiben.

    Wenn man indiziert auf Daten zugreifen will, dann müssen diese in indiziert adressierbarer Form organisiert sein - sprich: Array ("Array of Daten" oder "Array of Pointer to Daten"). In SCL gibt es noch die Möglichkeit, mit "AT"-Sichten Einzel-Instanzen über ein Instanz-Array zu legen. Durch verkettete Listen kann man ebenfalls in Schleifen iterieren. Bei wenigen Instanzen kann man mit CASE-Fallunterscheidungen arbeiten.

    Um wieviele Instanzen geht es denn? Gibt es einen zwingenden Grund, die Instanzen indiziert anzusprechen?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #19
    Registriert seit
    13.03.2004
    Beiträge
    135
    Danke
    10
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo Harald,

    es geht darum einen Multiplexer zu bauen, der im OB35 über eine serielle Schnittstelle jeweils eine von maximal 6 Messkarten anspricht. Natürlich kann man die Daten für die Karten in einem Array ablegen. Dann habe ich aber keine Zuordnung zum Schaltplan mehr.

    Habe mir jetzt überlegt, die im DB abgelegten Daten per BLKMOV zunächst in ein Array zu kopieren und dann damit zu arbeiten. Ich muss dann nur die Anfangsadresse, die Anzahl der Karten und die Länge der Struktur wissen, falls diese sich nochmal verändert. Möchte es halt so universell wie möglich gestalten, ohne bei einer Änderung in der Struktur die Daten für BLKMOV händisch anpassen zu müssen.

    Gruß Hagen
    Geändert von Hagen (09.02.2016 um 11:31 Uhr)
    Im Zweifel, tue immer das richtige!

  10. #20
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ähhhh ... OB35 und serielle Schnittstelle ... ???
    Bist du dir sicher, dass du das so machen willst ...?

    Wofür möchtest du das Ganze denn als Array of UDT verpacken wenn du doch eigentlich einen UDT "M101" und den nächsten "M234" nennen willst. Dann leg sie doch einzeln an ...
    Oder hast du bei der späteren Verarbeitung Vorteile wenn du die Daten in einem Array hast ?

    Gruß
    Larry

Ähnliche Themen

  1. S7 Indirekte Adressierung
    Von Rommani im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 02.05.2014, 22:05
  2. Indirekte Adressierung
    Von Kuddel30 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.11.2009, 12:52
  3. indirekte Adressierung
    Von Christian84 im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 21.02.2009, 09:09
  4. Indirekte Adressierung von Bit's in SCL
    Von tarzipan7 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.01.2009, 12:37
  5. Indirekte adressierung DB
    Von elko im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 25.04.2006, 22:00

Lesezeichen

Berechtigungen

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