# RANT: Konstrukte bei denen man sich manchmal fragt



## vollmi (16 Oktober 2013)

Ich bin grad an einem Projekt dran das seit 5 Jahren läuft und jetzt erweitert wird. Ich muss mich also in die denke eines anderen Programmierers eindenken.
Und vor allem Fehler suchen die nur sporadisch auftauchen.

Ich bin weit entfernt ein Pro zu sein. Aber bei manchen Konstrukten zweifle ich echt an der Zurechnungsfähigkeit und der Qualitätskontrolle.

Das hier wäre so ein Beispiel.

```
U     #Obj_Schalten      
SPBN  AU01
      ON    #Obj_Freigabe
      O     #Obj_SA_Abschaltung
      O     #Obj_SA_SGK_Schalten
      SPBN  AU01
      R     #Obj_Schalten
AU01: NOP   0
```

Was denkt man sich wenn man so was konstruiert? Denkt man da auch an den nächsten der da online Fehler suchen soll? Wie macht man mit sowas ne Inbetriebnahme?

Das wird dann in anderen Programmteilen noch etwas exzessiver.


```
O     "Instanz DB11".Betrieb_Im_Obj1_Ein
      O     "Instanz DB11".Prg_Immission_Obj1_aktiv
      O     "Instanz DB11".Betrieb_IM_Obj2_Ein
      O     "Instanz DB11".Prg_Immission_Obj2_aktiv
      O     "Instanz DB11".Betrieb_Manuell_Ein
      O     "Instanz DB11".Prg_Manuell_aktiv
      SPBN  FR01
      U     "IODB"._DBX_2_1          // Drehrichtung
      SPB   FR00
      U(                                // Drehzahl
      L     "SPS -> MMI"._DBW_60_0
      L     50
      <=I   
      )     
      SPBN  FR01
FR00: O(    
      L     "SPS -> MMI"._DBW_86_0
      L     150
      >=I   
      )     
FR01: UN    #Obj_SA_Alarme_Anfahrt
      UN    #Obj_SA_SGK_Schalten
      UN    #Obj_SA_Abschaltung
      U     #Obj_Freigabe
      SPBN  FR02
      S     #Obj_Schalten
FR02: NOP   0
```

Was habt ihr da so zu bieten wo ihr euch schonmal gefragt habt was sich derjenige dabei dachte.

mfG René


----------



## SoftMachine (16 Oktober 2013)

vollmi schrieb:


> Was habt ihr da so zu bieten wo ihr euch schonmal gefragt habt was sich derjenige dabei dachte.
> 
> mfG René[/SIZE]



Hallo René

das ist der Progger-Stil eines Programmierers, der noch 
mit Sicherheit in S5-Zeiten aufgewachsen ist. 
Dort war es so üblich, in AWL das "Setzen" so wie hier 
aufzurufen und das Rücksetzen erst Netzwerke später 
oder gar in einem anderem Baustein auszuführen (was 
sicher auch funktioniert, aber nicht unbedingt 
nachvollziehbar ist).

Bleibt dir nur eins:
"reinpfriemeln" 
ODER
auseinander nehmen und neu programmieren. 


Gruss


----------



## vollmi (17 Oktober 2013)

SoftMachine schrieb:


> Hallo René
> 
> das ist der Progger-Stil eines Programmierers, der noch
> mit Sicherheit in S5-Zeiten aufgewachsen ist.



Leider nicht. Darum kann ich mir diesen Stil ja auch nicht erklären.



> Dort war es so üblich, in AWL das "Setzen" so wie hier
> aufzurufen und das Rücksetzen erst Netzwerke später
> oder gar in einem anderem Baustein auszuführen (was
> sicher auch funktioniert, aber nicht unbedingt
> nachvollziehbar ist).



Ich setze und rücksetze ja manchmal auch in verschiedenen Netzwerken. Dann wenn es der Uebersichtlichkeit oder Sicherheit geschuldet ist.
Aber ich war mir sicher das man auch bei der S5 ein S und R Ergebnisabhängig ausgeführt hat. Und nicht überspringen musste wenn es nicht ausgeführt werden sollte.

Und in diesen Programmteilen ist es dann ja sogar so dass zwingens S oder R ausgeführt werden. Also die Funktion garnicht benötigt wird sondern ein = den selben Zwecke erfüllte.

Ich versuche möglichst mit aus dem Programm rauszuhalten und die Erweiterungen in getrennten Bereichen zu halten. Aber es hat da drin auch hochsporadisch auftauchende Fehler die echt schwierig zu finden sind.

mfG René


----------



## PN/DP (17 Oktober 2013)

Der gezeigte Programmierstil hat nichts mit "alter S5-Programmierer" zu tun, sondern eher mit "junger größenwahnsinniger S7-Programmierer", der nach kurzer Erfahrung schon meint, er wäre ein AWL-Genie ("übersichliches KOP/FUP ist was für Weicheier und Platzverschwendung").

Es war auch zu S5-Zeiten nicht üblich, mitten in Verknüpfungen zu springen - erst recht nicht mit SPB/SPBN *ROFL*, weil das nämlich gar nicht so funktioniert, wie das kleine Genie wohl gewollt hat. 
siehe die zweimal "SPBN  FR01"

Ich kann mir gut vorstellen, daß der Code mit den Vergleichern gar nicht so funktioniert wie er soll, man sieht aber leider nicht welchen Sinn die Parameter _DBW_60_0 und _DBW_86_0 haben.

Damit "S #Obj_Schalten" ausgeführt wird:

WENN _DBX_2_1 = 0 und _DBW_60_0 > 50 DANN wird _DBW_86_0 ignoriert
WENN _DBX_2_1 = 0 und _DBW_60_0 <= 50 DANN muß _DBW_86_0 >= 150 sein
WENN _DBX_2_1 = 1 DANN wird _DBW_60_0 ignoriert aber _DBW_86_0 muß >= 150 sein
WENN keines der "DB11"-Bits true ist, dann werden beide _DBW_60_0 und _DBW_86_0 ignoriert


"FR00: O("
Ob hier O( oder U( steht ist egal, weil immer eine neue Verknüpfung mit Erstabfrage angefangen wird und später kein O mehr kommt. Das verwendete O( ist aber irreführend weil es wie U( wirkt!


"SPBN  FR02" und "SPBN  AU01"
Die einzelnen S oder R zu überspringen ist Ansichtssache. Man kann es so machen, weil es evtl. die Übersichtlichkeit erhöht. Solange nur S und R nach dem SPBN folgen ist das Überspringen nicht notwendig. Vielleicht war da aber auch noch weiterer (auskommentierter) VKE-unabhängiger Code nach dem SPBN (oder die Stelle soll für sowas freigehalten werden)?

Harald


----------



## Larry Laffer (17 Oktober 2013)

PN/DP schrieb:


> Es war auch zu S5-Zeiten nicht üblich, mitten in Verknüpfungen zu springen ...



Hast du 'ne Ahnung ...  Derartige Merkwürdigkeiten habe ich auch schon des Öfteren gesehen ... und ich mache mit dir eine Wette, dass noch viele "erfahrene" Programmierer auch heute noch so programmieren ...
In meinem heutigen Zuständigkeitsbereich gibt es so etwas nicht ... und früher habe ich solche Konstrukte dann regelmäßig elemeniert, streng nach der vielleicht etwas größenwahnsinnigen Devise : wenn ich es nicht auf Anhieb verstehe - wie sollen es dann Andere tun ...



Gruß
Larry


----------



## Aventinus (17 Oktober 2013)

Die Devise ist aber sehr gut...

Ich nehme mir immer vor, etwas so zu programmieren, dass ich auch in 5 Jahren mir einer Kiste Bier intus noch verstehe was ich programmiere. Aber wenn ich heute Programme anschaue die ich vor 10 Jahren gebastelt hab, glaub ich eher, dass ich damals besoffen war....


----------



## vollmi (17 Oktober 2013)

Aventinus schrieb:


> Aber wenn ich heute Programme anschaue die ich vor 10 Jahren gebastelt hab, glaub ich eher, dass ich damals besoffen war....



Das geht mir heute auch so. Wenn ich mir die Merkerverballerei von vor 10 Jahren anschaue die ich programmiert habe. Wo ich heute alles versuche in Bausteine zu kapseln.

Aber man lernt ja auch dazu. Zumindest versucht man es.

Aber selbst vor 10 Jahren habe ich auch meinen wesentlich unübersichtlicheren Programmierstil ausführlich mit Kommentaren und Datum versehen dass ich auch auch heute noch weiss um was es ging und was die Intention hinter einer Programmzeile war.

mfG René


----------



## Aventinus (17 Oktober 2013)

vollmi schrieb:


> Wenn ich mir die Merkerverballerei von vor 10 Jahren anschaue die ich programmiert habe. Wo ich heute alles versuche in Bausteine zu kapseln.



Du weißt was ich meine


----------



## KingHelmer (17 Oktober 2013)

arbeitet bei dir in der firma ein mann der Alex heißt?


----------



## Ralle (17 Oktober 2013)

KingHelmer schrieb:


> arbeitet bei dir in der firma ein mann der Alex heißt?



Gott arbeitet nicht, Gott erschafft!!!


----------



## KingHelmer (17 Oktober 2013)

> Gott arbeitet nicht, Gott erschafft!!!



Gott und Alex in einem Thread zu nennen halte ich für unbedacht


----------



## rostiger Nagel (17 Oktober 2013)

Wir können ja mal schauen ob es da Ähnlichkeiten gibt 



vollmi schrieb:


> ```
> U     #Obj_Schalten
> SPBN  AU01
> ON    #Obj_Freigabe
> ...






00alex schrieb:


> ```
> FUNCTION FC 1 : VOID
> TITLE =
> VERSION : 0.1
> ...


----------



## vollmi (18 Oktober 2013)

Wenigstens hats bei mir keine Symbollosen Merker dabei. Aber die externen IDB zugriffe sind ja auch nicht wirklich besser.

Aber meine güte. Selbst wenn man online davor sitzt. Ist es richtig übel den Auslöser für irgendeine Funktion zu finden.

Da gibts auch so veroderungen welche ein Objekt sperren so dass man es rücksetzen muss. Aber es wird nicht der auslösende Fehler gespeichert sondern das Objekt wird als gestört gestört.

Super wenn irgendwo ein Wackelkontakt ist, und das MMI die Einzelmeldung garnicht mitkriegt.

Finde den Fehler wenn nur das Resultat bekannt ist, der Fehler aber schon wieder weg. Vor allem wenn das Resultat aus 100 verschiedenen Auslösern gebildet wird.

mfG René


----------



## ducati (18 Oktober 2013)

vollmi schrieb:


> Was habt ihr da so zu bieten wo ihr euch schonmal gefragt habt was sich derjenige dabei dachte.



Ich hatte letztens:

C:= (A OR B) AND A; ...

da sitzt man dann im ersten Augenblick davor und grübelt 

Gruß.


----------



## Blockmove (18 Oktober 2013)

Manche "Kollegen" haben einfach nicht begriffen, dass ihre Programme wie Kindersachbücher (Im Sitle von "Was ist Was") schreiben sollten.
Einige schreiben Romane, andere Prosa und wieder andere Esotherik.

Gruß
Dieter


----------



## PN/DP (18 Oktober 2013)

Hier mal eine Auswahl was ich sehr oft sehe:

- Rücksetzen einer boolschen Variable nur nach vorheriger Prüfung, ob die denn auch gesetzt ist
- Verknüpfen aller Rücksetzbedingungen bei SR-Flipflop auch nochmal im Setzen-Zweig
- seitenlange "Angst-Rücksetz-Orgien" von 'zig Variablen bei "Ereignissen" - die zeigen mir immer, daß der Programmierer seinem eigenen Programm nicht traut.
- Verarbeiten von HMI-Eingaben ohne Wertebereichsprüfung oder höchstens Grenzwertprüfung bei der Eingabe im HMI

Was in neuerer Zeit mit ST und SCL leider immer mehr zunimmt: diese oft logisch unvollständig(!) ausprogrammierten IF..THEN mit 'zig extra Sonderbehandlungen für 'zig möglicherweise auftretende Ereignisse, statt sich mit vernünftiger Logik ala Karnaugh und Wahrheitstabellen zu beschäftigen ...

Harald


----------



## vollmi (18 Oktober 2013)

PN/DP schrieb:


> - seitenlange "Angst-Rücksetz-Orgien" von 'zig Variablen bei "Ereignissen" - die zeigen mir immer, daß der Programmierer seinem eigenen Programm nicht traut.



Bei diesen Setz\Rücksetzorgien oder auch verriegelungsorgien ist das doofe. Übersichtlicher werden die Programme dadurch nicht. Und auf einmal gibts dann ne konstellation wo sich alles ineinander verriegelt. 

Mit freundlichen Grüßen René


----------



## drfunfrock (18 Oktober 2013)

Ich arbeite hier an einem Programm, das im Prinzip 4 Modi und 3 Submodi implementiert. Als Randbedg. kommen noch Grenzwerte dazu. Der damalige Progammierer hat alles mit Merkern gemacht. Die IF-THEN-ELSE Exzesse sehen in etwa so aus: 

IF Merker1 THEN Merker5=False
IF Speed<4 then Merker7=True; 
END_IF;
ELSIF Merker3 THEN ....

Auf diese Weise hat er einen Rampengenerator für eine Position realisiert...

Ich habe dann die Modes in einen Mode-Controller ausgelagert und dort errechnet und habe jetzt eine wunderschöne State-Machine mit einem

CASE Mode OF 
  Mode 1: 
  Mode 2:
....

END_CASE;

Ich bestreite das man Merker benötigt


----------



## ducati (18 Oktober 2013)

drfunfrock schrieb:


> Ich bestreite das man Merker benötigt



 Ich auch


----------



## vollmi (20 Oktober 2013)

drfunfrock schrieb:


> Ich bestreite das man Merker benötigt



Ich will nicht auf meinen True und Falsemerker verzichten.


----------



## Blockmove (20 Oktober 2013)

vollmi schrieb:


> Ich will nicht auf meinen True und Falsemerker verzichten.



Von den hab ich mich neulich getrennt.
Stehen jetzt in einem Global-DB oder werden ggf. im Baustein als statische Varaible deklariert.

Gruß
Dieter


----------



## drfunfrock (21 Oktober 2013)

vollmi schrieb:


> Ich will nicht auf meinen True und Falsemerker verzichten.



Stell dir vor, du hast 6 Modi, wie eine Maschine gefahren werden kann. Du brauchst für jeden  Modus einen Merker. Und da jeder Modus auch überall Auswirkungen hat, biste dann jedesmal dabei so etwas zu fabrizieren: 


```
IF m1 AND NOT m2 AND NOT m3 AND NOT m4 AND NOT m5 AND NOT m6 THEN
.....
END_IF;
```
In der Praxis wird die Abfrage der meisten Merker dann aus Bequemlichkeit unterlassen, was eine nette Quelle für Fehler ist: 


```
IF m1 AND NOT m3 AND NOT m4 THEN
.....
END_IF;
```


Das ist in keiner Sprache vernünftig auszudrücken. Richtig nett wird es denn, wenn du einen der Merker zurücksetzen willst. Nach meiner Erfahrung, wird dass dann überall gemacht und dann nach den verschiedensten Regeln. 

Ich mache das so

1. Modus festlegen

```
Manuell = 0
Manuell mit Joystick = 1
Auto Vorwärts = 2
Auto Rückwärt = 3
Auto Ausgleich = 4
Auto Ausgleich mit Joystick = 5
```

2. Dann kann ich einfach eine Variable oder Merker vom Typ Integer festlegen und brauche mir um das Rücksetzen keine Sorgen zu machen, denn es gibt nur eine Stelle an der ich den Modus ändere


```
CASE Modus OF
  0: 
       IF  Geschwindigkeit<1.0 THEN
           Modus = NeuerModus;
  END_IF;
  1: 
 IF  Geschwindigkeit<1.0 THEN
  Modus = NeuerModus;
 END_IF;
und so weiter

END_CASE
```



3. An Stellen wo es etwas in Abhängigkeit vom Modus zu machen gibt sieht das dann so aus: 


```
CASE Modus OF
 0: 
    mach was
 1: 
  mach was
 2: 

END_IF;
```
oder so aus 


```
IF Modus = 0 THEN
...
ELSE
...
END_IF;
```

4. Wenn man etwas nachdenkt, ist das Verfahren mit dem Joystick nur ein Untermodus. Wenn ich dann die Hauptmodi mit 10 multipliziere, dann sieht das so aus

Manuell = 0
Manuell mit Joystick = 1
Auto = 10
Auto Vorwärts = 11
Auto Rückwärt = 12
Auto Ausgleich = 20
Auto Ausgleich mit Joystick = 21

5. In FB wie einem Regler interessiert mich der Joystick nicht, ebenso nicht, ob es Rückwärts oder Vorwärts geht. Da sieht es denn so aus: 


```
CASE modus/10 OF
  0:  (* Manuell *)
     .....
  1: (* Auto *)
   ....
  2: (* Auto Ausgleich *)
    ... 
END_CASE;
```

Mach das mal mit Merkern


----------



## ducati (21 Oktober 2013)

In CFC hab ich noch nie nen true oder false Merker benötigt, da konfiguriert man an den Bausteineingängen direkt den InstanzDB bzw. erzeugt CFC beim Übersetzen selbst die entsprechende Verschaltung mit 0 oder 1...

Aber irgendwie kommt CFC ja nicht aus seinem Schattendasein heraus bzw. bei TIA hört man davon Garnichts...

Gruß.


----------



## drfunfrock (21 Oktober 2013)

Es hängt wohl damit zusammen, das FUP und Leiterdiagramme immer noch so populär sind. 

Ich selbst, mag grafische Programmiersprachen weniger, weil ich Texte beliebig kopieren kann und ich auch nicht mehr Übersicht habe. Wobei du hast recht, es würde sich lohnen, mal sich CFC anzuschauen. 

Und ich muss derzeit mit CX-Programmer von Omron arbeiten. Da gibt es CFC gar nicht.  CX-Programmer ist eine grosse Zumutung, weil Omron es fertigbringt, die Regional-Einstellungen für Komma und Punkt etc. in die Umgebung mit einzubinden, so dass ich dann statt 3.14 diese Zahl mit 3,14 schreiben muss. Dummerweise ändert sich der Aufruf von Parameter nicht, so das

RXD_SCU(buffer, 1,1,2,3);

als 

RXD_SCU(buffer, (1,1), (2,3)) 

gelesen wird. So muss ich dann den Aufruf als 

RXD_SCU(buffer, (1),(1),(2),(3));

schreiben. Somit sind solche Projekte auch nicht portabel.


----------



## ducati (21 Oktober 2013)

drfunfrock schrieb:


> Ich selbst, mag grafische Programmiersprachen weniger, weil ich Texte beliebig kopieren kann und ich auch nicht mehr Übersicht habe. Wobei du hast recht, es würde sich lohnen, mal sich CFC anzuschauen.



Man schreibt ja nicht alles in CFC. Die Bausteine erstellt man weiterhin in SCL oder AWL... Nur die Verschaltung, Parametrierung und das "Drumherum" mach ich in CFC. 
Bei der IBN geht das Beobachten der Instanz bzw. Änderungen viel schneller und einfacher...
Man muss sich auch nicht mehr um die ganzen IDBs kümmern, macht CFC alles selber...

Gruß.


----------



## vollmi (22 Oktober 2013)

drfunfrock schrieb:


> Stell dir vor, du hast 6 Modi, wie eine Maschine gefahren werden kann. Du brauchst für jeden  Modus einen Merker. Und da jeder Modus auch überall Auswirkungen hat, biste dann jedesmal dabei so etwas zu fabrizieren:



Meine True/False Merker nutze ich eigentlich als Konstante um eine Schnittstelle voll zu beschalten oder einen Baustein im Fup aus dem Ablauf zu nehmen etc.
Das hat in dem sinn nichts mit meiner Steuerung ansich zu tun.

Da nutze ich eigentlich genau das Konzept wie du es beschreibst  Nur gibts bei mir keine 0 im Modus. 0 ist für mich immer Ungültig. Damit will ich vermeiden dass ein Objekt irgend einen scheiss macht wenn jemand einen DB löscht oder ein Initialwert nicht gesetzt ist.

Auch für die Übertragung nehme ich das her. Ein Befehl hat immer einen Wert über 0. Wenn der Wert über null ist, wird das Telegramm gespeichert, gesendet und der Befehl wieder auf 0 zurückgesetzt.

mfG René


----------



## drfunfrock (29 Oktober 2013)

Ich würde Omron zu dem Übelsten küren, was man sich nur denken kann. Die haben einfach alles den Regionaleinstellungen unterworfen. Der gesamte Kode ist nicht mehr portabel, weil man Zahlen mit Komma schreiben muss, während in den USA natürlich der Punkt gilt. Das hat Konsequenzen. Funktionen und FB mit Komma als Parameterseparator funktionieren nur, wenn man die Zahlen dann in Klammern setzt. Die nächste Überraschung kam dann, als ich mit dem SCADA-System "Supervisor" CSV-Dateien geschrieben hatte, um ein Interface zu anderer Software zu haben und dann auch die Feldtrenner von der Locale gesteuert wurden. Im Prinzip sind alle Konvertierungen  nach String von der Locale beeinflusst. Wer es richtig macht, setzt einfach die Locale für PC auf US-Standart fest. Die haben doch einen Schuss weg. 

Das ist das Schlimmste was mir bisher begegnet ist.


----------



## bugatti66 (4 November 2013)

Der Omron Kontaktplan ist einer der Besten, den ich je gesehen habe.


----------



## IBFS (4 November 2013)

bugatti66 schrieb:


> Der Omron Kontaktplan ist einer der Besten, den ich je gesehen habe.



Und was sagst du zu der Meinung von drfunfrock?   In diesem Kontext hat dein Satz keinen rechten Sinn.


----------



## bugatti66 (4 November 2013)

Das Punkt und Komma-Problem ist doch ein Problem von Microsoft.
Wenn ich meine Reisekosten auf einem deutschen PC mache und sie dann nach England schicke, kann der Kollege die ja auch nicht öffnen ohne an seinem PC etwas umzustellen, wenn sie in csv-Format verschickt wird.


----------



## IBFS (4 November 2013)

bugatti66 schrieb:


> Das Punkt und Komma-Problem ist doch ein Problem von Microsoft.



... es ist nachher ein Problem vom Programmierer der mit dem Unsinn klarkommen muss.

Eine Reisekostenabrechnung hin gegen führt nicht direkt zum Produktionsausfall es sei denn du kannst 
aufgrund nicht bezahlter Rechnungen keine schnelle Maintenance mehr machen,


----------



## Aventinus (4 November 2013)

Wir verschicken aber keine SPS-Programme im CSV-Format. und selbst wenn ich eine Quelle eines Bausteins von Deutschland nach China schicke sollte beim Übersetzen wieder was vernünftiges rauskommen.


----------



## bike (4 November 2013)

bugatti66 schrieb:


> Das Punkt und Komma-Problem ist doch ein Problem von Microsoft.



MS$ baut PLC Steuerungen?
Das ist ja toll, dann haben diese in Zukunft direkt einen Zugang zur NSA und Facebook.

Also diese Argumentation ist doch bei dem Problem, dass man Programme nicht einfach in verschiedenen Sprachumgebungen nutzen kann, einfach völlig daneben.
Aber vermutlich hat Omron noch nie gehört, dass eine Maschine von einem in ein anderes Land umgesetzt wird.


bike


----------



## drfunfrock (4 November 2013)

bugatti66 schrieb:


> Das Punkt und Komma-Problem ist doch ein Problem von Microsoft.
> Wenn ich meine Reisekosten auf einem deutschen PC mache und sie dann nach England schicke, kann der Kollege die ja auch nicht öffnen ohne an seinem PC etwas umzustellen, wenn sie in csv-Format verschickt wird.



Komisch, ich habe nie Probleme mit C, C++, VB, Pascal oder Python gehabt, weil dort die Locale nur für die Anwender-Strings angewendet werden. Omron hätte genau den gleichen Schwachsinn unter Linux verbrochen. Ich vermute einmal, die haben sich alles zusammengekauft und dann "schnell" internationalisiert. Und weil Omron-Programmierer aus Japan oder den USA kommen, haben die das Konzept auch nicht richtig verstanden. Nicht einmal Inder können derart dämlich sein.


----------



## drfunfrock (4 November 2013)

Für jedes Update vom Supervisor (Scada) von Omron, darf ich auch beim Kunden die Runtime updaten, inkl. Reboot usw. Weil ansonsten müssten wir die Entwickler-PC auf dem Stand von Vorgestern halten.


----------



## ducati (5 November 2013)

drfunfrock schrieb:


> Für jedes Update vom Supervisor (Scada) von Omron, darf ich auch beim Kunden die Runtime updaten, inkl. Reboot usw. Weil ansonsten müssten wir die Entwickler-PC auf dem Stand von Vorgestern halten.



Das ist bei Siemens aber auch so (ähnlich)...

Wir haben da für fast jede Kundenanlage ne eigene Entwickler/Test-VM.


----------



## drfunfrock (5 November 2013)

ducati schrieb:


> Das ist bei Siemens aber auch so (ähnlich)...
> 
> Wir haben da für fast jede Kundenanlage ne eigene Entwickler/Test-VM.



Was das Leiden nicht besser macht. ich arbeite viel in Umgebungen, die jede Änderung zu Hölle machen, weil ich teilweise für 30min Änderung 12h und mehr warten muss. Das ist zwar bezahlt aber nicht lustig. Ich will in Zukunft HTML, damit ich genau das nicht mehr habe. Ich muss mir da mal Produkte wie atvise anschauen.


----------



## ducati (5 November 2013)

drfunfrock schrieb:


> Was das Leiden nicht besser macht. ich arbeite viel in Umgebungen, die jede Änderung zu Hölle machen, weil ich teilweise für 30min Änderung 12h und mehr warten muss. Das ist zwar bezahlt aber nicht lustig. Ich will in Zukunft HTML, damit ich genau das nicht mehr habe. Ich muss mir da mal Produkte wie atvise anschauen.


Jo, wer kennt das nicht... Oft wird aber die Programmierumgebung/Sprache vorgeschrieben... von daher hat man eh keine Wahl...


----------



## vollmi (2 April 2014)

Gestern durfte ich mal wieder spätabends ausrücken. In dem Programm habe ich einen zusätzlichen FB eingebaut. Den FB habe ich von A-Z durchgetestet und funktionierte. Leider funktionierte etwas im Alten teil des Programms dann nicht mehr. Das ganze war in einem FB programmiert. #VK_Auf im TEMP deklariert und wird nirgends zurückgesetzt.


```
O     #ZK_Auf      
O     "Schaltbefehle von AV"._DBX_22_6
      SPBN  VK01
      S     #VK_Auf
      S     #VK_Oeffnen


VK01: U     #VK_Auf
      FR    T     32
      L     S5T#30S
      SA    T     32
      UN    T     32
      SPBN  VK02
      R     #VK_Oeffnen
VK02: NOP   0
```

#VK_Oeffnen hat eine Klappe offen gehalten welche eigentlich wieder hätte zeitverzögert schliessen sollen. Nachdem die beiden Startbedingungen weggefallen sind.

Mal abgesehen vom Zugriff auf eine fremde Instanz. Wie kommt man auf die Idee S7 Timer in einem FB mit eigener Instanz einzusetzen? Und dann noch in so einer kruden Konstruktion?

mfG René


----------



## Lipperlandstern (2 April 2014)

vollmi schrieb:


> Gestern durfte ich mal wieder spätabends ausrücken. In dem Programm habe ich einen zusätzlichen FB eingebaut. Den FB habe ich von A-Z durchgetestet und funktionierte. Leider funktionierte etwas im Alten teil des Programms dann nicht mehr. Das ganze war in einem FB programmiert. #VK_Auf im TEMP deklariert und wird nirgends zurückgesetzt.
> 
> 
> ```
> ...




Da kommt der gute Programmierer mit seinem vorbereiteten Programm auf die Baustelle und muss dann auf die schnelle die Änderungen reinbasteln die seine Kollegen ihm nicht erzählt haben.... da bleibt dann der saubere Programmierstil und das Auskommentieren auf der Strecke.

Ob das in deinem Programm so war kann man schlecht sagen aber bei vielen Programmen ist es so ....


----------



## Larry Laffer (3 April 2014)

@Axel:
Du wirst sicherlich Recht haben, dass das so entstanden sein könnte - als eine Entschuldigung kann ich das aber nicht akzeptieren.
Genau das, was René schreibt, kenne ich (auch von meinen Kollegen) zur Genüge und bin auch schon zwei-drei Mal darüber gestolpert. Die 2 Sekunden mehr Zeit kann man sich schon nehmen ...

Gruß
Larry


----------



## RONIN (3 April 2014)

Hahaha.. das ist mal ein lustiger Beitrag.

 Ich hatte vor kurzem eine lustige Konstellation in einem SPS-Programm einer Fremdfirma. Es ging um eine einfache Uhrzeit-Synchronisation zwischen dem Panel und der CPU.

 Das Panel schickt die Uhrzeit als einzelne INT-Varaiblen an die SPS. Im STAT-Bereich des FB ist ein DATE_AND_TIME angelegt. Als es dann aber an das zusammensetzen des DT ging wurde es ein wenig merkwürdig.

Da stand dann sowas.

```
L Daten.Jahr
ITB
T DB11.DBB20   //Zuerst werden die Zeitwerte auf irgendeinen DB transferiert.
L Daten.Monat
ITB
T DB11.DBB21

//.... und so weiter

//dann geht's an das setzen der Uhrzeit
Call SET_CLK
IN= #DT_VarAusStat  // wurde eigentlich noch nirgends beschrieben
```
 Bin dann eh schnell drauf gekommen dass der DB11 der Instanz-DB des hiesigen FBs war. 
Das war die lustigste Art der "indirekten Adressierung" von  STAT-Daten die ich jemals gesehen hab.

 Ich glaub Larry pflegt zu sagen: *Von hinten, durch die Brust, ins Auge. **ROFL*


----------



## Thomas_v2.1 (3 April 2014)

Ich finde ja, dass die Probleme mit der Verwendung von uninitialisierten Temp-Variablen eigentlich ein Fall für eine Compilerwarnung wären.

Denn der könnte überprüfen ob eine Temp-Variable gelesen, bevor sie geschrieben wird, und dann zumindest eine Warnung ausgeben. Gleiches wenn ich einen FC habe und eine Out-Variable nicht beschreibe. Das wäre für den Compiler-Hersteller nur ein geringer Aufwand, würde aber viele Fehler vermeiden helfen.


----------



## RONIN (3 April 2014)

Thomas_v2.1 schrieb:


> Ich finde ja, dass die Probleme mit der Verwendung von uninitialisierten Temp-Variablen eigentlich ein Fall für eine Compilerwarnung wären.



*ACK*

Wie viel Blödsinn wäre uns und der Welt damit wohl erspart geblieben.


----------



## Aventinus (4 April 2014)

Aber nur als Warnung bitte. Nicht dass die Initialisierung bzw. das Beschreiben vor dem Lesen an mehreren Stellen nur Bedingt bearbeitet wird. Und dann kann der Kompiler ggf. nicht erkennen ob sicher irgendwo initialisiert wird oder ob alle Schreibzugriffe in einer Konstellation übersprungen werden.


----------



## drfunfrock (4 April 2014)

bugatti66 schrieb:


> Der Omron Kontaktplan ist einer der Besten, den ich je gesehen habe.



1) Arrays lassen sich nur mit Signed-Integer-Typen indexieren. 
2) Es gibt keine Bit-Manipulation mit Integertypen, sondern nur mit Word-typen
3) Addition, Subtraktion etc. sind nur für integertypen definiert, aber nicht für Word-Typen
4) Die Konvertierung kann nicht einfach auf Kontaktplanniveau erfolgen. Daher gibt es jede Menge Warnungen vom Compiler.
5) Typkonvertierungen in ST werden immer von Warnungen des Compiler begleittet, so dass wirkliche Fehler wie ein doppeltes Schreiben auf eine Variable nicht auffallen. 
6) Das endet in ST damit, dass man wieder Willen und das bei bester Planung Unmengen von Konvertierungen durchführen muss, weil selbst so simple Funktionen wie SHL() nur einen Word-Typ zurückgeben. 
7) Es gibt eine FOR-Schleife, die aber ohne Index-Variable ist, daher kann man dann auch gleich eine State-Machine implementieren. 

Omron war nicht  einmal in der Lage FBs für die CANbus-Initialisierung zu liefern, die in jeder Situation funktionieren. Stellt man nämlich eine feste Zykluszeit ein, funktionieren die nicht mehr, weil da gepfuscht wurde und nicht auf das Ende des FINS-Kommandos getestet wurde.


----------



## vollmi (23 April 2014)

Nächste krasses Konstruktion.
Ich hab echt manchmal mühe da durchzublicken was eigentlich das Ziel sein sollte.


```
U     "SPS4 - IO DB160"._DBX_10_4 // Not-Aus
      SPB   OE0
      U     #Oelanlage_Freigabe         // Pumpe Freigabe
      SPB   OE1
OE0:  R     #Schalten_Oelanlage_Pu1
      R     #Schalten_Oelanlage_Pu2
      R     #Oelanlage_Anlauf
      R     #Umschaltung
      R     T      1
      R     "SPS -> BR"._DBX_202_6
      SPA   OE12


// Öldruck abwarten, notfalls umschalten    
OE1:  UN    #Schalten_Oelanlage_Pu1     // Eine Pumpe einschalten
      UN    #Schalten_Oelanlage_Pu2
      SPB   OE3
      U     #Schalten_Oelanlage_Pu1     // Beide Pumpen in Betrieb
      U     #Schalten_Oelanlage_Pu2
      SPB   OE12
      U     T      1                    // Anlauf fertig
      U     #Oelanlage_Anlauf
      SPB   OE11
      UN    #Oelanlage_Anlauf           // keine 30bar nach Anlauf
      UN    #Umschaltung
      UN    #RM_Oeldruck_Pumpen_30bar
      SPB   OE2
      U     T      1
      U     #Umschaltung
      SPBN  OE12
      U     #RM_Oeldruck_Pumpen_30bar   // 30bar nach Umschaltung
      SPB   OE12
      U     #Schalten_Oelanlage_Pu1     // keine 30bar nach Umschaltung
      SPB   OE7
      U     #Schalten_Oelanlage_Pu2
      SPB   OE5


OE2:  U     #Schalten_Oelanlage_Pu1     // Umschaltung keine 30bar nach Anlauf
      SPB   OE6
      U     #Schalten_Oelanlage_Pu2
      SPB   OE4
      SPA   OE12


// Ein-/Umschaltung
OE3:  S     #Oelanlage_Anlauf
      L     "SPS -> BR"._DBW_100_0      // Betriebsstunden Pumpe1
      L     "SPS -> BR"._DBW_102_0      // Betriebsstunden Pumpe2
      <I    
      SPB   OE5
      SPA   OE7


OE4:  R     #Schalten_Oelanlage_Pu2     // Umschalten
      S     #Umschaltung
      R     T      1
      S     "SPS -> BR"._DBX_202_6
OE5:  S     #Schalten_Oelanlage_Pu1
      SPA   OE12


OE6:  R     #Schalten_Oelanlage_Pu1     // Umschalten
      S     #Umschaltung
      R     T      1
      S     "SPS -> BR"._DBX_202_6
OE7:  S     #Schalten_Oelanlage_Pu2
      SPA   OE12


OE11: R     #Oelanlage_Anlauf           // Anlauf fertig
      R     T      1
OE12: NOP   0

      U(    
      O     #Oelanlage_Anlauf
      O     #Umschaltung
      )     
[COLOR=#ff0000]      FR    T      1[/COLOR]
[COLOR=#ff0000]      L     S5T#5S[/COLOR]
[COLOR=#ff0000]      SS    T      1[/COLOR]
      U     T      1
      R     #Start_Timer
```

Ist übrigens ein FB. Wieso da ein S5 Timer sein musste ist mir schleierhaft.
Ab den vielen Sprüngen wird mir direkt schwummrig.

mfG René


----------



## Larry Laffer (23 April 2014)

@René:
Du hast da aber auch ein wirklich Könner am Start gehabt ... 8)
Ich finde das auch schrecklich, was sich so manch einer als Code einfallen läßt um vielleicht ein paar Bytes an Code zu sparen aber dafür einen hohen Preis mit der Durchschaubarkeit bezahlt ...

Gruß
Larry


----------



## bugatti66 (3 Mai 2014)

drfunfrock schrieb:


> Omron war nicht  einmal in der Lage FBs für die CANbus-Initialisierung zu liefern, die in jeder Situation funktionieren. Stellt man nämlich eine feste Zykluszeit ein, funktionieren die nicht mehr, weil da gepfuscht wurde und nicht auf das Ende des FINS-Kommandos getestet wurde.



Also ich glaube Dir, dass Du irgendwie ziemlich sauer bist, wenn Du nach Monaten damit nochmal hervorkommst.
Was sollen das denn für komische FBs sein.
Kann man die sich irgendwo runterladen ?

Arbeitest Du jetzt immer noch an dem Projekt?


----------



## vollmi (25 Juni 2014)

bugatti66 schrieb:


> Also ich glaube Dir, dass Du irgendwie ziemlich sauer bist, wenn Du nach Monaten damit nochmal hervorkommst.
> Was sollen das denn für komische FBs sein.
> Kann man die sich irgendwo runterladen ?
> 
> Arbeitest Du jetzt immer noch an dem Projekt?



Ich arbeite leider immernoch ab und zu in dem Projekt. Da sollen halt noch Erweiterungen rein (solche die in meinen anderen Projekten einwandfrei laufen und der Kunde gefallen dran gefunden hat)

Direkt veröffentlichen will ich das natürlich trotzdem nicht erstens soll nicht daraus ersichtlich werden WER das programmiert hat und auch nicht in welcher Anlage.

Nochmal n kleines Schmankerl, vonwegen InstanzDBs






Ich such Verwendungsstelle #AK_Freigabe finde nur diese eine hier am Anfang des FBs. Denke mir "Kann doch nicht sein"
Suche dann in den Referenzen diesen Instanzdb. Ist doch herrlich:





Solche S/R Orgien sind mir an sich schon ein Gräuel ich muss mich schon überwinden am Schluss des OB1 noch einen Baustein aufzurufen wo für den Notaus noch eine sichere Stellung gesetzt wird.
Aber hier wird echt der Vogel abgeschossen. Muss ich erwähnen dass etwa die hälfte dieser S/Rs eh zu 100% in der hälfte des Bausteins unbedingt in einen Zustand versetzt werden?

mfG René


----------



## IBFS (25 Juni 2014)

vollmi schrieb:


> ....dass etwa die hälfte dieser S/Rs eh zu 100% in der hälfte des Bausteins unbedingt in einen Zustand versetzt werden?



.. das 50% eh zu 100% in der "Hälfte" des  ....      "Viertel nach   Dreiviertel vor Um = Halb"    .....      außer das man die Startsprungmarke AK2 nicht sieht ist das für mich noch lange keine Orgie ....


----------



## vollmi (25 Juni 2014)

IBFS schrieb:


> .. das 50% eh zu 100% in der "Hälfte" des  ....      "Viertel nach   Dreiviertel vor Um = Halb"    .....      außer das man die Startsprungmarke AK2 nicht sieht ist das für mich noch lange keine Orgie ....



Das meinte ich auch nicht als Orgie, sondern eher das was im Baustein abgeht wo die Referenzliste drauf verweist. Da wird 12 mal in einem Baustein auf die Instanz eines völlig anderen Bausteins geschrieben.

mfG René


----------



## Draco Malfoy (25 Juni 2014)

vollmi schrieb:


> Da wird 12 mal in einem Baustein auf die Instanz eines völlig anderen Bausteins geschrieben.


Ohren abreißen für sowas


----------



## vollmi (29 September 2014)

Wiedermal geiles Schmankerl.


```
(*Auf nächste ganze Zahl aufrunden*)
IF (nSV*10) - TRUNC(nSV)*10 <> 0.0 AND nSV > 0 THEN
    Res := TRUNC(nSV) +1;
END_IF;
IF (nSV*10) + TRUNC(nSV)*10 <> 0.0 AND nSV < 0 THEN
    Res := TRUNC(nSV) -1;
END_IF;
IF nSV = 0 OR Einschaltsperre = 1 THEN
    Res := 0;
END_IF;
```

nSV und Res sind übrigens vom Typ REAL, Einschaltsperre ist BOOL.

Der Programmschnippsel funktioniert sogar (bis Siemens mal restriktiver mit dem Compiler wird, vermutlich)
Man könnt auch meinen Klammern kosten Geld oder bin ich der einzige der Vergleichsoperationen einklammert bevor die Resultate Bitweise verknüpft werden?

mfG René


----------



## Draco Malfoy (29 September 2014)

vollmi schrieb:


> nSV und Res sind übrigens vom Typ REAL
> 
> mfG René


Verstehe ich es richtig, daß hier eine Variable auf 0 überprüft wird, die definitionsgemäß überhaupt nicht null werden kann ??


----------



## Thomas_v2.1 (29 September 2014)

Draco Malfoy schrieb:


> Verstehe ich es richtig, daß hier eine Variable auf 0 überprüft wird, die definitionsgemäß überhaupt nicht null werden kann ??


Eine Zahl vom Datentyp Real kann auch Null sein, wieso denn nicht.
Problematisch kann es nur sein wenn man nach verschiedenen Gleitpunkt-Operationen hofft wieder bei Null zu landen, und dann aufgrund der Ungenauigkeiten im Real-Format eben nicht 0,0 sondern 0,000001 herauskommt.

Von den Datentypen her ist das prinzipiell Ok, es nutzt eben die automatische Typwandlung bei SCL aus. Es ist nur umständlich und nicht gerade optimal im Benzug auf Geschwindigkeit programmiert.


----------



## Blockmove (29 September 2014)

Draco Malfoy schrieb:


> Verstehe ich es richtig, daß hier eine Variable auf 0 überprüft wird, die definitionsgemäß überhaupt nicht null werden kann ??



Nach der ersten Rechenoperation / Umwandlung ist generell empfehlenswert REAL nur noch auf größer, kleiner oder eben einen bestimmten Bereich zu vergleichen.

Gruß
Dieter


----------



## Draco Malfoy (29 September 2014)

Hm. Ich meine mich aber erinnern zu können, daß eine Float-Zahl grundsätzlich nicht null werden kann, wegen der Spezifik der Mantisse / Exponent Darstellung, denn wenn ich einfach überall Nullen setze, wäre das ja null hoch null und folglich =1. Oder wurde diese Definitionslüke in S7 geschlossen, indem man einfach eine Abfolge von Nullen in als NULL definiert hat ?


----------



## vollmi (29 September 2014)

Thomas_v2.1 schrieb:


> Eine Zahl vom Datentyp Real kann auch Null sein, wieso denn nicht.
> Problematisch kann es nur sein wenn man nach verschiedenen Gleitpunkt-Operationen hofft wieder bei Null zu landen, und dann aufgrund der Ungenauigkeiten im Real-Format eben nicht 0,0 sondern 0,000001 herauskommt.



Sobald da irgendein Messwert in den Wert reinspielt ist es extrem unwahrscheindlich dass da wieder irgendwo eine gerade Zahl wie ne Null rauskommt. Auch =10.0 oder =22.5 abzufragen ist bei Realzahlen mehr oder weniger sinnlos (IMHO).



> Von den Datentypen her ist das prinzipiell Ok, es nutzt eben die automatische Typwandlung bei SCL aus. Es ist nur umständlich und nicht gerade optimal im Bezug auf Geschwindigkeit programmiert.



Was mich am meisten stört ist das hin und her gespringe mit der Typwandlung. Entweder man macht die Abfragen in Real (dann gehören IMHO auch die Konstanten in Real reingetippt. Klar geht 10 aber 10.0 Ist imho leserlicher).

Und eben es wäre rein von der Lesbarkeit her sinnvoll Vergleichsoperationen und die Arithmetik in Klammern zu verpacken bevor man sie logisch verknüpft. Arithmetik, Vergleichsoperationen und Logische Verknüpfungen ganz ohne etwas einzugruppieren finde ich extrem unleserlich.
Vor allem da Klammern offenbar bekannt waren. Aber warum man eine Multiplikation in Klammern setzt die doch sowieso höher Priorisiert ist als eine Addition. Aber den gesamten Arithmetik nicht in Klammern setzt um die Lesbarkeit zu erhöhen erschliesst sich mir nicht.

Geschwindigkeit ist bei den heutigen Maschinen ja eher Nebensache. Aber Leserlich und verständlich sollte das Zeug werden.

Und da helfen auseinander gerissene IF Konstrukte auch nicht so wirklich.

mfg René


----------



## vollmi (29 September 2014)

Ich hätte es so gemacht.
Ein bisschen Kommentar und Klammerung und man sieht viel schneller was zusammen gehört.



```
(*Auf nächste ganze Zahl aufrunden*)
IF ((nSV - TRUNC(nSV)) <> 0.0) AND (nSV > 0.0) THEN  // nSV Positiv aufrunden auf nächstgrössere ganze Zahl
    Betrieb_Soll := TRUNC(nSV) + 1;
ELSIF ((nSV + TRUNC(nSV)) <> 0.0) AND (nSV < 0.0) THEN // nSV Negativ, abrunden auf nächstkleinere ganze Zahl
    Betrieb_Soll := TRUNC(nSV) - 1;
ELSE // nSV genau 0.0
    Betrieb_Soll := 0;
END_IF;
```

Da Betrieb_Soll im Programm nachher nur noch auf > oder < 0 abgefragt wird, hätte ich diesen gleich als INT definiert.
Unglücklich bin ich trotzdem damit, da eine echte 0 nie erreicht wird und somit immer als Betrieb_Soll zwischen -1 und +1 schwankt. Da wäre eine Hysterese sinnvoll gewesen.

mfG René


----------



## hucki (30 September 2014)

Ich würde sogar den Vergleich auf >0 bzw <0 noch zusätzlich nach vorne stellen. Dann sieht man nämlich auch noch besser, dass nur dann die ganze Rechnerei von Bedeutung ist:

```
[FONT=Courier New](*Auf nächste ganze Zahl aufrunden*)
IF    (nSV > 0.0) AND (nSV - TRUNC(nSV) <> 0.0) THEN    // nSV Positiv, aufrunden auf nächstgrössere ganze Zahl
    Betrieb_Soll := TRUNC(nSV) + 1;
ELSIF (nSV < 0.0) AND (nSV + TRUNC(nSV) <> 0.0) THEN    // nSV Negativ, abrunden auf nächstkleinere ganze Zahl
    Betrieb_Soll := TRUNC(nSV) - 1;
ELSE                                                    // nSV genau 0.0
    Betrieb_Soll := 0;
END_IF;[/FONT]
```
Ob man bei der Rechnerei jetzt auf 0 oder 0.0 vergleicht, wär' mir egal, da man eh' (Real - DINT) hat. 
Aber irgendwie ist der ELSE-Zweig nicht das Gleiche wie oben. Wenn nämlich nSV zufällig eine genau ganze Zahl ist, wird bei Deinem Code auch 0 zugewiesen, was oben (zumindest in dem zu sehenden Auszug) nicht der Fall ist.

Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:

```
[FONT=Courier New]// Betrag aufrunden (zu erwartende Nachkommastellen beachten!)
Betrieb_Soll:= TRUNC( [/FONT]ABS( nSV ) + 0.99999 )[FONT=Courier New];

// Vorzeichen hinzufügen
Betrieb_Soll:= Betrieb_Soll * SEL( G:= nSV < 0.0, IN0:= 1, IN1:= -1);[/FONT]
```
Btw, warum gibt's eigentlich die AWL-Funktion RND+ nicht unter SCL? Die wär' ja hier ganz hilfreich gewesen.


----------



## vollmi (30 September 2014)

hucki schrieb:


> Ob man bei der Rechnerei jetzt auf 0 oder 0.0 vergleicht, wär' mir egal, da man eh' (Real - DINT) hat.


Ich weiss. Allerdings finde ich es gut wenn man gleich sieht dass das Ziel eine REAL ist ohne in die Schnittstelle zu wechseln (welche mit den vielen Abkürzungen übrigens komplett undokumentiert ist)



> Aber irgendwie ist der ELSE-Zweig nicht das Gleiche wie oben. Wenn nämlich nSV zufällig eine genau ganze Zahl ist, wird bei Deinem Code auch 0 zugewiesen, was oben (zumindest in dem zu sehenden Auszug) nicht der Fall ist.



Das macht in oberem Code ja dies. Einschaltsperre gehört IMHO hier nicht her.


```
[COLOR=#333333]IF nSV = 0 OR Einschaltsperre = 1 THEN[/COLOR]    
Res := 0; 
[COLOR=#333333]END_IF;[/COLOR]
```



> Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:



Das gefällt mir. 

mfG René


----------



## hucki (30 September 2014)

vollmi schrieb:


> Das macht in oberem Code ja dies. Einschaltsperre gehört IMHO hier nicht her.
> 
> 
> ```
> ...


Ich meinte auch nur den nSV.
Wenn der 0.0 ist, bekommt Res im Original bzw. Betrieb_Soll in Deiner Version die 0 zugewiesen.
Wenn der Wert jedoch genau 2.0, dann passiert im Original nichts (alter Wert bleibt), während bei Dir auch die 0 zugewiesen wird, da es ja nichts zum Aufrunden gibt (soll bei beiden Versionen ja nur bei vorhandenen Nachkommastellen passieren). Die Frage ist, wie wahrscheinlich ist ein Wert von genau 2.0 und was passiert dann vlt. noch beim Original (weil man das oben nicht sieht).





hucki schrieb:


> Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:
> 
> ```
> [FONT=Courier New]// Betrag aufrunden (zu erwartende Nachkommastellen beachten!)
> ...





vollmi schrieb:


> Das gefällt mir.


Ich versuch' sowas eigentlich immer lieber mathematisch zu lösen.
Soweit es dann noch halbwegs verständlich bleibt, hat es bei mir auf jedenfall Vorrang vor so 'ner IF...THEN-Orgie. Selbst das SEL nervt mich hier noch etwas, aber das Negativbit zu isolieren ist ja auch ziemlich aufwendig.


Was bleibt, ist meine letzte Frage.


----------



## Blockmove (30 September 2014)

@vollmi
Vielleicht gleich der etwas radikalere Ansatz:
Warum muss nSV überhaupt eine REAL sein?


----------



## vollmi (30 September 2014)

hucki schrieb:


> Ich meinte auch nur den nSV.
> Wenn der 0.0 ist, bekommt Res im Original bzw. Betrieb_Soll in Deiner Version die 0 zugewiesen.
> Wenn der Wert jedoch genau 2.0, dann passiert im Original nichts (alter Wert bleibt),



Stimmt eigentlich müsste dann nSV durchgereicht werden. garnicht 0. 0 null beim sperren.

nSV muss überhaupt keine REAL sein. Wird nirgends benötigt überall wird ein INT draus gemacht. manchmal halt faktor 10. manchmal gerundet und hier halt auf und abgerundet. Aber ich kann jetzt schlecht das ganze Programm durchackern. Da bau ich nur Fehler ein wie man grad gesehen hat.

Ich bin da nur drüber gestolpert weil im gleichen Baustein Temporäre Var genutzt werden welche nicht zwingend beschrieben werden. Dadurch hat ein zusätzlicher Baustein von mir eine Fehlfunktion in einem ganz anderen Bereich ausgelöst.

Erklär das mal dem Kunden dass ein getestetes Programm wegen einer Erweiterung welche in meinen anderen Anlagen einwandfrei läuft (da gekapselt und nur auswertend keine Funktionen auslösend) auf dieser Anlage unvorhergesehene Reaktionen hervorruft.


----------



## vollmi (21 Mai 2019)

Lange ists her. Ich hab da mal wieder n Schmankerl.

```
AUF   "DB32"
      L     "SPS<->BR"._DBW_794_0       //Anzahl Messwerte für Mittelung
      T     "DB32".DB30_DBW4
```
Danach folgen ein Netzwerk mit diversen vollqualifizierten Zugriffen.

Dann dieses

```
U     "DB32".DB30_DBX0_1          // Start Messwert einlesen
      SPBN  MW02
```

Ich wollte da gerne zum start noch ein ein weiteres Kriterium hinzufügen. Ein neuer DB für ein zusätzliches Programm von mir. Ich wollte also möglichst nichts an der Funktion verändern sondern nur die Berechnung verzögern bis meine Software bereit ist.
Und da hat dann nix mehr funktioniert, cpu rennt mit sehr vielen Zugriffsfehlern irgendwo rum. Bis ich mir das alte Programm angeschaut habe.
Ein Netzwerk später.

```
LAR1  DBD   10                    // Adresse speichern DBB 100 "ST 01"
      L     DBB   90                    // Messwert "ST01"
      T     B [AR1,P#0.0]               // Messwert Speichern DBB100-117 "ST01"
      +AR1  P#1.0
      TAR1  DBD   10
```

Hätte ich gleich sehen müssen das da für den Indirekten Zugriff gar keine sichere Adresse geöffnet wird.
Zu solchen Zeiten, denke ich mir. Man müsste einen Schein machen der einen berechtigt absolut indirekt zu programmieren.

mfG René


----------



## Heinileini (21 Mai 2019)

SoftMachine schrieb:


> das ist der Progger-Stil eines Programmierers, der noch mit Sicherheit in S5-Zeiten aufgewachsen ist.
> Dort war es so üblich, in AWL das "Setzen" so wie hier aufzurufen und das Rücksetzen erst Netzwerke später oder
> gar in einem anderem Baustein auszuführen (was sicher auch funktioniert, aber nicht unbedingt nachvollziehbar ist).


Oh, oh, oh, mit S5 mag man so einiges erklären oder auch entschuldigen, aber dieser Code sieht viel mehr nach Hilflosigkeit und/oder Abenteuerlust aus.
Vielleicht ist der Code durch gedankenloses, nachträgliches Zusammenstreichen von etwas Umfangreicherem entstanden, wohl eher aber ein Zeichen dafür, dass dem Täter die "harte Schule" der S5-Programmierung fehlte. 

SPBN gab's bei S5 nicht und nach einem SPB war auch damals schon immer das VKE=1 und die nächste durchlaufene Verknüpfung eine Erstverknüpfung.
Sogar die DeMorganschen Gesetze waren damals schon bekannt, so dass man nicht unbedingt auf SPBN angewiesen war.

Ich kann leider nicht nachvollziehen, warum hier im Forum so oft auf den Befehlen Setzen und Rücksetzen herumgehackt wird.
Sicherlich sind sie verzichtbar, aber Unheil treiben lässt sich mit anderen Befehlen auch sehr gut. 

Gruss, Heinileini


----------



## PN/DP (21 Mai 2019)

vollmi schrieb:


> Ich hab da mal wieder n Schmankerl.


Ich sehe an dem Code eigentlich nicht viel Verwerfliches. Lediglich das "AUF DB32" ist ein bisschen weit weg von der Stelle, wo sich ohne DB-Angabe auf den DB32 bezogen wird. Und steht da eigentlich auch nur als "Gedankenstütze" für den Programmierer (weil es durch die nachfolgenden vollqualifizierten DB-Zugriffe überflüssig ist). So wurde halt in der Übergangszeit S5 zu S7 programmiert, oft mit halbherziger/halbfertiger Migration der bewährten "unser Standard"-S5-Bausteine unter Zeitdruck ("funktioniert schon so"). Sowas habe ich schon öfters gesehen, daß solche "AUF DB" nur am Bausteinanfang stehen, meistens noch ganz alleine. Der Original-Programmier weiß dadurch, daß er nach vollqualifizierten DB-Zugriffen sicherstellen muß, daß wieder der DB vom Bausteinanfang geöffnet ist.

Direkt vor der impliziten Verwendung des DB32 steht "U "DB32".DB30_DBX0_1" - ein nachfolgendes "AUF DB32" ist dadurch überflüssig, es wäre nur als Kosmetik und Warnung vor Programmänderungen nützlich.

Registerindirekte Adressierung "[AR1,P#0.0]" gibt es nur ohne Angabe der DB-Nummer. Da sind die nicht qualifizierten DB-Zugriffe auf DBD10 und DBB90 eigentlich in guter Gesellschaft 

Das muß man halt "ahnen" und die nachfolgenden Netzwerke prüfen, wenn man in (fremden) Programmen Änderungen vornimmt mit Änderung des DB-Registers (durch vollqualifizierte Zugriffe auf andere DB).

Harald


----------



## vollmi (21 Mai 2019)

PN/DP schrieb:


> Das muß man halt "ahnen" und die nachfolgenden Netzwerke prüfen, wenn man in (fremden) Programmen Änderungen vornimmt mit Änderung des DB-Registers (durch vollqualifizierte Zugriffe auf andere DB).



Das auf jedenfall, für mich hat aber so ein AUF DB mit nachgelagerte Vollqualifizierten Zugriffen immer etwas den Touch von, da hat man was gemacht aber nicht genau gewusst was. Ich mache, auch wenn ich weiss dass es auch ohne funktioniert vor indirekten Adressen ein AUF hin damit fürderhin klar ist welcher db da geöffnet sein muss.


----------



## vollmi (13 Januar 2022)

Wiedermal was nettes. Der Programmierer ist nun Pensioniert und ich soll seine Anlage noch fertig machen.
Er hat immer gemeckert dass TIA allem ein Symbol geben will.
Und sein Prinzip war immer FC sind fürs Programm, FB sind für kleinere Funktionen (hat er nie verwendet, selbst wenn er 20 mal dasselbe macht, kopiert er halt 20 mal den Code und macht mit Suchen ersetzen das nächste Objekt. Sehr geil wenn man etwas nachrüsten muss)

Aja es muss immer ein Symbol haben seit TIA. Machemer halt die Absolutadresse zu Symbol. Manchmal gibts wenigstens einen Symbolkommentar.
Und da dies ja ein FC ist. Braucht man noch einen HilfsDB als Merkerersatz (die hat er übrigens immernoch verwendet)
In dem Programm wurde übrigens nicht ein UDT verwendet. Obwohl der Auftraggeber hier Typicals vorgegeben hat. Im Programm steht dann einfach die Variablen im DB direkt untereinander mit dem Namen des objekts und der Absolutadresse.
Die SCADA welche drauf zugreift greift dann indirekt auf den Typ zu indem es den Versatz von der Startadresse ausrechnet. Absolut, weil OPC oder S7+ Treiber sind ja des Teufels.


```
U(
      O     "NORWES-SPS-LUE-AS01"._DBX_420_3
      O     "NORWES-SPS-LUE-AS01"._DBX_421_1
      O     "NORWES-SPS-LUE-AS01"._DBX_421_7
      O     "NORWES-SPS-LUE-AS01"._DBX_422_5
      O     "NORWES-SPS-LUE-AS01"._DBX_423_3
      O     "NORWES-SPS-LUE-AS01"._DBX_424_1
      O     "NORWES-SPS-LUE-AS01"._DBX_424_7
      O     "NORWES-SPS-LUE-AS01"._DBX_425_5

      O     "NORWES-SPS-LUE-AS01"._DBX_426_3
      O     "NORWES-SPS-LUE-AS01"._DBX_427_1
      O     "NORWES-SPS-LUE-AS01"._DBX_427_7
      O     "NORWES-SPS-LUE-AS01"._DBX_428_5
      O     "NORWES-SPS-LUE-AS01"._DBX_429_3
      O     "NORWES-SPS-LUE-AS01"._DBX_430_1
      O     "NORWES-SPS-LUE-AS01"._DBX_430_7
      O     "NORWES-SPS-LUE-AS01"._DBX_431_5

      O     "NORWES-SPS-LUE-AS01"._DBX_432_3
      O     "NORWES-SPS-LUE-AS01"._DBX_433_1
      O     "NORWES-SPS-LUE-AS01"._DBX_433_7
      O     "NORWES-SPS-LUE-AS01"._DBX_434_5
      O     "NORWES-SPS-LUE-AS01"._DBX_435_3
      O     "NORWES-SPS-LUE-AS01"._DBX_436_1
      O     "NORWES-SPS-LUE-AS01"._DBX_436_7
      O     "NORWES-SPS-LUE-AS01"._DBX_437_5

      O     "NORWES-SPS-LUE-AS01"._DBX_438_3
      O     "NORWES-SPS-LUE-AS01"._DBX_439_1
      O     "NORWES-SPS-LUE-AS01"._DBX_439_7
      O     "NORWES-SPS-LUE-AS01"._DBX_440_5
      O     "NORWES-SPS-LUE-AS01"._DBX_441_3
      O     "NORWES-SPS-LUE-AS01"._DBX_442_1
      O     "NORWES-SPS-LUE-AS01"._DBX_442_7
      O     "NORWES-SPS-LUE-AS01"._DBX_443_5

      O     "NORWES-SPS-LUE-AS01"._DBX_444_3
      )
      =     "DB_Hilfsbaustein".Stauerkennung

      U     "DB_Hilfsbaustein".Stauerkennung
      L     s5t#3m
      SE    "Timer_Stau"

      U     "DB_Hilfsbaustein".Betriebsart_Automatik
      L     s5t#1m
      SE    "Timer_Stau_zurück"
```

Das musste jetzt raus, ich bin echt angepisst wieso man einfach 20 Jahre keinerlei neuen Techniken angenommen hat.


----------



## ducati (13 Januar 2022)

vollmi schrieb:


> Wiedermal was nettes. Der Programmierer ist nun Pensioniert und ich soll seine Anlage noch fertig machen.
> Er hat immer gemeckert dass TIA allem ein Symbol geben will.
> Und sein Prinzip war immer FC sind fürs Programm, FB sind für kleinere Funktionen (hat er nie verwendet, selbst wenn er 20 mal dasselbe macht, kopiert er halt 20 mal den Code und macht mit Suchen ersetzen das nächste Objekt. Sehr geil wenn man etwas nachrüsten muss)
> 
> ...


auf jeden Falls hast aber verstanden, was er da gemacht hat 
Ich kenn da einiges, wo Du nach 3 Tagen noch nicht weisst, was da eigentlich abgeht


----------



## vollmi (13 Januar 2022)

ducati schrieb:


> auf jeden Falls hast aber verstanden, was er da gemacht hat
> Ich kenn da einiges, wo Du nach 3 Tagen noch nicht weisst, was da eigentlich abgeht


Vor allem muss ich jetzt TIA ein Kränzchen binden.
#Geschwindigkeit ist eine Statische Variable in einer Bausteinschnittstelle. Hier hat er tatsächlich mal einen FB gemacht.
die Querverweisinformationen zeigen auch die externe Verwendung der Instanzvariable. Seit zeit TIA denn sowas an?


----------



## Ralle (13 Januar 2022)

vollmi schrieb:


> die Querverweisinformationen zeigen auch die externe Verwendung der Instanzvariable. Seit zeit TIA denn sowas an?


Noch nicht so lange und wie ich mal festgestellt habe auch nicht immer. Aber immerhin.


----------



## ducati (13 Januar 2022)

vollmi schrieb:


> Seit zeit TIA denn sowas an?


glaub sei V15.1?


----------



## DeltaMikeAir (13 Januar 2022)

vollmi schrieb:


> Seit zeit TIA denn sowas an


Seit TIA V14:




Quelle:



https://www.spshaus.ch/files/inc/Do...Infos/Software/STEP_7_V14_Neue_Funktionen.pdf


----------



## vollmi (13 Januar 2022)

DeltaMikeAir schrieb:


> Seit TIA V14:
> 
> https://www.spshaus.ch/files/inc/Do...Infos/Software/STEP_7_V14_Neue_Funktionen.pdf


Coole Sache. Da braucht man gar nicht mehr über IN oder Out zu gehen. Alle Variablen im Stat bereich deklarieren und von extern drauf zugreifen. wird ja in der Querverweisliste nachgeführt.


----------



## DeltaMikeAir (13 Januar 2022)

vollmi schrieb:


> Coole Sache. Da braucht man gar nicht mehr über IN oder Out zu gehen. Alle Variablen im Stat bereich deklarieren und von extern drauf zugreifen. wird ja in der Querverweisliste nachgeführt.


Ja, gute Sache


----------



## ducati (13 Januar 2022)

DeltaMikeAir schrieb:


> Seit TIA V14:


wer nutzt schon TIA V14


----------



## Thomas_v2.1 (13 Januar 2022)

Immerhin hat er noch ein Symbol vergeben. Die Krönung die ich hatte war ein Programm, bei denen in den Programmdatenbausteinen nur Arrays angelegt wurden, also auch in einem DB in dem die 200 Sollwerte liegen, ist einfach nur ein Array[0..199] of Real. Dann gibt es dazu eine Excel-Tabelle zu diesem Projekt, und in dieser ist dann hinterlegt was an der Adresse für ein Parameter liegt. Das gleiche mit etlichen anderen Datenbausteinen, ohne diese Excel-Tabelle ist das Programm nutzlos.

Man vermutet ja immer das sind irgendwelche kleinen 1-Mann Firmen die sowas verzapfen. Aber ich sehe solche Schmierereien immer bei großen Automationsfirmen, sogar Aktiengesellschaften. Alles mit Know-How Schutz versehen und alle denken was da tolles drinsteckt. Machst du die Bausteine auf, dann staunt man nicht schlecht was dort für ein Mist zusammengeschmiert wurde.


----------



## Mrtain (13 Januar 2022)

Thomas_v2.1 schrieb:


> ...ohne diese Excel-Tabelle ist das Programm nutzlos.



Auch eine Art von Know-how Schutz...


----------



## Thomas_v2.1 (13 Januar 2022)

Mrtain schrieb:


> Auch eine Art von Know-how Schutz...


Könnte man vermuten, dass das so beabsichtigt ist. Also kein Know How Schutz, sondern einfach wenn jemand das Programm haben will kann die Firma sagen: hier hast du es. Aber wie viel länger die Erstellung, Inbetriebnahme und Wartung eines solchen Machwerks benötigt, wurde vermutlich nicht berücksichtigt. Wenn ich eine Anlage so programmieren und inbetriebnehmen müsste, würde ich direkt kündigen.


----------



## escride1 (13 Januar 2022)

Thomas_v2.1 schrieb:


> Aber wie viel länger die Erstellung, Inbetriebnahme und Wartung eines solchen Machwerks benötigt, wurde vermutlich nicht berücksichtigt.


Vermutlich nicht länger. Immerhin ist auf Monitor 2 durchgehend die Tabelle offen, womöglich direkt mit den Adressen, da kann man ja schnell Copy'n'Paste verwenden ^^ 😁


----------



## Thomas_v2.1 (13 Januar 2022)

escride1 schrieb:


> Vermutlich nicht länger. Immerhin ist auf Monitor 2 durchgehend die Tabelle offen, womöglich direkt mit den Adressen, da kann man ja schnell Copy'n'Paste verwenden ^^ 😁


Aber: warum? Ich verwende auch Excel-Tabellen um daraus automatisch HMI Variablen und Störmeldung zu generieren, Programmcode habe ich daraus auch schon generiert. Dann ist aber im Programm auch die gleiche Information wie in der Tabelle. Oder andersherum, wenn ich den Aufbau aus dem Programm extern benötige, dann gibt es etliche Möglichkeiten diese automatisiert zu extrahieren, sei es über AWL Quellen, Kommandoschnittstelle oder sonstwas. Aber Programm nur in Excel dokumentieren und im Programm nur mit Absolutadressen arbeiten, ich glaube dafür gibt es keinen triftigen Grund.


----------



## ducati (14 Januar 2022)

Thomas_v2.1 schrieb:


> Immerhin hat er noch ein Symbol vergeben. Die Krönung die ich hatte war ein Programm, bei denen in den Programmdatenbausteinen nur Arrays angelegt wurden, also auch in einem DB in dem die 200 Sollwerte liegen, ist einfach nur ein Array[0..199] of Real. Dann gibt es dazu eine Excel-Tabelle zu diesem Projekt, und in dieser ist dann hinterlegt was an der Adresse für ein Parameter liegt.


Da war jetzt wieder der 3. Vorteil vom TIA, der mir letztens nicht eingefallen ist. Ab V15.1 kannst jedem Arrayelement nen eigenen Kommentar geben


----------



## ducati (14 Januar 2022)

Das mit den Excellisten ist so ne Sache...
Wir haben bei verschiedenen Kunden auch so Konstrukte, wo quasi diese Excelliste die Schnittstellendoku zwischen SPS und Leitsystem ist.
Theoretisch kannst zuerst die Liste erstellen und dann kann SPS-Mensch und Visu-Mensch gleichzeitig losarbeiten... vorher krigt der Kunde die noch zur Freigabe der Namen und BMKs...
Die Texte in den DB rüberkopieren kann man natürlich machen 
Jedenfalls kommts auf das Gesamtkonzept an, ob das nun Sinn macht... Ich will die Excelliste nicht verteufeln


----------



## vollmi (14 Januar 2022)

ducati schrieb:


> Da war jetzt wieder der 3. Vorteil vom TIA, der mir letztens nicht eingefallen ist. Ab V15.1 kannst jedem Arrayelement nen eigenen Kommentar geben



Dann sind wir wieder bei absoluten Symbolen mit Kommentaren im Hintergrund. Da kann ich dann gleich wieder symbole mit Absolutadressennamen verwenden. 

Es ist doch einfach viel effizienter wenn man den Code intuitiv tippen kann und intellisense das vervollständigen hilft

Tempoel.rIst := Tempoel.rRoh * Tempoe.rKorr;


----------



## ducati (14 Januar 2022)

vollmi schrieb:


> Es ist doch einfach viel effizienter wenn man den Code intuitiv tippen kann und intellisense das vervollständigen hilft
> 
> Tempoel.rIst := Tempoel.rRoh * Tempoe.rKorr;


Kommt halt auf das Gesamtkonzept an, wie effizient das ist.
Ich hatte mal nen Kunden, da MUSSTE die Symbolik sich aus AKZ OKZ BMK zusammensetzen. Also =4532ABC+DHZB123-P1234.45.F23.6
Wobei sich F23.6 auch noch ständig ändert, wenn der Pfad im Eplan bei der Revision sich verschiebt... Da schalte ich freiwillig auf absolute Adressierung um und tippe E0.0


----------



## ducati (14 Januar 2022)

Grundsätzlich gilt für Programmierstandards, sie sollten bei jeder Anlage gleich sein, sonsts ists kein Standard.
Wenn ich 100 Anlagen habe, die nach identischem Konzept programmiert sind, ist mir das Konzept eigentlich wurscht.
Nur wenn ich 100 verschiedene Konzepte habe, weil jeder meint immer was "besser" machen zu wollen, dann krieg ich die Krise...

PS: noch besser wirds, wenn ich in einer SPS 10 verschiedene Konzepte habe, weil über 20 Jahre 10 verschiedene Programmierer an der Anlage waren. Sowas hab ich auch...

Also Einheitlichkeit geht vor Schönheit sag ich immer.


----------



## Mrtain (20 Januar 2022)

Hier mal etwas, was mir bei vielen unserer älteren Anlagen begegnet:

Gegeben ist ein Puffer mit zum Beispiel 80 Fächern. Für jede der 80 Fachpositionen wurde je eine Interger-Variable auf eine Register gelegt.
Wenn man dann die position von, sagen wir Fach 6 haben wollte, wurde zuerst die Registeradresse des ersten Faches ermittelt, diese um 1 dekrementiert, und dann anschliessend die Fachnummer addiert. Mit dieser berechneten Adresse wurde dann indirekt auf den Wert zugriffen, der dann temporär in einer Integervariable zur weiteren Verwendung gespeichert wurde.

```
riSollPosition := 0;                                                 // Sollposition loeschen
rSollFachNummer := 6;                                                // Sollfachnumer setzen (hier fest auf 6 als Beispiel)
rFachzeiger := regnum(rPuffer01Fach01) + (rSollFachNummer - 1);      // Adresse des Sollfachregisters ermitteln
riSollPosition := @rFachzeiger;                                      // Fachposition in Sollposition zwischenspeichern
```

Man hätte auch einfach ein Array [1..80] of int anlegen können....


----------



## winnman (20 Januar 2022)

Seinerzeit versuchte man mit solchen Krücken den nicht-vorhandenen/sehr-sehr-teuren Speicherbedarf etwas zu minimieren.
Rechenzeit kostete nichts, ein paar 100 ms mehr spielten meist keine Rolle, die paar zeitkritischen Sachen wurden dann noch separat entsprechend bearbeitet.


----------



## Mrtain (20 Januar 2022)

Ob ich jetzt 80 einzelne register anlege, oder ein Array benutze, was auch 80 register belegt,  macht für mich keinen unterschied.
Ich vermute, dass das noch aus Sympass Zeiten stammt.

PS. Du meinst die Stackgröße oder? Wäre zumindest bei der Jetter Steuerung (glaub war ne 242) wo ich das her hab, zumindest kein Problem mehr gewesen.


----------



## IBFS (23 Januar 2022)

vollmi schrieb:


> Tempoel.rIst := Tempoel.rRoh * Tempoe.rKorr;


Weil ich das gerade sehe ... wann wird der Unfug, den Typ der Variable voranzustellen endlich verboten.
Wenn man die Namen gut wählt, braucht man das nicht. Außerdem gibt es ToolTips. Nunja.


----------



## Heinileini (23 Januar 2022)

IBFS schrieb:


> Weil ich das gerade sehe ... wann wird der Unfug, den Typ der Variable voranzustellen endlich verboten.


Hoffentlich nie! Jeder darf sich selbst für oder gegen die Enthaltsamkeit entscheiden bzw. sich an FirmenStandards halten.
Im Rahmen dieses Forums erweist es sich immer wieder als sinnvoll, insbesondere temporär und statisch klar zu unterscheiden.

Die Silbe "Temp" muss auch nicht unbedingt auf eine temporäre Variable hinweisen.
Im hiesigen Beispiel und im Zusammenhang mit Öl könnte es auch die Abkürzung für Temperatur sein?


----------



## Blockmove (23 Januar 2022)

Heinileini schrieb:


> Hoffentlich nie! Jeder darf sich selbst für oder gegen die Enthaltsamkeit entscheiden bzw. sich an FirmenStandards halten.
> Im Rahmen dieses Forums erweist es sich immer wieder als sinnvoll, insbesondere temporär und statisch klar zu unterscheiden.
> 
> Die Silbe "Temp" muss auch nicht unbedingt auf eine temporäre Variable hinweisen.
> Im hiesigen Beispiel und im Zusammenhang mit Öl könnte es auch die Abkürzung für Temperatur sein?


Das Voranstellen des Variablentyps ist weder bei TIA noch bei Codesys notwendig.
Ich habs auch viele Jahre gemacht, aber in der Zwischenzeit habe ich mir es abgewöhnt.
Wenn man Autovervollständigung nutzt, dann ist es praktischer ohne Voranstellen.
Zu Kennzeichnung von Temp-Variablen:
tmp ist sinnvoller als temp. Dann gibts nämlich keinen Ärger mit der Temperatur.


----------



## de vliegende hollander (23 Januar 2022)

vollmi schrieb:


> Coole Sache. Da braucht man gar nicht mehr über IN oder Out zu gehen. Alle Variablen im Stat bereich deklarieren und von extern drauf zugreifen. wird ja in der Querverweisliste nachgeführt.


Ich mach das so.
Aber die Querverweise zeigen in 1 Richtung auf das innere vom FB. Und in die andere Richtung nicht auf die verwendete idb Variable.
Also bei mir. TIA V16 getest.


----------

