# sprechende Variablen vs. durchnummerieren



## forellengarten (26 November 2010)

ich dreh mich mit ein paar gedanken im Kreis und würde dazu gern um eure Hilfe bitten:

Eine Steuerung hat sehr viele Digitalausgänge. Ich habe diese in etwa wie folgt deklariert:
O_EG_WOHNZ_LICHT_SUED AT %Q*:BOOL;
O_EG_WOHNZ_LICHT_DECKE AT %Q*:BOOL;
etc. etc.

Problem: Häufig wäre es zweckmäßig zu sagen "IF OUTPUT[2] = TRUE then", anstatt zu sagen "IF O_EG_WOHNZ_LICHT_SUED = TRUE then", weil es dadurch leichter softwaretechnisch anzusprechen ist (z.B in Schleifen, etc).

Frage: wie kann ich die sprechenden Variablen behalten, aber trotzdem Ausgänge z.b in einer FOR-Schleife der Reihe nach ansprechen. Mache ich nämlich einfach ein Array (OUTPUT ARRAY [1..120] OF BOOL) so funktioniert zwar alles wunderbar, aber ich muß dafür auf meine sprechenden Variablen verzichten..


----------



## Verpolt (26 November 2010)

Hallo,

Kannst den Array 0-120 nicht auf die Structur zurückkopieren?


----------



## forellengarten (26 November 2010)

Verpolt schrieb:


> Hallo,
> 
> Kannst den Array 0-120 nicht auf die Structur zurückkopieren?


 
ist halt nur nicht die eigentliche lösung.
toll wäre z.b ein konstrukt wie:

output[1] := O_EG_LICHT AT %Q*:BOOL;


----------



## Thomas_v2.1 (26 November 2010)

Beispiel wie man das mit einem Zeiger-Array machen könnte:

Da müsstest dir ein lokales oder globales Array anlegen:

```
ptrOutputs : ARRAY [0..120] OF POINTER TO BOOL;
```

und dann in einer Funktion die z.B. beim Anlauf aufgerufen wird die Zeiger mit den entsprechenden Adressen initialisieren:

```
ptrOutputs[0] := ADR(O_EG_LICHT);
ptrOutputs[1] := ...
```

Dann kannst du in einer Schleife oder über einen index mit:

```
ptrOutputs[index]^ := FALSE;
index := index + 1;
ptrOutputs[index]^ := TRUE;
```
auf deine Ausgänge zugreifen. Wichtig ist dabei der Dereferenzierungs-Operator "^".

Die Möglichkeit soetwas zu programmieren finde ich einen wesentlichen Vorteil des Codesys ST gegenüber dem Siemens SCL, denn da gibt es keine (echten) Pointer. Wenn man da sowas umsetzen will, muss man wirklich erst vorher alles in das Array hinein- und nachher wieder herauskopieren.


----------



## Thomas_v2.1 (26 November 2010)

Hm, ich habe das gerade mit Twincat und einem BC versucht. Leider funktioniert das mit dem Pointer zwar auf eine BOOL Variable, aber nicht auf einen Ausgang. Weiß der Teufel warum es hier wieder eine Ausnahme gibt.
Die ADR()-Funktion habe ich gegen BITADR() ausgetauscht, aber bei meinem Controller funktioniert das leider nicht


----------



## Oberchefe (26 November 2010)

Funktioniert wahrscheinlich deshalb nicht weil Bools 1 Byte groß sind, die einzelnen Ausgänge aber nicht.


----------



## Thomas_v2.1 (26 November 2010)

Oberchefe schrieb:


> Funktioniert wahrscheinlich deshalb nicht weil Bools 1 Byte groß sind, die einzelnen Ausgänge aber nicht.



Menno, irgendwas ist ja immer. Drecks-Sprachen sind das...

Machte mich auch gerade stutzig dass mit BITADR() MX0.0 und IX0.0 die gleichen Adressen haben sollen.
Man könnte jetzt hingehen und die Ausgangsbits als Byte deklarieren, dann muss man aber in der E/A-Zuweisung ganz schön rumfrickeln. An einer Kundenanlage würde ich das so niemals programmieren.

Wenn das so mit meinem Pointer-Array funktioniert hätte wäre es ja ok.


----------



## forellengarten (28 November 2010)

@Thomas_v2.1

besten Dank, auch fürs Austesten (und Feststellen daß es nicht geht :-( ). Pointer könnten da der richtige Ansatz sein. Ich werde auf jeden Fall mal versuchen in dieser Richtung weiterzukommen. Da ich eher noch "basic" herumprogrammiere bin ich trotzdem über inputs dankbar!


----------



## BFlat (28 November 2010)

*Bezeichner*

Sprechende, selbsterklärende Mnemos (Symbole) sind manchmal ein wahrer Hemmschuh bei der Erzeugung von Programmen.

Im Falle der angesprochenen Ein- und Ausgänge ist aber mein Ratschlag klar und eindeutig:

>>> Die Bezeichner des Stromlaufplanes <<<

Da sich diese an den Seitennummern des Stromlaufplanes orientieren, haben somit Ziffern einen gewissen Vorrang.

Bei einer sauber ausgeführten Elektroinstallation wird man die gleichen Bezeichner auch auf den Sensoren oder Aktoren finden. Der Weg von der Anlage in das Programm ist somit ziemlich direkt.

Störend könnte nur sein, dass bei einer VDE gerechten Bezeichnung auch mathematische und IT Operatoren enthalten sind wie Punkte, Doppelpunkte Minuszeichen und Gleichheitszeichen. Das kann bei höheren Sprachen zu Verwirrungen führen.




BFlat


----------



## BFlat (28 November 2010)

*Strukturierte E/A*

kommen eigentlich äußerst selten vor. Denn bei der Zuordnung der E/A geht man meistens nach anderen Gesichtspunkten vor, z.B. Gruppenbildung für Ausstattungsvarianten einer Maschine oder Anlage.

Da wird man um das zu-Fuß kopieren in eine Speicherstruktur nicht herum kommen um hinterher die Variablen elegant und selbsterklärend ansprechen zu können.

Interessant ist, dass es offenbar Systeme gibt, in denen man E/A garnicht z.B. als Array ansprechen kann. Ob es wohl damit zu tun hat, dass sich Mikroprozessoren offenbar noch immer schwer tun (=rechenzeitfressend) Einzelbits anzusprechen. Ich kann mir gut vorstellen, dass in vielen Systemen das nächste Bit an der selben Stelle im nächsten Byte steht. die dazwischenliegenden 7 Bits schenkt man einfach her. Speicherplatz kostet sowieso nichts mehr.

Andererseits wurde genau aus diesem Grund das E/A Abbild erfunden. Normalerweise greift man nämlich nicht auf das Eingangsbit direkt, sondern auf dessen Abbild im Arbeitsspeicher der SPS zu. Dieses Abbild wird zwischen den Programmzyklen aufgefrischt. Dieses "Auffrischen" ist dann ein relativ komplexer Ablauf in welchen z.B die Eingänge einzeln abgefragt und entsprechend die Abbildmerker gesetzt werden. Dann könnten die Eingänge zwar brav nebeneinander in einem 8 Bit Eingangswort stehen, während im Abbildspeicher platzverschwenderisch nur immer das unterste des 8 Bit Speicherwortes besetzt ist.




BFlat
Als Mutmaßer


----------



## MSB (28 November 2010)

BFlat schrieb:


> Bei einer sauber ausgeführten Elektroinstallation wird man die gleichen Bezeichner auch auf den Sensoren oder Aktoren finden. Der Weg von der Anlage in das Programm ist somit ziemlich direkt.
> 
> Störend könnte nur sein, dass bei einer VDE gerechten Bezeichnung auch mathematische und IT Operatoren enthalten sind wie Punkte, Doppelpunkte Minuszeichen und Gleichheitszeichen. Das kann bei höheren Sprachen zu Verwirrungen führen.



Das kann unter keinen Umständen zur Verwirrung führen, da eine derartige Eingabe bei sämtlichen mir bekannten IEC 61131 Systemen,
ganz schlicht und einfach nicht möglich ist.

Soderzeichen wie = - + . : etc. dürften im Variablennamen nicht vorkommen.

Die einzige mir bekannte Ausnahme: Step7 von Siemens, da könnte man Variablennamen tatsächlich so vergeben.

Persönlich bin ich bei dem Punkt ein wenig hin und hergerissen.
Auf der einen Seite bin ich zwar direkt in der Anlage, auf der anderen Seite ist aber -11B1 jetzt im Programm
in keinster Weise selbsterklärend, Kommentare werden bei Codesys leider nicht direkt am Variablennamen angezeigt.
Heißt also, ich habe (fast) keine Chance, das Programm sinnvoll ohne Schaltplan zu lesen.

Mfg
Manuel


----------



## Thomas_v2.1 (28 November 2010)

BFlat schrieb:


> Interessant ist, dass es offenbar Systeme gibt, in denen man E/A garnicht z.B. als Array ansprechen kann. Ob es wohl damit zu tun hat, dass sich Mikroprozessoren offenbar noch immer schwer tun (=rechenzeitfressend) Einzelbits anzusprechen. Ich kann mir gut vorstellen, dass in vielen Systemen das nächste Bit an der selben Stelle im nächsten Byte steht. die dazwischenliegenden 7 Bits schenkt man einfach her. Speicherplatz kostet sowieso nichts mehr.
> 
> Andererseits wurde genau aus diesem Grund das E/A Abbild erfunden. Normalerweise greift man nämlich nicht auf das Eingangsbit direkt, sondern auf dessen Abbild im Arbeitsspeicher der SPS zu. Dieses Abbild wird zwischen den Programmzyklen aufgefrischt. Dieses "Auffrischen" ist dann ein relativ komplexer Ablauf in welchen z.B die Eingänge einzeln abgefragt und entsprechend die Abbildmerker gesetzt werden. Dann könnten die Eingänge zwar brav nebeneinander in einem 8 Bit Eingangswort stehen, während im Abbildspeicher platzverschwenderisch nur immer das unterste des 8 Bit Speicherwortes besetzt ist.



Das hat mit dem Mikroprozessor der in dem Gerät läuft ja nicht viel zu tun, da ich ja nur über das Betriebssystem der SPS auf die E/A zugreifen kann.

Es gibt aber auch nicht viele Controller die überhaupt in Assembler-Befehle zur Manipulation von binären Variablen besitzen. Der selige 8051 hat z.B. welche, jedoch lassen sich diese auch nicht indirekt ansprechen. Der Infineon C166 der in einigen S7-300 verbaut ist hat auch Befehle für den direkten Zugriff auf einzelne Bits, da weiß ich aber nicht ob es da Befehle für die indirekte Adressierung gibt.

Warum das bei Codesys nicht geht, und dass einmal BOOL ein Bit ist und einmal ein Byte ist schon wieder inkonsistent (gut, in anderen Sprachen gibt es auch nur die Vorgabe einer Mindestgröße). Es gibt eigentlich keinen Grund warum man das im SPS-Betriebssystem nicht hätte gleichbehandeln können, zumindest will mir keiner einfallen. Es müsste eine E/A-Adresse (oder auch Merker, denn da funktioniert der Pointerzugriff auch nicht) einfach ein anderer Datentyp als BOOL sein.


----------



## IBFS (28 November 2010)

BFlat schrieb:


> Interessant ist, dass es offenbar Systeme gibt, in denen man E/A garnicht z.B. als Array ansprechen kann.



Wenn es nur um Eingänge geht, kann man sichdoch durch Umkopieren
ein Image in einem ARRAY erstellen.
Es gibt sogar Systeme - CompactLogix - von AB, da muss man alle E/As
umkopieren, weil man sonst keine EA-Konsistenz hat.

Frank


----------



## forellengarten (29 November 2010)

Leute, 
danke euch für eure Inputs. Was Bflat angeht (">>> Die Bezeichner des Stromlaufplanes <<<) ist das für mich voll nachvollziehbar. Habe nur die Befürchtung daß das auf einem Level ist denn ich als Hobby-SPSer so nicht abliefern kann . Scheint dabei zu bleiben - beide Varianten haben Vor/Nachteile und man muß sich eben für eine Variante festlegen.


----------



## Blockmove (29 November 2010)

Forellengarten vielleicht musst du das Problem auch von einer anderen Seite angehen. Du kommst wohl von der PC-Seite und schreibst dein Programm in ST. Für die Anforderungen einer Lichtsteuerung ist in den meisten Fällen KOP oder FUP als Programmiersprache besser geeignet. Dinge wie Gruppenbildung, Zentral-Aus oder Szenarien lassen sich damit - meiner Meinung nach - einfacher abbilden und realisieren.

Gruß
Dieter


----------



## forellengarten (30 November 2010)

Blockmove schrieb:


> Forellengarten vielleicht musst du das Problem auch von einer anderen Seite angehen. Du kommst wohl von der PC-Seite und schreibst dein Programm in ST. Für die Anforderungen einer Lichtsteuerung ist in den meisten Fällen KOP oder FUP als Programmiersprache besser geeignet. Dinge wie Gruppenbildung, Zentral-Aus oder Szenarien lassen sich damit - meiner Meinung nach - einfacher abbilden und realisieren.
> 
> Gruß
> Dieter


 
möglich daß du Recht hast, Dieter. Mir ist allerdings aufgefallen daß professionelles Programmieren praktisch immer in ST passiert und da sich ja alles immer mehr richtung Hochsprachen orientiert möchte ich da dabei sein. Zumal immer wieder Einschränkungen auftauchen, die sich in FUP etc. nicht richtig realisieren lassen und erst wieder ST aushelfen muß.

Meine persönliche Erkenntnis daher: programmiere nichts doppelt sondern erstell dir FB's und verwende diese. Einzelne FB's kann man auch mal leicht ändern/optimieren ohne daß man gleich das ganze Prog ändern muß. Das Forum ist für mich übrigens momentan eine der wichtigsten Informationsquellen :TOOL:


----------



## Werner29 (30 November 2010)

Thomas_v2.1 schrieb:


> Warum das bei Codesys nicht geht, und dass einmal BOOL ein Bit ist und einmal ein Byte ist schon wieder inkonsistent (gut, in anderen Sprachen gibt es auch nur die Vorgabe einer Mindestgröße). Es gibt eigentlich keinen Grund warum man das im SPS-Betriebssystem nicht hätte gleichbehandeln können, zumindest will mir keiner einfallen. Es müsste eine E/A-Adresse (oder auch Merker, denn da funktioniert der Pointerzugriff auch nicht) einfach ein anderer Datentyp als BOOL sein.


Es ist ganz einfach: ein Byte zu manipulieren geht auf allen Prozessoren um Faktoren schneller, als ein Bit zu manipulieren. Daher sind BOOL-Variablen nur dann Bits wenn es unbedingt sein muss (das Bitadressen den Typ BOOL haben, liegt am Standard, ich würde den Typ BIT auch bevorzugen). Ausserdem würde es an dem Problem nichts ändern. Die Prozessoren erlauben nun mal keine Pointer auf Bits und deswegen funktioniert das nicht.
BITADR ist im übrigen ein ganz spezieller Operator, der mit der wirklichen Adresse nichts zu tun hat.


----------



## Blockmove (30 November 2010)

forellengarten schrieb:


> möglich daß du Recht hast, Dieter. Mir ist allerdings aufgefallen daß professionelles Programmieren praktisch immer in ST passiert und da sich ja alles immer mehr richtung Hochsprachen orientiert möchte ich da dabei sein.



Professionelles Programmieren zeichnet sich durch eines aus:
Für jede Aufgabe das richtige Werkzeug.
In der professionellen Gebäudetechnik wirst du im Bereich Lichtsteuerung wenig ST finden. Dafür aber im Bereich HLK (Heizung, Lüftung, Klima).

Aber bekanntlich führen viele Wege nach Rom 

Gruß
Dieter


----------



## BFlat (1 Dezember 2010)

*Anlagenbau versus Gebäudeleittechnik*

Hallo Forellengarten,



MSB schrieb:


> Heißt also, ich habe (fast) keine Chance, das Programm sinnvoll ohne Schaltplan zu lesen.


 
Bingo!
Ich habe lernen müssen, dass der Schaltplan der wahre Schlüssel zu jeder Installation ist! 


bei der Programmerstellung: Ein sorgfältig konstruierter Schaltplan sagt mehr als seitenweise Funktionsbeschreibung, geschrieben als deutscher Aufsatz.
bei der Installation und beim Test: wenn etwas falsch läuft so beginnt die Suche beim Schaltplan oder bei den Bezeichnern, die z.B. direkt am Initiator hängen.
Nach Jahren des Betriebs, wenn an einer Anlage etwas ergänzt werden soll und vom ursprünglichem Autor des Programms bestenfalls nur noch der Name bekannt ist
Andererseits ist ein Bezeichner nicht so absolut unleserlich.

Dein Beispiel mit dem 11B1:
Darf ich etwas erweitern?
Ich habe ihn gelegentlich als 1101B1 gesehen. Im Schaltplan auf dem Blatt 110 in der Spalte 1 zu finden. _Blatt 110 ist nicht Seite 110! Auch in einem Schaltplan mit 30 Seiten ist ein Blatt 110 oder 980 sinnvoll._ Seltsamer Weise, unabhängig voneinander, ist bei verschiedenen Anlagenbauern unter den Blättern 1100 die Sicherheitstechnik zu finden. "B" steht, glaube ich, für einen Initiator (also z.B. kein Wahlschalter). Schließlich hat der 1101B1 noch einen Kommentar, wo auch noch einige Informationen zu holen sind.

Doch das alles führt ja in Richtung Maschinen- und Anlagensteuerung...

Nun will ich mich aber auch an Dein ursprüngliches Anliegen erinnern, wie das alles in eine Struktur z.B. in ein ARRAY zu bringen sei.

Du bist anscheinend in der Welt der Gebäudeleittechnik zuhause. 

Ist es dort nicht so, dass ein Kontakt wesenlich mehr Eigenschaften besitzt als schnödes EIN/AUS? Mir fallen spontan ein: Meldekathegorie, Störkathegorie, Gewichtung in einem Energiesteuersystem, Zeitfenster (wann ist dieser Kontakt interessant?), topologischer Beiwert (in welchem Stockwerk?), geografischer Beiwert(Osten-Westen).

Da ist strukturierte Verarbeitung angesagt: 
wieviele Fenster sind auf der Nordseite offen? 
Welche Türen müssen nachts abgesperrt sein?
... etc.

Bieten sich da nicht Strukturen ähnlich einer EXCEL Tabelle an, in deren erste Spalte die Eingänge stehen und in den weiteren Spalten die Zugehörigkeit zur jeweiligen Gruppe bezeichnet ist?

"Zugehörigkeit" in SPS Sprache übersetzt bedeutet "Zweisung", also Kopieren. Der Zustand des Eingangs wird auf einen Platz der jeweiligen Tabelle kopiert. Das geschieht zyklisch in einer Art Erfassungsroutine.

Die Auswertung könnte dann äußerst codesparend für jede Spalte der Tabelle in Form von Schleifen geschehen.    

Wie gesagt , spielt sich das alles im Arbeitsspeicher ab, wo sich Strukturen ziemlich leicht bilden lassen. Die Eingänge werden einzeln und "zu Fuß" in diese Strukturen kopiert.


Grüße von einem "freien" Abend in meinem Quartier auf einem Einsatz,




BFlat


----------

