-> 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.
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.
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