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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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
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
stimmt natürlich, Bitaccess ist suboptimal, jedoch in diesem System womöglich die relativ beste Lösung
Gruss
lothar
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
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
Originally created by: Bernhard Werner
Hallo Georg,
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.
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
Hallo Bernhard,
In einigen Bereichen haben die Normierer wohl etwas die Praxis außer Acht gelassen!
Ok, also alles wird gut!
(wenn wir dann in ein paar Jahren mal V3.x einsetzen können)
Gruß
Georg
[/quote]