Indirekte Adressierung von STRING SCL

sm@rt

Level-2
Beiträge
9
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Warum willst du Variablen um jeden Preis mappen, man könnte sie doch in WinCC auch händisch anlegen.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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. :ROFLMAO:

PS: Allerdings nutze ich ohnehin massiv Rohdatenvariable, das spart enorm Tags in der License. Und da geht ja alles nur per Hand und Script.
 
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

 
Zurück
Oben