DB automatisch mit Werte füllen

Potenzial

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch mal Hallo an alle! (( =

Habe hier vor ein paar Tagen einen Thread gesehen in dem es drum ging einen DB automatisch zufüllen, finde diesen leider nicht mehr... =//

Ich habe vor einen DB (DB11) bei Anlauf der SPS (Neustart / Warmstart,...) Automatisch über einen FC(FC41) füllen zulassen.

Habe schon was zusammengeschrieben, finde nach 2-4 Stunde finde ich habe ich wieder mal keinen Ansatz woran es liegen könnte!?
Daher wäre es nett, wenn Jemand noch mal drüber schaut! (( =

Und weiterhin vorab, ja habe es evtl. mit den Kommentaren übertrieben! ((; Und nicht jeder Kommentar trifft noch zu!




[FONT=&quot]Soweit erst mal danke an Alle! [ =

PS:
Wie kann man einen OB/FB/FC in Step7 So "heraus kopieren"?
Mache das z.Z. über WIN-SPS... =//

[/FONT]
Code:
FUNCTION FC41:VOID 
TITLE= 
 
 
AUTHOR:nb
FAMILY:nb
NAME:nb
VERSION:00.01 
 
 
 
 
 
VAR_TEMP 
       tSensor:UDT11;
       tZielDBXANYP:ANY;
       tSensorANYP:ANY;
       tSchrittWW:WORD;
       tStartAdrZielDbW:WORD;
       tStopBgKAdrINT:INT;
       tAnzLOOPsW:WORD;
       tRetValSFC20INT:INT;
       tBgKAdrINT:INT;
       tStartBgKAdrINT:INT;
       tSensorNrINT:INT;
       tSchrittWBgKAdrINT:INT;
       tZielDBNrW:WORD;
END_VAR 
BEGIN 
 
NETWORK
TITLE= 

 
//*****************************************************************************************// 
//*****************************************************************************************// 
// Tämporäre Globale Deklation 
//*****************************************************************************************// 
 
       L    W#16#000B;                   // Lade die Nummer des Ziel DBs 
       T    #tZielDBNrW;
 
       L    W#16#0006;
       T    #tSchrittWW;
 
       L    W#16#0000;
       T    #tStartAdrZielDbW;
 
       L    320;
       T    #tStartBgKAdrINT;
 
       L    366;
       T    #tStopBgKAdrINT;
 
       L    2;
       T    #tSchrittWBgKAdrINT;
 
// Berechne LOOPs 
       L    #tStopBgKAdrINT;
       L    #tStartBgKAdrINT;
       -I;
       T    #tAnzLOOPsW;
 
 
//*****************************************************************************************// 
//*****************************************************************************************// 
// ZEIGER FÜR KOPIERN AUS / IN DEN DATENBAUSTEIN BAUEN 
//*****************************************************************************************// 
 
//*****************************************************************************************// 
// Baue Zeiger für tZielDBXANYP 
//*****************************************************************************************// 
       LAR1 P##tZielDBXANYP;             // Lade Adresse des zielANYPDbx 
       L    B#16#10;                     // Lade Wert für einen Bereichsübergeifender Zeiger 
       T    LB [AR1,P#0.0];              // Speicher "B#16#10" an die Stelle des zielANYPDbx mit dem "offset" P#0.0 
       L    B#16#02;                     // Lade Typ: Byte 
       T    LB [AR1,P#1.0];              // Speicher Typ Byte an die Stelle des zielANYPDbx mit dem "offset" P#1.0 
       L    #tSchrittWW;                 // Lade schrittweite / Bytes die geschrieben werden sollen. 
       T    LW [AR1,P#2.0];              // ... mit dem offset P#2.0 
       L    #tZielDBNrW;                 // Lade die Nummer des Ziel DBs 
//     L    DINO                         // Lade die FB DBnr 
       T    LW [AR1,P#4.0];              // ... mit dem offset P#4.0 
// Bereichszeiger zusammenstellen 
       L    #tStartAdrZielDbW;           // Lade Start Adresse innerhalb des Ziel DBs 
       SLD            3;                 // Um 3 bit links schieben 
       T    LD [AR1,P#6.0];              // ... mit dem offset P#6.0 
       L    B#16#87;                     // Lade 84h (Bereichsübergreifend, Globaldaten) // DB11 ist Global 
       T    LB [AR1,P#6.0];              // Überschreibe Byte 1 des Bereichszeigers 
 
 
//****************************************************************************// 
// Baue Zeiger für tSensorANYP 
// !!!ACHTUNG!!! -->> dIGNOR!!! 
// Im Speicher MUSS tBgKAdrINT vor tSensorNrINT stehen und beides NACH ein- 
// ander, da die zwei Variabeln an die Start Adresse von tBgKAdrINT 
// gekoppelt sind!!! 
//****************************************************************************// 
       LAR1 P##tSensorANYP;
       L    B#16#10;
       T    LB [AR1,P#0.0];              // Speicher "B#16#10" an die Stelle des zielANYPDbx mit dem "offset" P#0.0 
       L    B#16#02;                     // Lade Typ: Byte 
       T    LB [AR1,P#1.0];              // Speicher Typ Byte an die Stelle des zielANYPDbx mit dem "offset" P#1.0 
       L    #tStartAdrZielDbW;           // Lade schrittweite / Bytes die geschrieben werden sollen. 
       T    LW [AR1,P#2.0];              // ... mit dem offset P#2.0 
       L    0;                           // Lade die Nummer des Ziel DBs, da kein DB-Any Pointer ist steht hier eine 
//     L     DINO                        // Lade die FB DBnr 
       T    LW [AR1,P#4.0];              // ... mit dem offset P#4.0 
// Bereichszeiger zusammenstellen 
//      L     P##tSensor                  // Lade Adresse des "tSensor" 
       L    P##tStartBgKAdrINT;          // Siehe !!! ACHTUNG !!! 
       T    LD [AR1,P#6.0];              // .. mit dem offset P#6.0 
       L    B#16#87;                     // Lade 87h (Bereichsübergreifend, temporäre Lokaledaten des Vorgängerbausteins) 
       T    LB [AR1,P#6.0];              // Überschreibe Byte 1 des Bereichszeigers 
 
 
 
 
//****************************************************************************// 
//****************************************************************************// 
// Beginn der Schleife 
//****************************************************************************// 
       L    #tAnzLOOPsW;
L001  :T    #tAnzLOOPsW;
 
       L    0;
       NOP  0;
       L    1;
       L    0;
 
//****************************************************************************// 
// Aktueller Werte in DB11 Kopieren, 
// über die AnyZeiger tSensorANYP und tZielDBXANYP 
//****************************************************************************// 
       CALL SFC      20(
         SRCBLK:=#tSensorANYP,
         RET_VAL:=#tRetValSFC20INT,
         DSTBLK:=#tZielDBXANYP);
 
 
//****************************************************************************// 
// Baugruppenadresse + Kanallnummer Aktualisieren 
//****************************************************************************// 
       L    #tSchrittWBgKAdrINT;
       L    #tStartBgKAdrINT;
       +I;
       T    #tStartBgKAdrINT;
       L    #tStartAdrZielDbW;
 
//****************************************************************************// 
// Neuer Bereichszeiger für tStartAdrZielDbW zusammenstellen 
//****************************************************************************// 
 
 
// Einen Schritt weiter gehen im DB11 
       L    #tStartAdrZielDbW;
       L    #tSchrittWW;
       +I;
       T    #tStartAdrZielDbW;
 
// Neuer Bereichszeiger für für tStartAdrZielDbW 
       LAR1 P##tZielDBXANYP;             //Lade Adresse des tZielDBXANYP 
 
       L    #tStartAdrZielDbW;           // Lade die NEUE Start Adresse innerhalb des Ziel DBs 
       SLD            3;                 // um 3 bit links schieben 
       T    LD [AR1,P#6.0];              // ... mit dem offset P#6.0 
       L    B#16#87;                     // Lade 87h (Bereichsübergreifend, temporäre Lokaledaten des Vorgängerbausteins) 
       T    LB [AR1,P#6.0];              // Überschreibe Byte 1 des Bereichszeigers 
 
 
//****************************************************************************// 
// schreifen ende 
//****************************************************************************// 
       L    #tAnzLOOPsW;
//    L    1 
//    -I 
    //   T    #tAnzLOOPsW 
   LOOP L001;
 
 
//****************************************************************************// 
//****************************************************************************// 
END_FUNCTION
 

Anhänge

  • Projekt-DB-Werte-AutoFuell.ZIP
    19,9 KB · Aufrufe: 4
Zuletzt bearbeitet:
Ich habe vor einen DB (DB11) bei Anlauf der SPS (Neustart / Warmstart,...) Automatisch über einen FC(FC41) füllen zulassen.
Ich habe das jetzt nur kurz überflogen, aber so wie das aussieht willst Du einen Strukt öfters in einen DB schreiben.
Dafür ist der SFC21 "FILL" sehr gut geeignet.
Als Eingangsparameter kannst Du den Strukt übergeben und am Ausgang gibst Du Deinen Zielbereich ein.
Jetzt wird der Eingangsbereich (Strukt, anhand der Länge) so oft in den Ausgangsbereich kopiert wie es die Ziellänge erlaubt.
[FONT=&quot]Wie kann man einen OB/FB/FC in Step7 So "heraus kopieren"?[/FONT]
Das geht mit:
Baustein öffnen > Datei schließen > Quelle generieren > Namen definieren > Speichern
Nun liegt eine AWL-Quelle des Bausteins vor.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nicht ganz falsch! (( ;

Also der DB11 ist so aufgebaut:
Array[0..15] of UDT11
Und will immer im temporären UDT Daten austauschen und
so mit den DB11 Stück für Stück füllen...

Schau mir Morgen mal die Funktion des SFC21 an.

Danke so weit [ =
 
Zurück
Oben