- Beiträge
- 14.426
- Reaktionspunkte
- 3.282
-> Hier kostenlos registrieren
...............NEIN! ... Doch! .... oooooohhhhh-mmmmhhh
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: This feature may not be available in some browsers.
...............NEIN! ... Doch! .... oooooohhhhh-mmmmhhh
hDatenQuelle : ANY ;
xDatenQuelle AT hDatenQuelle : STRUCT
ID_Code : BYTE ; // 10h für S7
DataTyp : BYTE ;
Anzahl : WORD ;
DB_Nr : WORD ;
SpeicherPtr : DWORD ;
END_STRUCT ;
Also neuer Versuch :eine Variable vom Typ ANY anlegen, eine AT-Sicht, wie oben dargestellt darauf machen, und die gewünschten Inhalte in die AT-Sicht schreiben. Anschließend die ursprüngliche ANY-Variable für den Baustein verwenden ...Code:hDatenQuelle : ANY ; xDatenQuelle AT hDatenQuelle : STRUCT ID_Code : BYTE ; // 10h für S7 DataTyp : BYTE ; Anzahl : WORD ; DB_Nr : WORD ; SpeicherPtr : DWORD ; END_STRUCT ;
Gruß
Larry
Naja ... man könnte ja die AT-Sicht auch anders aussehen lassen und das letzte DWORD dann anders auflösen - oder eine 2. AT-Sicht auf die gleiche Datenquelle machen ...
yDatenQuelle AT hDatenQuelle : STRUCT
ID_Code : BYTE ; // 10h für S7
DataTyp : BYTE ;
Anzahl : WORD ;
DB_Nr : WORD ;
Speicherbereich : ARRAY [0..3] OF BYTE ;
END_STRUCT ;
... ich schrieb ja von einer 2. AT-Sicht - die könnte dann z.B. so aussehen :GrußCode:yDatenQuelle AT hDatenQuelle : STRUCT ID_Code : BYTE ; // 10h für S7 DataTyp : BYTE ; Anzahl : WORD ; DB_Nr : WORD ; Speicherbereich : ARRAY [0..3] OF BYTE ; END_STRUCT ;
Larry
Adress2:=SHL(IN:=INT_TO_DWORD(Adress1),N:=3);
OUT1:=Adress2 AND dw#16#84000000;
DWORD_TO_INT(dw#16#84000000);
Das habe ich mir auch schon überlegt aber die Anweisund
Klapt nicht des halb dachte ich mit dem OR geht das wie unter FUP mit dem Befehl WOR_DW aber den Zahn kann ich mir wohl ziehn...Code:DWORD_TO_[SIZE=5][COLOR=#FF0000][B]D[/B][/COLOR][/SIZE]INT(dw#16#84000000);
Wenn man in SCL Bytes, Words oder DWs mit "AND" oder "OR" verknüpft, wird die Verknüpfung bitweise durchgeführt und das Ergebnis ist ein Byte, Word oder DW.OR funktioniert an der Stelle nicht! Ergebnis von AND und OR sind jeweils Bits.
Wenn man in SCL Bytes, Words oder DWs mit "AND" oder "OR" verknüpft, wird die Verknüpfung bitweise durchgeführt und das Ergebnis ist ein Byte, Word oder DW.
Gruß
Erich
Das Ergebnis des Ausdrucks ist entweder TRUE oder FALSE bei der
Verknüpfung von booleschen Operanden oder ein Bitmuster nach der Bitverknüpfung
zwischen den beiden Operanden.
In dieser Anwendung: Ja!...Addition geht aber trotzdem auch
FUNCTION_BLOCK FB30
VAR_INPUT
GD:INT; //Größe pro Datensatz in Bayte.
AD:INT; //Anzahl der Datensätze
S:BOOL; //POS. Flanke zum Schiben.
DB_Nr:INT; //Nummer des DBs der erschtellt werden soll.
DB_er:BOOL; //DB erstellen POS. Flanke
DATA:ANY; //Pointer auf die Daten
END_VAR
VAR
G:WORD; //Gesamtgröße
DB_erstellt:BOOL; //DB ist bereits erstellt.
Schieben:BOOL; //Schieben läuft.
ND:INT; //Nächster Datesatz. Zum Schieben.
ND_DWORD:DWORD; //Nächster Datesatz. Zum Schieben als DWORD
NZ:INT; //Nächstes Ziel beim Schieben.
NZ_DWORD:DWORD; //Nächstes Ziel beim Schieben als DWORD
DUMY_Nr:WORD; //Nummer Des Erstellten DBs.
SFC22_INT:INT; //Rückgabe Wert DB Erstellem
BLKMOV_INT:INT; //Rückgabe Wert Block Move.
END_VAR
VAR_OUTPUT
// Hife VAR zur Diagnose
OUT1:INT;
OUT2:DWORD;
OUT3:DWORD;
OUT4:DWORD;
END_VAR
VAR_TEMP
// Struckturen für beide ANY Pointer
Quelle: STRUCT // Queladresse für Block Move
ANY_id: BYTE;
DataType: BYTE;
Laenge: WORD;
DB_Nr: WORD;
Byte_Pointer: DWORD;
END_STRUCT;
Ziel: STRUCT // Ziel Adresse für Block Move
ANY_id: BYTE;
DataType: BYTE;
Laenge:WORD;
DB_Nr:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
// Zuweisen des Structes auf den ANY Pointer
Quelle_ANY AT Quelle:ANY;
Ziel_ANY AT Ziel:ANY;
END_VAR
IF DB_er THEN
G:=INT_TO_WORD(GD*AD); //Errechnen der Gesamten Größe des DBs.
//Erstellen des Datenbausteines mit Hilfe des SFC22.
SFC22_INT:=CREAT_DB(LOW_LIMIT := INT_TO_WORD(DB_Nr) // IN: WORD
,UP_LIMIT := INT_TO_WORD(DB_Nr) // IN: WORD
,COUNT := G // IN: WORD
,DB_NUMBER := DUMY_Nr // OUT: WORD
); // INT
ELSE
IF WORD_TO_INT(DUMY_Nr) > 0 THEN //Ermitteln ob der DB erstellt wurde.
DB_erstellt:=TRUE;
END_IF;
IF DB_erstellt & S THEN
//Berechnen der Adresse des Ersten zu schiebenden Datensatzes
ND:=WORD_TO_INT(G)-(2*GD);
//Berechnen der Adresse des Ersten zu schiebenden Zieles
NZ:=WORD_TO_INT(G)-(GD);
//Zusammen setzen des Quell Pointers
ND_DWORD:=SHL(IN:=INT_TO_DWORD(ND),N:=3); //Schiebe Wert ND um 3 Stellen nach Links.
ND_DWORD:= ND_DWORD OR 16#84000000; // Ergenzen des Wertes 16#84000000 dies steht für Datenbaustein
//Zusammen setzen des Ziel Pointers
NZ_DWORD:=SHL(IN:=INT_TO_DWORD(NZ),N:=3); //Schiebe Wert NZ um 3 Stellen nach Links.
NZ_DWORD:= NZ_DWORD OR dw#16#84000000; // Ergenzen des Wertes 16#84000000 dies steht für Datenbaustein
//Zusammen Setzen des Quell ANY Pointers.
Quelle.ANY_id:=16#10;
Quelle.DataType:=16#2;
Quelle.Laenge:=INT_TO_WORD(GD);
Quelle.DB_Nr:=DUMY_Nr;
Quelle.Byte_Pointer:= ND_DWORD ;
Out2:=ND_DWORD;
//Zusammen Setzen des Ziel ANY Pointers.
Ziel.ANY_id:=16#10;
Ziel.DataType:=16#2;
Ziel.Laenge:=INT_TO_WORD(GD);
Ziel.DB_Nr:=DUMY_Nr;
Ziel.Byte_Pointer:= NZ_DWORD ;
Out3:=NZ_DWORD;
WHILE ND >= 0 DO // Schleife beenden wen alle werte geschoben wurden.
//Schieben der Werte mit Block Move.
BLKMOV_INT:= BLKMOV(SRCBLK := Quelle_ANY // IN: ANY
,DSTBLK := Ziel_ANY // OUT: ANY
); // INT
// Errechnen der nächste Quell und Ziel Adresse.
ND:=ND-GD;
NZ:=NZ-GD;
//Zusammen setzen des Quell Pointers
ND_DWORD:=SHL(IN:=INT_TO_DWORD(ND),N:=3);
ND_DWORD:= ND_DWORD OR dw#16#84000000;
//Zusammen setzen des Ziel Pointers
NZ_DWORD:=SHL(IN:=INT_TO_DWORD(NZ),N:=3);
NZ_DWORD:= NZ_DWORD OR dw#16#84000000;
//Werte in den ermitttelten werte in den ANY Pointer übertragen.
Quelle.Byte_Pointer:= ND_DWORD ;
Ziel.Byte_Pointer:= NZ_DWORD ;
;
END_WHILE;
//Neu Werte auf die erste Adresse Setzen.
Ziel.Byte_Pointer:=dw#16#84000000;
BLKMOV_INT:= BLKMOV(SRCBLK := DATA // IN: ANY
,DSTBLK := Ziel_ANY // OUT: ANY
); // INT
ELSE
;//ENDE!
END_IF;
END_IF;
;
END_FUNCTION_BLOCK
Eine weitere Funktion die ich noch einbauen will ist wen der Befehl kommt DB erstellen der Allte DB wenn vorhanden gelöscht wird. Und das Ausgeben eines Belibigen Datensatzes.
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