40Byte vergleichen

skyvan

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

ich hab im Db1.dbd0-dbd16 eine Datenreihe und im DB1.dbd40-dbd56 eine Datenreihe. Nun würde ich gern diese zwei Reihen miteinander vergleichen ob sich irgenein Wert geändert hat und bei Änderung ein Bit kurz setzen.

vielleicht hat ja jemand so etwas schon einmal verbrochen.

Gruß skyvan
 
Hallo skyvan,

wenn Du eine Schleife über alle Bytes nimmst, in der Du die Bytes vergleichst sollte es gehen.

Grüße
Gebs
 
Beispiel

Hallo,
hier eine Möglichkeit.
In diesem Beispiel brauchst Du 16 Programmzyklen bis du alles verglichen hast.

Code:
      L     40
      T     #tmp_Offset
      L     16
      T     #tmp_MaxValues
 
      AUF   DB     3
      L     P#0.0
      L     MW    10
      ITD   
      DTR   
      +R    
      T     #tmp_1
      L     #tmp_Offset
      ITD   
      DTR   
      +R    
      T     #tmp_2
      L     DBB [#tmp_1]
      L     DBB [#tmp_2]
      <>I   
      S     M      0.0
      L     MW    10
      INC   1
      T     MW    10
      L     #tmp_MaxValues
      >I    
      SPBN  m001
      L     0
      T     MW    10
m001: BE
tmp_1 und tmp_2 als Real deklarieren.
Mw10 der Zwischenspeicher für deinen Counter.

mfg Erick
 
Hallo,
hier eine Möglichkeit.
In diesem Beispiel brauchst Du 16 Programmzyklen bis du alles verglichen hast.

Code:
      L     40
      T     #tmp_Offset
      L     16
      T     #tmp_MaxValues
 
      AUF   DB     3
      L     P#0.0
      L     MW    10
      ITD   
      DTR   
      +R    
      T     #tmp_1
      L     #tmp_Offset
      ITD   
      DTR   
      +R    
      T     #tmp_2
      L     DBB [#tmp_1]
      L     DBB [#tmp_2]
      <>I   
      S     M      0.0
      L     MW    10
      INC   1
      T     MW    10
      L     #tmp_MaxValues
      >I    
      SPBN  m001
      L     0
      T     MW    10
m001: BE
tmp_1 und tmp_2 als Real deklarieren.
Mw10 der Zwischenspeicher für deinen Counter.

mfg Erick

Das geht wirklich mit Real als Pointer und Realarithmetik?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde es etwas anders lösen, weil ich den Vergleich in einem Zyklus haben wollte.

Code:
// Adressregister retten
TAR1 #Save_AR1

// Schleife und AR1 initialisieren

L P#0.0
LAR1

L 4
WEIT:T #LoopCounter

// Werte vergleichen und bei Unterschied Bit setzen
L DBD [AR1,P#0.0]
L DBD [AR1,P#40.0]
<>D
S M 0.0
SPB ENDE

// Adressregister erhöhen
+AR1 P#4.0

L #LoopCounter
LOOP WEIT

ENDE: NOP 0

// AR1 wieder herstellen
LAR1 #Save_AR1
Grüße
Gebs
 
Zuletzt bearbeitet:
zum Thema Pointer:
Die Real-Arithmetik steht im direkten Widerspruch zu dem Pointer-Aufbau.
Ich kann mir beim besten Willen nicht vorstellen, dass dass funktioniert.

Zur Realisierung an sich würde ich auch etwas auf der Basis der Vorschlags von Gebs hernehmen. Vor Allem hier auch mit DWORD-Vergleichen arbeiten - das spart Durchläufe (und damit Zeit) ...

Gruß
LL
 
Ich nehme bloß noch den EQ_ANY aus der Oscat-Bibliothek.
Der funzt einwandfrei und man kann den alles durchsuchen lassen.

Code:
FUNCTION EQ_ANY : BOOL
TITLE = 'EQ_ANY'
//version 1.0 
//programmer  dalbi
//tested by   dalbi
//
VERSION : '1.0'
AUTHOR  : dalbi
NAME    : EQ_ANY
FAMILY  : xS7
VAR_INPUT
  IN1 : ANY;
  IN2 : ANY;
END_VAR
VAR_TEMP
  tANY1 : ANY;
    _ANY1 AT tANY1 : STRUCT
      id: BYTE;
      DataType: BYTE;
      Lenght: WORD;
      DBNr: WORD;
      Byte_Pointer: DWORD;
    END_STRUCT;
  tANY2 : ANY;
    _ANY2 AT tANY2 : STRUCT
      id: BYTE;
      DataType: BYTE;
      Lenght: WORD;
      DBNr: WORD;
      Byte_Pointer: DWORD;
    END_STRUCT;
  tAdr1 : INT;
  tAdr2 : INT;
  i : INT;
END_VAR
  
BEGIN
  tANY1 := IN1;
  tANY2 := IN2;
  
  tAdr1 := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SHL(IN:=_ANY1.Byte_Pointer,N:=8),N:=11)));
  tAdr2 := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SHL(IN:=_ANY2.Byte_Pointer,N:=8),N:=11)));
  EQ_ANY := FALSE;
  IF _ANY1.Lenght <> _ANY2.Lenght THEN
    EQ_ANY := TRUE;
  ELSE
    FOR i := 0 TO WORD_TO_INT(_ANY1.Lenght)-1 DO
      IF WORD_TO_BLOCK_DB(_ANY1.DBNr).DB[tAdr1+i] <> WORD_TO_BLOCK_DB(_ANY2.DBNr).DB[tAdr2+i] THEN
        EQ_ANY := TRUE;
        EXIT;
      END_IF;
    END_FOR;
  END_IF;
  
END_FUNCTION
 
Zurück
Oben