TIA Vorlage für BITSUM für beliebige (nicht optimierte)DB als SCL Quelle

Beiträge
3.045
Reaktionspunkte
1.024
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

Die letzte Zeit war ich nur stille Mit-Leser.
Arbeit ohne Ende gehabt.

Jetzt hab ich was Zeit um Rest-AWL programmteilen um zu schreiben nach SCL.
Wir hatten in AWL eine Bitsumme für DB's. Nach online Suche hab ich gesehen das solche Funktionen es nicht Standard in de Bibliothek und SCL gibt und Mann sich selbst etwas ausdenken (oder zusammenreimen) muss.

Für derjenigen die es mal braucht:
Bei diese meine Quelle zum BITSUM auf Basis von ATTR_DB und FOR Schleife.

Code:
  FUNCTION_BLOCK "BITSUM"
TITLE = BITSUM
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : 'v.Berkel'
VERSION : 0.1
   VAR_INPUT 
      DB_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DB_ANY;
   END_VAR
   VAR_OUTPUT 
      "Bits > 0" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
      Anzahl_Bits { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
   END_VAR
   VAR 
      Attrib { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte;
      DB_Länge { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : UDInt;
      Retval { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
      Zählwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
      Zählwert_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
      Zählwert_ende { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
   END_VAR

BEGIN
 #Retval := ATTR_DB(REQ := true, DB_NUMBER := #DB_IN, DB_LENGTH => #DB_Länge, ATTRIB => #Attrib);
 
 #Anzahl_Bits := 0;
 #Zählwert_start := 0;
 #Zählwert_ende  := (UDINT_TO_INT(#DB_Länge) - 1);
 
 FOR #Zählwert := #Zählwert_start TO #Zählwert_ende DO
     #Anzahl_Bits := #Anzahl_Bits + BITSUM(BYTE_TO_DWORD(PEEK(area := 16#84, dbNumber := #DB_IN, byteOffset := #Zählwert)));
 END_FOR;
 
 #"Bits > 0" := #Anzahl_Bits > 0;
END_FUNCTION_BLOCK

Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bram,

ein FB der sich rekursiv aufruft? Funktioniert das wirklich? Warum ist das überhaupt ein FB?

Gruß, Onkel

Also das hab ich auch gerade gesehen und mich gewundert.
Es gibt irgendwo bei Classic in der TI-S7-Bliblothek einen FC BITSUM, der die Bits in einem DWORD zählt.
Das könnte der Aufruf im FB sein. Aber dann passt eigentlich das Symbol des FBs nicht.

Gruß
Blockmove
 
Hallo Onkel,

Ja, wenn eine drin ist, dies Funktioniert. Wo wäre dann aber der Rekursive Aufruf. Ich sehe ihm nicht.

FB aus dem Grund das ich ganz gerne auf die OUT Schnittstelle des FB's zurückgreife ins Programm. (Ja ist auch was von zu sagen ..)

Bram
 
Zurück
Oben