vierlagig
Level-1
- Beiträge
- 9.882
- Reaktionspunkte
- 2.021
-> Hier kostenlos registrieren
klar larry, für dich immer ...
also erstmal der baustein, der im OB35 alle 10ms aufgerufen wird
im excel sieht das dann wie im anhang aus.
es ist weder bugfrei noch ausführlich getestet geschweigedenn besonders schön, gerade der VBA-teil ist überarbeitungsbedürftig, hab es wie gesagt nur schnell zusammengeschustert
also erstmal der baustein, der im OB35 alle 10ms aufgerufen wird
Code:
*
FUNCTION_BLOCK "Kurvenschreiber"
TITLE =
//Kurvenschreiber
//
//Aurufumgebung: Weckalarm OB mit 10ms
//Interface: EXCEL, Visu, other direkt auf IDB
//
//Dieser Baustein erstellt nach einem Startimpuls einen Datenbaustein mit aus
//Aufzeichnungsdauer und Stützpunktanzahl berechneter Länge. Der Datenbaustein
//wird mit den Daten des angegebenen MD gefüllt.
//
//Es können max. 10 DB angelegt werden. Bevor eine neue Messung gestartet werden
//kann, müssen diese 10 DB gelöscht werden.
//
//DATE: 19.05.2008
//AUTHOR: 4lagig
//VERSION: V0.1
AUTHOR : '4lagig'
VERSION : 0.1
VAR
xInStart : BOOL ; //Aufzeichnung starten
xInDeleteDb : BOOL ; //Datenbausteine löschen
xOutOnAir : BOOL ; //Aufzeichnung läuft
xDbOverflow : BOOL ; //10 DBs angelegt
xHelpFlag1 : BOOL ;
xHelpFlag2 : BOOL ;
iInMdNumber : INT ; //Aufzuzeichnendes Doppelwort
iInTimeStamp : INT ; //Auflösung
iInTimeWriting : DINT ; //Aufzeichnungsdauer in ms
wDbNumber : WORD ; //Nummer des erstellten DB
wDbLength : WORD ; //Länge des erstellten DB
iCreateReturn : INT ;
iDataCounter : INT ; //Adressierungszähler
iCycleTimes : INT ; //Aufzeichnungshäufigkeit
iCycleCounter : INT ; //Aufzeichnungszähler
iDelReturn : INT ;
wBuffer0 : WORD ;
wBuffer1 : WORD ;
wBuffer2 : WORD ;
wBuffer3 : WORD ;
wBuffer4 : WORD ;
wBuffer5 : WORD ;
wBuffer6 : WORD ;
wBuffer7 : WORD ;
wBuffer8 : WORD ;
wBuffer9 : WORD ;
iDbCounter : INT ; //erstellte DBs zählen
END_VAR
VAR_TEMP
wDbNumberTemp : WORD ; //Datenbausteinnummer zur Weiterverarbeitung
dMdNumber : DWORD ; //Merkerdoppelwortnummer zur Weiterverarbeitung
dAr1Save : DWORD ; //AR1
dAr2Save : DWORD ; //AR2
wDbnoSave : WORD ; //letzter globaldaten DB
iLoop : INT ; //Schleifenzähler
END_VAR
BEGIN
NETWORK
TITLE =
// ---------> Interrupt-Daten sichern <--------- //
L DBNO; // letzten offenen Globaldatenbaustein ...
T #wDbnoSave; // ... sichern
TAR1 #dAr1Save; // AR1 sichern
TAR2 #dAr2Save; // AR2 sichern
// --------> Startbedingungen ermitteln <------- //
U #xOutOnAir; // Aufzeichnung läuft bereits
SPB log; // dann aufzeichnen
U #xInStart; // Startimpuls
FP #xHelpFlag1;
UN #xDbOverflow; // bereits 10 Aufzeichnungen gemacht
SPBN late; // neuer DB oder Möglichkeit zu löschen
// -------> Datenbausteinnummer prüfen <-------- //
L #wBuffer9; // der letzte Pufferplatz
L 0; // ungleich 0
<>I ; // heißt 10 DBs angelegt
O ; // oder
L #iDbCounter; // der DB-Zähler
L 10; // ist auf 10
==I ;
SPBN go; // wenn noch Platz ist, ist alles i.O.
S #xDbOverflow; // 10-DBs angelegt
SPA late; // maximale Anzahl erreicht, erst löschen
// ------> Datenbausteinlänge ermitteln <------ //
go: L #iInTimeWriting; // Länge der Aufzeichnung
L #iInTimeStamp; // Trigger 10, 20, 30, ... 100ms ...
/I ; // = Anzahl der Aufzuzeichnenden Werte
L 4; // REAL in Bytes ...
*I ; // ...Anpassung
+ 4; // Kopfdaten 2*INT
T #wDbLength; // Datenbausteinlänge
// ----------> Datenbaustein erzeugen <--------- //
CALL "CREAT_DB" (
LOW_LIMIT := W#16#1,// Bereich der DB-Nummer
UP_LIMIT := W#16#FF,// angeben
COUNT := #wDbLength,// Länge übergeben
RET_VAL := #iCreateReturn,// Fehlercode
DB_NUMBER := #wDbNumber);// DB Nummer zur weiterbearbeitung
// --------> Datenbausteinnr. ablegen <--------- //
L #wBuffer8; // shift-Register begin...
T #wBuffer9; //
L #wBuffer7; //
T #wBuffer8; //
L #wBuffer6; //
T #wBuffer7; //
L #wBuffer5; //
T #wBuffer6; //
L #wBuffer4; //
T #wBuffer5; //
L #wBuffer3; //
T #wBuffer4; //
L #wBuffer2; //
T #wBuffer3; //
L #wBuffer1; //
T #wBuffer2; //
L #wBuffer0; //
T #wBuffer1; //
L #wDbNumber; //
T #wBuffer0; // ... end
L #iDbCounter; // DB-Zähler
+ 1; //
T #iDbCounter; // inkrementieren
// -------------> Initialisierung <------------- //
L 0; // 0
T #iDataCounter; // für den Wertezähler
L 0; // 0
T #iCycleCounter; // für Aufzeichnungszähler
L #iInTimeStamp; // Trigger 10, 20, 30, ... 100ms ...
L 10; // 10
/I ; // dividiert
T #iCycleTimes; // macht die Pausen
L #wDbLength; // verfügbarer Speicherplatz
+ -4; // -4
T #wDbLength; // macht Adressierung
SET ; // 1
S #xOutOnAir; // für Aufzeichnung läuft
// -------------> Kopf schreiben <-------------- //
L #wDbNumber; // DB-Adresse
T #wDbNumberTemp; // für Weiterverarbeitung
L #iDataCounter; // Adressierungszähler
SLD 3; // Bits maskieren
LAR1 ; // in AR1 laden
AUF DB [#wDbNumberTemp]; // DB öffnen
L #wDbLength; // DB Länge Nutzdaten
T DBW [AR1,P#0.0]; // in DB schreiben
L #iInTimeStamp; // Auflösung
T DBW [AR1,P#2.0]; // in DB schreiben
L #iDataCounter; // Adressierung
+ 4; // um vier
T #iDataCounter; // erhöhen
// --------------> Daten erfassen <------------- //
log: U #xOutOnAir; // Aufzeichnung läuft
SPBN late; //
L #iCycleCounter; // Aufzeichnungszähler
L 1;
+I ; // inkrementieren
T #iCycleCounter;
L #iCycleCounter;
L #iCycleTimes; // mit Soll
==I ; // vergleichen
SPBN late; // wenn nich, dann nich
L 0; // wenn doch, dann 0
T #iCycleCounter; // in Aufzeichnungszähler
L #wDbNumber; // DB-Adresse
T #wDbNumberTemp; // für Weiterverarbeitung
L #iInMdNumber; // MD-Adresse
SLD 3;
T #dMdNumber; // für Weiterverarbeitung
L #iDataCounter; // Adressierungszähler
SLD 3; // Bits maskieren
LAR1 ; // in AR1 laden
AUF DB [#wDbNumberTemp]; // DB öffnen
L MD [#dMdNumber]; // Wert
T DBD [AR1,P#0.0]; // in DB schreiben
L #iDataCounter; // Adressierung
+ 4; // um vier
T #iDataCounter; // erhöhen
L #wDbLength;
L #iDataCounter; // mit Adressierungszähler
<=I ; // vergleichen
SPBN late;
R #xOutOnAir; // Aufzeichnung beendet
// ---------> Datenbausteine löschen <---------- //
late: U #xInDeleteDb; // löschen angefordert
FP #xHelpFlag2;
UN #xOutOnAir; // und keine Aufzeichnung aktiv
SPBN end;
L 10; // max. angelegte DBs
next: T #iLoop; // als Schleifenzähler benutzen
L #wBuffer0; // DB-Adresse auf 0 prüfen
L 0;
==I ; // wenn 0 (=ungültige DB-Adresse)
SPB shif; // löschen überspringen
CALL "DEL_DB" (// Datenbaustein löschen
DB_NUMBER := #wBuffer0,
RET_VAL := #iDelReturn);
shif: L #wBuffer1; // shift-Register begin...
T #wBuffer0; //
L #wBuffer2; //
T #wBuffer1; //
L #wBuffer3; //
T #wBuffer2; //
L #wBuffer4; //
T #wBuffer3; //
L #wBuffer5; //
T #wBuffer4; //
L #wBuffer6; //
T #wBuffer5; //
L #wBuffer6; //
T #wBuffer7; //
L #wBuffer7; //
T #wBuffer8; //
L #wBuffer9; //
T #wBuffer9; //
L 0; //
T #wBuffer9; // ... end
L #iLoop;
LOOP next;
SET ;
R #xDbOverflow; // max-Bit rücksetzen
L 0;
T #iDbCounter; // Datenbausteinzähler zurücksetzen
// -------------> Schlußbehandlung <------------ //
end: LAR1 #dAr1Save; // AR1 rücksichern
LAR2 #dAr2Save; // AR2 rücksichern
AUF DB [#wDbnoSave]; // letzten Globaldatenbaustein öffnen
SET ;
SAVE ; // EN0 eins machen
BE ;
END_FUNCTION_BLOCK
es ist weder bugfrei noch ausführlich getestet geschweigedenn besonders schön, gerade der VBA-teil ist überarbeitungsbedürftig, hab es wie gesagt nur schnell zusammengeschustert
Anhänge
Zuletzt bearbeitet: