Inhalt eines Datenbaustein auf 0 vergleichen

norman

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

ich würde gerne um eine Sammesstörung zu generieren, den Störmeldebaustein z.B. DB50 auf 0 Vergleichen.

Also wenn alle Datenwörter im DB 50 = 0, dann ist keine Störung.

Der Datenbaustein kann aus einer unbekannten Anzahl von Datenwörtern bestehen.

Gibt es da ein SFC der das Kann?

Schön währe ein FC mit den Parameter.

IN_VAR
DB //DB nummer in dem die Störmeldungen liegen

OUT_VAR
Sammelstörung //Wenn ein Bit in einem Datenword im DB gesetzt ist = True



Danke
 
geht auch anderst...

machst du:

in vari DBNR
int variable SCHLEIFENZ
out vari: SAMMELSTOERUNG
Code:
AUF     #DBNR
L     DBLG
LP:T     #SCHLEIFENZ
L     #SCHLEIFENZ
SLD     3
LAR1
L     DBB [AR1,P#0.0]
L     0
<>I
SPB STOE
L    #SCHLEIFENZ
LOOP LP

SET 
R  #SAMMELSTOERUNG
BEA
STOE: SET
S #SAMMELSTOERUNG
sollte gehen

Achtung!!!! nicht getestet!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Das kannst du über eine Schleife Programmieren.

Da brauchst du nur mit dem Befehl L DBLG die Länge des Datenbausteines Laden. Daraus kannst du deine maximalen Schleifendurchgänge ermitteln. Und in der Schleife vergleichst du einfach alle Werte auf null. Wenn nicht Null springst du aus der Schleife ansonsten läuft die Schleife durch und zum Schluss setzt du dann dein Bit das dir dann sagt das überal im DB 0 steht.

godi
 
Servicefreundlich

Hallo,
besonders servicefreundlich ist folgende Methode:

L DW0
L DW2
OW
L DW4
OW
L ...
...
...
OW
L W#16#0
<>I
= M 0.0 //Störung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mhhhm....

Denke wir müssen ....

Code:
L DBLG
LP:T SCHLEIFENZ


durch

Code:
L DBLG
+ -1
LP:T SCHLEIFENZ

ersetzen....

wie gesagt. das ganze ist nur ein beispiel... ich habe nichts getestet....
 
hey,

die einfachste möglickeit besteht dadrinne, die anzahl der wörter im db zu erfassen. die anzahl als schleifenzähler zu verwenden. mit einem pointer lädst du dann das aktuelle wort des db und vergleichst es mit eine null. so bald einer null ist, kannst du ja ne störung melden und rausspringen. ansonsten erhöhst du den pointer am ende und verminderst den schleifenzähler um -1 und vergleichst den schleifenzähler auf 0 und läßt ihn bei >0 wieder in die schleife springen.


auf db...
lar1 p#0.0
l #anzahl wörter db
Next: t #schleifenzähler
l dbw[ar1,p#0.0]
l 0
><DINT
SPBN Fehl
+ar1 p#2.0
loop Next

Fehl: Ausgabe des Fehlers


meine das dies die einfachste lsg. ist. der loop befehl vermindert den schleifenzähler automatisch um -1.

bis denne
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
besonders servicefreundlich ist folgende Methode:

L DW0
L DW2
OW
L DW4
OW
L ...
...
...
OW
L W#16#0
<>I
= M 0.0 //Störung

das mit der schleife ist genausogut zu "warten" im schlimmsten fall kann immer noch jeder in den db schauen...
er wollte es flexibel unabhängig von der db länge...
aufgabe nicht verstanden - setzten - 6 :ROFLMAO:



die methode mit dblg und der schleife ist ne saubere sache.
wenn in dem db aber noch andere daten sind, d.h du nur einen bestimmten bereich für die störmeldungen hast, dann kannst du deinem auswertebaustein auch den "pfad" zur struktur in dem die störbits liegen über einen anypointer übergeben.
der anypointer enthält dann startadresse, länge und weiter information (suche).

geht dann auch sauber symbolisch, je nachdem wie du im db gearbeitet hast...
 
Hallo,

Die Funktion als SFC habe ich auch vermisst, ich habe noch eine symbolische Variante.
Wenn ein Bit in der Datenstruktur "I_BitData" TRUE ist, dann ist der Ausgang ENO des FC's ebenfalls TRUE. Der FC eignet sich für symbolische Programmierung in FUP und KOP.

PHP:
FUNCTION "FC_ANY_BIT" : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  I_BitData : ANY ;    //Datenstruktur, die ausgewertet werden soll
END_VAR
VAR_TEMP
  _ret_val : INT ;    
  tTyp : BYTE ;    
  tFaktor : WORD ;    
  tDBNummer : INT ;    
  tBereich : BYTE ;    
  tBereichAddr : DWORD ;    
  tmp_Number_Of_Byte : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =ANY Number

      L     0; 
      T     #_ret_val; 

      L     P##I_BitData; 
      LAR1  ; 
      L     B [AR1,P#1.0]; 
      T     #tTyp; 
      L     W [AR1,P#2.0]; 
      T     #tFaktor; 
      L     W [AR1,P#4.0]; 
      T     #tDBNummer; 
      L     D [AR1,P#6.0]; 
      T     #tBereichAddr; 
      L     B [AR1,P#6.0]; 
      T     #tBereich; 
NETWORK
TITLE =

      O(    ; 
      L     #tTyp; //Byte?
      L     B#16#1; 
      ==I   ; 
      )     ; 
      O(    ; 
      L     #tTyp; //Byte?
      L     B#16#2; 
      ==I   ; 
      )     ; 
      O(    ; 
      L     #tTyp; //Char?
      L     B#16#3; 
      ==I   ; 
      )     ; 
      SPBN  c16B; 

      L     #tFaktor; 
      T     #tmp_Number_Of_Byte; 
      SPA   TEDB; 
NETWORK
TITLE =16 Bit ?

c16B: O(    ; 
      L     #tTyp; //WORD
      L     B#16#4; 
      ==I   ; 
      )     ; 
      O(    ; 
      L     #tTyp; //INT
      L     B#16#5; 
      ==I   ; 
      )     ; 
      SPBN  c32B; 
      L     #tFaktor; 
      L     2; 
      *I    ; 
      T     #tmp_Number_Of_Byte; 
      SPA   TEDB; 
NETWORK
TITLE =

c32B: NOP   0; 
      CLR   ; 
      SAVE  ; 
      BE    ; 


NETWORK
TITLE =DB oder DI?

TEDB: O(    ; 
      L     #tBereich; 
      L     B#16#84; //Datenbaustein
      ==I   ; 
      )     ; 
      O(    ; 
      L     #tBereich; 
      L     B#16#85; //Instanz-Datenbaustein
      ==I   ; 
      )     ; 
      SPBN  NODB; 
      AUF   DB [#tDBNummer]; 
NODB: NOP   0; 
NETWORK
TITLE =Schleife

      L     #tBereichAddr; 
      LAR1  ; 

Loop: L     B [AR1,P#0.0]; 
      L     0; 
      <>I   ; 
      SPB   bTRU; 

      +AR1  P#1.0; 
      L     #tmp_Number_Of_Byte; 
      L     1; 
      -I    ; 
      T     #tmp_Number_Of_Byte; 
      L     0; 
      >I    ; 
      SPB   Loop; 

      CLR   ; 
      SAVE  ; 
      BE    ; 
bTRU: NOP   0; 
      SET   ; 
      SAVE  ; 
      BE    ; 


END_FUNCTION
 
Zurück
Oben