TIA tempVariable

Zuviel Werbung?
-> Hier kostenlos registrieren
Temp Variablen sind niemals (sicher) beim Zyklusanfang initialisiert.

Temp Variablen immer erst schreiben (hier z.B. mit einem Leerstring) bevor Sie das erstmal mal gelesen werden. Ansonsten kann dort auch vollkommen unerwartetes Zeug drin stehen.
 
Ruf doch mal die RIGHT-Funktion zyklisch auf und ruf nur S_CONV bedingt auf.

Andere Frage: Das Problem ist doch nicht, dass eine 0 zur falschen Zeit geschrieben wird, sondern, dass ein Wert (Programmnummer) zur falschen Zeit geschrieben wird, oder?

Wann ist eigentlich der falsche Zeitpunkt? Eigentlich kommt doch wahrscheinlich die Bedingung, die die Programmnummer schreibt zur falschen Zeit?

Ja hast du recht, aber auch wenn die 2 Bedienungen erfüllt sind, wird dort trotzdem K00 konvertiert was im Effekt nur Wert 0 ist. Es muss doch was anderes sein.
Das verstehe ich jetzt nicht (mehr). Also ist das Problem, dass im String was Falsches (nämlich K00) drin steht? Ich dachte, die Programmnummer wird zu einem falschen Zeitpunkt geschrieben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Temp Variablen sind niemals (sicher) beim Zyklusanfang initialisiert.

Temp Variablen immer erst schreiben (hier z.B. mit einem Leerstring) bevor Sie das erstmal mal gelesen werden. Ansonsten kann dort auch vollkommen unerwartetes Zeug drin stehen.
Nein, beim TIA-Portal (ich weiß gerade nicht mehr, ab welcher Version) WIRD eine Temp-Variable bei Bausteinaufruf vom System initialisiert. Da steht kein "unerwartetes Zeug" drin, wie man es von der Classic-Welt kennt.

VG

Mario
 
Nein, tempString ist nicht vor ersten Verwendung initialisiert. Ich gehe davon auf dass alle Temp Variablen bei Zyklus Anfang initialisiert sind.
Das gilt nur für statische Variablen (angelegt im STAT-Bereich eines FB) - temporäre Variablen sind erstmal grundsätzlich nicht initialisiert ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, beim TIA-Portal (ich weiß gerade nicht mehr, ab welcher Version) WIRD eine Temp-Variable bei Bausteinaufruf vom System initialisiert. Da steht kein "unerwartetes Zeug" drin, wie man es von der Classic-Welt kennt.

VG

Mario
Hast du dafür eine Quelle? Nicht dass ich es dir nicht glaube, aber irgendwie klingt das falsch für mich. Wie löst der Compiler das Ganze dann? Immer den ganzen Temp-Bereich mit "Null" initialisieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok danke, war mir so nicht bewusst. Aber aufgrund der Unterscheidung Optimiert/Nicht Optimiert stellt sich schon meiner Meinung nach die Frage, ob damit wirklich ein sinnvoller Mehrwert geschaffen wurde. Denn scheinbar gilt dies ja nur für optimierte DBs, ob die immer verwendet werden?

Da wäre mir persönlich eine einheitliche Programmierregel schon lieber, statt dann Unterscheidungen machen zu müssen. Aber wenn es geht, dann hab ich nix gesagt.
 
Ok danke, war mir so nicht bewusst. Aber aufgrund der Unterscheidung Optimiert/Nicht Optimiert stellt sich schon meiner Meinung nach die Frage, ob damit wirklich ein sinnvoller Mehrwert geschaffen wurde. Denn scheinbar gilt dies ja nur für optimierte DBs, ob die immer verwendet werden?

Da wäre mir persönlich eine einheitliche Programmierregel schon lieber, statt dann Unterscheidungen machen zu müssen. Aber wenn es geht, dann hab ich nix gesagt.
Ehrlich gesagt initialisiere ich die temp-Variablen gewohnheitsmäßig auch immer explizit im Programmcode.
Allerdings sollte es so funktionieren. Die Frage ist nur, ob der DB optimiert ist?

VG

Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für das Update - ich bezog mich hier allerdings auf den Datentyp String bei dem ich wegen dem Verhalten von solchen Bausteinen wie z.B. RIGHT immer erstmal initialisieren würde ...
Da in der verlinkten Beschreibung auch davon nichts steht gehe ich davon aus, dass das bei String immer noch so gilt ...
 
Danke für das Update - ich bezog mich hier allerdings auf den Datentyp String bei dem ich wegen dem Verhalten von solchen Bausteinen wie z.B. RIGHT immer erstmal initialisieren würde ...
Da in der verlinkten Beschreibung auch davon nichts steht gehe ich davon aus, dass das bei String immer noch so gilt ...
Ja, ok.

Bedeutet aber wirklich, dass man sich auf den String bzw. die erfüllte Bedingung dafür stürzen sollte.
Ich denke nicht, dass bei der Übergabe an den INPUT irgend etwas schief läuft.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ruf doch mal die RIGHT-Funktion zyklisch auf und ruf nur S_CONV bedingt auf.
Passt, wenn ich die Möglichkeit habe Programm einzuspielen dann ändere ich das.
Andere Frage: Das Problem ist doch nicht, dass eine 0 zur falschen Zeit geschrieben wird, sondern, dass ein Wert (Programmnummer) zur falschen Zeit geschrieben wird, oder?
Genau. Ich will auf Keyence Messsystem wert 0 als Programmnummer schicken. Keyence bekommt aber wert 25. Im Trace habe ich danach gesehen dass Variable xxx.inProgrammnummer wert 25 beinhaltet wenn ich aber Datenbaustein beobachtet habe steht dort 0. und im tempProgrammnummerDINT war auch 0.

Das verstehe ich jetzt nicht (mehr). Also ist das Problem, dass im String was Falsches (nämlich K00) drin steht? Ich dachte, die Programmnummer wird zu einem falschen Zeitpunkt geschrieben?
Also: Wenn eine Probe unter Messsystem liegt schicke ich an Messsystem Programmnummer z.b.: bei Probentyp K25 schicke ich 25 an keyence.
Wenn eine Kalibrierprobe vermessen will, Daten werden nicht als .belegt markiert d.h: die Bedienung ist nicht erfüllt und kommt gar nicht zu RIGHT funktion. Wenn doch Fehler im Programm ist und Kalibrierprobe wurde als .belegt markiert schicke ich Probennummer K00 auf RIGHT und bekomme ich Wert 0 welche ich an keyence schicken muss.


1. Ich werde RIGHT Funktion separat zyklisch aufrufen.
2. Bearbeite ich Trace dass ich die 2 Bedienungen sehe bei nächster Fehler
3. Schreibe tempProgrammnummerDINT auf eine statische variable dass ich das auch tracen/ beobachten kann.
4.Initialisiere tempString vor RIGHT Funktion.

habe ich noch vergessen?
Danke für eure Hilfe.
Falls jemanden was noch einfällt bin ich dankbar für jede Tip.

Sg
Jozef
 
Zurück
Oben