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

Ergebnis 1 bis 9 von 9

Thema: Codesys Array of Word -> Beliebiges Struct

  1. #1
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hardware: Wago 750-841 + 750-650

    Ich test gerade die HMI-Kommunikation zwischen dem Controller und einem Bediengerät.
    Die Kommunikation ansich funktioniert schon ohne Probleme.

    Ich verwende zur Kommunikation die Wago-Library TerminalSlave_04, mit den Baustein "TERMINAL_MODBUSSLAVE_RTU".
    Als Datenfeld hat dieser ein Array of WORD, mit variabler Länge (VAR_GLOBAL Constant).

    Wie kann man nun am geschicktesten dieses Array irgendwelchen Globalen Variablen, oder einem Datentyp zuweisen,
    unter beibehaltung der Lese/Schreib Funktionalität des Arrays?

    Der AT Befehl funktioniert ja scheinbar nur für "echte" Adressen.

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).
    Zitieren Zitieren Codesys Array of Word -> Beliebiges Struct  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Der Baustein ist mit zwar nicht bekannt aber laut der Doku von WAGO ist die Variable (VAR_IN_OUT) aDATA vom Typ typSLAVE_DATEN was einem WORD-ARRAY entspricht.

    Also wenn Du jetzt eine globale Variable vom Typ typSLAVE_DATEN anlegst und in Deinem Programm beschreibst werden die Daten an den FB TERMINAL_MODBUSSLAVE_RTU übergeben, der wiederum ändert die Variable ab und Du kannst die Variable auswerten.

    usw.
    Geändert von zotos (25.12.2007 um 21:02 Uhr)
    If you open your Mind too much, your Brain will fall out.

  3. #3
    Avatar von MSB
    MSB ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard

    Insoweit sind wir uns ja einig.

    Ich habe nun letzten Endes ein Array,
    also ARRAY [0..255] OF WORD.

    Also eine Globale Variable:
    Datenfeld: typSlave_Daten; an der entsprechenden Stelle an den FB geschrieben ...

    Wie mache ich nun sinngemäß sowas:
    Sollwert AT Datenfeld[0]: REAL;

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  4. #4
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von MSB Beitrag anzeigen
    ...
    Wie mache ich nun sinngemäß sowas:
    Sollwert AT Datenfeld[0]: REAL;
    ...
    Also Du willst das "aufdröseln"?

    Angenommen Du hast ein Array mit 256 Word Werten. Und Du weist ganz genau welches einzelne Byte welche Funktion hat, kannst Du doch ein eigenen Datentyp anlegen der in Summe UND in der Reihenfolge dem Übereinstimmt (WICHTIG: eine einfache BOOL Variable ist ein BYTE lang!).

    Ich interpretiere das in das REAL da oben mal rein, dass Du das weist.

    So das mit dem AT geht ja nur auch echte Adressen. Aber man kann mit Pointern arbeiten und das ganze Kopieren.


    Code:
    VAR
      myDATA    : myType;                      (* Programminterne Daten *)
      ExtDATA   : typSLAVE_DATEN;              (* Externe Daten von dem IN_OUT vom FB *)
      pExtDATA  : POINTER TO myType;
      pMyDATA   : POINTER TO typSLAVE_DATEN;
    END_VAR
    
    
    (* Pointer ermitteln *)
    pExtDATA := ADR(ExtDATA);
    pMyDATA  := ADR(myDATA);
    
    (* Daten Manipulieren im Programm *)
    myDATA.Erstes[0] := 123;
    
    (* vor dem FB aufruf Programminterne Daten an den FB übergeben *)
    extDATA   := pMyDATA^;
    
    (* FB Aufruf hier Symbolisch verändern von Daten *)
    ExtDATA.typSLAVE_DATEN[128] := 321;
    
    (* nach dem FB Aufruf die externen Daten auf die interne variable kopieren *)
    myDATA   := pExtDATA^;
    Wenn jemand eine bessere Idee hat bin ich gerne bereit zu lernen.
    Geändert von zotos (25.12.2007 um 22:03 Uhr)
    If you open your Mind too much, your Brain will fall out.

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

    MSB (25.12.2007)

  6. #5
    Avatar von MSB
    MSB ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard

    Also ich habe jetzt auch noch eine Variante entdeckt, auch wenn ich mir über die Auswirkung nicht 100% im klaren bin.

    Wenn ich die Globale Variable so deklariere:

    VAR_GLOBAL RETAIN PERSISTENT
    Datenfeld AT %MW0 :typ_SlaveDaten;
    END_VAR

    Es hat sich nun die Projektgröße auf dem Controller von 26kB auf 150kB erweitert, aber das alleine ist ja noch nicht kritisch, oder?
    Dann kann ich frei auf die Merkerwörter zugreifen, und muss mir in dem Sinn keine Gedanken machen,
    und auch nichts gesondert programmieren.

    Das ist zwar sicher nach der Codesys-Philosophi nicht der eleganteste weg,
    aber es ist auf jeden Fall ein sehr einfacher Weg, wie ich praktisch "beliebig"
    auf das Array zugreifen kann.

    Wie gesagt ich kommuniziere über dieses Array mit dem Bediengerät, und dafür ist mir die Variante von Zotos
    offengestanden ein wenig aufwendig.

    Nachteil: Ich verblase unmengen an Merkerwörtern, andererseits, wofür braucht man die Sonst,
    wenn nicht für sowas?

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  7. #6
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Du hast recht das kann man so machen.

    Ich würde trotzdem eine Struktur anlegen und beide mit AT auf den Merkerbereich setzen dann hat man eine eindeutigere Zuordnung das es ein Datenverbund ist.

    VisuDaten.Sollwert := 123.4;
    Geändert von zotos (25.12.2007 um 22:54 Uhr)
    If you open your Mind too much, your Brain will fall out.

  8. #7
    Avatar von MSB
    MSB ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard

    Das Bediengerät welches ich daran betreibe hat auch ein paar Wörter Datenaustauch.

    Das wäre z.B. das erste Wort im Datenaustausch.
    Code:
           BZ0 : BOOL ;    (* BEEP Hakko Panel *)
           BZ1 : BOOL ;    (* BEEP-BEEP Hakko Panel *)
           BZ2 : BOOL ;    (* BEEP_Contionously *)
           Calendar_Setting : BOOL ;    (*  *)
           Unused_0_4 : BOOL ;    (*  *)
           Unused_0_5 : BOOL ;    (*  *)
           Unused_0_6 : BOOL ;    (*  *)
           Unused_0_7 : BOOL ;    (*  *)
           Unused_1_0 : BOOL ;    (*  *)
           Unused_1_1 : BOOL ;    (*  *)
           Unused_1_2 : BOOL ;    (*  *)
           Unused_1_3 : BOOL ;    (*  *)
           Unused_1_4 : BOOL ;    (*  *)
           Unused_1_5 : BOOL ;    (*  *)
           Unused_1_6 : BOOL ;    (*  *)
           Unused_1_7 : BOOL ;    (*  *)
    Nun teilt Codesys ja jedes BOOL einem "neuen" BYTE zu, wie du das ja schon angedeutet hattest, kann man das irgendwie verhindern?
    Oder wie könnte ich genau dieses erste Wort und nicht die ersten 8 Wörter (16 Bytes) mit dieser Strucktur belegen?

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  9. #8
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Also das einzige was mir da jetzt auf Anhieb einfällt ist, dass erste Word auch in Deinem Struct als Word zu verwenden. Dieses Word auf die Daten diese Variable dann eben in Deinem Programm auch zu verwenden und mit dem Bitoperator auf die einzelnen Bits zu zu greifen. Was besseres fällt mir gerade nicht ein.

    Siehe auch: http://www.sps-forum.de/showpost.php...0&postcount=22
    If you open your Mind too much, your Brain will fall out.

  10. #9
    Registriert seit
    22.12.2007
    Beiträge
    17
    Danke
    1
    Erhielt 6 Danke für 6 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Moin,

    vielleicht hilft euch ja das ein Stückchen weiter:

    http://forum.3s-software.com/viewtop...028&highlight=

    Ist von hinten durch die Brust funktioniert aber und ihr bekommt symbolischen Zugriff auf die Bits eines Worts.

    Grüße an allen denen das hift


  11. Folgender Benutzer sagt Danke zu Professor für den nützlichen Beitrag:

    MSB (10.01.2008)

Ähnliche Themen

  1. Datentyp ARRAY und STRUCT
    Von Quoellfrisch im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 06.12.2015, 19:40
  2. Array of Word
    Von natasia im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 26.07.2011, 12:34
  3. struct als word in HMI
    Von Züttu im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 06.06.2011, 16:22
  4. Problem mit ARRAY - STRUCT
    Von Jörg_24 im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 31.03.2011, 16:08
  5. Problem ARRAY of STRUCT S7 -> WinCC flex 2008
    Von sps-concept im Forum HMI
    Antworten: 4
    Letzter Beitrag: 19.02.2010, 18:49

Lesezeichen

Berechtigungen

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