TIA TIA Portal V18 Wunschliste [Diskussion]

Status
Für weitere Antworten geschlossen.
Zuviel Werbung?
-> Hier kostenlos registrieren
Da kräuseln sich mir die NackenHaare.
1.) Zeile 4 ist identisch mit Zeile 3.
😂
Tja, wenn mal jemand hier schreibt "Ich habe das Programm 1:1 von Siemens übernommen", da bedeutet also nicht unbedingt, das es passt bzw. funktioniert. Sind ja auch nur Menschen.
 
Du könntest, wie schon mehrfach beschrieben, an zentraler Stelle Deines Programms, die/den Parameter ändern, auf die/den Dein darauf ausgelegter ProgrammCode an zig Stellen zugreifen kann.
Genau das möchte ich ja nicht. Dadurch vermeide ich Flüchtigkeitsfehler, weil ich es nur an einer Stelle ändern muss. Nichts desto trotz muss ich es immer noch händisch ändern. Wenn ich das auch nur einmal vergesse, warum auch immer, und die CPU dadurch in den Stop geht im laufenden Betrieb....dann gibts Mord und Totschlag. Mir ist auch klar, dass es dafür auch Organisationsbausteine gibt, die eben die CPU nicht in Stop gehen lassen. Ich ziehe es aber vor mir einen Programmierstil anzueignen, bei dem möglichst elegant, kompakt und nachvollziehbar solche Fehler von vornherein automatisch umgangen werden. Und da es diese Funktion für Arrays schon gibt, würde ich sie gerne auch für alle Arrays nutzen können. Wie gesagt, es ist ein Wunsch und kein aktuelles Problem was ich habe^^ Ich könnte mir ja theoretisch auch als Parameter im DB die Array Größe liefern lassen. Aber das sind alles nur Workarounds um eine eigentlich simple Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mich regt es durchaus auf, wenn ich beobachte, wie sich solche Kleinigkeiten im Laufe der Zeit wider besseren Wissens zu Grossigkeiten weiterentwickeln, statt einfach ausgeräumt zu werden.
wenn ich mir so anschaue, was heute überall so abgeht, wundert mich das nicht. Und aufregen bringt überhaupt nix, man kann sich natürlich abundzu den Frust von der Seele schreien, aber ändern tut das nix...
 
😂
Tja, wenn mal jemand hier schreibt "Ich habe das Programm 1:1 von Siemens übernommen", da bedeutet also nicht unbedingt, das es passt bzw. funktioniert. Sind ja auch nur Menschen.
Na klar machen wir alle Fehler, Michael. Dass ich selbst das auch sehr gut beherrsche, habe ich in diesem Forum ja schon häufig bewiesen!
Den Punkt 1.) hatte ich aber nur der Vollständigkeit halber überhaupt erwähnt. 2.) und 3.) waren mir wichtiger.

Apropos Siemens-Beispiele:
Hatte mich vor Jahrenden mal wegen eines solchen, nicht funktionierenden Beispiels an Siemens gewandt und erfahren : "das ist doch NUR ein Beispiel."
Bei Siemens geht man also gar nicht davon aus, dass Beispiele auch funktionieren sollten. Wozu die Beispiele dann überhaupt noch angeführt werden, weiss ich bis heute nicht. :( Wahrscheinlich ist das einer der Punkte, die beim Erstellen der Dokumentation abgehakt werden müssen.

wenn ich mir so anschaue, was heute überall so abgeht, wundert mich das nicht. Und aufregen bringt überhaupt nix, man kann sich natürlich abundzu den Frust von der Seele schreien, aber ändern tut das nix...
Du hast Recht, ducati. Sich aufzuregen bringt nix und für die Erledigung der Aufgabe ist es eher hinderlich als hilfreich.
Und dennoch: ich will mich aber aufregen dürfen - oder wie Loriot sagte: "ich will mir von einem kaputten Fernseher nicht vorschreiben lassen, wann ich ins Bett zu gehen habe!"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich beneide niemanden, der in der heutigen Zeit das Programmieren lernen muss oder will. Die Bäume und das Gestrüpp, die einem den Blick auf den Wald versperren, haben ja sowas von zugenommen, dass kaum noch ein "schonender" Einstieg möglich zu sein scheint
Nee, nur die Anzahl der Straßen nach Rom wächst halt
 
da es diese Funktion für Arrays schon gibt, würde ich sie gerne auch für alle Arrays nutzen können. (...) Aber das sind alles nur Workarounds um eine eigentlich simple Lösung.
Wo sollen denn die Informationen zu den Array-Grenzen eines "herkömmlichen" Arrays "simpel" in der SPS hinterlegt werden? Die müssten ja in einem zusätzlichen Speicherbereich als "Meta"-Daten gespeichert werden oder bei jedem Zugriff als unsichtbarer zusätzlicher Parameter mitgegeben werden.

Als nächstes kommt dann die Forderung der dringende Wunsch, daß jegliche Zugriffe auf Arrays prüfen sollen, ob die Zugriffe innerhalb der Grenzen sind, weil "das Programm kennt doch LOWER_BOUND/UPPER_BOUND". Solche Prüfungen sind aber so ressourcenfressend, daß der Check z.B. in Codesys extra aktiviert werden muß.

Harald
 
Nee, nur die Anzahl der Straßen nach Rom wächst halt
Im Zeitalter der Navis kein Problem.
Nur, dass man heutzutage solche und andere HilfsMittel benötigt und bedienen können muss, ohne verstehen zu müssen, wie sie funktionieren, das ist das Problem.
Welchen Baustein benötige ich hierfür und welchen dafür? So lauten viele Fragen in diesem Forum.
Und das, um z.T. so simple Aufgaben zu lösen, dass man sich nur wundern kann. Irgendwie hat sich der Schwerpunkt des Knowhows auf manchmal wunderliche Weise doch sehr verschoben ...
Ich fühle mich sehr daran erinnert, wie sich die Lego-Bauklötzchen im Laufe der Jahrzehnte entwickelt haben. Zuviele Bausteine für zuviele SpezialZwecke.
Kann man damit noch lernen, selbständig etwas zu erarbeiten, ohne immer wieder nur auf die neuesten Bausteine warten zu müssen?
Und vor allem, ohne durch die Vielzahl der verschiedenen Bausteine dermaßen erschlagen zu werden, dass man den Spass an der Freude verliert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Als nächstes kommt dann die Forderung der dringende Wunsch, daß jegliche Zugriffe auf Arrays prüfen sollen, ob die Zugriffe innerhalb der Grenzen sind, weil "das Programm kennt doch LOWER_BOUND/UPPER_BOUND". Solche Prüfungen sind aber so ressourcenfressend, daß der Check z.B. in Codesys extra aktiviert werden muß.
Ja, aber das wäre doch ein Kompromiss?!

Neben den anderen Haken (remanent, aus HMI lesbar, von HMI beschriebbar, Einrichtwert,...) könnte man für Arrays ja noch anfügen "Grenzen lesbar" und "Grenzenprüfung aktiv" 😂
 
Ja, aber das wäre doch ein Kompromiss?!

Neben den anderen Haken (remanent, aus HMI lesbar, von HMI beschriebbar, Einrichtwert,...) könnte man für Arrays ja noch anfügen "Grenzen lesbar" und "Grenzenprüfung aktiv" 😂
Im SCL für 300/400er gibts das doch? Oder hab ich da jahrelang was falsches drunter vermutet?
1667486066685.png

1667486100536.png

könnte man sich ja im resultierenden AWL-Code mal anschauen, was dann passiert...
 
Im SCL für 300/400er gibts das doch? Oder hab ich da jahrelang was falsches drunter vermutet?
Anhang anzeigen 64661

Anhang anzeigen 64662

könnte man sich ja im resultierenden AWL-Code mal anschauen, was dann passiert...

In Classic habe ich noch nicht mit SCL gearbeitet. Aber, wenn es das schon gab, warum wird das dann nicht in TIA übernommen? Für jeden anderen Sch**** wird ja inzwischen auch Speicher bereit gestellt.
 
Wo sollen denn die Informationen zu den Array-Grenzen eines "herkömmlichen" Arrays "simpel" in der SPS hinterlegt werden? Die müssten ja in einem zusätzlichen Speicherbereich als "Meta"-Daten gespeichert werden oder bei jedem Zugriff als unsichtbarer zusätzlicher Parameter mitgegeben werden.
:unsure: Ja, das ist sicherlich ein Problem, wenn man sich darüber zur Einführung der Arrays noch keine Gedanken gemacht hat.
Zu S5-Zeiten gab es einen DB0, der eine BausteinListe enthielt und in dem stand, welcher Baustein wo abgelegt ist. Das finde ich durchaus vergleichbar. Eine ArrayListe muss aber entsprechend mehr Informationen enthalten, wenn diverse Informationen nicht direkt "vor Ort" beim Array abgelegt werden sollen.
Wenn in einem FC für ein A(*)-Array je Dimension die Werte von LowerBound und UpperBound abfragbar sind, dann müssen diese Informationen aber doch vorhanden oder zumindest rekonstruierbar sein. Und zwar für alle Arrays, denn das A(*)-Array existiert für mein Verständnis gar nicht, sondern ist lediglich der "Multiplexer", mit dem man auf eines der "real existierenden" Arrays zugreifen kann.
Als nächstes kommt dann die Forderung der dringende Wunsch, daß jegliche Zugriffe auf Arrays prüfen sollen, ob die Zugriffe innerhalb der Grenzen sind, weil "das Programm kennt doch LOWER_BOUND/UPPER_BOUND". Solche Prüfungen sind aber so ressourcenfressend, daß der Check z.B. in Codesys extra aktiviert werden muß.
Joa. Warum nicht, Harald? Zumindest bei SchreibZugriffen auf Arrays wäre das doch schon sehr hilfreich, um unbeabsichtigte DatenSabotage zu verhindern. Ressourcen- und Perfomance-fressend ist das natürlich. Aber wir reden ja hier über SPS-Programme und die sollten ja vorrangig "sicher" funktionieren.
Andererseits, wenn man mittels LowerBound und UpperBound selbst in die Hand nehmen kann, an welchen Stellen im Programm man solche VorbeugeMaßnahmen gegen BereichsVerletzungen vornehmen möchte und an welchen nicht, wäre das doch Ressourcen- und Performance-schonend gegenüber generell im Programm wirksamen, ständigen Überprüfungen.
Vielleicht wären Hinweise auf Ressourcen-Bedarf und Performance-Einbuße bei den Funktionen LowerBound und UpperBound sinnvoll.
Man muss ja nicht an jeder Stelle im Baustein die Funktionen benutzen (= erneut aufrufen), an denen man auf die Werte zurückgreifen will.
Einmal am BausteinAnfang und in TempVariablen gespeichert, greift man dann nur noch auf die Temps zu.
Für die TestPhase von neuentwickelten von Bausteinen finde ich LowerBound und UpperBound sowie die Prüfung auf BereichsVerletzung nicht verkehrt (, aber auch nicht unerlässlich).

ProgrammierFehler der Art ...
Code:
FOR ix := UpperBound(aktuellesArray, 1) TO LowerBound(aktuellesArray, 1) BY -1 DO
    aktuellesArray[ix + 1] := aktuellesArray[ix] ;
END_FOR ;
... also, dass der "geprüfte" IndexBereich doch noch durch z.B. ix +1 verfälscht wird, sind vermutlich die häufigsten. Aber man muss sie nur oft genug gemacht haben, dann achtet man schon automatisch darauf. ;)
 
In der Formulierung "Wenn ein Feldindex den zulässigen Bereich überschreitet, wird das OK-Flag auf FALSE gesetzt." fehlt mir wieder die wichtigste Information: wird bei einem SchreibZugriff ins Nirvana denn auf das Schreiben auch zuverlässig vezichtet?
Und (für Skeptiker) gilt das, was für ein Überschreiten des Bereichs gilt auch dann, wenn der Bereich "unterschritten" wird?
 
In der Formulierung "Wenn ein Feldindex den zulässigen Bereich überschreitet, wird das OK-Flag auf FALSE gesetzt." fehlt mir wieder die wichtigste Information: wird bei einem SchreibZugriff ins Nirvana denn auf das Schreiben auch zuverlässig vezichtet?
Und (für Skeptiker) gilt das, was für ein Überschreiten des Bereichs gilt auch dann, wenn der Bereich "unterschritten" wird?
naja, wie gesagt, für S7-300 könnte man ja im resultierenden AWL-Code nachschauen, was genau gemacht wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
// SCL Code
FUNCTION FC100 : INT

VAR_TEMP
test : ARRAY[1..10] OF REAL;
i : INT;
END_VAR

i := 2;
test[i]:= 123.456   ;
FC100 := 100;
END_FUNCTION

Code:
// AWL Code ohne Arraygrenzenprüfung
   SET 
      SAVE
      SET 
      =     L     42.1
      L     2
      T     #i
      L     #i
      ITD 
      T     LD    44
      L     LD    44
      L     L#1
      -D 
      T     LD    44
      L     LD    44
      L     L#32
      *D 
      T     LD    44
      L     1.234560e+002
      LAR1  LD    44
      T     LD [AR1,P#0.0]
      L     100
      T     #RET_VAL
      U     L     42.1
      SAVE
      BE

Code:
// AWL Code mit Arraygrenzenprüfung
      SET 
      SAVE
      SET 
      =     L     42.1
      L     2
      T     #i
      L     #i
      ITD 
      T     LD    44
      L     LD    44
      L     L#1
      >=D 
      =     L     42.2
      U     L     42.2
      U     L     42.1
      =     L     42.1
      L     LD    44
      L     L#10
      <=D 
      =     L     42.2
      U     L     42.2
      U     L     42.1
      =     L     42.1
      L     LD    44
      L     L#1
      -D 
      T     LD    44
      L     LD    44
      L     L#32
      *D 
      T     LD    44
      L     1.234560e+002
      LAR1  LD    44
      T     LD [AR1,P#0.0]
      L     100
      T     #RET_VAL
      U     L     42.1
      SAVE
      BE

Code:
// AWL Code mit Arraygrenzenprüfung und optimiertem Code
      SET  
      SAVE
      =     L     42.1
      L     2
      T     #i
      ITD  
      L     L#1
      >=D  
      U     L     42.1
      =     L     42.1
      TAK  
      L     L#10
      <=D  
      U     L     42.1
      =     L     42.1
      TAK  
      L     L#1
      -D  
      L     L#32
      *D  
      L     1.234560e+002
      TAK  
      LAR1
      TAK  
      T     LD [AR1,P#0.0]
      L     100
      T     #RET_VAL
      SAVE
      BE

Code:
// AWL Code mit optimiertem Code, Arraygrenzenüberwachung und OK Flag setzen
     SET   
      SAVE 
      =     L     42.1
      L     2
      T     #i
      ITD   
      L     L#1
      >=D   
      U     L     42.1
      =     L     42.1
      TAK   
      L     L#10
      <=D   
      U     L     42.1
      =     L     42.1
      TAK   
      L     L#1
      -D   
      SPO   I007
      SPA   I008
I007: CLR   
      =     L     42.1
I008: L     L#32
      *D   
      SPO   I009
      SPA   I00a
I009: CLR   
      =     L     42.1
I00a: L     1.234560e+002
      TAK   
      LAR1 
      TAK   
      T     LD [AR1,P#0.0]
      L     100
      T     #RET_VAL
      CLR   
      U     L     42.1
      SAVE 
      BE

1667489890461.png
 
Zuletzt bearbeitet:
Wo sollen denn die Informationen zu den Array-Grenzen eines "herkömmlichen" Arrays "simpel" in der SPS hinterlegt werden? Die müssten ja in einem zusätzlichen Speicherbereich als "Meta"-Daten gespeichert werden oder bei jedem Zugriff als unsichtbarer zusätzlicher Parameter mitgegeben werden.

Als nächstes kommt dann die Forderung der dringende Wunsch, daß jegliche Zugriffe auf Arrays prüfen sollen, ob die Zugriffe innerhalb der Grenzen sind, weil "das Programm kennt doch LOWER_BOUND/UPPER_BOUND". Solche Prüfungen sind aber so ressourcenfressend, daß der Check z.B. in Codesys extra aktiviert werden muß.

Harald
Das kann ja wie in C/C++ funktionieren. Der Aufruf von "LOWER_/UPPER_BOUND" wird, bei bekannten Arrays, beim Übersetzen durch die Konstante der Array-Größe ersetzt. Der Compiler weis ja wie lang das Array ist.
 
hier noch ein Auszug zu dem Verhalten der verschiedenen CPU Typen aus der TIA Hilfe:
Fehlerbehandlung bei ARRAY-Zugriffen

Zugriffsfehler entstehen, wenn Sie zur Laufzeit auf ein Element zugreifen, das außerhalb der deklarierten ARRAY-Grenzen liegt. Die verschiedenen CPU-Familien reagieren unterschiedlich auf Überschreitungen der ARRAY-Grenzen:

S7-300/400

Die CPU wechselt in den Betriebszustand "STOP".

Um dies zu vermeiden, können Sie den Programmablauffehler-OB (OB 85) programmieren.

In SCL haben Sie zusätzlich die Möglichkeit, in den Bausteineigenschaften das Attribut "ARRAY-Grenzen prüfen" zu aktivieren. Es bewirkt, dass bei ARRAY-Zugriffsfehlern der Freigabeausgang ENO auf FALSE gesetzt wird.

S7-1200

Die CPU erzeugt einen Diagnosepuffereintrag und verbleibt im Betriebszustand "RUN".

S7-1500

Die CPU wechselt in den Betriebszustand "STOP".

Um dies zu vermeiden, können Sie den Programmierfehler-OB (OB 121) programmieren.

Außerdem haben Sie die Möglichkeit, die lokale Fehlerbehandlung mit den Anweisungen "GET_ERROR: Fehler lokal abfragen" oder "GET_ERROR_ID: Fehler-ID lokal abfragen" zu programmieren.

Hinweis

Überwachung von ARRAY-Zugriffsfehlern durch ENO

Der Freigabeausgang ENO wird nicht auf den Signalzustand FALSE gesetzt, wenn bei der Ausführung einer Anweisung die ARRAY-Grenzen überschritten werden. Eine Ausnahme bilden nur SCL-Bausteine auf CPUs der Baureihen S7-300/400, für die die Bausteineigenschaft "ARRAY-Grenzen prüfen" gesetzt ist.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben