TIA TIA AWL VKE-Bit initialisieren

quiddi

Level-1
Beiträge
60
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bekomme beim Übersetzen eines AWL-Codes im TIA-Portal die Fehlermeldung:
"Das VKE ist nicht initialisiert. Der Zugriff ist ungültig."

Normalerweise hatte es in S7-Classic doch ausgereicht, dass man einfach mit der Anweisung "SET" das VKE-Bit am Anfang des Programmes gesetzt hatte. Wo liegt hier mein Denkfehler?

Als CPU wird eine 1507 verwendet mit TIA 15.1.

Schönen Gruß und Danke
 
Sorry, hier der Code:

Code:
      SET



      A     #Lichtschranke_1
      JC    StarteMessung
      A     #Lichtschranke_2
      JC    StoppeMessung
      JCN   VerlasseBaustein


StarteMessung : SET
      CALL  MOVE
         value_type:=Variant
         IN  :=16#0
         OUT :=#Speicher1
      CALL  MOVE
         value_type:=Variant
         IN  :=16#0
         OUT :=#Speicher2


      CALL  RUNTIME
         Ret_Val :=#Speicher1
         MEM     :=#Speicher2
      JC    VerlasseBaustein


StoppeMessung : SET
      CALL  RUNTIME
         Ret_Val :=#Speicher1
         MEM     :=#Speicher2
      CALL  MOVE
         value_type:=Variant
         IN  :=#Speicher2
         OUT :=#Zeit
      JC    VerlasseBaustein


VerlasseBaustein : SET
      SAVE
 
Code:
      [COLOR="#008000"]SET[/COLOR]  [COLOR="#008000"]//"Angst"-SET, muß nicht, kann aber so bleiben[/COLOR]
           [COLOR="#008000"]//(Schutz gegen VKE-Verschleppung aus vorherigem Netzwerk)[/COLOR]

      A     #Lichtschranke_1
      JC    StarteMessung
      A     #Lichtschranke_2
      JC    StoppeMessung
      [COLOR="#FF0000"]JCN[/COLOR]   VerlasseBaustein  [COLOR="#FF0000"]//[COLOR="#008000"]ich würde JU nehmen[/COLOR] Edit: muß JU sein, JCN funktioniert nicht[/COLOR]


StarteMessung : [COLOR="#0000FF"]SET[/COLOR]  [COLOR="#0000FF"]//überflüssig[/COLOR]
      CALL  MOVE
         value_type:=Variant
         IN  :=16#0
         OUT :=#Speicher1
      CALL  MOVE
         value_type:=Variant
         IN  :=16#0
         OUT :=#Speicher2


      CALL  RUNTIME
         Ret_Val :=#Speicher1
         MEM     :=#Speicher2
      [COLOR="#FF0000"]JC[/COLOR]    VerlasseBaustein   [COLOR="#FF0000"]//muß JU sein[/COLOR]


StoppeMessung : [COLOR="#0000FF"]SET[/COLOR]  [COLOR="#0000FF"]//überflüssig[/COLOR]
      CALL  RUNTIME
         Ret_Val :=#Speicher1
         MEM     :=#Speicher2
      CALL  MOVE
         value_type:=Variant
         IN  :=#Speicher2
         OUT :=#Zeit
      [COLOR="#FF0000"]JC[/COLOR]    VerlasseBaustein   [COLOR="#FF0000"]//muß JU sein[/COLOR]


VerlasseBaustein : SET
      SAVE
Warum werden 2x "JC VerlasseBaustein" verwendet? Willst Du ein vom vorherigen CALL zurückgegebenes VKE auswerten? Das ist nicht möglich/nicht erlaubt. Willst Du eine eventuelle Fehler-Rückgabe des Bausteins auswerten? Dann müsstest Du vor dem JC noch "A BR" schreiben.

Warum programmierst Du das nicht einfach in FUP oder KOP? Da bräuchtest Du Dich nicht um solche Details kümmern...

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vorsicht: Du verwendest die RUNTIME-Anweisung, die läuft irgendwann mal über (vermutlich alle 24 Tage?) und liefert einen negativen Wert, der laut Siemens einfach "ignoriert" werden soll :roll: Was aber keine Lösung ist... (Ist in Deiner TIA-Version der Überlauf bei S7-1500 dokumentiert?)

Funktioniert das RUNTIME überhaupt? Wir hatten hier auch schon das Problem, daß RUNTIME auf einer S7-1500 mit TIA V15.1 überhaupt nicht funktionierte.

Du könntest TIME_TCK verwenden, da ist der Überlauf dokumentiert und kann deshalb herausgerechnet werden.

Harald
 
Danke für den Tipp mit der RUNTIME.

Nichts desto trotz hätte ich gerne gewusst, warum ich hier ein SET brauche.
StoppeMessung : SET //überflüssig
Wenn ich es nicht hinschreibe, kommt ein Übersetzungsfehler. Ich war nämlich auch der Meinung, dass es überflüssig ist.

Und noch eine zweite Frage hierzu:
JC VerlasseBaustein //muß JU sein
JC <--> Springe wenn VKE = 1 gilt
JU <--> Springe absolut
Wieso bekomme ich hier mit JC einen Übersetzungsfehler? Ob mein Programm richtig läuft sei mal dahingestellt, aber übersetzen müsste ich es doch können, oder?

Schönen Gruß und Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und nicht vergessen, auf einer 1500-er ist AWL auch langsamer als alles andere, das es nur interpretiert wird.
Das kann man mind. genausogut in FUP oder SCL hinbekommen und vor Allem besser lesbar für Ungeübte.
 
Nichts desto trotz hätte ich gerne gewusst, warum ich hier ein SET brauche.
StoppeMessung : SET //überflüssig
Wenn ich es nicht hinschreibe, kommt ein Übersetzungsfehler. Ich war nämlich auch der Meinung, dass es überflüssig ist.
Hinter einer Sprungmarke muß eine Anweisung stehen. Das kann das "CALL ..." sein oder ein "NOP 0" oder irgendwas - wenn mir nichts besseres einfällt dann nehme ich gerne SET oder CLR, weil das kürzer getippt ist als "NOP 0" und garantiert das VKE abgrenzt in Fällen wo gesprungen wird ohne das VKE zu beeinflussen (wie z.B. JU, JZ, JM, ...). Für das VKE ist das "SET" in Deinem Code aber nicht nötig.

Wieso bekomme ich hier mit JC einen Übersetzungsfehler?
Die Fehlermeldung sollte Dir doch auch zeigen, wo/in welcher Zeile der Fehler ist. Ich vermute, es ist jeweils die Zeile mit dem "JC ..." nach dem CALL, weil JC das VKE auswerten will, an der Stelle das VKE aber "unbestimmt" ist.
Code:
...
      JC    StarteMessung      //beende Verknüpfung, wenn VKE = 1 dann springe zur Marke

      A     #Lichtschranke_2   //beginne eine neue Verknüpfung und lade den Wert von #Lichtschranke_2
                               // ins VKE. (Hier ist es egal ob die Anweisung A oder O oder X ist!)

      JC    StoppeMessung      //beende Verknüpfung, wenn VKE = 1 dann springe zur Marke
                               //wenn VKE = 0, dann springe nicht [COLOR="#0000FF"]und setze VKE = 1![/COLOR]
[COLOR="#0000FF"]//ab hier ist VKE immer 1 ![/COLOR]

      [COLOR="#FF0000"]JCN[/COLOR]   VerlasseBaustein   //wenn VKE = 0 dann springe zur Marke, in jedem Fall setze VKE = 1
                               [COLOR="#FF0000"]//JCN nach JC ist ein Fehler, weil hier VKE immer 1 ist! --> JU verwenden![/COLOR]
...
StoppeMessung : SET            //mit oder ohne SET ist hier das VKE auf 1 gesetzt
      CALL  RUNTIME

//ab hier ist das VKE "unbestimmt" und darf nicht ausgewertet werden

      CALL  MOVE

//hier ist das VKE "unbestimmt" und darf nicht ausgewertet werden

      [COLOR="#FF0000"]JC[/COLOR]    VerlasseBaustein   [COLOR="#FF0000"]//JC will das unbestimmte VKE auswerten! Fehler![/COLOR]

Zu dem JC + JCN: ich habe das jetzt nicht ausprobiert weil ich das nie so verkompliziert programmiere (ich nehme in so einem Fall immer als zweites ein JU), aber laut "Hilfe zu AWL" kann Deine Variante nicht funktionieren, weil JC bei VKE = 0 das VKE auf 1 setzt! Daher muß nach JC ein JU kommen (oder ein weiteres JC ;) ). Da hast Du genau die eine Variante gewählt die nicht funktioniert.
Code:
      A     ...
      JC    StoppeMessung
      [COLOR="#FF0000"]JCN[/COLOR]   VerlasseBaustein  [COLOR="#FF0000"]//so funktioniert es nicht![/COLOR]

      A     ...
      JC    StoppeMessung
      [COLOR="#008000"]JU[/COLOR]    VerlasseBaustein  [COLOR="#008000"]//so funktioniert es  :-)[/COLOR]

      A     ...
      JCN   VerlasseBaustein
      [COLOR="#0000FF"]JC[/COLOR]    StoppeMessung     [COLOR="#0000FF"]//so funktioniert es auch![/COLOR]

      A     ...
      [COLOR="#0000FF"]JC[/COLOR]    StoppeMessung
      [COLOR="#0000FF"]JC[/COLOR]    VerlasseBaustein  [COLOR="#0000FF"]//so funktioniert es auch!!!  ;-)[/COLOR]
Übrigens: In einer Hochsprache (wie z.B. SCL) schreibt man "IF (NOT) .. THEN .. ELSE" (das entspricht "A .. JC(N) .. JU") und nicht "IF .. THEN .. IF NOT .."


Tipp 1: Probiere die Varianten aus und beobachte, wie sie funktionieren.
Tipp 2: Wenn Du in AWL nicht ganz sicher bist, dann programmiere in FUP oder KOP.

Harald
 
Zurück
Oben