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

Ergebnis 1 bis 7 von 7

Thema: Indirekte Adressierung von STRING SCL

  1. #1
    Registriert seit
    22.06.2007
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Indirekte Adressierung von STRING SCL  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.06.2007
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    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 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.06.2007
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Zitat Zitat von sm@rt Beitrag anzeigen
    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 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.06.2007
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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


Ähnliche Themen

  1. S7 Indirekte Adressierung
    Von Rommani im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 02.05.2014, 22:05
  2. Indirekte Adressierung
    Von Bensen83 im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 26.01.2010, 11:33
  3. indirekte Adressierung
    Von Christian84 im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 21.02.2009, 09:09
  4. Indirekte-Adressierung
    Von johnij im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.02.2008, 14:32
  5. Indirekte Adressierung von SFC 20
    Von andre im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.09.2005, 09:44

Stichworte

Lesezeichen

Berechtigungen

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