- Beiträge
- 27.876
- Reaktionspunkte
- 10.951
-> Hier kostenlos registrieren
Ja, ich war da gedanklich irgendwie woanders. Es geht natürlich nichtScheint trotzdem nicht zu funktionieren.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Ja, ich war da gedanklich irgendwie woanders. Es geht natürlich nichtScheint trotzdem nicht zu funktionieren.
FUNCTION_BLOCK "Bitsumme"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
DBNR : Int;
END_VAR
VAR_OUTPUT
Anzahl_Bits : DInt;
END_VAR
VAR_TEMP
DBNR_t : Int;
Pointer_daten_bit_t : DWord;
SchleifenZaehler_T : DInt;
Bitzaehler_t : DInt;
END_VAR
BEGIN
NETWORK
TITLE =
L #DBNR ;//Indirektes Öffenen des Datenbausteines über In Parameter
T #DBNR_t;
AUF DB[ #DBNR_t];
//******************************************************************************** ***********
LAR1 P#0.0 ;//Initialisierung des Datenbitpointers
//******************************************************************************** ***********
L DINT#0 ;//Initialisierung des Bitzaehlers
T #Bitzaehler_t;
//******************************************************************************** ***********
L DBLG ;//auslesen der Datenbausteinlänge in Byte
L DINT#8 ;//multiplikationfaktor Byte nach Bit
*D;
next: T #SchleifenZaehler_T ;//Vorspannen des Schleifenzaehlers in DINT,da die Schleife grösser als 32767 sein Könnte
CLR ;//Erzwingen VKE=0
U DBX[ AR1, P#0.0];
SPBN m001 ;//wenn Bit=0 Springe
L DINT#1 ;//Zaehlen wenn ein Bit=1
L #Bitzaehler_t;
+D;
T #Bitzaehler_t;
m001: +AR1 P#0.1 ;//Pointererhöhung für nächsten Schleifendurchlau
L #SchleifenZaehler_T ;//dekrementierung SchleifenZaehler_T um 1
L DINT#1;
-D;
L DINT#1;
>=D;
SPB nex2 ;// Rücksprung in Schleife wenn noch nicht alle Bits des DB auf 1 Geprüft
SPA m002;
nex2: TAK;
SPA next;
m002: NOP 0;
//******************************************************************************** ***********
L #Bitzaehler_t ;// Übergabe der Temporär gezaehlten 1=Bit an Output
T #Anzahl_Bits;
END_FUNCTION_BLOCK
FUNCTION_BLOCK "BITSUM"
TITLE = BITSUM
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : 'v.Berkel'
FAMILY : Algemein
VERSION : 16.0
//BITSUM from any DB
VAR_INPUT
DB_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DB_ANY; // Any DB
END_VAR
VAR_OUTPUT
"Bits SET > 0" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // More then 0 Bits SET
"Number_of_Bits SET" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Number of SET Bits
END_VAR
VAR
Attribute_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Attribute of DB
DB_Length { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : UDInt; // Length of DB
Retval { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Return value
Countvalue { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Countvalue
Countvalue_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Countvalue_start
Countvalue_end { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Countvalue_end
END_VAR
BEGIN
#Retval := ATTR_DB(REQ := true, DB_NUMBER := #DB_IN, DB_LENGTH => #DB_Length, ATTRIB => #Attribute_DB);
#"Number_of_Bits SET" := 0;
#Countvalue_start := 0;
#Countvalue_end := (UDINT_TO_INT(#DB_Length) - 1);
FOR #Countvalue := #Countvalue_start TO #Countvalue_end DO
#"Number_of_Bits SET" := #"Number_of_Bits SET" + BITSUM(BYTE_TO_DWORD(PEEK(area := 16#84, dbNumber := #DB_IN, byteOffset := #Countvalue)));
END_FOR;
#"Bits SET > 0" := #"Number_of_Bits SET" > 0;
END_FUNCTION_BLOCK
Die Syntax "...DBD0" ist falsch. Vielleicht klärst Du uns mal auf welche SPS Du verwendest oder schaust selber in der TIA-Hilfe nach der richtigen Syntax für den direkten Zugriff auf DB-Doppelworte. In S7-300/400 musst (oder musstest) Du schreiben "...DD0" und in S7-1200/1500 (oder generell in TIA?) musst Du PEEK() verwenden.Ich habe allerdings das Problem, dass er den Zugriff auf das Doppelwort nicht zulassen möchte?
Anhang anzeigen 59544
So musste das in SCL classic geschrieben werden. In TIA-SCL wurde die Syntax geändert, da gilt diese Schreibweise nicht, sondern muß "irgendwie" anders geschrieben werden.DD0 in einer 300/400ér? Das habe ich noch nie gehört.
Mein Beispiel ist aus TIA ( DD wird hier nicht akzeptiert ):In TIA-SCL wurde die Syntax geändert, da gilt diese Schreibweise nicht, sondern muß "irgendwie" anders geschrieben werden.


Offiziell dokumentiert ist meines Wissens nur die Variante DD. Das DBD wurde vielleicht irgendwann mal undokumentiert eingebaut, vielleicht weil der Support zu oft genervt wurde von Programmierern die die Dokumentation nicht lesen (können)?Ok, in Step7 Classic schluckt der Compiler beides ( das DD war mir tatsächlich unbekannt )
Wie gesagt, ich kenne es nicht anders als DBD. Vermutlich weil ich aus der AWL Ecke komme. DD gehört für meinen Wissensstand zur S5.Offiziell dokumentiert ist meines Wissens nur die Variante DD. Das DBD wurde vielleicht irgendwann mal undokumentiert eingebaut, vielleicht weil der Support zu oft genervt wurde von Programmierern die die Dokumentation nicht lesen (können)?
Harald
Falsch. Slice-Zugriff ist ein Zugriff auf Teil-Bereiche einer Variable. Du willst aber absolut adressiert auf einen Speicherbereich zugreifen, in dem mehrere Variablen liegen.Ein passendes Stichwort wäre "Slice-Zugriff"
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen