Step 7 Vorgegebene Werte fest in SPS speichern und abfragen

tocama

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

ich hab folgendes Problem wo ich nach gut 1 1/2 Wochen immer noch nicht weiter bin:

Ich möchte gerne 25 verschiedene Werte fest in der SPS einspeichern. Diese Werte stellen einzelne Stromvebracuhe in kwh ohne Nachkommastelle dar (also zB 790000 kW/h). Diese Werte sollen bei Bedarf abgerufen werden können, um dann in eine Addition eingebaut zu werden.

Wie und wo schreibe ich die Werte rein, das diese Fest hinterlegt sind?
Wie rufe ich diese Werte dann wieder ab? (Abruf soll so erfolgen: Merker 1 ist aktiv, gebe Wert 1 aus (wobei der Wert natürlich wieder 0 sein soll wenn Merker 1 nicht mehr aktiv ist)

Die aktiven Merker bzw die ausgegebenen Werte möchte ich am Ende addieren, sodass ich ein Ergebnis erhalte, das Live immer alle aktiven Werte addiert hat.

Ich hoffe ich konnte ein wenig erklären worum es mir geht. Auf die Standardangaben habe ich verzichtet, da zu diesem Punkt absolutes unwissen herrscht und somit kein Programm für diesen Teil vorhanden ist. Weiterhin denke ich mal das CPU und Prog.Ver. nicht weiter benötigt werden.

Eine Hilfe in FUP würde ich liebend gerne bevorzugen, da es die Standardsprache hier inner Firma sit (abgeshen von der Rechnung, die kann ruhig in AWL sein).

Vielen Dank schon einmal für die Hilfe und lasst euch den Kaffee am morgen schmecken :)
So long
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Werte in Datenbausteinen ablegen und dann mit dem MOVE abrufen, wobei Du den entsprechenden Merker an den EN hängst.
Dann noch ein MOVE, mit einem großen UND davor, wo Du alle Merker auf NICHT abfragst und damit 0 in Deinen Wert schreibst.
 
Wobei Du dann 25 (bzw. 26) mal den Move Befehl anwenden musst :ROFLMAO:
Auf jeden Fall geht das in FUP... in AWL oder SCL natürlich komfortabler....
Gruss
MDO
 
Danke schonmal für die Antworten.

Ja zugegeben, in AWL wäre es wahrscheinlicher einfacher. Gibts nen Lösungsvorschlag darin?

Ich hab jetzt nach der (ausgedehnten) Frühstückpause mal den Datenbaustein beschrieben, weiß aber nicht obs richtig ist. Die Werte sind erstmal beispielhaft von 1-25 passend zur Position.

Ich hab den DB50 angelegt und die Werte da eingetragen. Mit DB's kenn ich mich allerdings genauso gut aus wie mit dem Ausnehmen von Fischen - garnicht. Der erste Wert aht +0.0 vorne in der Adresse stehen, der zweite Wert +2.0, der dritte +4.0 usw. Was genau muss ich jetzt zum abrufen in FUP (oder meinetwegen AWL) machen? ^^

Ich werd mich in der Zwischenzeit mal ein wenig in Datenbausteine einlesen und arbeiten ums besser zu verstehen.

So long
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei den Einträgen im Datenbaustein musst du darauf achten, dass im Format entweder INT oder Word ausgewählt ist.
INT bzw. Word beschreiben Ganzzahlen also das was du wohl auch willst.

Ansonsten mal Screenshot oder DB hier einstellen....

Sonst hast du auf jeden Fall schon mal recht.... lesen hilft :D
Ich denke hier werden noch ein paar hilfreiche Kommentare kommen, da ist bestimmt ne Lösung in Sicht...
 
Hi,

wenn du die Werte dauerhaft speichern willst, solltest du den Bereich im Datenbaustein als remanent markieren.
 
Um in FUP auf die Daten im Datenbaustein zuzugreifen ist es am besten, du vergibst einen Symbol für den Datenbaustein. Dann kannst du ihn symbolisch adressieren.
Beispiel: "Symbol_deines_DBs".Name_der_Variablen
Oder du adressiert das Ganze absolut.
Beispiel: DB99.DBW2
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ist der DB50 aktuell aufgebaut

Code:
Adresse           Name            Typ              Anfangswert
0.0                                 STRUCT
+0.0               Wert1           INT               1
+2.0               Wert2           INT               2
.
.
.
+48.0             Wert25          INT               25
=50.0                             END_STRUCT
(nicht perfekt, ich weiß)

Angenommen jetzt ist Taster 25 aktiv, also auch M25.0 (z.B.), wie krieg ich dann den Wert25 (Adresse +48.0) aus dem DB50 raus, sodass mir die bei Anfangswert eingetragene Zahl transferiert wird? Die Zahlen die bei Anfangswert drin stehen sollen ja am Ende je nachdem welche Merker an sind addiert werden.

Ich stell mir das so vor, das in meiner Addition der Wert 25 mal 0 ist (am anfang) und die 0 dann automatisch ersetzt wird wenn zB Wert 25 transferriert wird. Dann wäre das Ergebnis der Addition nicht mehr 0 sondern 25.

Bsp:
Merker 9 und 14 sind aktiv.
Wert01: 0+
Wert02: 0+
Wert03: 0+
Wert04: 0+
Wert05: 0+
Wert06: 0+
Wert07: 0+
Wert08: 0+
Wert09: 9+
Wert10: 0+
Wert11: 0+
Wert12: 0+
Wert13: 0+
Wert14: 14+
Wert15: 0+
Wert16: 0+
Wert17: 0+
Wert18: 0+
Wert19: 0+
Wert20: 0+
Wert21: 0+
Wert22: 0+
Wert23: 0+
Wert24: 0+
Wert25: 0=
Ergebnis 23 (INT/REAL/wasauchimmer)

Argh. Verdammt schwer das irgendwie zu erklären sorry :ROFLMAO:
 
Oh, die beiden neuen Posts hatte ich noch nicht gelesen. Danke für die Antworten ^^

EDIT: Hab das ganze jetzt in FUP drin, werde es dann testen sobald ich kann. Muss mir dafür ne SPS besorgen, da hier kein PLCSim drauf ist >.>
 
Zuletzt bearbeitet:
Ich möchte gerne 25 verschiedene Werte fest in der SPS einspeichern. Diese Werte stellen einzelne Stromvebracuhe in kwh ohne Nachkommastelle dar (also zB 790000 kW/h).
[...]
Die aktiven Merker bzw die ausgegebenen Werte möchte ich am Ende addieren, sodass ich ein Ergebnis erhalte, das Live immer alle aktiven Werte addiert hat.
Wenn Du das Programm sauber in FUP erstellen willst dann verbietet sich der Datentyp WORD, weil man mit WORD nicht rechnen darf (außer in AWL, da kann man rücksichtslos alles zusammenrechnen ;)).

Sinnvoll sind die Datentypen INT, DINT und REAL.

* Zuerst mußt Du überlegen:
- ob Du bei der Berechnung Nachkommastellen brauchst? wenn ja --> REAL
- wie groß die Gesamtsumme werden kann? wenn höchstens 32767 --> INT
- ansonsten --> DINT

Vermutlich kommst Du mit DINT am besten hin.

* Die Werte "fest" hinterlegen:
In einem Datenbaustein legst Du 25 Variablen von dem erforderlichen Datentyp (DINT) an und trägst den gewünschten Wert in der Spalte "Anfangswert" ein. Wenn alle 25 Werte festgelegt sind, dann müssen diese Werte noch in die Spalte "Aktualwert" übertragen werden (in der Datenansicht), entweder per Hand eintragen oder "Datenbaustein initialisieren". Falls Deine unbekannte SPS das unterstützt, könntest Du auch noch den DB als "schreibgeschützt in der AS" markieren. Danach den DB in die SPS laden.
Dem DB gibst Du noch einen symbolischen Name, dann erscheinen Deine Variablen im Programm mit dem im DB festgelegten Name.

* Bedingtes Aufsummieren:
- eine Variable "Summe" von dem erforderlichen Datentyp (DINT) anlegen (in einem Datenbaustein oder in TEMP)
- zuerst mit einem MOVE den Wert 0 in "Summe" schreiben
- danach mit 25 bedingten Additionen die aktiven Werte aufsummieren mit "ADD_DI" und den Aktiv-Merkern am EN-Eingang
Code:
          +--------+
          |  MOVE  |
     ...--|EN   OUT|--#Summe
       0--|IN   ENO|--
          +--------+
          +--------+
          | ADD_DI |
    M1.0--|EN      |
DB1.DBD0--|IN1  OUT|--#Summe
  #Summe--|IN2  ENO|--
          +--------+
          +--------+
          | ADD_DI |
    M1.1--|EN      |
DB1.DBD4--|IN1  OUT|--#Summe
  #Summe--|IN2  ENO|--
          +--------+
...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

danke für deine ausführliche Antwort. Ich werde mich im Laufe des Nachmittags damit beschäftigen sobald ich zuhause bin. Gibt es beim DINT auch eine Obergrenze für den Wert wie bei INT?

Gruß
Torben
 
Hallo,

also die Werte ablegen kannst du via Startwerte in den DB's oder im Anlauf OB (OB100) die Werte hinschreiben wohin die willst. Kann auch in den DB sein. Du solltest Dir noch überlegen ob du sie verändern willst und nach einem Wiederanlauf die geänderten Werte wieder verfügbar sein sollen. Wenn ja, dann sollten sie noch als Remanent gekennzeichnet werden.

Gruss,
Martin
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn sich die "festen" Werte tatsächlich fast "nie" ändern, dann kann man die auch gleich als Konstante an die ADD_DI-Boxen schreiben, braucht keinen DB und braucht nicht über Remanenz nachdenken.

Übrigens ist für den Anwendungsfall des TE Remanenz völlig unwichtig. Remanenz ist nur interessant für Werte, welche zur Programmlaufzeit geändert werden. Nicht-remanente (Non-Retain) DB werden bei jedem STOP/RUN-Übergang erneut aus dem Ladespeicher in den Arbeitsspeicher geladen und erhalten damit automatisch die Werte, welche beim Laden in die CPU in der Spalte "Aktualwert" eingetragen waren.

PS: Die DB-"Anfangswerte" haben auf das Verhalten in der CPU keinen Einfluß.

Harald
 
Zuletzt bearbeitet:
So nach knapp einer Woche meld ich mich mal wieder zurück. Danke noch für die weiteren Antworten, werde jetzt erstmal komplett auf den DB verzichten (bzw versuche es :) )

Ich meld mich sobalds was neues gibt :)

Gruß
tocama
 
Zurück
Oben