RANT: Konstrukte bei denen man sich manchmal fragt

Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
[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:
Code:
[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.
 
Zuletzt bearbeitet:
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.

Code:
[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é
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das macht in oberem Code ja dies. Einschaltsperre gehört IMHO hier nicht her.

Code:
[COLOR=#333333]IF nSV = 0 OR Einschaltsperre = 1 THEN[/COLOR]    
Res := 0; 
[COLOR=#333333]END_IF;[/COLOR]
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).



Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:
Code:
[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.
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.
:confused:
 
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),
:confused:

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lange ists her. Ich hab da mal wieder n Schmankerl.
Code:
      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
Code:
      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.
Code:
      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é
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.

Code:
      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.

Screenshot 2022-01-13 120745.png
 
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.

Code:
      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.

Anhang anzeigen 58549
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 ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
Screenshot 2022-01-13 132922.png
 
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.
 
Zurück
Oben