Arbeiten mit Integer-Werten ?!?

Jackjackson

Level-1
Beiträge
156
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich will in STEP7 ein Programm schreiben, das über ein Signal einen Zähler hochzählt und jedesmal, wenn der hochzählt, den Wert als Integer-Wert speichert.... Frage ist, wo soll ich die Werte reinspeichern bzw. wie kann ich auf diese dann zugreifen?
Vlt kann mir jemand helfen, danke....

MfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie speichere ich die in ein MW?
Mit dem Zähler schauts ja so aus:
U E0.0
ZV Z1
LC Z1
T MW1
der speichert doch nur den endwert.... ich brauch die vorherigen zahlen auch... mindestens die 5 vorherigen noch

:confused:
 
Hallo Jackjackson,

nimm dann besser einen DB und bau Dir darin einen FIFO oder einen Ringpuffer.

Mit LC lädst Du den Zählwert BCD-codiert. Wenn Du ihn aber als Int haben willst, hol Dir den Wert mit L Z1 oder vor dem T MW1 ein BTI.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zB. Es sind 10 Eingangssignale gekommen, der Zähler ist auf 10...
ich will dass die Werte 10, 9, 8, 7, 6, 5 irgendwo gespeichert werden, so dass ich auf die zugreifen kann... bei 11 wärn dann eben 11, 10, 9, 8, 7, 6...
Geht das überhaupt?
 
Wenn du hochzählst zB. bis 30 dann werden die 5 vorherigen Zahlen
MIT SICHERHEIT 25, 26, 27, 28, 29 sein !!!

Oder willst du ein "Bündel" beliebiger Zahlen speichern ?? dann sieht die Welt gaaanz anders aus.

peter(R)
 
Hallo Jackjackson,

Hier mal eine kleine Hilfestellung:

Code:
Auf DB 1 // Ringspeicher

U E0.0
ZV Z1

L Z1   // Adresse in Ringspeicher bilden
SLD3
LAR1

L #Zahl  // irgendeine Zahl die Du speichern willst
T DBW[AR1,P#0.0]

L Z1
L 10  // Anzahl der zu speichernden Zahlen
==I
R Z1

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich will in STEP7 ein Programm schreiben, das über ein Signal einen Zähler hochzählt und jedesmal, wenn der hochzählt, den Wert als Integer-Wert speichert.... Frage ist, wo soll ich die Werte reinspeichern bzw. wie kann ich auf diese dann zugreifen?

Es sind 10 Eingangssignale gekommen, der Zähler ist auf 10...
ich will dass die Werte 10, 9, 8, 7, 6, 5 irgendwo gespeichert werden, so dass ich auf die zugreifen kann... bei 11 wärn dann eben 11, 10, 9, 8, 7, 6...

Hier ist einmal ein Programmbeispiel für die Speicherung von Werten in einen FIFO-Speicher.

Die letzten 10 Zählwerte eines Zählers werden als INT-Werte in einem Datenbaustein als FIFO-Speicher gespeichert.

Code:
RGANIZATION_BLOCK "OB_HAUPTPROGRAMM"
TITLE = Hauptprogramm
//16
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : FIFO
VERSION : 1.0
 
VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =Zaehler
 
      U     "SIGNAL"; 
      ZV    "ZAEHLER"; 
      BLD   101; 
      NOP   0; 
      NOP   0; 
      U     "ZAEHLER_RUECKSETZEN"; 
      R     "ZAEHLER"; 
      NOP   0; 
      LC    "ZAEHLER"; 
      T     "ZAEHLER_ZAEHLWERT_BCD"; 
      NOP   0;
 
NETWORK
TITLE =Zaehler
 
      L     "ZAEHLER_ZAEHLWERT_BCD"; 
      BTI   ; 
      T     "ZAEHLER_ZAEHLWERT_INT"; 
      NOP   0; 
 
NETWORK
TITLE =FIFO Zaehler
 
      U     "SIGNAL"; 
      FP    "SIGNAL_FLANKE"; 
      SPBNB _001; 
      CALL "FC_FIFO_ZAEHLER" (
           DB_ZAEHLER               := "DB_ZAEHLER",
           ANZAHL_ZAEHLWERTE        := 10,
           ZAEHLWERT                := "ZAEHLER_ZAEHLWERT_INT");
_001: NOP   0; 
 
END_ORGANIZATION_BLOCK

Code:
TITLE =FIFO Zaehler
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : FIFO
VERSION : 1.0
 
VAR_INPUT
  DB_ZAEHLER : BLOCK_DB ; 
  ANZAHL_ZAEHLWERTE : INT ; 
  ZAEHLWERT : INT ; 
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ; 
  AR1_REGISTER : DWORD ; 
  SCHLEIFE : INT ; 
  ZWISCHENWERT : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
NETWORK
TITLE =FIFO Zaehler
 
      AUF   #DB_ZAEHLER; // DB Zaehler
 
      L     P#0.0; 
      LAR1  ; 
 
      L     #ZAEHLWERT; // Zaehlwert
      T     #ZWISCHENWERT; // Zwischenwert
 
      L     #ANZAHL_ZAEHLWERTE; // Anzahl Zaehlwerte
M01:  T     #SCHLEIFE; 
 
      L     DBW [AR1,P#0.0]; // Zaehlwert
      L     #ZWISCHENWERT; // Zwischenwert
      T     DBW [AR1,P#0.0]; // Zwischenwert => Zaehlwert
      TAK   ; 
      T     #ZWISCHENWERT; // Zaehlwert => Zwischenwert
 
      L     P#2.0; 
      +AR1  ; 
 
      L     #SCHLEIFE; 
      LOOP  M01; 
 
NETWORK
TITLE =Register wiederherstellen
 
      AUF   DB [#DB_REGISTER]; // DB-Register
 
      LAR1  #AR1_REGISTER; // AR1-Register
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    8 KB · Aufrufe: 8
  • FC100.pdf
    5,6 KB · Aufrufe: 7
  • DB100.pdf
    4,4 KB · Aufrufe: 7
  • Fifo.zip
    33,4 KB · Aufrufe: 6
Und noch zwei Bilder aus der Simulation mit PLCSIM.

Gruß Kai
 

Anhänge

  • PLCSIM_1.jpg
    PLCSIM_1.jpg
    267,8 KB · Aufrufe: 14
  • PLCSIM_2.jpg
    PLCSIM_2.jpg
    268,5 KB · Aufrufe: 9
Ich glaub Gebs- und Kai´s Lösung schiesst da etwas übers Ziel hinaus, warum so umständlich ???

Ich würd sagen das Peter(R) lösung für die simple Aufgabe wirklich ausreichend ist. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke .... hat mir sehr weitergeholfen!! :)
Wie müsste man eigentlich den OB1 bzw FC ändern, dass statt einem zählerhochzählenden Eingangssignal zufällige Int-Werte ins Programm gespeist werden?
 
Zuletzt bearbeitet:
Hallo Jackjackson,

die einfachste Möglichkeit wäre die Millisekunden aus dem OB1_Date_Time zu nehmen.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jackjackson,

ich meine schon OB1_DATE_TIME! AB L 12.0 im OB1. Im LW 18 stehen die ms der Systemuhr und der aktuelle Tag.

Mit
Code:
L LW 18
SRW 4
T MW xy
hast Du dann im MW xy die ms stehen.
Das MW xy setzt Du dann einfach an die Stelle des Zählwertes.

Grüße
Gebs
 
Das zählt nur automatisch MW1 hoch und runter...
ich will nur die Werte nacheinander in MW1 setzen und speichern ...
L LW 18
SRW 4
T MW1

L MW1
BTI
T "Z_INT"
NOP 0

:confused:

(An die SPS werden die IDs der Fördergüter gesendet, welches die 10 IDs speichert, auf die man zugreifen kann...)
 
Zuletzt bearbeitet:
Zurück
Oben