Arbeiten mit Integer-Werten ?!?

Die IDs sind ja nicht nummeriert nach Zählerprinzip...
Bzw, anscheinend hab ich mich leicht missverständlich ausgedrückt :rolleyes:
 
Welchen Wertebereich (INT oder DINT) haben die IDs?

Wertebereich INT = - 32768 bis + 32767

Wertebereich DINT = - 2147483648 bis + 2147483647

Gruß Kai
 
Hallo Jackjackson,

wie wär's dann damit:

Code:
U #NeuesFoerdergutEingetroffen  
ZV Z1

L Z1
-1
L 4     // Weil ein DINT 4 Bytes hat    
*D
SLD 3 // Ins Pointerformat
LAR1  // im Adressregister 1 ablegen

AUF DB 1  // der DB in dem die IDs gespeichert werden sollen
L #ID
T DBD [AR1,P#x.0]  // ID speichern; X ist hier der Offset im DB ab wo die ID stehen

L Z1
L 10
>=I
R Z1

Wenn Du den Code in einen FC stellst und dem FC die IN-Variablen
#NeuesFoerdergutErhalten
#ID
spendierst, werden die Daten in einem Ringpuffer abgelegt.
Wenn Du dann auch noch den Zählerstand speicherst, weißt Du wo die neueste ID liegt.

Grüße
Gebs
 
warum -1? egal, spring sowieso grad nur hier rein

Code:
*
      L     Z      1
      SLD   5                           // Ins Pointerformat
      LAR1                              // im Adressregister 1 ablegen

geht schneller

und wenn die eins noch weg soll

Code:
*
      L     Z      1
      [COLOR=red][B]+     -1[/B][/COLOR]
      SLD   5                           // Ins Pointerformat
      LAR1                              // im Adressregister 1 ablegen
 
wobei ich es sinnvollerweise mit

Code:
*
      U     #NeuesFoerdgut
      SPBN  noid
      ZV    Z      1
 
       ....
 
noid: NOP   0

ergänzen würde, damit nur eine ID gespeichert wird, wenn es wirklich notwendig ist.
 
@ vierlagig:

Dann würde der Z1 genau 1x zählen, da der Z ja eine Positive Flanke braucht.
______________________________
O #NeuesFoerdgut
ON #gezaehlt
SPBN noid
l mw xxx
+1
T mw xxx

set
S #gezaehlt

noid: nop 0

UN #NeuesFoerdgut
R #gezaehlt
_______________________________

Und dann halt noch das MW bei Bedarf wieder nullen..
Behauptet dtsclipper
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
der globale S7-zähler hat die flanken auswertung schon drinnen, also darüber mach ich mir keine platte.

wenn ich den codeschnipsel richtig verstanden habe, soll der zähler bei neuem fördergut um eins erhöht werden und legt damit den speicherplatz der ID im db für dieses neue fördergut fest.

fest steht, dass diese ganze global/lokal-mischmaschscheiße die der gebs da uns hingeschmissen hat nicht wirklich praktikabel ist.

ich würde alles lokal machen, auch den "zähler" als INT variable (STAT bei FB oder INOUT bei FC) und die DBnummer würde ich als blockDB übergeben... aber das ist ja dann dem jackson seine kanne bier :rolleyes:
 
also in etwa so:

Code:
*
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  xTrigger : BOOL ; 
  iID : INT ; 
  bdDB : BLOCK_DB ; 
END_VAR
VAR_IN_OUT
  iCounter : INT ; 
  xHelpFlag : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =
      U     #xTrigger; 
      FP    #xHelpFlag; 
      SPBN  end; 
      L     #iCounter; 
      +     1;
      T     #iCounter;  
      SLD   5; 
      LAR1  ; 
      AUF   #bdDB; 
      L     #iID; 
      T     DBD [AR1,P#0.0]; 
      L     #iCounter; 
      L     10; 
      ==I   ; 
      SPBN  end; 
      L     0; 
      T     #iCounter; 
end:  SET   ; 
      SAVE  ; 
 
END_FUNCTION
was man in drei minuten halt so baustein nennt :rolleyes:
 
Zuletzt bearbeitet:
--- grins ---

Aber man muss ja nicht gleich alles verraten, nicht wahr?

Sonst kann ich mich vor euch ja nur noch vor Ehrfurcht verneigen!
 
Zurück
Oben