A
L #Offset_Device // Offset laden (Device Bereich)
SLD 3 // um 3 nach links schieben um Zeigerstruktur zu erzeugen
FOR I := 1 TO Anzahl DO
Wert := "TestDB".Prog[I].bond_contr_Win_1_Value_1;
END_FOR;
SET
SAVE
= L 6.1
L #Anzahl
L 1
T #I
TAK
T LW 8
TAK
A7d0: L #I
L LW 8
<=I
SPBN A7d1
L #I
ITD
L L#-1
+D
L L#480
*D
L L#32
+D
LAR1
AUF "TestDB"
L DBW [AR1,P#0.0]
ITD
T #Wert
L #I
L 1
+I
T #I
SPA A7d0
A7d1: L 100
T #RET_VAL
CLR
U L 6.1
SAVE
BE
TYPE "UDT_DATENSATZ"
VERSION : 0.1
STRUCT
MOTORSTROM : INT ; //Beispiel Motorstrom
MOTORSPANNUNG : INT ; //Beispiel Motorspannung
DREHZAHL : INT ; //Beispiel Drehzahl
RESERVE : INT ; //UDT bis zu einer Doppelwortgrenze auffüllen (macht das Kopieren einfacher)
END_STRUCT ;
END_TYPE
DATA_BLOCK "DB_PARAMETER"
TITLE =
VERSION : 0.1
STRUCT
PARAMETERSATZ : ARRAY [1 .. 35 ] OF "UDT_DATENSATZ";
END_STRUCT ;
BEGIN
PARAMETERSATZ[1].MOTORSTROM := 0;
PARAMETERSATZ[1].MOTORSPANNUNG := 0;
PARAMETERSATZ[1].DREHZAHL := 0;
PARAMETERSATZ[1].RESERVE := 0;
PARAMETERSATZ[2].MOTORSTROM := 0;
PARAMETERSATZ[2].MOTORSPANNUNG := 0;
....usw
END_DATA_BLOCK
FUNCTION FC 2005 : INT
TITLE =
//ACHTUNG:
//So wie hier geschrieben funktioniert es nur in einer FC, NICHT in einem FB
AUTHOR : Onkel
VERSION : 0.1
VAR_INPUT
DATENBANK : ANY ; //Datenbereich der in dem die Parametersätze abgelegt sind
DATENSATZ : INT ; //Nummer des zu bearbeitenden Parametersatzes
END_VAR
VAR_TEMP
P : "UDT_DATENSATZ";
AR1_TEMP : DWORD ;
AR2_AKT_DATENSATZ : DWORD ;
TEMP_INT : WORD ;
TEMP_DINT : DWORD ;
LOOP : INT ;
LAENGE_UDT : INT ; //Länge des Parametersatzes [DWORD]
DB_UDT : INT ; //Nummer des DB [INT]
STARTADRESSE : DWORD ; //Startadresse im DB == 1. Datensatz
END_VAR
BEGIN
NETWORK
TITLE =
//*** AR1 sichern
TAR1 #AR1_TEMP;
SET ;
SAVE ;
//*** Ergebnisse initialisieren
L B#16#0;
T #RET_VAL;
//*** AR2 auf Datenbereich im DB
L P##DATENBANK;
LAR2 ;
//*** ANY-Ponter "zerlegen"
//*** wir brauchen nur die DB-Nr und Länge des UDT (Anzahl DWORD)
//*** sowie die Startadresse im DB (Bereichszeiger)
L B [AR2,P#0.0]; // Syntax-ID, bei S7 immer 10hex
L B [AR2,P#1.0]; // Datentyp (muss in diesem Bsp. DWORD sein)
L W [AR2,P#2.0]; // Anzahl von "Datentyp" == Länge des UDT (Anzahl DWORD) [INT]
T #LAENGE_UDT; // temporär ablegen
L W [AR2,P#4.0]; // Nummer des DB [INT]
T #DB_UDT; // temporär ablegen
L D [AR2,P#6.0]; // Bereichszeiger == Startadresse
T #STARTADRESSE; // Startadresse im DB == 1. Datensatz
//*** Prüfe, ob DATENBEREICH vom Typ=Doppelwort
// Zur Vereinfachung haben wir vorausgesetzt, das der Datentyp DWORD ist.
// Anderenfalls müssten beim nachfolgendem Kopieren Fallunterscheidungen
// getroffen werden - das ersparen wir uns.
L B [AR2,P#1.0]; // Datentyp (muss in diesem Bsp. DWORD sein)
L B#16#6; // 06hex == DWORD
==I ;
L 1; // Fehler 1: DATENBEREICH nicht vom Typ DWord
SPBN ERR; // !!! Baustein bei Parameterfehler beenden !!!
//*** Datenbank-DB öffnen und Adressregister AR2 auf Bereichszeiger
AUF DB [#DB_UDT]; // DB öffnen
L #STARTADRESSE; // Bereichszeiger == Startadresse 1. Datensatz
LAR2 ; // DATENBEREICH
//*** Offset des aktuellen Datensatzes zu AR2 addieren
L #DATENSATZ; // Nummer des aktuellen Datensatzes (1..n) [INT]
L 1; // beim 1. Datensatz ist Offset=0
-I ; // Nummer des aktuellen Datensatzes (0..n-1) [INT]
// Länge des UDT in BIT umrechnen, ohne Akku 2 zu verändern
L #LAENGE_UDT; // Länge des UDT (Anzahl DWORD) [INT]
SLW 5; // Länge des UDT (Anzahl BIT), (SLW 5 == *32)
// Länge des UDT mit aktueller (Datensatznummer-1) multiplizieren
*I ;
// Offset [BIT] zu AR2 addieren
+AR2 ; // AR2 zeigt jetzt auf aktuellen Datensatz im DB
//*** AR2 für späteres Zurückkopieren zwischenspeichern
TAR2 #AR2_AKT_DATENSATZ;
//*** AR1 auf Datenbereich in Lokaldaten
L P##P;
LAR1 ; // AR1 zeigt jetzt auf Datensatz in Lokaldaten
//*** Datensatz aus DB in temporäre Lokaldaten kopieren
L #LAENGE_UDT; // Länge des UDT (Anzahl DWORD)
LOO1: T #TEMP_INT;
L DBD [AR2,P#0.0];
T D [AR1,P#0.0];
+AR1 P#4.0;
+AR2 P#4.0;
L #TEMP_INT;
LOOP LOO1;
//***************************************************************************************************
// Ab hier steht die Kopie des Datensatzes in den temporären Lokaldaten und kann bearbeitet werden
//***************************************************************************************************
L #DATENSATZ; // Nr. des akt. Datensatzes
// Hier könnten u.a. auch Bausteine aufgerufen werden, denen ein Pointer auf die Lokaldaten dieses
// Bausteins übergeben wird ;-)
//*** Sinnloses Beispiel
CALL "BLKMOV" (
SRCBLK := #P,// Pointer auf akt. Datensatz in den Lokaldaten
RET_VAL := MW 2000,
DSTBLK := P#DB2005.DBX 0.0 DWORD 2);
//*** Normaler Zugriff
L #P.MOTORSTROM; // zugehörige Parameter
L #P.MOTORSPANNUNG;
L #P.DREHZAHL;
L 100;
T #P.MOTORSTROM; // zugehörige Parameter
L 200;
T #P.MOTORSPANNUNG;
//***************************************************************************************************
// Nach der Bearbeitung müssen die Daten in den DB zurück kopiert werden (falls sie verändert wurden)
//***************************************************************************************************
//*** AR1 auf Datenbereich in Lokaldaten
L P##P;
LAR1 ; // AR1 zeigt jetzt auf Datensatz in Lokaldaten
//*** AR2 auf aktuellen Datensatz im DB
LAR2 #AR2_AKT_DATENSATZ; // AR2 zeigt jetzt auf akt. Datensatz im DB
//*** falls DB-Register verändert wurde, DB erneut öffnen
AUF DB [#DB_UDT]; // DB öffnen
//*** Lokalen Datensatz in den DB zurück kopieren
L #LAENGE_UDT; // Länge des UDT (Anzahl DWORD)
LOO2: T #TEMP_INT;
L D [AR1,P#0.0];
T DBD [AR2,P#0.0];
+AR1 P#4.0;
+AR2 P#4.0;
L #TEMP_INT;
LOOP LOO2;
//***************************************************************************************************
// Ende
//***************************************************************************************************
//*** AR1-Register wiederherstellen
LAR1 #AR1_TEMP;
BEA ;
//*** Fehler
ERR: T #RET_VAL;
//*** AR1-Register wiederherstellen
LAR1 #AR1_TEMP;
BE ;
END_FUNCTION
CALL FC 2005 (
DATENBANK := P#DB2005.DBX 0.0 DWORD 2,
DATENSATZ := 10,
RET_VAL := MW 2000);
CALL FC 2005
DATENBANK:="DB_PARAMETER".PARAMETERSATZ[1]
DATENSATZ:=10
RET_VAL :=MW2000
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?