Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Probleme beim adressieren im Datenbaustein..

  1. #11
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Onkel,

    das hört sich absolut super und richtig an ! Aber da mein Benutzername sozusagen "Programm" ist habe ich fast nix verstanden. (hüstel)

    Aber ich werde mir die Lösung mal durch den Kopf gehen lassen !

    Besten Dank !

  2. #12
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard

    Hallo "Neuling",

    stimmt, ein Anfängerprojekt ist es nicht unbedingt. Die Members hier helfen dir dabei. Sobald ich etwas Zeit finde, mache ich mal den Anfang. Das soll jetzt aber andere nicht davon abhalten, zu posten.


    Gruss, Onkel

  3. #13
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard

    Hallo,

    Dank des bescheidenen Wetters kam meine Musestunde schon früher als erwartet.

    Ich hoffe, es schreckt dich nicht zu sehr ab. Den Umgang mit Pointern und Adressregistern kann man sich aneignen, vielleicht hilft dir dieses Beispiel dabei. Wenn du eine Möglichkeit zum Simulieren hast, dann verändere mal den UDT. Zunächst erst einmal nur ein die Schreibweise eines Symbols. Dann füge mal ein paar Daten an. Wenn sich die Struktur des UDT ändert, musst du den DB und die FC über "Datei - Zugriffe prüfen und aktualisieren" aktualisieren. Die Länge des UDT muss am Parameter des FC-Aufrufs ebenfalls aktualisiert werden.

    Mein Test-UDT
    Code:
    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
    Der DB
    Code:
    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
    Der FC mit dem Umweg über Lokaldaten
    Code:
    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
    Und der Bausteinaufruf
    Code:
          CALL FC  2005 (
               DATENBANK                := P#DB2005.DBX 0.0 DWORD 2,
               DATENSATZ                := 10,
               RET_VAL                  := MW  2000);

    Gruss, Onkel


    Nachtrag:

    Etwas einfacher geht es noch, wenn du beim Any-Pointer den Datentyp BYTE wählst. Dann kannst du beim Bausteinaufruf den ANY-Parameter symbolisch angeben. Es wird automatisch ein Pointer mit dem Datentyp BYTE generiert, und mit der Länge der angeknüpften Struktur. Der FC2005 müsste dann entsprechend auf den Datentyp BYTE geändert werden (bei der Typprüfung und beim Kopieren).

    Code:
          CALL  FC  2005
           DATENBANK:="DB_PARAMETER".PARAMETERSATZ[1]
           DATENSATZ:=10
           RET_VAL  :=MW2000

    Gruss, Onkel

  4. #14
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Onkel Dagobert und Co,

    was soll ich sagen, sehr beeindruckend !! Nicht nur die Beispiele, sondern auch diese Hilfsbereitschaft.
    Ich werde mir das alles mal in aller, aller Ruhe ansehen... Zur Zeit habe ich allerdings noch das Gefühl, dass es ist für mich beim aktuellen Projekt einfacher ist, nach Änderungen im UDT die Funktionen zu bearbeiten in denen er verwendet wird.
    Ich hatte gedacht das wäre ein wenig einfacher gewesen.

    Besten Dank Euch allen !!

Ähnliche Themen

  1. Probleme beim Installieren vom TIA V11 Pro
    Von Nordischerjung im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 08.07.2011, 13:59
  2. Hilfe beim Datenbaustein erzeugen
    Von Hans.S im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 03.01.2010, 12:53
  3. Probleme beim Start von S7
    Von papabär im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.09.2008, 19:46
  4. Probleme beim Exportieren S5 von IBH
    Von bernd67 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.01.2007, 23:11
  5. Probleme beim speichern beim Symatic Manager
    Von Anonymous im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 10.06.2005, 06:36

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •