Datenbaustein Wörter nach oben schieben

TheBigMemph

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
erstelle grad ein Fahrstuhl Programm mit dem Simatic Manager mit Hilfe eines Datenbausteines.
Es klappt auch alles ganz hervorragend, nun will ich allerdings, dass jedesmal das Datenbausteinwort 0 gelöscht wird wenn der Fahrstuhl die Etage die dort hinterlegt war erreicht hat.
Danach sollen nachtürlich die Etagen die nun im Datenbaustein sind nachrücken...
Gibt es dort eine einfache Möglichkeit, vorallem eine die auf unendlich viele Etagen erweiterbar ist ???

mfg
Memph
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...

Ich hatte bislang noch nichts mit pointern zu tun ... ich versteh das nicht wirklich ....
Code:
      U(    
      O     E      0.0
      O     E      0.1
      O     E      0.2
      )     
      ZV    Z      0
      U(    
      O     E      1.0
      O     E      1.1
      O     E      1.2
      )     
      U     E      2.0
      ZR    Z      0
      NOP   0
      NOP   0
      U(    
      L     DBW    0
      L     0
      ==I   
      )     




      R     Z      0
      NOP   0
      LC    Z      0
      T     MW    10
      NOP   0
Code:
      L     MW    10
      L     2
      *I    
      T     MD    90
      L     MD    90
      SLD   3
      T     MD    70
      L     MW    30
      T     DBW [MD 70]
Da speichert er immer nach der reihe die einzelnen Stockwerkanfragen ....
Wenn die erste abgearbeitet ist wird sie null ... nun sollen alle anderen einen nachrücken ...
nach meiner Logik sollte das doch mit

Code:
      L     DBW    2
      T     DBW    0

      L     DBW    4
      T     DBW    2

      L     DBW    6
      T     DBW    4

      L     DBW    8
      T     DBW    6

      L     DBW   10
      T     DBW    8
möglich sein ... aber wenn ich nun ein Stock abgearbeitet habe werden alle DBW's 0 ...
 
Wenn die erste abgearbeitet ist wird sie null ... nun sollen alle anderen einen nachrücken ...
nach meiner Logik sollte das doch mit

Code:
      L     DBW    2
      T     DBW    0
 
      L     DBW    4
      T     DBW    2
 
      L     DBW    6
      T     DBW    4
 
      L     DBW    8
      T     DBW    6
 
      L     DBW   10
      T     DBW    8
möglich sein ... aber wenn ich nun ein Stock abgearbeitet habe werden alle DBW's 0 ...

Dein Programmcode wird in jedem Programmzyklus abgearbeitet. Nach spätestens 6 Programmzyklen sind also alle MW gleich 0.

Wenn Dein Programmcode nur einmalig abgearbeitet werden soll, dann musst Du einen Sprung einbauen, z. B.:

Code:
      U     M    220.0
      FP    M    220.1
      SPBN  M001
 
      L     DBW    2
      T     DBW    0
 
      L     DBW    4
      T     DBW    2
 
      L     DBW    6
      T     DBW    4
 
      L     DBW    8
      T     DBW    6
 
      L     DBW   10
      T     DBW    8
 
M001: NOP 0

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      U     M    220.0
      FP    M    220.1
      SPBN  M001
 
      L     DBW    2
      T     DBW    0
 
      L     DBW    4
      T     DBW    2
 
      L     DBW    6
      T     DBW    4
 
      L     DBW    8
      T     DBW    6
 
      L     DBW   10
      T     DBW    8
 
M001: NOP 0
Die kürzeste Variante sieht dann übrigens so aus:


Code:
      U     M    220.0
      FP    M    220.1
      SPBN  M001
  
      CALL SFC20
       SRCBLK:=P#DBX2.0 BYTE 10
       RetVal:=#SFC20_RetVal
       DSTBLK:=P#DBX0.0 BYTE 10
 
M001: NOP 0
Diese Variante funktioniert deshalb, weil SFC20 intern wortweise arbeitet, das wort mit der niedrigsten Adresse zuerst. Umgekehrt würde es nicht funktionieren.
Diese Variante ist allerdings langsamer in der Ausführung.

mfg
Maxl
 
Code:
      L     DBW    0
      L     0
      ==I   
      CC    FC     3
hatte das so gedacht ... und in dem fc 3 dann

Code:
      L     DBW    2
      T     DBW    0

      L     DBW    4
      T     DBW    2

      L     DBW    6
      T     DBW    4

      L     DBW    8
      T     DBW    6

      L     DBW   10
      T     DBW    8
und dabei macht er mir auch alles null ... versteh ich aber nicht ganz warum...

Ich bin noch ein ziemlicher Anfänger mit Datenbausteinen und habe echt schwierigkeiten euch zu folgen ...

könntet ihr mir diese Sprungfunktion mal in Worten beschreiben ...
Was ich für die Merker ect einsetzen muss und was genau passiert ...

zu diesem fc20 muss ich sagen, dass bei mir
RetVal:=#SFC20_RetVal

nicht funktioniert ... kann das daran liegen das ich meinen Datenbaustein in
Ganzzahlen eingestellt habe (INT) ??

der Parameter wird immer rot in der Formel...
 
Der bedingte Aufruf der FC3 findet doch auch über mehrere Zyklen statt.
Der Aufruf müsste über eine Flankenauswertung geschehen.
Z.B.:
L DBW 0
L 0
==I
FP M 200.0
CC FC 3


Gruß
raika
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
1. und dabei macht er mir auch alles null ... versteh ich aber nicht ganz warum...
 
könntet ihr mir diese Sprungfunktion mal in Worten beschreiben ...
Was ich für die Merker ect einsetzen muss und was genau passiert ...
 
zu diesem fc20 muss ich sagen, dass bei mir 
RetVal:=#SFC20_RetVal
 
nicht funktioniert ... kann das daran liegen das ich meinen Datenbaustein in
Ganzzahlen eingestellt habe (INT) ??
 
der Parameter wird immer rot in der Formel...

alles null, weil die funktion in jedem zyklus die daten verschiebt..

du darfst also die funktion nur dann auslösen (und nur 1 mal) wenn es sein soll

U M 1.1 // aulösendes ereignis
FP M 2.0 // fankenspeicher
= M 1.0 // dieser merker ist 1 zyklus high

un m 1.0
spb nofc
call fc1
nofc: nop 0
[/code]
retval ist der rückgabecode der funktion. dort steht welcher fehler bei der bearbeitung der fc aufgetreten ist. siehe 's7-hilfe'

der sfc20 ist es egal was sie kopieren soll.
sie erwartet any-zeiger am ein- und ausgang.
der sieht z.b. so aus P#DB10.DBX 0.0 BYTE 10

(falls dir der zeiger nicht klar ist, suche mal nach 'any' 'zeiger'
 
Zurück
Oben