TIA AT Anweisung zum Bit Arrays vergleichen

buhuu

Level-1
Beiträge
20
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe heute versucht Bit Arrays zu vergleichen und bin auf die AT Anweisung gestoßen und habe etwas damit probiert.
Ziel hätte es sein sollen die 2 Arrays zu vergleichen und zu melden wenn sie unterschiedlich sind.
Leider hat es nicht so ganz funktioniert. Hat mir vielleicht jemand einen Tipp ?
Code:
FUNCTION_BLOCK "Baustein_1"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      bit1 { S7_HMI_Visible := 'False'} : Bool;
   END_VAR


   VAR 
      array_1 : Array[0..7] of Bool;
      AT_array_1 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT array_1 : Byte;
      array_2 : Array[0..7] of Bool;
      AT_array_2 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT array_2 : Byte;
      erg : Int;
   END_VAR

BEGIN
    #array_1[0] := 0;
    #array_1[1] := #bit1;
    #array_1[2] := 0;
    #array_1[3] := 0;
    #array_1[4] := 0;
    #array_1[5] := 0;
    #array_1[6] := 0;
    #array_1[7] := 0;
    
    
    #array_2[0] := 0;
    #array_2[1] := 0;
    #array_2[2] := 0;
    #array_2[3] := 0;
    #array_2[4] := 0;
    #array_2[5] := 0;
    #array_2[6] := 0;
    #array_2[7] := 0;
    
    IF #AT_array_1 = #AT_array_2 THEN
        #erg := 1;
    ELSE
        #erg :=  0;
    END_IF;
    
END_FUNCTION_BLOCK

Vielen Dank schon im Voraus.

 
Dafür reichen keine einfachen Befehle. Da braucht man eine Funktion die jedes einzelne Bit vergleicht.

Ich habe eine solche Funktion um für Alarme Änderungen in Bitfeldern festzustellen. Müsste auch für deinen Fall passen. Sie gibt die Index-Nummer des ersten Bits aus, das anders ist oder Null bei Gleichheit. Über den Eingangsparameter Neg gibt man an, ob man positive oder negative Änderungen sucht.



Code:
FUNCTION "FCBitfFlank" : VOID
TITLE =  Flanken erkennen in Bitfeldern (derselbe DB!)
VERSION : 0.1


VAR_INPUT
 BitfeldN : ANY ; //Adresse Bitfeld neue Daten
 BitfeldA : ANY ; //Adresse Bitfeld alte Daten
 von : INT ; // erstes Bit -1,dh 0 fürs Anfang Bitfeld
 bis : INT ; // letztes Bit
 neg : BOOL; // 0 positive Flanke 1=negative 
 END_VAR
 
VAR_OUTPUT
 BitNum: INT ; //Erstes geändertes Bit 0=Keins 1=erstes Bit usw
END_VAR


VAR_TEMP
 
 AR2Save: DWORD; // AR2 sichern
 BitfP: DWORD; //Anfang Bitfeld
 PointN: DWORD; //Arbeitszeiger neue Daten
 PointA: DWORD; //Arbeitszeiger alte Daten
 Limit: DWORD; //Ende Suchbereich
 DBNr: INT; // DB-Nummer
 
END_VAR

BEGIN

NETWORK
TITLE = AR2 sichern

TAR2; T #AR2Save;


NETWORK
TITLE = Vorbereitung neue Daten


L P##BitfeldN; LAR1;

L W [AR1,P#4.0]; T #DBNr ;


L D [AR1,P#6.0]; T #BitfP; //Anfang Bitfeld


T #BitfP; L #bis; +D; T #Limit; //Ende

L #BitfP; L #von; +D; T #PointN; //Anfang Suche

NETWORK
TITLE =Vorbereitung alte Daten


L P##BitfeldA; LAR2;


L D [AR2,P#6.0]; L #von; +D; T #PointA; //Anfang Suche

NETWORK
TITLE = Suche

AUF DB[#DBNr];

 
LOOP: NOP 0; 

L #PointN; L #Limit; >=D; SPB NIX;

L #PointN; LAR1;
L #PointN; L 1; +D; T PointN;

L #PointA; LAR2;
L #PointA; L 1; +D; T PointA;


U [AR1,P#0.0]; X #Neg; UN(; U [AR2,P#0.0]; X #Neg;); SPB FUND;
SPA LOOP;


FUND:
L #PointN;L #BitfP;-D; T Bitnum;
SPA END;


NIX:
L 0; T #Bitnum;

END: L AR2Save; LAR2; 

END_FUNCTION
 
Ziel hätte es sein sollen die 2 Arrays zu vergleichen und zu melden wenn sie unterschiedlich sind.
Leider hat es nicht so ganz funktioniert.
Was genau hat denn "nicht so ganz funktioniert"? Was hast Du erwartet? Dein Vergleich der beiden Arrays "IF #AT_array_1 = #AT_array_2 THEN" funktioniert jedenfalls.

Harald
 
Ich hätte 2 Anmerkungen dazu :

- Welches Entwicklungssystem ? Wenn TIA dann ggf. den "optimierten Bausteinzugriff" abschalten
- Das Array ist zwar nur 1 Byte breit, es belegt aber trotzdem den WORD-Bereich im Speicher. Ich weiß da im Augenblick nicht, wo die Bit's dann bleiben (High-Byte oder Low-Byte). Das könnte man damit kompensieren, dass man die AT-Sicht auf WORD setzt. Dann sollte der Vergleich und die Sicht auf alle Fälle funktionieren ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieso nicht in SCL?

Code:
FOR #counter := 0 TO 10 DO
  IF #"1stArray"[#counter] XOR #"2ndArray"[#counter]
  THEN #NotEqual := True;
       #Element := #counter;
  ELSE #NotEqual := False;
       #Element := 0;
  END_IF;
END_FOR;

Wenn Du mehr als eine Abweichung erwartest kannst anstatt des Bools ja eine Array der Abweichungen ausgeben.
Wenn Du Flanken auswerten willst rufst den Vergleich am besten am Ende des OB1 auf.
 
Zuletzt bearbeitet:
Zurück
Oben