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

Results 1 to 7 of 7

Thread: Indirekte Adressierung von STRING SCL

  1. #1
    Join Date
    22.06.2007
    Posts
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich habe folgendes Problem: Ich möchte gerne aus einem DB verschiedene Parameter sätze laden und an einem Baustein ausgeben. Diese Aufgabe möchte ich gerne mit SCL lösen. Normalerweise ist das kein Problem wenn
    man den DB über eine Struktur erzeugt (z.B. UDT). Ich habe den DB aber händich angelegt weil ich die Variablen des DB auch in WinCC brauche. Und ich möchte die Variablen nach WinCC Mappen d.h. eine Strukturierter DB kommt dann ja nicht in Frage da ich das Attribut S7_m_c nutzen muss und möchte.

    Hier unten habe ich mal ein Projekt erzeugt mit dem die geforderte Aufgabe zwar gelöst ist aber die Lösung ist nicht gerade elegant.

    Hier im Forum hat mal einer einen FC200 geschrieben mit dem man den Pointer für den SFC20 Variabel gestalten kann. Diesen Baustein habe ich genutzt um die Daten von der entsprechenden stelle im DB202 zu kopieren.
    Das Problem ist jetzt das ich diese Daten nicht direkt auf eine Ausgangsvariable des FB207 kopieren kann.
    Als übergangslösung habe ich die Daten auf die erste zelle des DB202 (Adresse 0.0 STRING [100]) kopiert. Danach kann ich ja wieder Symbolisch
    auf diese zelle zugreifen und sie an einen Ausgang des FB207 übergeben.

    Vielleicht gibt es ja dafür eine bessere Lösung.


    Code:
     
    FUNCTION_BLOCK FB207
    TITLE = 'Text'
        VERSION : '1.1'
        AUTHOR  : RICHERT
        NAME    : TEXT
        FAMILY  : SMS
    VAR_INPUT
        Anwahl_Nr { S7_m_c := 'true'; S7_visible := 'true' }: INT ;
        DB_Nr : WORD;
    END_VAR
    VAR_OUTPUT
        Text { S7_m_c := 'true'; S7_visible := 'true' }: STRING[100];       //Angewählter Text
        Wert1 { S7_m_c := 'true'; S7_visible := 'true' }: INT ;     //Angewählter Wert 1
        Wert2 { S7_m_c := 'true'; S7_visible := 'true' }: INT ;     //Angewählter Wert 1
        Wert3 { S7_m_c := 'true'; S7_visible := 'true' }: INT ;     //Angewählter Wert 1
        Wert4 { S7_m_c := 'true'; S7_visible := 'true' }: INT ;     //Angewählter Wert 1
    END_VAR
    VAR_TEMP
        DB_Nr_I : INT;                              //DB Nummer in dem die SMS Daten liegen
        Adresse_Text : INT ;                        //Adresse des Textes der kopiert werden soll    
    END_VAR
    BEGIN
    DB_Nr_I := WORD_TO_INT(DB_Nr);
    Adresse_Text:= (150*(Anwahl_Nr-1)) + 102;
        IF Anwahl_Nr <> 0 THEN
        FC200(QuellAdresse:=Adresse_Text
            ,QuellLaenge:=102          //Header + Nutzdaten (100 BYTE) = 102 BYTE
            ,QuellDB:=DB_Nr_I
            ,ZielAdresse:=0
            ,ZielLaenge:=102           //Header + Nutzdaten (100 BYTE) = 102 BYTE
            ,ZielDB:=DB_Nr_I);
     
            Wert1  := WORD_TO_INT(WORD_TO_BLOCK_DB(DB_Nr).DW[(150*(Anwahl_Nr-1)+102) + 102 ]); 
            Wert2  := WORD_TO_INT(WORD_TO_BLOCK_DB(DB_Nr).DW[(150*(Anwahl_Nr-1)+104) + 102 ]); 
            Wert3  := WORD_TO_INT(WORD_TO_BLOCK_DB(DB_Nr).DW[(150*(Anwahl_Nr-1)+106) + 102 ]); 
            Wert4  := WORD_TO_INT(WORD_TO_BLOCK_DB(DB_Nr).DW[(150*(Anwahl_Nr-1)+108) + 102 ]); 
     
     
        END_IF;
     
            Text:=Meldetexte.Text; 
     
    END_FUNCTION_BLOCK
    Aufbau vom DB202
    Der DB 202 wurde als Quelle generiert. Er kann aber so nicht übersetzt werden, da ich immer die Adressen da vor geschrieben habe (+ 102.0).
    Damit man die Adress Bearbeitung im FB207 besser nachvollziehen kann.
    Code:
    DATA_BLOCK "Meldetexte"
    TITLE =
    VERSION : 0.1
     
      STRUCT  
       + 0.0   Text : STRING  [100 ]; //Meldetext
       + 102.0 A1_Meldetext { S7_m_c := 'true' }: STRING  [100 ] := 'Meldung_1'; //Meldetext
       + 204.0 A1_Wert1 { S7_m_c := 'true' }: INT  := 10; //Wert
       + 206.0 A1_Wert2 { S7_m_c := 'true' }: INT  := 11; //Wert
       + 208.0 A1_Wert3 { S7_m_c := 'true' }: INT  := 12; //Wert
       + 210.0 A1_Wert4 { S7_m_c := 'true' }: INT  := 13; //Wert
       + 212.0 A1_Reserve : STRING  [38 ]; //Reserve
       + 252.0 A2_Meldetext { S7_m_c := 'true' }: STRING  [100 ] := 'Meldung_2'; //Meldetext
       + 354.0 A2_Wert1 { S7_m_c := 'true' }: INT  := 21; //Wert
       + 356.0 A2_Wert2 { S7_m_c := 'true' }: INT  := 22; //Wert
       + 358.0 A2_Wert3 { S7_m_c := 'true' }: INT  := 23; //Wert
       + 360.0 A2_Wert4 { S7_m_c := 'true' }: INT  := 24; //Wert
       + 362.0 A2_Reserve : STRING  [38 ]; //Reserve
       + 402.0 A3_Meldetext { S7_m_c := 'true' }: STRING  [100 ] := 'Meldung_3'; //Meldetext
       + 504.0 A3_Wert1 { S7_m_c := 'true' }: INT  := 31; //Wert
       + 506.0 A3_Wert2 { S7_m_c := 'true' }: INT  := 32; //Wert
       + 508.0 A3_Wert3 { S7_m_c := 'true' }: INT  := 33; //Wert
       + 510.0 A3_Wert4 { S7_m_c := 'true' }: INT  := 34; //Wert
       + 512.0 A3_Reserve : STRING  [38 ]; //Reserve
      END_STRUCT ; 
    BEGIN
       Text := ''; 
       A1_Meldetext := 'Meldung_1'; 
       A1_Wert1 := 10; 
       A1_Wert2 := 11; 
       A1_Wert3 := 12; 
       A1_Wert4 := 13; 
       A1_Reserve := ''; 
       A2_Meldetext := 'Meldung_2'; 
       A2_Wert1 := 21; 
       A2_Wert2 := 22; 
       A2_Wert3 := 23; 
       A2_Wert4 := 24; 
       A2_Reserve := ''; 
       A3_Meldetext := 'Meldung_3'; 
       A3_Wert1 := 31; 
       A3_Wert2 := 32; 
       A3_Wert3 := 33; 
       A3_Wert4 := 34; 
       A3_Reserve := ''; 
    END_DATA_BLOCK
    Reply With Quote Reply With Quote Indirekte Adressierung von STRING SCL  

  2. #2
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    Hallo,
    mir fällt da jetzt nicht wirklich etwas Tolles ein - außer :
    Die eigentliche Stärke von SCL sind symbolische Zugriffe (gleich welcher Art). Um das sinnvoll einsetzen zu können muß SCL die Struktur der Datenbereiche, auf die es zugreifen soll zum Zeitpunkt des Compilierens bekannt sein. Wenn ich das richtig verstanden habe, dann ist das bei dir (warum auch immer) nicht möglich.
    Ergo wäre das Einzige, was mir zum Optimieren einfiele das Bilden des Adress-Pointers :
    Code:
    WORD_TO_INT(WORD_TO_BLOCK_DB(DB_Nr).DW[(150*(Anwahl_Nr-1)+102) + 102 ]);
    den könnte man auch einmal ausrechnen und dann mit einem Offset arbeiten. Das würde dann deinen Code verringern und die Laufzeit (ein wenig) verkürzen ...

    Gruß
    LL

  3. #3
    sm@rt is offline Neuer Benutzer
    Themenstarter
    Join Date
    22.06.2007
    Posts
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo,
    erstmal vielen Dank!

    Wenn ich das richtig verstanden habe, dann müste ich einen Strukturierten
    DB erstellen der sich im Adressbereich nicht von meinem unterscheidet.
    Nach dem ich das dann übersetzt habe lass ich den Baustein einfach wieder auf den anderen DB zugreifen. Und schon würde alles funktionieren.
    Ist zwar auch nicht ganz sauber aber immer noch besser als meine Lösung.

    Ich muss den weg ja nur gehen meil ich die Variablen in WinCC brauche und mappen will. Und Strukurierte DB`s lassen sich halt nicht mappen.

    Mit dem Pionter hast Du natürlich recht. Eine einmalige Berechnung mit Offset macht mehr sinn.

    MfG

  4. #4
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,806
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    Warum willst du Variablen um jeden Preis mappen, man könnte sie doch in WinCC auch händisch anlegen.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    sm@rt is offline Neuer Benutzer
    Themenstarter
    Join Date
    22.06.2007
    Posts
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo,
    das mappen hat halt den Vorteil das WinCC immer konsitent zum Simatic Manager ist. Meldungen, Meltetexte, Archive, und Variablen werden im S7-Programm verwaltet. Ändern sich z.B. Adressen oder Texte dann werden diese durch das mappen Automatisch in WinCC angeglichen. Oder werden Messstellen aus dem Programm entfernt so sind auch alle damit verbundenen Elemente in WinCC nicht mehr vorhanden (nicht die Elemente in den Bildern). Es gibt keine leichen mehr.

    Variablen händich anlegen das hat man zu S5 zeiten gemacht.

    Davon ist heute grundsätzlich abstand zu nehmen!

    MfG

  6. #6
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,806
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    Quote Originally Posted by sm@rt View Post
    Hallo,
    das mappen hat halt den Vorteil das WinCC immer konsitent zum Simatic Manager ist. Meldungen, Meltetexte, Archive, und Variablen werden im S7-Programm verwaltet. Ändern sich z.B. Adressen oder Texte dann werden diese durch das mappen Automatisch in WinCC angeglichen. Oder werden Messstellen aus dem Programm entfernt so sind auch alle damit verbundenen Elemente in WinCC nicht mehr vorhanden (nicht die Elemente in den Bildern). Es gibt keine leichen mehr.

    Variablen händich anlegen das hat man zu S5 zeiten gemacht.

    Davon ist heute grundsätzlich abstand zu nehmen!

    MfG
    Ok, das ist deine Meinung, kann ich aber durchaus akzeptieren.

    Aber ich hab nochmal ne Nachfrage, kann der Kunde vor Ort, der ja WinCC auf dem Server hat Änderungen vornehmen, ohne daß dein Projekt dadurch inkonsistent wird? Denn Step7 hat er ja nicht auf dem WinCC-Server jedenfalls im Normalfalle. Kannst du später Unterschiede irgendwie wieder angleichen? Wenn das funktioniert, könnte ich mich durchaus damit anfreunden, denn ich mache das noch wie zu S5-Zeiten. Funktioniert sogar.

    PS: Allerdings nutze ich ohnehin massiv Rohdatenvariable, das spart enorm Tags in der License. Und da geht ja alles nur per Hand und Script.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #7
    sm@rt is offline Neuer Benutzer
    Themenstarter
    Join Date
    22.06.2007
    Posts
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich habe zwar nicht von Servern gesprochen das ist aber das gleiche. Wenn wir was mit Servern machen dann nutzen wir PCS7 und dann gibt es auch eine Engineering Station und auf der werden dann die Änderungen gemacht. Danach lädt man die Server mit den gemachten Änderungen und
    allles ist wieder O.K.
    Werden Änderungen in WinCC gemacht dann sind die natürlich nach dem mappen wieder weg.

    Der Kunde macht bei uns halt keine Änderungen am reinen WinCC Projekt sondern immer an der Engineering Station. Das ist einfach die Vorgehensweise vielleicht nicht immer einfach so was einem Kunden
    zu vermitteln.

    MfG


Similar Threads

  1. SCL indirekte Adressierung von Strukturen
    By Anonymous in forum Simatic
    Replies: 24
    Last Post: 10.02.2016, 19:10
  2. Step 7 SCL Indirekte Adressierung von Multiinstanzen
    By BlueDogi in forum Simatic
    Replies: 1
    Last Post: 01.06.2015, 19:43
  3. Indirekte Adressierung in SCL
    By Atlas in forum Simatic
    Replies: 7
    Last Post: 22.04.2014, 15:27
  4. Indirekte Adressierung von Bit's in SCL
    By tarzipan7 in forum Simatic
    Replies: 7
    Last Post: 23.01.2009, 12:37
  5. indirekte Adressierung in SCL
    By BiBi in forum Simatic
    Replies: 6
    Last Post: 18.05.2007, 23:42

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •