Statische Variablen funktionieren nicht mehr nach LOOP

trinkiwinki

Level-1
Beiträge
40
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

irgendwas machen wir falsch bei unserem LOOP:

CPU 414-3 PN/DP
Step 7 V5.5

Anbei der Code:

//Analogwerte von PST lesen und in DB40 schreiben
L #Analog_Input_Adress
SLD 3
T #Offset_adress_AI
L #Start_Adress_DB40
SLD 3
T #Offset_adress_DB40
LAR1 #Offset_adress_AI
LAR2 #Offset_adress_DB40
L 9
lop1: T MW 600
L PEW [AR1,P#0.0]
ITD
DTR
AUF DB 40
T DBD [AR2,P#0.0]
+AR1 P#2.0
+AR2 P#4.0
L MW 600
LOOP lop1


Wenn wir nun nach diesem Netzwerk eine Statische Variable beschreiben, und vor dem Netzwerk wieder verwenden, ist diese "False".

Was mache ich falsch bei der Sache? Hat jemand eine Idee?

Gruß

Marco
 
ist es dir möglich die gesamte quelle des bausteins (in code-tags!) zu posten? nur so kann man adressüberschneidungen erkennen...

ich nehme an, der baustein ist a) ein nicht multiinstanzfähiger FB und wird b) nur einmal aufgerufen?
 
Hi...

Wenn Ihr eine statische Variable beschreibt handelt es sich wohl um einen FB
Sicherlich ist er Multiinstanzfähig. Also MUSS AR2 gesichert und nach der Verwendung wieder hergestellt werden! Sonnst sind alle weiteren Instanzzugriffe falsch!
Gruss
Norbert
 
Hi...

Wenn Ihr eine statische Variable beschreibt handelt es sich wohl um einen FB
Sicherlich ist er Multiinstanzfähig. Also MUSS AR2 gesichert und nach der Verwendung wieder hergestellt werden! Sonnst sind alle weiteren Instanzzugriffe falsch!
Gruss
Norbert


Hallo Norbert,

der FB ist multiinstanzfähig. Hat das was mit dem TAR Befehl zu tun?

Gruß
 
So funktionierts. Danke an alle....... echt ein klasse Forum......




TAR1
TAR2
LAR1 #Offset_adress_AI
LAR2 #Offset_adress_DB40
L 9 //Schleifenzähler 9 Durchgänge
lop1: T MW 600
L PEW [AR1,P#0.0] //Inhalt des adressierten Datenwortes lesen
ITD
DTR
AUF DB 40
T DBD [AR2,P#0.0] //Inhalt des Akkus in adressiertes Datenwort
+AR1 P#2.0 //Pointer auf Datenwort x + 12 Worte setzen
+AR2 P#4.0
L MW 600 //Schleifenzähler in Akku laden
LOOP lop1
LAR1
LAR2
 
nee. sicher net.

Das mit dem Beschreiben der ARs hinter dem Loop ist eigentlich genial, solange der Baustein nicht als Multiinstanz verwendet wird.

Da bin ich in 15 Jahren nicht drauf gekommen...

hab grad keine hilfe zur hand... was schreibt LAR2 wenn es leer ist? doch den inhalt von akku1 und der ist nach verlassen der schleife NULL ... ist das der trick? kann man ja dann das TAR2 weg lassen...
 
nee. sicher net.

Das mit dem Beschreiben der ARs hinter dem Loop ist eigentlich genial, solange der Baustein nicht als Multiinstanz verwendet wird.

Da bin ich in 15 Jahren nicht drauf gekommen...

An das habe ich natürlich nicht gedacht. Der Baustein soll in einem FB 15 mal aufgerufen werden und dann als Multiinstanz......

Das würde dann eben bestimmt nicht mehr funktionieren.....oder? Wenn ich für jeden einen DB nehme, dann schon..... Richtig?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne Variablen hinter TAR2 und LAR2 kanns nicht funktionieren

Im AR2 und DI Register werden bei einem FB-Aufruf die Adressen der STAT-Register abgelegt, daher musst du diese vorher sichern.

TAR2 #temp_AR2
LAR1 #Offset_adress_AI
LAR2 #Offset_adress_DB40
L 9 //Schleifenzähler 9 Durchgänge
lop1: T MW 600
L PEW [AR1,P#0.0] //Inhalt des adressierten Datenwortes lesen
ITD
DTR
AUF DB 40
T DBD [AR2,P#0.0] //Inhalt des Akkus in adressiertes Datenwort
+AR1 P#2.0 //Pointer auf Datenwort x + 12 Worte setzen
+AR2 P#4.0
L MW 600 //Schleifenzähler in Akku laden
LOOP lop1
LAR2 #temp_AR2

ich habs nicht getestet, müsste aber so klappen.
 
Was ich auch nicht verstehe, wieso du den Schleifen Index als MW ausführst und nicht als TEMP Variable??
Aber es ist auch noch früh am Morgen, vielleicht versteh ichs einfach nicht....
 
An das habe ich natürlich nicht gedacht. Der Baustein soll in einem FB 15 mal aufgerufen werden und dann als Multiinstanz......

Das würde dann eben bestimmt nicht mehr funktionieren.....oder? Wenn ich für jeden einen DB nehme, dann schon..... Richtig?

Gruß

richtig.

Als Multiinstanz sollte die Variante von Züttu funktionieren.

Die Variable #temp_AR2 ist dabei eine Interne Variable vom Typ DWORD...

edit: Das MW hat da natürlich nix zu suchen, auch wenns funktionieren wird.
Da sollte imho eine Temp Variable vom Typ INT genommen werden.

@4L
Ich würde das nicht so machen, wäre aber auch niemals auf die Idee gekommen es so zu machen.

Micha
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
zur multiinstanzfähigkeit muß noch gesagt werden, dass das AR1 um das AR2 zum bausteinstart erhöht werden muß (hier kommt dann auch der punkt, wo die einfache LAR2 lösung in MI nicht funktioniert...)

ansonsten: ja, das MW600 bewegte mich im wesentlichen zu meiner aussage, dass dir hier keiner einen sauberen stil bei zu bringen vermag...
 
...... wer lesen kann ist klar im VOrteil....

TAR2 #temp_AR2
ist diese TEMP oder STAT? Ich gehe von STAT aus....

Gruß
 
Zuletzt bearbeitet:
Zurück
Oben