Lokierte Variablen über Umweg remanent machen?

ASDF0815

Level-2
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich arbeite mich zurzeit ein wenig in die Beckhoff-Programmierung ein und stehe nun vor folgendem Problem:

Ich will Zählerstände von Stromzählern über digitale Eingangsklemmen auf einen BC3150 "zwischenspeichern" und diese Werte dann über Profibus auf eine Siemens CPU schicken.

Das ich diese Werte in das DP-Slave Modul (BC3150) bekomme, müssen ja die Variablen dazu lokiert sein, also Adressen wie z.B.

zaehlwert AT%Q*: array[1..64] OF DINT

deklariert werden, das sie im System-Manager von Twincat sichtbar werden und ich diese dann mit den Modulen des DP-Slaves verknüpfen kann.

Ich wollte sie als VAR_GLOBAL RETAIN PERSISTENT deklarieren, was ja mit dem lokieren nicht mehr geht (beim Übersetzen Größe der verbrauchten Retain-Daten: 0 Bytes)

Wie kann ich das nun mit möglichst wenig Aufwand bewerkstelligen?

Gibts dann auch die Möglichkeit, nach Spannungsausfall des BC3150, dass die Werte erhalten bleiben ohne USV?

Vielen Dank schon mal für die Hilfe!
 
Du legst in var global ratain persistent ein Array an, in welches du deine Werte hineinschreibst.
Um sie an den Koppler zu bringen legst du für diesen die Outputvatiablen an und schreibst im Programm deine perstistenten Daten jeden Zyklus (Oder von mir aus auch über einen Trigger) auf die Outputvariablen (z.Bsp. per Schleife).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Ralle,
erstmal vielen Dank für die schnelle Antwort. Ich mach das also folgendermaßen:

Unter den Globalen Variablen steht folgendes:

VAR_GLOBAL RETAIN PERSISTENT
(*Variablen IN*)


Skalierung: ARRAY[1..64] OF DWORD;
Nulldurchgang: ARRAY[1..64]OF DWORD;
Sollwert: ARRAY[1..64]OF DWORD;

(*Variablen OUT*)
Zaehlwert : ARRAY [1..64] OF DINT;

END_VAR

also z.B.

Wie ordne ich dann meine Ausgangsvariablen meinen persistenten Variablen im MAIN-Programm zu? Das Programm über Trigger würde schon laufen, nur komm ich mit der Deklaration der lokalen Variablen ( der Zuordnung zu den persistenten Variablen vom Array) nicht ganz klar, da ich noch Einsteiger bei Beckhoff und der Schreibweise bin.

Vielen Dank schonmal ;)
 
Code:
FOR I := 1 TO 64 DO
   Q_Skalierung[I] := Skalierung[I];
END_FOR

Ich hab im Moment keine Beckhoff im Zugriff, denke aber, man konnte ganze Array auf die Outputklemmen legen, im Notfall die einzelnen Klemmem jeweils mit einem Array-Element verbinden.
Mein Vorschlag ist, das über den Umweg von 2 Array zu machen, einmal das persistente, dann das Output_Array, da ich aus deiner Beschreibung des Problems entnehme, dass du die persistenten Arrayelemente nicht direkt mit der Klemme verbinden kannst.
 
Genau das ist das Problem. Ich hab es nun folgendermaßen gemacht:

Ich habe als VAR_GlOBAL RETAIN PERSISTENT eine Variable Zaehlwert als Array deklariert.

Im Main Programm habe ich nochmal eine Variable für den Zählwert als Ausgangsvariable deklariert, auch als Array.

POGRAM MAIN
VAR
iZaehlwert AT %Q* : ARRAY [1..64] OF DINT;END_VAR

Nun hab ich in meiner Schleife am Ende die beiden Variablen zusammengefügt.

FOR iSchleife := 1 TO 64 BY 1 DO
IF Zaehler[iSchleife] AND NOT bFlanke[iSchleife] THEN (*Wenn Zählerpuls High und kein Flankenmerker*)
bFlanke[iSchleife] := TRUE; (*dann Flankenmerker High setzen und*)
Zaehlwert[iSchleife] := Zaehlwert[iSchleife] + Skalierung[iSchleife]; (*Zählwert um Skalierungswert erhöhen*)
iZaehlwert[iSchleife] := Zaehlwert[iSchleife]; (*Persistente Variable auf Ausgangsvariable schreiben*)
END_IF
(...)

Normalerweise müsste doch beispielsweise nach einem Reset der Zählwert erhalten bleiben? Das tut es aber nicht. Hab ich irgendwas übersehen? Muss ich noch was anderes machen?`
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt nach einem Reset natürlich zuerst wieder die Schleife durchlaufen, um die remenenten Zählwerte auf deine Output-Variable zu schreiben.
 
Gibt auch so eine Speicherklemme, in welcher 128kByte NOVRAM drin sind. Da würdest du dein Array drunter anlegen, mit den Variablen im Prog verknüpfen (die dann nicht mehr Retain/Persistent sein müssen) und die werden dann zyklisch im NOVRAM abgelegt. Beim Neustart werden dann automatisch die Werte aus dem NOVRAM in die SPS zurückgeschrieben.
 
Zurück
Oben