Pointer zählt nicht weiter

Sickone4

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

ich verzweifel an einem Pointer....

ich möchte:

alle X-Minuten ein netzwerk ausführen, den aktuellen Messwert in einen DB schreiben, den Pointer 4 Bytes weiter zählen und wenn die nächste Zeit rum ist erneut in den DB usw...

mein script sieht wie folgt aus:

es gibt ein paar hilfstrigger, damit ich das script unabhängig von meinem hauptprogramm testen kann:

NW1 enthält den Timer, welcher korrekt triggert

NW2: Pointer
U #Trigger_Auswertung.Q // Ausgang vom Timer
SPBN M001
AUF "Auswertung_CO2_Kurven" // DB 302 enthält die Analysedaten
U E 2.6 // Hilfstrigger um die Messung zu resetten, wird später durch einen Programmtrigger ersetzt
SPBN M002
L P#0.0
T #Pointer1 // Temp DWORD
L 1.000000e+000 // gefakter Messwert beim ersten Durchlauf
T #Messwert

M002: NOP 0
L #Messwert
T DBD [#Pointer1]
L #Messwert // Messwert erhöhen um im DB unterschiede zu sehen,
L 1.000000e+000 // diese und die nächste zeile fallen später weg
+R
T #Messwert

L #Pointer1 // Pointer um 4 Byte erhöhen
L P#4.0
+D
T #Pointer1

M001: NOP 0 // NW-Ende


vielleicht könnt ihr mir ja helfen

vielen dank

sven
 
Hallo,
da ich das nicht ersehen kann : welchen Typ's ist #Pointer und wo ist der deklariert ? #Pointer sollte ein DWORD sein und entweder im STAT-Bereich eines FB deklariert sein oder ein MD sein oder aus einem DB kommen.
Was hast du ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der ist im moment temp dword. als ich den in stat gezogen habe wurde die zeile: T DBD [#Pointer1] rot und da stand dass pointer nicht im stst bereich eines fb´s sein dürfen
 
Hallo

Ich denke dass dein Problem bei dem Pointer darin liegt dass du ein TEMP DWORD verwendest.
Das TEMP DWORD verliert das Gedächtnis.
Du musst ein MD oder ein DD verwenden für den Pointer.

Gruß
Bernhard
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieh dir mal unsere FAQ an, da gibt es einen sehr guten Beitrag zum Thema Pointer.
Du solltest deinen Pointer in das Adressregister 1 laden (LAR1) und dann mit

L DBD[AR1, P#0.0]

arbeiten.

Also etwa so:

Code:
AUF "Auswertung_CO2_Kurven"
L #Pointer1
LAR 1
L #Messwert
T DBD[AR1, P#0.0]

PS. Pointer1 natürlich ein STAT DWORD
 
Oder, nicht so schön wie bei Ralle:

BEGINN FB:
L PointerH1 //STAT_DWORD
T Pointer1 //TEMP_DWORD

Bearbeitung
..
..
..

ENDE FB
L Pointer1 //TEMP_DWORD
T PointerH1 //STAT_DWORD
 
nun habe ich den pointer als DWORD als STAT Variable deklariert und es wird nicht rot. ok soweit.
der pointer steht bei: 2.870e-42 und die p#4.0 ergeben 4.484e-44 die addition ergibt 2.915e-42

kann mir das wer erklären?

ps: der pointer steht dort er zählt nicht weiter hoch. mache ich ein MD 400 draus klappts wunderbar... woran könnte das liegen? die stat var ist definitiv als DWORD deklariert
 
ou das lag daran dass ich das so eingestellt hatte -.-

naja mich wundert arg, dass ich KEINE StatVar nutzen kann für den Pointer, nur ein MD, mit MD funktioniert es
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt dir den Pointer auch als DWord ansehen.
Dividierst du den Pointer durch 8 hast du die Adresse im DB und kannst nachsehen, da der Pointer Bits adressiert und die 3 letzten Stellen die Bits sind.
Ist dein DB groß genug? ist der Pointer richtig initialisiert/zu groß?
 
Hallo Leute ich nochmal,

irgendwie will mein pointer nicht so wie ich will....

ich hab das mal auf ein bild gemacht:

vll noch ein wort, was passiert, bzw wie es aufgebaut ist:

mein FB121 ist ein multi fb um messwerte in einen db zu schreiben. dieser wird im fb 11 aufgerufen mit den gezeigten eingangsparametern.
dann soll der messwert zunächst in dbd0 und dann in das dbd [pointer] geschrieben werden.

aus irgendeinem grund steht im ar1 19.0 drin, auch nachdem die flanke für das reset/erstaufruf kam und in NW4 wird dann hochgezählt um 4 aber nicht weiter... er bleibt bei dem wert konstant stehen.
im beispiel wird eine 4 als startadresse angegeben.

ich verstehs nicht.


in nw 2 wird der TON resettet falls ein abbruch kommt und in nw3 ist der TON Timer aufruf, welcher NW 4 alle x sekunden freigibt.

pointer problem.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Bist du sicher, das die Trigger-Zeit kommt? Schalte an den Ausgang des Timers mal eine Stat-Bool und nimm diese im NW4 statt Timerausgang Q.
2. Du mußt das AR1 in jedem Zyklus neu mit der richtigen Adresse beschreiben, da auch andere Bausteine das AR1 nutzen könnten.
Also schreibe den Pointer bei der Startflanke (Initialisierung) in eine Stat-Variable vom Typ DWORD.

L #_DB_StartADR
SLD3
T #Stat_Variable

Lade vor der Nutzung des AR1 innerhalb der Schleife immer die Stat-Variable ins AR1.

SCHL: T #Schleifenzaehler

L #Stat_Variable
LAR 1
L #Prozesswert
...

Dann solltest du natürlich auch nicht das AR1 hochzählen, sondern die Stat-Variable.

L #Stat_Variable
L P#4.0
+D
T #Stat_Variable

3. Wozu nutzt du eine Schleife, wenn du den Schleifenzähler auf 1 setzt?
 
Zuletzt bearbeitet:
Zurück
Oben