Variablenzugriff Strukturierter Text

radiator
2006-07-19
2006-07-25
  • radiator - 2006-07-19

    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

    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!

     
  • gravieren - 2006-07-19

    Hi

    Habe deine Frag NUR kurz überflogen.

    IF progZwei.progZweiVar = 1 THEN

    progEinsVar = 1;

    END_IF;

    Vergleich -> progEinsVar = 1; Zuweisung -> progEinsVar := 1;

    Globale Variablen vereinbaren ? !

    Karl

     
  • Gumpi - 2006-07-19

    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

     
  • J Schohaus - 2006-07-20

    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.

     
  • radiator - 2006-07-20

    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

     
  • mwatermann - 2006-07-20

    wenn du die zuweisung mit := machst und die variablen global anlegst sollte es eigentlich gehen...

    ansonsten mal code posten...

     
  • Erik Böhm - 2006-07-20

    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]

     
  • radiator - 2006-07-20

    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.

     
  • Erik Böhm - 2006-07-20

    Hi nochmal

    1. Läufts denn in der Simulation, oder auf dem Zielsystem?

    2. Eigentlich meckert der Compiler schon an, wenn die Variable keinen Zugriff zulässt, also nicht als VAR_INPUT deklariert ist.

    MfG

    Erik Böhm

     
  • radiator - 2006-07-22

    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?

     
  • e-pappy - 2006-07-22

    Hallo...

    Wenn ich dein Problem richtig verstanden habe versuchs in der Variablendeklaration doch mal so:

    VAR_GLOBAL
    progEinsVar : BOOL;
    progZweiVar : BOOL;
    END_VAR
    

    Und dann schreibst Du Deine Überprüfung einfach in ein Programm mit o.g. Variablen... Damit sollte es dann eigentlich funktionieren...

     
  • Erik Böhm - 2006-07-24

    Moin

    Kannst du nicht mal dein Projekt mit anhängen ?

    Ich glaube wir reden schwer aneinander vorbei...

     
  • radiator - 2006-07-24

    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]

     
  • Erik Böhm - 2006-07-24

    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

    portBlocked AT %MX60.5: BOOL;
    
    starBlocked AT %MX60.6: BOOL;
    

    END_VAR

    einfach

    PROGRAM valve

    VAR_INPUT

    portBlocked: BOOL;
    
    starBlocked: BOOL;
    

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

     
  • radiator - 2006-07-24

    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

     
  • Erik Böhm - 2006-07-24

    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.

    IMG: Forum Post302.JPG

    New_AntiHeel.zip [10.06 KiB]

     
  • radiator - 2006-07-25

    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

     
  • gravieren - 2006-07-25

    Hi

    Würd mich auch interessieren

    Vorallem die Zugriffsmöglichkeit über Kombnation

    Progname.Varname ! ?

    Karl

     

Log in to post a comment.