Probleme mit Lokaldatenstack

Sesssko

Level-1
Beiträge
83
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe das Problem gehabt das ein Lokaldatenbit nicht mehr mit dem VKE ausgegeben wie es geschrieben wurde.

Beispiel (im FCxxx):
Code:
O L25.3
O L23.5
= L40.4
= L40.5
= L40.6
.
.
.
.
.
L LW40
T #W_Befehl1
Jetzt konnte ich im Baustein sehen das die Lokalbits 40.4 bis 40.6 auf 1 waren, im LW40 fehlte jedoch L40.5 (war 0), L40.4 und L40.6 waren 1. Das Bit wird später im Programm nicht mehr geschrieben, sonden nur noch im LW40 gelesen (deswegen die vertikalen Punkte im Code).
Abhilfe brachte nur das löschen des gesamten Programms in der CPU (es handelt sich um eine 414-2DP) und anschließendem einspielen des gesamten Programms in die CPU (DB's habe ich drin gelassen).
Hat das schonmal jemand gehabt?
LG, Sascha
 
Zuletzt bearbeitet:
Danke für die Beiträge.
Problem ist das es ein bestehendes Programm ist das schon gut zwei Jahre so läuft und jetzt kam halt dieser Fehler auf. Wie gesagt, das Problem wurde dadurch "behoben" das ich alle Bausteine nach dem löschen nochmal neu aufgespielt habe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe das Problem gehabt das ein Lokaldatenbit nicht mehr mit dem VKE ausgegeben wie es geschrieben wurde.

Beispiel (im FCxxx):
Code:
O L25.3
O L23.5
= L40.4
= L40.5
= L40.6
.
.
.
.
.
L LW40
T #W_Befehl1
Jetzt konnte ich im Baustein sehen das die Lokalbits 40.4 bis 40.6 auf 1 waren, im LW40 fehlte jedoch L40.5 (war 0), L40.4 und L40.6 waren 1. Das Bit wird später im Programm nicht mehr geschrieben, sonden nur noch im LW40 gelesen (deswegen die vertikalen Punkte im Code).
Abhilfe brachte nur das löschen des gesamten Programms in der CPU (es handelt sich um eine 414-2DP) und anschließendem einspielen des gesamten Programms in die CPU (DB's habe ich drin gelassen).
Hat das schonmal jemand gehabt?
LG, Sascha

Ist sichergestellt, daß der Code, der die Lokaldaten schreibt, in jedem Zyklus aufgerufen wird? Ansonsten kann tatsächlich eine beliebige andere Variable, die auf den L-Stack gelegt wird das LW40 beeinflussen. Lokaldaten sind ab dem Moment des Beschreibens nur im Rest des betreffenden Bausteins für genau den Zyklus, in welchem sie geschrieben wurden, gültig! Das Löschen aller Bausteine und Wiedereinspielen, könnte da etwas verschoben haben und nun paßt es zufällig wieder (weil z.Bsp. keine anderes Ergebnis auf dem Stack landet), bis zum nächsten Mal.
 
das erklärt aber noch nicht das Problem sondern beschreibt nur die Grundlagen

Nun ja,

die Temp Variablen liegen auf dem lokal Stack der CPU. Dh. mehrere Bausteine nutzen den gleichen Stack, sodaß dann Zufallsprodukte erzeugt werden können, wie oben beschrieben.
Wenn man so programmiert wie der Kollege, dann kann es gut gehen (häufig ist es so), muss es aber nicht. Das beweist auch die Strategie, das nach CPU neuladen alles wieder i.O. ist. Man erzeugt immer undefinierte Zustände die nicht nachvollziehbar sind.

Gruß
 
Der Baustein wird zyklisch aufgerufen und wird für die Steuerung eines FU eingesetzt. Ich persönlich arbeite dann auch lieber mit den Lokaldaten wenn diese benannt sind. Aber der Anlagenlieferant hat es so programmiert...
 
Ist der Baustein in FUP/KOP programmiert?
Bei Bausteinaufrufen in dieser Darstellung werden Lokaldaten verwendet die dir deine eingenen Daten überschreiben könnten. Wenn ja, den Baustein mal auf AWL umstellen und nachsehen was der FUP/KOP-Umsetzer für Adressen verwendet hat.
(Wenn man symbolisch programmiert gibt der Editor eine Warnung dass die Lokaldaten schon verwendet werden)
 
am Beginn des FC/FB würde ich mal alles löschen,
d.h. auf 0 setzen.
Dann bleibts solange 0 bis wieder einen Aufruf (vermutlich zyklisch) durchführst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nichts dergleichen. Linearer code der stur von oben nach unten abgearbeitet wird. Ich guck das ich morgen mal den gesamten Baustein hier poste...
Vielen Dank euch allen und bis dann.
Der Sascha
 
So, wie versprochen hier der Code:

Code:
      L     #BEFEHL_ENTSPERREN
      T     LB    33
      L     #W_STATUS_1                 
      T     LW    50

      O     L     33.1                  
      O     L     33.2                  
      O     L     33.7                  
      =     L     41.0                  
      =     L     40.6                  

      U     #NOT_AUS
      U     #STOERUNG1
      U     #STOERUNG2
      U     #STOERUNG3
      U     #STOERUNG4
      =     L     40.7                  

      U     #HILFS_EIN
      =     L     40.2                  

      O     L     33.1
      O     L     33.2
      O     L     33.7
      O     L     50.4
      =     L     41.1                  

      O     L     33.1
      O     L     33.2
      O(    
      U     L     23.4
      U     L     51.2
      )     
      =     L     23.4                  

      O     L     23.4                      //VKE=1
      O     L     33.7
      =     L     41.4                      //VKE=1                
      =     L     41.5                      //VKE=1                  
      =     L     41.6                      //VKE=1                  

      U     #HILFS_EIN
      =     L     41.2                  

      U     #LEISTUNGSKONTAKT           
      U     L     50.4                  
      =     L     41.3

      O     L     33.1
      O     L     33.7
      =     L     40.3                  

      O     L     33.7
      O(    
      U     L     32.3                  
      UN    L     32.5                  
      )     
      O     L     33.2
      =     L     40.4                  

      U     L     40.7
      U     #GITTERTOR                  
      U     #STOERUNGREGELER             
      =     #START                      
      =     #ENTSPERREN                 

      U     #RESET
      =     L     41.7                  

      L     LW    40
      T     #W_BEFEHL_1

Gesteuert wird damit ein Masterdrive VC, die Befehle werden von außen über #W_BEFEHL_1 an den FU weitergeleitet. Ich habe mal Kommentare dran geschrieben wie der Zustand des VKE zum Fehlerzeitpunkt an der betreffenden stelle war. Im LW40 war das Bit 41.5 jedoch 0.
Wieso ??? :confused:
 
Hi,

hier gehts schon los

O L 33.1
O L 33.2
O(
U L 23.4
U L 51.2
)
= L 23.4

L23.4 ist eine lokale Temp Variable. Wenn du = L23.4 schreibst dann kannst du nicht im nächsten Zyklus U L23.4 auf "1" abfragen. L23.4 hat kein Gedächtnis ist nicht mit einem Merker zu vergleichen.
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann man die L-Stack deklaration sehen? Vielleicht wird etwas Symbolisch und absolut verwendet.

Hi,

ich glaube es ist müssig hier Ratschläge zu geben, denn so wie es programmiert ist, ist es Käse.
Die Gründe hierfür wurden ja schon hier und anderswo hinreichend diskutiert. Es ist eben so wie es ist, dann muss man jetzt nicht gross nachforschen, einfach die Ratschläge annehmen un Programm ändern, dann wirds schon funzen. Meine Meinung
Gruß
 
In-Variablen:
NOT_AUS
STOERUNG1
STOERUNG2
STOERUNG3
STOERUNG4
HILFS_EIN
LEISTUNGSKONTAKT
STOERUNGREGLER
RESET
W_STATUS_1 //Word
BEFEHL_ENTSPERREN //Byte
GITTERTOR


Out-Variablen:
START
ENTSPERREN
W_BEFEHL_1 //Word


Keine In_Out oder Temp Variablen vorhanden. Der Baustein ist ein FC.

Es ist ja so das der Baustein schon seit rund zwei Jahren so funktioniert hat.
 
Hi,

ich glaube es ist müssig hier Ratschläge zu geben, denn so wie es programmiert ist, ist es Käse.
Die Gründe hierfür wurden ja schon hier und anderswo hinreichend diskutiert. Es ist eben so wie es ist, dann muss man jetzt nicht gross nachforschen, einfach die Ratschläge annehmen un Programm ändern, dann wirds schon funzen. Meine Meinung
Gruß

Denke ich werde mich wohl mal dran machen müssen den Baustein komplett neu zu erstellen und das aus Italy gelieferte Ding über Bord werfen...
 
Zurück
Oben