TIA DB_Any oder Peek/Poke - Vorteile/Nachteile

Mephisto

Level-1
Beiträge
242
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Bin gerade dabei, auf einen absolut adressierten (weil erst im Programm generierten) über einen SCL-FB zuzugreifen.
Nun meine Frage: Wie löse ich das eleganter?
DB_Any, z.B.:
DB_Num[1] ist die DB-Nummer
Code:
UINT_TO_DB_ANY(#DB_Num[1]).DBW0 := UINT_TO_DB_ANY(#DB_Num[1]).DBW0+1;
Peek/Poke, z.B.:
DB_Num[2] ist die DB-Nummer, Tick ist eine Variable, die inkrementiert wird.
Code:
POKE(area:=16#84,
     dbNumber:=#DB_Num[2],
     byteOffset:=4,
     value:=#Tick);
Gibt es Vor- oder Nachteile bei der Performance? (Mir geht's vor allem um Geschwindigkeit, ich muss aber absolut adressiert bleiben)
Kann ich mit Peek/Poke auch symbolisch arbeiten?

Wie ist eure Meinung zu dem Thema?
 
Moin!
Code:
UINT_TO_DB_ANY(#DB_Num[1]).DBW0 := UINT_TO_DB_ANY(#DB_Num[1]).[COLOR=#ff0000]DBW0+1[/COLOR];
Das geht doch so eh nicht?!
Den Index beim %DBW kann man meines Wissens nach nicht variabel gestallten.

Gibt es Vor- oder Nachteile bei der Performance? (Mir geht's vor allem um Geschwindigkeit, ich muss aber absolut adressiert bleiben)
Kann ich mit Peek/Poke auch symbolisch arbeiten?

Wie ist eure Meinung zu dem Thema?

Die Performance kannst du für deinen Fall selbst ausmessen -> RUNTIME-Baustein von Siemens.
Und was genau meinst du mit "symbolisch" arbeiten bei Peek und Poke. Die sind ja genau dafür da nicht symbolisch zu arbeiten (lesen/schreiben von Speicherbereichen) ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Code:
UINT_TO_DB_ANY(#DB_Num[1]).DBW0 := UINT_TO_DB_ANY(#DB_Num[1]).[COLOR=#ff0000]DBW0+1[/COLOR];
ist vielleicht missverständlich geschrieben
Code:
[COLOR=#006400]UINT_TO_DB_ANY(#DB_Num[1]).DBW0[/COLOR] := [COLOR=#006400]UINT_TO_DB_ANY(#DB_Num[1]).DBW0[/COLOR] [COLOR=#ff0000][/COLOR]+[COLOR=#ff0000] 1[/COLOR];

Bez. Peek/Poke wollte ich fragen, was das alles kann.

Jedenfalls habe ich mittlerweile festgestellt, dass ich zwar mit DB_Any meinen DB indirekt adressieren kann, nicht aber die DB-Variable mit z.B.:
Code:
DB5.DW(i):=3;
Somit muss ich wohl Poke verwenden. Oder gibt es hier noch andere, elegante und schnelle Lösungen?
 
Jedenfalls habe ich mittlerweile festgestellt, dass ich zwar mit DB_Any meinen DB indirekt adressieren kann, nicht aber die DB-Variable mit z.B.:
Code:
DB5.DW(i):=3;
Somit muss ich wohl Poke verwenden. Oder gibt es hier noch andere, elegante und schnelle Lösungen?
das habe ich ja in #2 gesagt :cool:
ich würde es (wenn es symbolisch leider nicht geht) mit Poke machen:
Code:
POKE(area:=16#84,
     dbNumber:=#DB_Num[2],
     byteOffset:=4,
     value:=#Tick,
     [COLOR=#008000]ENO => ENO[/COLOR]);
IF NOT ENO THEN
// Baustein beenden - kein DB gefunden oder auf falscher Adresse unterwegs
END_IF;
Mit der ENO-Prüfung siehst du bei Online erzeugten DBs nämlich auch gleich, ob dieser wirklich da ist.
 
Ich würde ebenfalls zu Peek/Poke tendieren. Dafür das es sich um absolute Adressierung handelt, ist es dann eben doch besser les und nachvollziehbar als wenn man sich alles mit Pointern zusammenbastelt.
Aber was jetzt im Zyklus effizienter ist, hab ich auch noch nicht ausprobiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Frage ist eigentlich nicht "Welche Variante ist eleganter oder performanter?" sondern "Welche Variante muß ich bei meiner CPU nehmen?"
Bei S7-300 und S7-400 muß Du die erste Variante verwenden.
Bei S7-1200 und S7-1500 mußt Du PEEK/POKE verwenden.
Siehe TIA-Hilfe "Operanden indirekt adressieren"


Das geht doch so eh nicht?!
Den Index beim %DBW kann man meines Wissens nach nicht variabel gestallten.
Das geht schon - zuerst aber mal genau hinschauen, was der Code macht: da wird der Inhalt des DBW0 inkrementiert.
Man kann aber auch die Adresse variabel gestalten: %DB1.DW(#adresse)

Harald
 
Moin Harald
Das geht schon - zuerst aber mal genau hinschauen, was der Code macht: da wird der Inhalt des DBW0 inkrementiert.
Man kann aber auch die Adresse variabel gestalten: %DB1.DW(#adresse)
Was da passiert ist mir schon klar. Weil Mephisto aber nach Poke fragte, dachte ich mir schon das es um eine 1500er geht.
Wie das allerdings %DB1.DW(#adresse) in einer 1500er funktionieren soll, ist mir ein Rätsel :confused:
 
Hallo!

Die ENO-Prüfung brauch ich nicht,weil ich die DBs direkt vorher im gleichen SCL-Baustein generiere. Trotzdem Danke für den Tipp.

%DB1.DW(#adresse) funktioniert bei S7-1200/1500 nicht. Deshlab Peek/Poke

Und bei S7-300/400 würde ich kein DB_Any, sondern Block_DB verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie das allerdings [FONT=&]%DB1.DW(#adresse)[/FONT] in einer 1500er funktionieren soll, ist mir ein Rätsel :confused:
Das ist es doch gerade: in S7-1500 geht NUR die PEEK/POKE-Schreibweise, in S7-300/400 geht NUR die [FONT=&]%DB1.DW(#adresse)[/FONT]-Schreibweise. Warum Siemens das absichtlich so inkompatibel eingerichtet hat weiß ich nicht. Es wäre sicher auch "klassisch" ohne das PEEK/POKE gegangen, klingt dann aber nicht so innovativ...

Harald
 
Das ist es doch gerade: in S7-1500 geht NUR die PEEK/POKE-Schreibweise, in S7-300/400 geht NUR die %DB1.DW(#adresse)-Schreibweise. Warum Siemens das absichtlich so inkompatibel eingerichtet hat weiß ich nicht. Es wäre sicher auch "klassisch" ohne das PEEK/POKE gegangen, klingt dann aber nicht so innovativ...
Ah ok, dann haben wir aneinander vorbeigeredet. Ich dachte du kennst noch einen Kniff für %DB1.DW(#adresse) in der 1500er. Dann wäre Peek/Poke allerdings obsolet :D
 
Zurück
Oben