Step 7 Temporäre Variablen und bedingte Sprünge.. keine Funktion

Kapitaen31

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jungs und Mädels...

ich habe da ein kleines Problem mit meinen Temp Variablen und bedingten Sprüngen....

Den AWL Code habe ich leider hier jetzt nicht zur Hand.... aber ich versuch es mal schematisch darzustellen...

FC53 NW1:

u M1.0
FP M 10.0
= #Temp_schr_Anf

u M1.1
FP M10.1
= #Temp_schr_ende

o #Temp_schr_anf
o #Temp_schr_ende
o
u(
l db5.dbw10
l 10
==i
)
u(
ldb5.dbw12
l 0
==i
)
Fp M10.2
= #D_schr

u #D-schr
spb aus1
be

NW2:
aus1: nop 0
. weitere Befehle
.
.

NW3:
.
.
.

ee01: nop 0

----- Ende des Bausteins


So ungefähr sieht der Quelltext aus. Es sind noch einige andere Abfrage mit enthalten....
Den bedingten Sprung führt die CPU 315/2DP nicht korekkt aus. Scheinbar ist die Temp Var immer auf null für den SPB.... Jedenfals wenn ich vor dem Sprung mir ein Kontrollmerker setze, um zu sehen ob D_schr überhaupt auf high gegangen ist, sehe ich das der Merker gesetzt wurde....
Wenn die Temp Var kurzfristig ein High Sig hat, warum wird der SPB nicht ausgeführt?
Kann mir jemand dazu eine Antwort geben?

Vielleicht sehe ich auch vor lauter einsen nichts mehr...... ;-)
Gruß
Andreas
 
das mit temp-var als flanke ist kritisch. du hast mehrere bedingungen für das bilden von d_schr. die müssen alle im selben zyklus erfüllt sein damit d_schr high wird. nimm globale variablen.
 
du hast recht. ich habe das mit dem kontrollmerker nicht richtig gelesen.
 
hallo,

ich habe ja ein Oder zwischen den verschiedenen Abfragen...

Ich werde gleich nochmal den Quellcode hochladen.... den hatte ich gestern abend nicht mehr im Kopf... Der sieht ein bischen anders aus...

Ich realisiere damit einen Temperatur schreiber, der zu bestimmten Zeiten die Temperaturen in einen DB speichert. Am Anfang wird alles im DB zu null geschrieben und dann am Anfang und am Ende einmal.... dazwischen wird alle 15min geschrieben...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kapitän

Die Flankenmerker sind nur 1 Zyklus lang aktiv, also auf "high". Ich schätze mal, dass das dein Problem ist, warum die Schrittkette nicht weiterschaltet und dein SPB auf "0" ist.

Du könntest dein #Schritt_Temp_Anf mit Setzen auf "high" halten und im Schritt 2 wieder rücksetzen.

mfg
Kapo
 
Hallo,

ich habe hier erst mal den Quellcode eingestellt, sowie ich ihn im FC habe.

Hallo Kapo,

ja, das war mir schon klar, das die Flanke auch nur genau einen Zyklus high hat. Ich brauche dieses Bit auch nur genau für einen Zyklus, daher hatte ich diese Variante gewählt.... Trotz dem habe ich es nicht verstanden, warum es nicht geht.

Das komische daran ist, das ich mir hinter dem "=#Schritt_Temp_Anf" schon mal einen Hilfsmerker "u #Schritt_Temp_Anf s M2.0 " gestzt habe, um zu sehen, ob die Var gesetzt wird. Und immer war der Merker gesetzt. Ich habe dann heute morgen halt, die DB´s gesetzt und im Netzwerk drei habe ich dann das Bit wieder zurückgesetzt.

Vielleicht weiß jemand warum das mit TempVar nicht geht.
Gruß
Andi



Code:
Netzwerk1:

    U     DB20.DBX  101.2
      UN    DB20.DBX  101.4
      FP    M    103.0
   [COLOR=#ff0000]   S     DB55.DBX    1.0          [/COLOR]   // = #D_schr_Anf_0

      U     M     86.3
      FP    M    103.1
   [COLOR=#0000ff]   S     DB55.DBX    1.1   [/COLOR]          // = #D_schr_Anf

      U     M     86.3
      FN    M    103.2
   [COLOR=#800000]   S     DB55.DBX    1.2    [/COLOR]         // =     #D_schr_End

      [COLOR=#0000ff]U     DB55.DBX    1.1  [/COLOR]           // #D_schr_Anf
      O     
      U(    
      L     DB22.DBW   54               
      L     15
      ==I   
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.3                 
      O     
      U(    
      L     DB22.DBW   54
      L     30
      ==I                               
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.4
      O     
      U(    
      L     DB22.DBW   54
      L     45
      ==I   
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.5
      O     
    [COLOR=#800000]  U     DB55.DBX    1.2     [/COLOR]        //  #D_schr_End
      =     #D_schr
      UN    #D_schr
      BEB   


Netzwerk 2:
  L     MW    82
      T     #Drehzahl
      L     DB20.DBW  102
      T     #Anz_Temp
      S     DB55.DBX    0.3

     [COLOR=#ff0000] UN    DB55.DBX    1.0[/COLOR]
      SPB   aus2
      AUF   DB    55
      L     P#10.0
      T     #Zeiger
      L     DBLG
      L     10
      -I    
sch:  T     #Anzahl                     // DB50 alles auf null schreiben
      L     0
      T     DBB [#Zeiger]
      L     #Zeiger
      L     P#1.0
      +D    
      T     #Zeiger
      L     #Anzahl
      LOOP  sch
      L     P#10.0                      // Startstellung im DB 55
      T     DBD    2
      L     P#2426.0
      T     DBD    6
      R     DB55.DBX    1.0
aus2: AUF   DB    55                    // bei zu wenig Platz im DB 55 beenden
      L     DBD    2
      SRD   3
      L     14
      +I    
      L     DBLG
      >I    
      SPB   ee03
      L     DBD    6
      T     #Zeiger_Zeit
      L     DBD    2
      T     #Zeiger
      L     P#14.0                      // Diff. zwischen 1. Datensatz und Drehzahldatensatz im DB55
      +D    
      T     #Zeiger_Drehz
      L     P#2.0
      T     #Zeiger2
scl:  T     #Anzahl2
      AUF   DB    40
      L     #Anzahl2
      L     9
      >=I   
      SPB   aus3
      L     DBW [#Zeiger2]
      AUF   DB    55
      T     DBW [#Zeiger]
      L     P#2.0
      L     #Zeiger
      +D    
      T     #Zeiger
      L     P#2.0
      L     #Zeiger2
      +D    
      T     #Zeiger2
aus3: L     #Anzahl2
      LOOP  scl
      L     #Drehzahl
      T     DBW [#Zeiger_Drehz]
 
Zuletzt bearbeitet:
sorry...ich wollte dir nicht zu nahe treten. ;)

Ich habe dein Problem gerade selbst probiert. Ich weiß leider auch nicht warum das nicht geht, werde aber mal recherchieren.
Wenn du für deinen Flankenmerker eine Lokalvariable benutzt, funktionierts.

Habe es selber mal bei einer Schrittkette so programmiert gehabt und dadurch hat die Anlage ihren eigenen Kopf entwickelt. Seit dem bin ich mit Lokalvariablen vorsichtiger. :D

Code:
//geht nicht
      U     M    400.0
      FP    M    400.1
      =     #m1

//funktioniert
      U     M    400.0
      =     #m1

      U     #m1
      FP    #m2
       =     #m3

mfg
Kapo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
//geht nicht
      U     M    400.0
      FP    M    400.1
      =     #m1
:confused:

Also in meiner Simu funktioniert auch das! Wüßte jetzt auch nicht, warum das nicht funktionieren soll.

Dagegen dürfte die 2. Variante in einem FC (wie von Kapitaen31 verwendet) nicht funktionieren, da Flankenmerker statisch sein müssen. Aber das sind sie mit den Merkern bei Kapitaen31 ja.
 
Wirklich? Auf meiner CPU 315-2 DP/PN funzt es nicht.

Neu Windows Bitmap Bild.GIF

Ich habe auch keinen Fehler in seiner Anweisung gesehen und dachte mir ich probiers mal schnell.
 
Code:
Netzwerk1:
      [COLOR=#0000ff]U     DB55.DBX    1.1  [/COLOR]           // #D_schr_Anf
      O     
      U(    
      L     DB22.DBW   54               // DB50 alles auf null schreiben
      L     15
      ==I   
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.3                  // Startstellung im DB 55
      O     
      U(    
      L     DB22.DBW   54
      L     30
      ==I                               // bei zu wenig Platz im DB 55 beenden
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.4
      O     
      U(    
      L     DB22.DBW   54
      L     45
      ==I   
      )     
      U(    
      L     DB22.DBW   56
      L     0
      ==I   
      )     
      FP    M    103.5
      O     
    [COLOR=#800000]  U     DB55.DBX    1.2     [/COLOR]        //  #D_schr_End
      =     #D_schr
...
Ich würde mal vermuten, dass hier ein paar Klammern fehlen und dadurch der #D_schr_Anf (bzw. alles vor den Flankenbildungen) immer wieder mit in die weiteren Flankenbildungen einbezogen wird. PS: Und somit am Ende nur entweder die FP M103.5 oder #D_schr_End als ODER-Eingänge für den bedingten Sprung überbleiben.
Aber so umfangreiche Verknüpfungen mach' ich persönlich lieber in KOP (da blick' ich schneller durch), vlt. hab' ich deshalb auch einen Denkfehler.


Fragen:
Wenn Du die ersten 3 Flanken als separate Verknüpfung auf eine temporäre Variable ausführst, warum machst Du das mit den Vergleichen nicht auch und bildest erst zum Schluß die Verknüpfung für den Sprung? Dann wird's doch auch übersichtlicher, oder?

Und warum benutzt du nicht einen FB und machst die Flankenbildung mit statischen Variablen. Dann kann man z.B. auch die Temps zu den Statics umlegen und einfacher prüfen, an welcher genau es jetzt liegt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe einen alten Thread gefunden in dem das Verhalten von Lokalvariablen schon mal besprochen wurde

http://www.sps-forum.de/simatic/32113-temporaere-lokalvariablen-2.html

und einen Post

Hans Berger schreibt in seinem AWL-SCL-Buch zum Thema "Temporäre Lokaldaten" auf S. 258:
".....Temporäre Lokaldaten sind Operanden, die im Lokaldaten-Stack (L-Stack) im Systemspeicher der CPU liegen. Das Betriebssystem der Zentralbaugruppe stellt die temporären Lokaldaten für jeden Codebaustein bei dessen Aufruf zur Verfügung. Die Werte im L-Stack sind beim Aufruf eines Bausteins quasi zufällig."

In der STEP7-Hilfe ist unter dem Stichwort "temporäre Lokaldaten" zu lesen:
"...Beim Erstellen von Organisationsbausteinen können Sie temporäre Variablen (TEMP) deklarieren, die nur während der Bearbeitung des Bausteins zur Verfügung stehen und dann wieder überschrieben werden. Vor dem ersten Zugriff müssen die Lokaldaten initialisiert werden. Außerdem benötigt jeder Organisationsbaustein für seine Startinformation 20 Lokaldaten-Byte.
Die CPU besitzt einen begrenzten Speicher für die temporären Variablen (Lokaldaten) gerade bearbeiteter Bausteine. Die Größe dieses Speicherbereichs, des Lokaldaten-Stacks, ist CPU-abhängig. Der Lokaldaten-Stack wird zu gleichen Teilen unter den Prioritätsklassen aufgeteilt (Voreinstellung). Das bedeutet, jede Prioritätsklasse verfügt über einen eigenen Lokaldatenbereich. Damit ist gewährleistet, dass auch hochpriore Prioritätsklassen und ihre zugeordneten OBs Platz für ihre Lokaldaten zur Verfügung haben."

Wenn das Speicherverhalten von irgendwelchen mehr oder weniger zufälligen Konstellationen abhängt, dann sollte man so wohl besser nicht programmieren.
 
Zuletzt bearbeitet:
Wirklich? Auf meiner CPU 315-2 DP/PN funzt es nicht.

Anhang anzeigen 21435
Und? Geht doch!
Das VKE der FP geht nach einem Zyklus wieder auf 0, weil der Inhalt STA jetzt auch 1 ist.
Hättest vlt. danach mit #m1 noch einen separaten Setzen-Befehl ausführen sollen, denn wer kann schon das Einschalten für einen Zyklus mit dem bloßen Auge erkennen.
;)
 
Haste recht. Mit der Zuweisung gehts nicht, aber habe es als Setzen geändert und es funktioniert immer noch nicht.
Möglich das ich um diese Uhrzeit auch nicht mehr Denkfähig bin.
 
Haste recht. Mit der Zuweisung gehts nicht, aber habe es als Setzen geändert und es funktioniert immer noch nicht.
Teste mal so:
Code:
[FONT=Courier New]      U     M    400.0
      FP    M    400.1
      =     #m1

      U     M    400.3   // damit M400.2 nicht direkt das Ergebnis der Flanke bekommt
      =     M    400.4

      U     #m1
      S     M    400.2
[/FONT]
Und temporäre Variablen immer Zuweisen nicht Setzen/Rücksetzen, sonst können sie undefiniert sein!

Aber fragt dazu nicht 00Alex!
:ROFLMAO:
 
sorry...ich wollte dir nicht zu nahe treten. ;)

Hi Kapo,

alles kein Problem. Du tritts mir damit nicht zu nahe.... Du weißt ja auch nicht welches wissen ich habe... ;-)

Wenn du für deinen Flankenmerker eine Lokalvariable benutzt, funktionierts.

Habe es selber mal bei einer Schrittkette so programmiert gehabt und dadurch hat die Anlage ihren eigenen Kopf entwickelt. Seit dem bin ich mit Lokalvariablen vorsichtiger. :D

Code:
//geht nicht
      U     M    400.0
      FP    M    400.1
      =     #m1

//funktioniert
      U     M    400.0
      =     #m1

      U     #m1
      FP    #m2
       =     #m3

mfg
Kapo

Also ich hatte in dem gleichem Projekt, so ziemlich am Anfang, schon mal bei einer FP mit TempVar gearbeitet... Allerdings ging es dort gar nicht.... Deshalb benutze ich bei Flanken nur noch statische...
Mein Gedanke war es halt, das ich Merker einspare.... zwar habe ich genug... aber das war halt mein Grundgedanke...

Gruß
Andreas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich hatte in dem gleichem Projekt, so ziemlich am Anfang, schon mal bei einer FP mit TempVar gearbeitet... Allerdings ging es dort gar nicht.... Deshalb benutze ich bei Flanken nur noch statische...
Der Flankenmerker am FP/FN muss statisch, das Verknüpfungsergebnis kann bei Zuweisung temporär sein.


Mein Gedanke war es halt, das ich Merker einspare.... zwar habe ich genug... aber das war halt mein Grundgedanke...
Ein Grund mehr für das:
Und warum benutzt du nicht einen FB und machst die Flankenbildung mit statischen Variablen. Dann kann man z.B. auch die Temps zu den Statics umlegen und einfacher prüfen, an welcher genau es jetzt liegt.
 
Hallo hucki,


Ich würde mal vermuten, dass hier ein paar Klammern fehlen und dadurch der #D_schr_Anf (bzw. alles vor den Flankenbildungen) immer wieder mit in die weiteren Flankenbildungen einbezogen wird. PS: Und somit am Ende nur entweder die FP M103.5 oder #D_schr_End als ODER-Eingänge für den bedingten Sprung überbleiben.
Aber so umfangreiche Verknüpfungen mach' ich persönlich lieber in KOP (da blick' ich schneller durch), vlt. hab' ich deshalb auch einen Denkfehler.

Naja, mein Gedanke war halt, ich mache diese Verknüpfung mit einem ODER.... habe deinen Gedanke nicht unbedingt bedacht.... Werde ich gleich mal ausprobieren...bzw. morgen auf der Arbeit...

Fragen:
Wenn Du die ersten 3 Flanken als separate Verknüpfung auf eine temporäre Variable ausführst, warum machst Du das mit den Vergleichen nicht auch und bildest erst zum Schluß die Verknüpfung für den Sprung? Dann wird's doch auch übersichtlicher, oder?

Darüber habe ich überhaupt keinen Gedanke verschwendet.... mhhhh.... Du hast aber vollkommen recht... wird auf jeden Fall übersichtlicher...

Und warum benutzt du nicht einen FB und machst die Flankenbildung mit statischen Variablen. Dann kann man z.B. auch die Temps zu den Statics umlegen und einfacher prüfen, an welcher genau es jetzt liegt.

Stimmt.... vielleicht mache ich das morgen früh schnell mal....
Aber danke schon mal von Dir...
 
Wenn ich das richtig überblickt habe, hat sich Kapitaen31 daran gehalten:
Erst zugewiesen, dann gelesen.

Wenn ich auch das richtig verstanden habe, hat er das Setzen erst heute mit den DBX eingetragen.


Hallo hucki,

jein.... ich hatte gestern schon den Gedanke und auch schon geändert, aber hatte es dann auf der Arbeit nicht mehr ausprobiert, weil ich Schluß gemacht hatte..... die ganzen nullen und einsen konnte ich nicht mehr sehen.... ;-)
Heute morgen hatte ich es ausprobiert.... und damit läuft es..... aber eigentlich wollte ich es nicht so machen.... aber es bleibt mir erst mal nichts anderes übrig....

Und ich habe auch immer darauf geachtet, das ich erst setze und dann lese...... das habe ich einmal bisher bei Temp falsch gemacht... und mir einen Wolf gesucht.... grrr..... seit dem bin ich diese Erfahrung auch reicher..... ;-)
 
Zurück
Oben