Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Struktur mit Bit-Variablen auch wordweise zugreifen

2007-07-24
2007-07-27
  • georg.bertram - 2007-07-24

    Hallo,

    ich habe eine Struktur mit Bit-Variablen (Fehlermeldungen). Auf diese möchte ich aber zum Zwecke der Übertragung auf ein Visualisierungssystem auch Doppelwortweise zugreifen.

    Hat jemand eine Idee wie das gehen könnte?

    Gruß Georg Bertram

     
  • lothar - 2007-07-24

    Hallo,

    das Pragma {bitaccess} würde soetwas ermöglichen:

    für Fehlermeldungen würde man z.B., ausgehend von einer Struktur aus DWORDs per {bitaccess} die Einzelbits der Struktur zugänglich machen. Die Einzelbits haben dann Namen und sind auch per Intellisense anwählbar.

    Einfach mal die Hilfe zum Bitaccess befragen. Evtl. ist die Funktion aber Zielsystemabhängig.

    Gruss

    lothar

     
  • georg.bertram - 2007-07-25

    Hallo,

    ok, {bitaccess} funktioniert. Ist allerdings ein ziemlicher Krampf. Man muss jedes Symbol 2 mal ausprogrammieren. Einmal in der Struktur als {bitaccess} und dann noch einmal global. Die globale Definition führt dann leicht zu Namenskonflikten die man eigentlich bei der Verwendung von Strukturen gar nicht hat.

    Unverständlich auch: Wenn man in der Struktur statt einer Reihe DWORDS ein ARRAY OF DWORDS definiert, dann bekommt man beim Übersetzen einen Fehler beim Zugriff auf die Bit-Variablen. Kann man das verstehen?

    Aus welchem Grund werden Bool-Variablen eigentlich intern als Byte behandelt? Das ist ja das eigentliche Übel meines Problems!

    Gruß Georg

     
  • lothar - 2007-07-25

    stimmt natürlich, Bitaccess ist suboptimal, jedoch in diesem System womöglich die relativ beste Lösung

    Gruss

    lothar

     
  • Rolf-Geisler - 2007-07-26

    Hallo,

    hätte da noch einen anderen Vorschlag. Vielleicht wäre es eine mögliche Lösung, die Fehlermeldungen grundsätzlich als DWORD zu verwalten. Das Auftauchen einer Störung würde dann als Setzen, das Verschwinden der Störung als Rücksetzen eines Bits im DWORD zu realisieren sein. Das DWORD kann in dieser Form auch an die Visualisierung weitergegeben werden.

    Zum bitweisen Manipulieren von BYTE, WORD und DWORD gibt es bei http://www.geisler-controls.de die Freeware .

    Was die Verwaltung von Bit-Variablen auf dem Zielsystem angeht, so ist sie vom Betriebssystem und/oder der Hardware beeinflußt. In der kleinsten möglichen Einheit wird mit einer Adresse genau 1 Byte angesprochen (wie auf den antiken MS-DOS-Rechnern).

    Auf SPSen reserviert der Compiler für jede Bool-Variable also immer ein ganzes Byte, er kann nicht anders. Logisch TRUE ist diese Variable dann, wenn das Byte einen Wert von <> 0 hat.

    Gruß Rolf

     
  • georg.bertram - 2007-07-27

    Hallo,

    natürlich kann ich die Meldungen komplett als DWORD verwalten und dann über <variablenname>.<bitnummer> direkt auf die einzelnen bits zugreifen. Aber im Zeitalter symbolischer Programmierung ist das ein ziemlicher Rückschritt.</bitnummer></variablenname>

    Wenn eine SPS-Programmiersprache bits nur byteweise anlegen kann ist das schon ziemlich bescheiden. Gerade im Bereich der SPS Programmierung ist es üblich bei Protokolle und Schnittstellen (aus Platzgründen) die einzelne Befehlsbits zu Bytes oder Worten zusammenzufassen. Warum nimmt eine (relativ junge) Programmiersprache wie CoDeSys da keine Rücksicht drauf?

    Gruß Georg

     
  • Anonymous - 2007-07-27

    Originally created by: Bernhard Werner

    Hallo Georg,

    georg.bertram hat geschrieben:
    Aus welchem Grund werden Bool-Variablen eigentlich intern als Byte behandelt? Das ist ja das eigentliche Übel meines Problems!

    Das kann ich dir beantworten. Bits lassen sich auf den üblichen Prozessoren nicht adressieren. Man kann nur ein einzelnes Byte adressieren. Um ein Bit zu adressieren muss man das Byte auslesen das gesuchte bit ausmaskieren, und das Wort im Register rotieren. Zum schreiben muss das ganze umgekehrt passieren. Das kostet Zeit und Platz, deswegen ist in allen Hochsprachen der Datentyp bool ein Byte oder mehr gross.

    georg.bertram hat geschrieben:
    Wenn eine SPS-Programmiersprache bits nur byteweise anlegen kann ist das schon ziemlich bescheiden. Gerade im Bereich der SPS Programmierung ist es üblich bei Protokolle und Schnittstellen (aus Platzgründen) die einzelne Befehlsbits zu Bytes oder Worten zusammenzufassen. Warum nimmt eine (relativ junge) Programmiersprache wie CoDeSys da keine Rücksicht drauf?

    Wir berücksichtigen das zum Beispiel indem wir den Bitzugriffsoperator eingeführt haben. Der ist nämlich nicht Teil der IEC-Norm.

    Man kann übrigens auch mit einer symbolischen Konstante auf ein Bit eines DWORDs zugreifen. Dazu muss man in den Übersetzungsoptionen "Konstanten ersetzen" einschalten.

    dwFehler.Bit1 sieht doch wunderbar aus.

    Eine andere Möglichkeit wäre es Funktional auf das Bit zuzugreifen:

    bTest := FehlerX(dwFehler).

    Übrigens stellt Codesys ab Version 3.2 ganz neu jetzt auch den Datentyp BIT zur Verfügung. Den kann man aber nur in Strukturen benutzen.

    Grüsse,

    Bernhard

     
  • georg.bertram - 2007-07-27

    Hallo Bernhard,

    Zitat:
    Wir berücksichtigen das zum Beispiel indem wir den Bitzugriffsoperator eingeführt haben. Der ist nämlich nicht Teil der IEC-Norm.

    In einigen Bereichen haben die Normierer wohl etwas die Praxis außer Acht gelassen!

    Zitat:
    Übrigens stellt Codesys ab Version 3.2 ganz neu jetzt auch den Datentyp BIT zur Verfügung. Den kann man aber nur in Strukturen benutzen.

    Ok, also alles wird gut!
    (wenn wir dann in ein paar Jahren mal V3.x einsetzen können)

    Gruß
    Georg
    [/quote]

     

Log in to post a comment.