Arbeiten mit Integer-Werten ?!?

Zuviel Werbung?
-> Hier kostenlos registrieren
An die SPS werden die IDs der Fördergüter gesendet, welches die 10 IDs speichert, auf die man zugreifen kann...

Welchen Wertebereich (INT oder DINT) haben die IDs?

DINT wär am günstigsten

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

Eine beliebige Fördergut ID-Nummer wird im MD100 ID_NUMMER im Datenformat DINT eingetragen.

Bei einem positiven Flankenwechsel am M110.0 SIGNAL wird die ID-Nummer im FIFO-Speicher im DB100 DB_FOERDERGUT gespeichert.

Im FIFO-Speicher werden die letzten 10 ID-Nummern gespeichert.

Code:
ORGANIZATION_BLOCK OB 1
TITLE = Hauptprogramm
//18
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 =FIFO Foerdergut
 
      U     M    110.0; 
      FP    M    110.1; 
      SPBNB _001; 
      CALL FC   100 (
           DB_FOERDERGUT            := DB   100,
           ANZAHL_ID_NUMMERN        := 10,
           ID_NUMMER                := MD   100);
_001: NOP   0; 
 
END_ORGANIZATION_BLOCK

Code:
FUNCTION FC 100 : VOID
TITLE =FIFO Foerdergut
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : FIFO
VERSION : 1.0
 
VAR_INPUT
  DB_FOERDERGUT : BLOCK_DB ; 
  ANZAHL_ID_NUMMERN : INT ; 
  ID_NUMMER : DINT ; 
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ; 
  AR1_REGISTER : DWORD ; 
  ZWISCHENWERT : DINT ; 
  SCHLEIFE : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
NETWORK
TITLE =FIFO Foerdergut
 
      AUF   #DB_FOERDERGUT; // DB Foerdergut
 
      L     P#0.0; 
      LAR1  ; 
 
      L     #ID_NUMMER; // ID-Nummer
      T     #ZWISCHENWERT; // Zwischenwert
 
      L     #ANZAHL_ID_NUMMERN; // Anzahl ID-Nummern
M01:  T     #SCHLEIFE; 
 
      L     DBD [AR1,P#0.0]; // ID-Nummer
      L     #ZWISCHENWERT; // Zwischenwert
      T     DBD [AR1,P#0.0]; // Zwischenwert => ID-Nummer
      TAK   ; 
      T     #ZWISCHENWERT; // ID-Nummer => Zwischenwert
 
      L     P#4.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
    6 KB · Aufrufe: 8
  • FC100.pdf
    5,7 KB · Aufrufe: 10
  • DB100.pdf
    4,4 KB · Aufrufe: 8
  • SYMBOLE.pdf
    4,4 KB · Aufrufe: 8
  • Fifo.zip
    33 KB · Aufrufe: 12
Zuletzt bearbeitet:
Und noch ein paar Bilder aus der Simulation mit PLCSIM.

Gruß Kai
 

Anhänge

  • PLCSIM_1.jpg
    PLCSIM_1.jpg
    263,7 KB · Aufrufe: 10
  • PLCSIM_2.jpg
    PLCSIM_2.jpg
    264,2 KB · Aufrufe: 9
  • PLCSIM_3.jpg
    PLCSIM_3.jpg
    264,2 KB · Aufrufe: 7
  • PLCSIM_4.jpg
    PLCSIM_4.jpg
    264,9 KB · Aufrufe: 11
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Hinweise :)
Ist es auch möglich für jeden gespeicherten Wert, sagen wir für ein Array von 1000 Werten, jeweils einen Ausgangsimpuls zu senden in einem Intervall von 50ms?
 
Zurück
Oben