was muss ich eigentlich tun, um eine variable eines anderen programms zu verwenden?
ich hab zwei verschiedene programme:
progEins und progZwei
in beiden sind variablen angelegt:
progEinsVar : BOOL;
und
progZweiVar : BOOL;
Jetzt schreibe ich in progEins:
IF progZwei.progZweiVar = 1 THEN
progEinsVar=1;
END_IF;
der compiler meckert nicht, aber es tut sich einfach nix! im online-modus kann ich rechts neben dem programmcode verfolgen welchen status die variablen haben. progZweiVar ist definitiv TRUE aber die IF-anweisung wird nicht ausgeführt. Wie kann das sein?
muss ich bei der deklaration auf bestimmte sachen achten?
Hilfe!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich denke auch, dass es an der Zuweisung liegt, die muss mit Doppelpunkt sein. Ansonsten sollte es so eigentlich klappen. Wenn man x=y schreibt, dann steht da im endeffekt ein true oder ein false... Der Compiler nimmts zur Kenntnis, aber so wirklich ne Aufgabe haste ihm damit nicht gestellt g
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Der Angezeigte Status der Variablen enspricht in der Regel den Zustand am ende des Zyklus. Ich vermute das dein zweites Programm die Varaible in der IF bedingung zurückgesetzt wird. Teste dein Programm doch einfach mal im einzelschritt Modus.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ich habe das programm unter berücksichtigung eurer hinweise überprüft, aber leider gibt es immer noch keinen erfolg.
die variable wird nur an einer stelle gesetzt und dann auch nur einmal, das heisst der wert steht wie eine eiche bei TRUE. aber das andere programm (mit der IF-anweisung) führt einfach nix aus. hier wird wie gesagt nur lesend zugegriffen (IF).
dieselbe schreibweise setze ich in dem programm mit anderen variablen aus anderen programmen schon einige zeilen früher ein und da funktioniert es einwandfrei. kann es sein, dass die beiden programme in derselben task aufgerufen werden müssen?
gruß
björn
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
in meinem programm stand ":=" . es war ein tippfehler von mir hier im forum.
ich finde das alles sehr komisch. normalerweise müsste der compiler doch meckern, wenn ich eine variable versuche einzubinden, welche unter diesen umständen gar nicht erkannt werden .
ich habs jetzt mit globalen variablen gelöst, aber das kann ja nicht sinn der übung sein. da kann man ja gleich alles global deklarieren...
haben hier auch mit mehreren leuten drübergeschaut und keine fehler gefunden.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hier mal das projekt. es geht hauptsächlich um die programme "valve" und "fail".
und dabei um die variablen "portBlocked" und "starBlocked".
die werden in "valve" gesetzt und in "fail" abgefragt.
wie gesagt, jetzt ist es mit globalen variablen gelöst. aber das was ich eigentlich vorhatte funktioniert schon in dem programm "main".
sieh dir mal die variable "heelingAngle" im prog "angle" an. diese wird in einer abfrage im programm "main" benutzt, und hier funktioniert das sehr gut.
für die adressen hab ich mir extra ein excel-sheet gemacht. da bin ich mir recht sicher, dass alles ok ist.
die adressen nutze ich in einem alarm-wort. sobald dieses wort nicht mehr NULL ist geht das system in den fehlerstatus. mal sehen, ob ich das anders machen kann...
und ja, der aufruf war kurzfristig nicht gesetzt. ich bin da noch am basteln.
hast du dir die deklaration angeschaut? ist die auf seiten korrekt? oder kanns vielleicht an taskprioritäten liegen?
gruß
björn
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
In dem jetzigen Projekt sind besagte Variablen ja Global. Da ists ja keine Kunst.
Ansonsten, was heisst beide Seiten ? Eine Deklaration gibts ja nur auf einer Seite, auf der anderen wird ja nur darauf zugegriffen.
Ich hab das Projekt jetzt mal bei mir auf einer elrest Steuerung laufen lassen (hab grade keinen Wago aufm Tisch).
Da funktioniert das tadellos, allerdings wird starBlocked nach 2-3 Zyklen wieder auf FALSE gesetzt. Ich schätze mal, durch überschreiben mit sysString.
Wenn ich mir mal die Ausgabe der Speicherbereichsüberprüfung anschaue, dann finde ich folgendes: siehe Screenshot
Hab das Projekt mal angehängt. Habe nur portBlocked und starBlocked als Inputvariablen von valve deklariert und in fail den Zugriff angepasst.
habs nochmal versucht und auch mit dem programm welches du geändert hast. es funktioniert nicht. er erkennt ums verrecken die bool-variable nicht. witzigerweise ohne dass der compiler meckert. speicherüberschneidung ist kein prob. ich habs wie gesagt jetzt global gelöst. ich werd mal jemanden von wago zu rate ziehen. ich glaub da ist demnächst jemand bei uns im hause.
wenn ich genaueres weiss sag ich auf jeden fall bescheid.
das ist seltsam...
gruß
björn
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hallo zusammen!
was muss ich eigentlich tun, um eine variable eines anderen programms zu verwenden?
ich hab zwei verschiedene programme:
progEins und progZwei
in beiden sind variablen angelegt:
progEinsVar : BOOL;
und
progZweiVar : BOOL;
Jetzt schreibe ich in progEins:
IF progZwei.progZweiVar = 1 THEN
END_IF;
der compiler meckert nicht, aber es tut sich einfach nix! im online-modus kann ich rechts neben dem programmcode verfolgen welchen status die variablen haben. progZweiVar ist definitiv TRUE aber die IF-anweisung wird nicht ausgeführt. Wie kann das sein?
muss ich bei der deklaration auf bestimmte sachen achten?
Hilfe!
Hi
Habe deine Frag NUR kurz überflogen.
Vergleich -> progEinsVar = 1; Zuweisung -> progEinsVar := 1;
Globale Variablen vereinbaren ? !
Karl
Ich denke auch, dass es an der Zuweisung liegt, die muss mit Doppelpunkt sein. Ansonsten sollte es so eigentlich klappen. Wenn man x=y schreibt, dann steht da im endeffekt ein true oder ein false... Der Compiler nimmts zur Kenntnis, aber so wirklich ne Aufgabe haste ihm damit nicht gestellt g
Der Angezeigte Status der Variablen enspricht in der Regel den Zustand am ende des Zyklus. Ich vermute das dein zweites Programm die Varaible in der IF bedingung zurückgesetzt wird. Teste dein Programm doch einfach mal im einzelschritt Modus.
hallo alle!
danke für eure schnelle hilfe!
ich habe das programm unter berücksichtigung eurer hinweise überprüft, aber leider gibt es immer noch keinen erfolg.
die variable wird nur an einer stelle gesetzt und dann auch nur einmal, das heisst der wert steht wie eine eiche bei TRUE. aber das andere programm (mit der IF-anweisung) führt einfach nix aus. hier wird wie gesagt nur lesend zugegriffen (IF).
dieselbe schreibweise setze ich in dem programm mit anderen variablen aus anderen programmen schon einige zeilen früher ein und da funktioniert es einwandfrei. kann es sein, dass die beiden programme in derselben task aufgerufen werden müssen?
gruß
björn
wenn du die zuweisung mit := machst und die variablen global anlegst sollte es eigentlich gehen...
ansonsten mal code posten...
Hi
Eine Zuweisung wie: progEinsVar = 1; krieg ich gar nicht hin, da gibts nämlich ne Fehlermeldung: 4024: Erwarte ';', ':=' oder '(' vor '=.
Ansonsten muss das so natürlich funktionieren.
Ausser... Das ganze läuft in der Simulation. Da wird nämlich lustigerweise immer nur EIN Task ausgeführt.
MfG
Erik[/b]
sorry leute. habs eben vergessen zu posten.
in meinem programm stand ":=" . es war ein tippfehler von mir hier im forum.
ich finde das alles sehr komisch. normalerweise müsste der compiler doch meckern, wenn ich eine variable versuche einzubinden, welche unter diesen umständen gar nicht erkannt werden .
ich habs jetzt mit globalen variablen gelöst, aber das kann ja nicht sinn der übung sein. da kann man ja gleich alles global deklarieren...
haben hier auch mit mehreren leuten drübergeschaut und keine fehler gefunden.
Hi nochmal
Läufts denn in der Simulation, oder auf dem Zielsystem?
Eigentlich meckert der Compiler schon an, wenn die Variable keinen Zugriff zulässt, also nicht als VAR_INPUT deklariert ist.
MfG
Erik Böhm
hallo erik!
das programm läuft auf dem zielsystem wago 750-841.
die deklaration ist die einzige sache bei der ich mir nicht wirklich sicher bin, habe deswegen auch schon alles mögliche ausprobiert.
um mal meinem beispiel zu folgen:
ich deklariere in progEins
VAR_INPUT
progZweiVar
END_VAR
und in progZwei
VAR_OUTPUT
progZweiVar
END_VAR
das ist doch so korrekt, oder?
Hallo...
Wenn ich dein Problem richtig verstanden habe versuchs in der Variablendeklaration doch mal so:
Und dann schreibst Du Deine Überprüfung einfach in ein Programm mit o.g. Variablen... Damit sollte es dann eigentlich funktionieren...
Moin
Kannst du nicht mal dein Projekt mit anhängen ?
Ich glaube wir reden schwer aneinander vorbei...
ja hast recht, erik.
hier mal das projekt. es geht hauptsächlich um die programme "valve" und "fail".
und dabei um die variablen "portBlocked" und "starBlocked".
die werden in "valve" gesetzt und in "fail" abgefragt.
wie gesagt, jetzt ist es mit globalen variablen gelöst. aber das was ich eigentlich vorhatte funktioniert schon in dem programm "main".
sieh dir mal die variable "heelingAngle" im prog "angle" an. diese wird in einer abfrage im programm "main" benutzt, und hier funktioniert das sehr gut.
hoffentlich steigst du da durch
test.zip [12.22 KiB]
Bist du sicher, dass deine Merkeradressen alle richtig sind und da nicht irgendwo was überschrieben wird ?
Was ist wenn du die Variablen ohne Adresse definierst ?
Also z.B.:
anstatt
PROGRAM valve
VAR_INPUT
END_VAR
einfach
PROGRAM valve
VAR_INPUT
END_VAR
Denn mit "heelingAngle" funktionierts ja, und so ists auch korrekt.
Das muss gehen...
Wo wir grade dabei sind: Einen Aufruf für valve finde ich auch nirgends...
hallo erik,
erstmal danke für deine hilfe.
für die adressen hab ich mir extra ein excel-sheet gemacht. da bin ich mir recht sicher, dass alles ok ist.
die adressen nutze ich in einem alarm-wort. sobald dieses wort nicht mehr NULL ist geht das system in den fehlerstatus. mal sehen, ob ich das anders machen kann...
und ja, der aufruf war kurzfristig nicht gesetzt. ich bin da noch am basteln.
hast du dir die deklaration angeschaut? ist die auf seiten korrekt? oder kanns vielleicht an taskprioritäten liegen?
gruß
björn
Hi
In dem jetzigen Projekt sind besagte Variablen ja Global. Da ists ja keine Kunst.
Ansonsten, was heisst beide Seiten ? Eine Deklaration gibts ja nur auf einer Seite, auf der anderen wird ja nur darauf zugegriffen.
Ich hab das Projekt jetzt mal bei mir auf einer elrest Steuerung laufen lassen (hab grade keinen Wago aufm Tisch).
Da funktioniert das tadellos, allerdings wird starBlocked nach 2-3 Zyklen wieder auf FALSE gesetzt. Ich schätze mal, durch überschreiben mit sysString.
Wenn ich mir mal die Ausgabe der Speicherbereichsüberprüfung anschaue, dann finde ich folgendes: siehe Screenshot
Hab das Projekt mal angehängt. Habe nur portBlocked und starBlocked als Inputvariablen von valve deklariert und in fail den Zugriff angepasst.
New_AntiHeel.zip [10.06 KiB]
hi!
nochmal danke für deine hilfe!
habs nochmal versucht und auch mit dem programm welches du geändert hast. es funktioniert nicht. er erkennt ums verrecken die bool-variable nicht. witzigerweise ohne dass der compiler meckert. speicherüberschneidung ist kein prob. ich habs wie gesagt jetzt global gelöst. ich werd mal jemanden von wago zu rate ziehen. ich glaub da ist demnächst jemand bei uns im hause.
wenn ich genaueres weiss sag ich auf jeden fall bescheid.
das ist seltsam...
gruß
björn
Hi
Würd mich auch interessieren
Vorallem die Zugriffsmöglichkeit über Kombnation
Progname.Varname ! ?
Karl