TIA PEEK/POKE Probleme

t.win

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

seit einigen Tagen beschäftige ich mich mit der Umstellung von Step7 Projekten in Richtung TIA Portal( was bis heute auch recht gut funktioniert hat ).


Leider machen mir folgende Zeilen etwas Probleme und bleiben ohne Funktion:

Code:
    #Schritte_STA    := #OFFSET + 18;
    #Absolutwert_STA := #OFFSET + 22;
.
.
.

  IF    .... THEN

POKE(area:=16#84,dbNumber:=2,byteOffset:=Absolutwert_STA ,value:=PEEK_DWORD(area:=16#84,dbNumb    er:=2,byteOffset:=Absolutwert_STA )-PEEK_DWORD(area:=16#84,dbNumber:=2,byteOffset:=#Schritte_STA));

in diesem Fall wird der erwartete Wert (Absolutwert_STA-#Schritte_STA) nicht in den Datenbaustein geschrieben!



auch der Versuch mit einer temp Var. hat nicht zum Erfolg geführt

Code:
IF .... THEN

// "Tag_40":=PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA); //1.Lesetest  Wert=0 

#absolut_tmp:=PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA)-(PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Schritte_STA));
POKE(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA,value:=#absolut_tmp);

  //"Tag_40":=PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA);//2. Lesetest Wert=#Absolutwert_STA

Meine Beobachtung ist, dass ich den Wert #Absolutwert_STA nach der POKE Anweisung aus dem Datenbaustein auslesen kann...vorher nicht. Die Lesetests habe ich nacheinander ausgeführt.


Gibt es evtl. Erfahrungen??



Gruß und danke im Vorraus
 
Zuletzt bearbeitet:
Meine Beobachtung ist, dass ich den Wert XY nach der POKE Anweisung XY auslesen kann...vorher nicht.
:confused:
Kannst Du das genauer erklären?
XY mußt Du doch vorgeben und nicht aus PEEK oder POKE auslesen.
Wie ist XY bei Dir deklariert und wie initialisiert bzw. zugewiesen?

Tip: Programmcode bitte in CODE-Tags einschließen - der #-Button im Beitragseditor.

Harald
 
Mußt Du Deinen Code unbedingt in eine kilometerlange Zeile quetschen? Da ist für mich total unübersichtlich. Wenn Du keine Zwischenvariablen benutzen willst dann mache für mehr Übersicht wenigstens Zeilenumbrüche rein.
Ich zerlege mal Deinen Code und speichere in Zwischenvariablen:
Code:
#absolutw_tmp := PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA);
#schritte_tmp := PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Schritte_STA);
#absolutw_tmp: = #absolutw_tmp - #schritte_temp;
POKE(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA,value:=#absolutw_tmp);
Entspricht dieser Code dem was Du tun willst?
Also einen Absolutwert lesen, davon einen Schrittewert abziehen und auf den selben Absolutwert wieder speichern?
Und das funktioniert nicht???

Kann es sein, daß da nur ein scheinbares Problem beim Beobachten besteht, weil bei jedem Aufruf der Wert an der Adresse DB2.DBD[#Absolutwert_STA] verringert wird?
Oder wie kommt dieser Schrittewert her?

PS:
Weil ich dieses TIA fast gar nicht kenne, woher "weiß" das POKE eigentlich, daß es ein DWORD schreiben soll?

Harald
 
Hallo PN/PD,

du hast es absolut richtig verstanden. Mit diesen Zeilen bestimme ich die Position von mehreren Schrittmotoren. Einen Absolutwert lesen, davon eine Schrittwert subtrahieren und dann wieder in den selben Absolutwert speichern.
Die Schrittwerte werden vom User vorgegeben und ausgelesen.

PS:
Weil ich dieses TIA fast gar nicht kenne, woher "weiß" das POKE eigentlich, daß es ein DWORD schreiben soll?

Sehr gute Frage :ROFLMAO: Wahrscheinlich richtet sich die größe der POKE Anweisung nach dem vorgegebenen value.


Nein, leider funktioniert es nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann den Code leider nicht testen, meine aber, der müßte funktionieren.
Vielleicht kann jemand anders mal testen.
Auf welcher CPU soll der Code denn laufen bzw. auf welcher CPU läuft er nicht wie von Dir erwartet?

Ich kann irgendwie nicht glauben, daß ein POKE erst beim zweiten Versuch funktioniert oder ein PEEK erst nach vorherigem POKE. Ich denke eher, Du machst einen Fehler beim Beobachten oder bei der Adressberechnung (falsche Werte in #OFFSET oder #Absolutwert_STA oder #Schritte_STA). Vielleicht schreibt auch ein anderer Programmteil in falsche Adressen statt die gewollten? schreibt z.B. den Absolutwert in DB2.DBD[#Schritte_STA] statt DB2.DBD[#Absolutwert_STA] - das würde zu Deiner Beobachtung passen, daß beim ersten Lesen DB2.DBD[#Absolutwert_STA] = 0 ist und beim zweiten Lesen ein Absolutwert drin steht.

Hat der Ziel-DB "Standard"-Zugriff oder "optimierten" Zugriff? (bei "optimiertem" Zugriff dürfte aber PEEK/POKE eigentlich gar nicht funktionieren)

Harald
 
Hi

versucht mal das ENO -- ja, ich weiß, das macht ein SCL Programmierer nicht -- abzuholen.

Code:
#absolutw_tmp := PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA,     ENO=>#eno1    );
#schritte_tmp := PEEK_DWORD(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Schritte_STA,       ENO=>#eno2    );
#absolutw_tmp: = #absolutw_tmp - #schritte_temp;
POKE(area:=16#84,dbNumber:=#DABAU_MO,byteOffset:=#Absolutwert_STA,value:=#absolutw_tmp,     ENO=>#eno3    );

Leider ist das der einzige Kanal an dem PEEK und POKE sich über nicht existierende oder zu kurze DB beschweren können.

Kann es sein, daß da nur ein scheinbares Problem beim Beobachten besteht, weil bei jedem Aufruf der Wert an der Adresse DB2.DBD[#Absolutwert_STA] verringert wird?
Gute Frage? Kannst du das mal "festnageln"?

Weil ich dieses TIA fast gar nicht kenne, woher "weiß" das POKE eigentlich, daß es ein DWORD schreiben soll?

vom Typen des value.

'n schön' Tach auch
HB
 
Zurück
Oben