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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: String aus DB in FC OUT-Variable kopieren

  1. #1
    Registriert seit
    05.03.2008
    Beiträge
    3
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo alle zusammen,
    ich möchte in Abhängigkeit einer Variable eine feste Zeichenfolge (z.B. "SV") aus meinem DB laden und an anderer Stelle im DB wieder ablegen.
    Danach soll dieser String als OUT-Variable mit Format String an meinem FC anliegen. Es soll bei anschließender Parametrierung des FC`s nach der Eingabe des Typs dieser in Klartextauf an der rechten Seite stehen.

    Das Kopieren innerhalb vom DB habe ich mit der SFC20 versucht zu realisieren. Ich mache da wohl einen Fehler bei der Bildung vom ANY-Pointer.
    Wie ich die Ausgabe vom String an die OUT-Variable hinbekomme weis ich noch nicht. Ist das überhaupt möglich?
    Es währe nett, wenn Ihr ein Paar Denkanstöße hättet.

    Code:
     L     #TYP                        // Sprungverteiler Typ 1-5
          L     5
          ==D   
          SPB   t5
    
          L     #TYP
          L     4
          ==D   
          SPB   t4
    
          L     #TYP
          L     3
          ==D   
          SPB   t3
    
          L     #TYP
          L     2
          ==D   
          SPB   t2
    
          L     #TYP
          L     1
          ==D   
          SPB   t1
    
    t5:   L     28                          //Typbeding Startadresse für DB
          T     #QuellDW
          SPA   end
    t4:   L     22
          T     #QuellDW
          SPA   end
    t3:   L     16
          T     #QuellDW
          SPA   end
    t2:   L     10
          T     #QuellDW
          SPA   end
    t1:   L     4
          T     #QuellDW
    
    end:  L     #NR
          L     P#20.0                      //plus 20  (Ofset im DB)
          *I                                //Nr*10
          T     #Zeiger_5                   //Ergebnis speichern
    
          L     #Zeiger_5
          L     P#140.0                     //plus 140  (Startadresse im DB)
          +I    
          LAR2                              //In AR1 bereitstellen
    
    
          LAR1  P##Quelle                   //Anfangsadresse des ANY-Pointers in AR1 laden
          L     B#(16, 2)                   //Syntax-ID und Typ: Byte laden
          T     LW [AR1,P#0.0]
          L     6                           //Transferlänge
          T     LW [AR1,P#2.0]
          L     161                         //Quelle-DB
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0
          L     #QuellDW                    //Anfangs-DW im Quell-DB
          ITD   
          SLD   3
          +D    
          T     LD [AR1,P#6.0]
    
          LAR1  P##Ziel                     //Anfangsadresse des ANY-Pointers in AR1
    
          L     B#(16, 2)                   //Syntax-ID und Typ: Byte laden
          T     LW [AR1,P#0.0]
          L     6                           //Transferlaenge
          T     LW [AR1,P#2.0]
          L     161                         //Ziel-DB
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0                   //Anfangs-DW im Ziel-DB
          L     DBD [AR2,P#10.0]            //#ZielDW
          ITD   
          SLD   3
          +D    
          T     LD [AR1,P#6.0]
    
          CALL  SFC   20
           SRCBLK :=#Quelle
           RET_VAL:=#RET_1
           DSTBLK :=#Ziel
    Zitieren Zitieren String aus DB in FC OUT-Variable kopieren  

  2. #2
    Registriert seit
    06.03.2008
    Ort
    Neustadt/Wstr.
    Beiträge
    276
    Danke
    35
    Erhielt 42 Danke für 39 Beiträge

    Standard

    Ich kann dir bei dem Thema ansich zwar nicht helfen aber ich wollte mal fragen warum du keine Sprungleiste verwendest?

    Code:
          L     #TYP                        // Sprungverteiler Typ 1-5
          L     5
          ==D   
          SPB   t5
     
          L     #TYP
          L     4
          ==D   
          SPB   t4
     
          L     #TYP
          L     3
          ==D   
          SPB   t3
     
          L     #TYP
          L     2
          ==D   
          SPB   t2
     
          L     #TYP
          L     1
          ==D   
          SPB   t1


    Sprungleiste:

    Code:
    L     #TYP
    SPL     end
    SPA     t1
    SPA     t2
    SPA     t3
    SPA     t4
    SPA     t5
    Ist vielleicht ne blöde Frage, aber ich bin noch nicht so lange dabei.
    Lebe so als sei jeder Tag dein letzter -
    eines Tages wirst Du recht haben

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

    @AndyM:
    Strings können nur in der Länge 254 als Parameter für IN oder OUT verwendet werden. Den Hinweis dazu findest du in der Step7-Hilfe unter OUT-Variablendeklaration.

    Gruß
    LL

  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

    Zitat Zitat von AndyM Beitrag anzeigen
    Hallo alle zusammen,
    ich möchte in Abhängigkeit einer Variable eine feste Zeichenfolge (z.B. "SV") aus meinem DB laden und an anderer Stelle im DB wieder ablegen.
    Danach soll dieser String als OUT-Variable mit Format String an meinem FC anliegen. Es soll bei anschließender Parametrierung des FC`s nach der Eingabe des Typs dieser in Klartextauf an der rechten Seite stehen.

    Das Kopieren innerhalb vom DB habe ich mit der SFC20 versucht zu realisieren. Ich mache da wohl einen Fehler bei der Bildung vom ANY-Pointer.
    Wie ich die Ausgabe vom String an die OUT-Variable hinbekomme weis ich noch nicht. Ist das überhaupt möglich?
    Es währe nett, wenn Ihr ein Paar Denkanstöße hättet.

    Code:
     L     #TYP                        // Sprungverteiler Typ 1-5
          L     5
          ==D   
          SPB   t5
    
          L     #TYP
          L     4
          ==D   
          SPB   t4
    
          L     #TYP
          L     3
          ==D   
          SPB   t3
    
          L     #TYP
          L     2
          ==D   
          SPB   t2
    
          L     #TYP
          L     1
          ==D   
          SPB   t1
    
    t5:   L     28                          //Typbeding Startadresse für DB
          T     #QuellDW
          SPA   end
    t4:   L     22
          T     #QuellDW
          SPA   end
    t3:   L     16
          T     #QuellDW
          SPA   end
    t2:   L     10
          T     #QuellDW
          SPA   end
    t1:   L     4
          T     #QuellDW
    
    end:  L     #NR
          L     P#20.0                      //plus 20  (Ofset im DB)
          *I                                //Nr*10
          T     #Zeiger_5                   //Ergebnis speichern
    
          L     #Zeiger_5
          L     P#140.0                     //plus 140  (Startadresse im DB)
          +I    
          LAR2                              //In AR1 bereitstellen
    
    
          LAR1  P##Quelle                   //Anfangsadresse des ANY-Pointers in AR1 laden
          L     B#(16, 2)                   //Syntax-ID und Typ: Byte laden
          T     LW [AR1,P#0.0]
          L     6                           //Transferlänge
          T     LW [AR1,P#2.0]
          L     161                         //Quelle-DB
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0
          L     #QuellDW                    //Anfangs-DW im Quell-DB
          ITD   
          SLD   3
          +D    
          T     LD [AR1,P#6.0]
    
          LAR1  P##Ziel                     //Anfangsadresse des ANY-Pointers in AR1
    
          L     B#(16, 2)                   //Syntax-ID und Typ: Byte laden
          T     LW [AR1,P#0.0]
          L     6                           //Transferlaenge
          T     LW [AR1,P#2.0]
          L     161                         //Ziel-DB
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0                   //Anfangs-DW im Ziel-DB
          L     DBD [AR2,P#10.0]            //#ZielDW
          ITD   
          SLD   3
          +D    
          T     LD [AR1,P#6.0]
    
          CALL  SFC   20
           SRCBLK :=#Quelle
           RET_VAL:=#RET_1
           DSTBLK :=#Ziel
    Hast du kein SCL, damit geht alles, was mit Stringmaipulation zu tun hat am Einfachsten.

    Ansonsten, das hier:

    Code:
    end:  L     #NR
          L     P#20.0                      //plus 20  (Ofset im DB)
          *I                                //Nr*10
          T     #Zeiger_5                   //Ergebnis speichern
    
          L     #Zeiger_5
          L     P#140.0                     //plus 140  (Startadresse im DB)
          +I    
          LAR2
    kommt mir recht eigenartig vor.
    Rechne doch das ZielDW normal als Integer aus und wandle es dann in einen Pointer um, wie di es mit dem QullDW

    Code:
     
    L     P#DBX 0.0
    L     #QuellDW                    //Anfangs-DW im Quell-DB
     ITD   
     SLD   3
     +D    
     T     LD [AR1,P#6.0]
    ja richtig machst.

    PS: Wenn es nur um 2 Zeichen geht, reicht sogar ein L DBX.DDY , denn 2 Byte sind Stringkopf und 2 Byte Zeichen. Warum hast du Transferlänge 6, sind deine Strings 4 Zeichen lang? Auch dann könnte man statt Blk_Move auch 2 Transferbefehle nutzen.
    Geändert von Ralle (06.03.2008 um 12:42 Uhr)
    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. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    AndyM (07.03.2008)

  6. #5
    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 Larry Laffer Beitrag anzeigen
    @AndyM:
    Strings können nur in der Länge 254 als Parameter für IN oder OUT verwendet werden. Den Hinweis dazu findest du in der Step7-Hilfe unter OUT-Variablendeklaration.

    Gruß
    LL
    Einspruch, Euer Ehren!
    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. #6
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Da ja doch immer wieder Zeiger zusammengebastelt werden, stelle ich hier mal einen FC rein, der das für einen erledigt. Funktioniert aber "nur" für DB's, aber eine Anpassung sollte man dann selber machen können:

    Paramer sind die DB-Nummer, die Anzahl der Bytes und die Startadresse der Bytes. Ausgabe ist dann ein Pointer auf den gewünschten Bereich, der dann z.B. mit BLKMOV weiterverwendet werden kann.

    FUNCTION "DB_Pointer" : VOID
    TITLE = DB_Zeiger
    AUTHOR : ich...
    VERSION : 0.3

    VAR_INPUT
    Nr_DatenDB : INT ;
    Anz_Bytes : INT ;
    Startbyte : INT ;
    END_VAR
    VAR_IN_OUT
    Datenzeiger : ANY ;
    END_VAR
    VAR_TEMP
    savear1 : DWORD ;
    savear2 : DWORD ;
    sendedaten : ANY ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    TAR1 ; // ar sichern
    T #savear1;
    L P##Datenzeiger;
    LAR1 ;
    L B#16#10; // 10H für S7
    T B [AR1,P#0.0];
    L B#16#2; // 2 für Datentyp BYTE
    T B [AR1,P#1.0];
    L #Anz_Bytes; // für Wiederholfaktor
    T W [AR1,P#2.0];
    L #Nr_DatenDB; // für DB-Nummer
    T W [AR1,P#4.0];
    L #Startbyte; // Startadresse der Bytes
    SLD 3; // 3 nach links (Byteadresse 3 nach Links verschoben
    OD DW#16#84000000; // mit 84H verodern für Speicherbereichkennung
    T D [AR1,P#6.0];

    LAR1 #savear1;
    END_FUNCTION

  8. Folgende 3 Benutzer sagen Danke zu Grubba für den nützlichen Beitrag:

    AndyM (07.03.2008),Ganz (05.04.2008),SIGGI (14.05.2009)

  9. #7
    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 Ralle Beitrag anzeigen
    Einspruch, Euer Ehren!
    Das hier funzt:

    Code:
    FUNCTION FC253 : INT
    
    Title = 'FIS_Kop'
    //
    // FIS-Datenbaustein füllen
    //
    Version : '1.0'
    author  : rk
    name    : FIS_KOP
    family  : SYSTEM
    
    VAR_INPUT
      // Eingangsparameter
      template: STRING[10];
      send_key_01: STRING[8];                
      send_value_01: STRING[25];             
      send_key_02: STRING[8];                
      send_value_02: STRING[25];   
      send_key_03: STRING[8];                
      send_value_03: STRING[25];             
      send_key_04: STRING[8];                
      send_value_04: STRING[25];   
      send_key_05: STRING[8];                
      send_value_05: STRING[25];             
      send_key_06: STRING[8];                
      send_value_06: STRING[25];   
      send_key_07: STRING[8];                
      send_value_07: STRING[25];             
      send_key_08: STRING[8];                
      send_value_08: STRING[25];   
      send_key_09: STRING[8];                
      send_value_09: STRING[25];             
      send_key_10: STRING[8];                
      send_value_10: STRING[25];   
      send_key_11: STRING[8];                
      send_value_11: STRING[25];
      rec_key_01: STRING[8];                
      rec_value_01: STRING[25];             
      rec_key_02: STRING[8];                
      rec_value_02: STRING[25];   
      rec_key_03: STRING[8];                
      rec_value_03: STRING[25];             
      rec_key_04: STRING[8];                
      rec_value_04: STRING[25];   
      rec_key_05: STRING[8];                
      rec_value_05: STRING[25];              
    END_VAR
    
    VAR_OUTPUT // Ausgangsparameter
      template_db: STRING[10];  
      send_key_01_db: STRING[8];                
      send_value_01_db: STRING[25];             
      send_key_02_db: STRING[8];                
      send_value_02_db: STRING[25];   
      send_key_03_db: STRING[8];                
      send_value_03_db: STRING[25];             
      send_key_04_db: STRING[8];                
      send_value_04_db: STRING[25];   
      send_key_05_db: STRING[8];                
      send_value_05_db: STRING[25];             
      send_key_06_db: STRING[8];                
      send_value_06_db: STRING[25];   
      send_key_07_db: STRING[8];                
      send_value_07_db: STRING[25];             
      send_key_08_db: STRING[8];                
      send_value_08_db: STRING[25];   
      send_key_09_db: STRING[8];                
      send_value_09_db: STRING[25];             
      send_key_10_db: STRING[8];                
      send_value_10_db: STRING[25];   
      send_key_11_db: STRING[8];                
      send_value_11_db: STRING[25]; 
      rec_key_01_db: STRING[8];                
      rec_value_01_db: STRING[25];             
      rec_key_02_db: STRING[8];                
      rec_value_02_db: STRING[25];   
      rec_key_03_db: STRING[8];                
      rec_value_03_db: STRING[25];             
      rec_key_04_db: STRING[8];                
      rec_value_04_db: STRING[25];   
      rec_key_05_db: STRING[8];                
      rec_value_05_db: STRING[25];                    
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
    END_VAR
    
    // Anweisungsteil
        template_db := template;
        send_key_01_db := send_key_01;  
        send_value_01_db := send_value_01;
        send_key_02_db := send_key_02;  
        send_value_02_db := send_value_02;
        send_key_03_db := send_key_03;  
        send_value_03_db := send_value_03;
        send_key_04_db := send_key_04;  
        send_value_04_db := send_value_04;
        send_key_05_db := send_key_05;  
        send_value_05_db := send_value_05;
        send_key_06_db := send_key_06;  
        send_value_06_db := send_value_06;
        send_key_07_db := send_key_07;  
        send_value_07_db := send_value_07;
        send_key_08_db := send_key_08;  
        send_value_08_db := send_value_08;
        send_key_09_db := send_key_09;  
        send_value_09_db := send_value_09;
        send_key_10_db := send_key_10;  
        send_value_10_db := send_value_10;
        send_key_11_db := send_key_11;  
        send_value_11_db := send_value_11;
       
        rec_key_01_db := rec_key_01;  
        rec_value_01_db := rec_value_01;
        rec_key_02_db := rec_key_02;  
        rec_value_02_db := rec_value_02;
        rec_key_03_db := rec_key_03;  
        rec_value_03_db := rec_value_03;
        rec_key_04_db := rec_key_04;  
        rec_value_04_db := rec_value_04;
        rec_key_05_db := rec_key_05;  
        rec_value_05_db := rec_value_05;
        
        ;
        FC253 := 100;
    END_FUNCTION

    Korrektur

    Der SCL-Compiler macht da tatsächlich 254-er Strings draus, habs mal im FC selbst nachgeprüft.
    Bei FB geht das allerdings.
    Geändert von Ralle (06.03.2008 um 12:50 Uhr)
    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

  10. #8
    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

    Zitat Zitat von Ralle Beitrag anzeigen
    Einspruch, Euer Ehren!
    Einspruch abgelehnt ...

  11. #9
    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 Larry Laffer Beitrag anzeigen
    Einspruch abgelehnt ...
    Korrekt, hatte ich ja schon korrigiert !

    Wobei man, auch wenn man lange Strings als IN und OUT definieren muß, dort dann z.Bsp. mit String[8] definierte Variablen als IN antragen und auch bearbeiten kann. Insofern stimmt mein Einspruch wieder!
    Geändert von Ralle (06.03.2008 um 15:03 Uhr)
    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

  12. #10
    AndyM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.03.2008
    Beiträge
    3
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke an Alle für die schnelle Unterstützung.

    @Ralle
    Zitat Zitat von Ralle Beitrag anzeigen
    Hast du kein SCL, damit geht alles, was mit Stringmaipulation zu tun hat am Einfachsten.
    Hab ich leider nicht...

    Zitat Zitat von Ralle Beitrag anzeigen
    PS: Wenn es nur um 2 Zeichen geht, reicht sogar ein L DBX.DDY , denn 2 Byte sind Stringkopf und 2 Byte Zeichen. Warum hast du Transferlänge 6, sind deine Strings 4 Zeichen lang? Auch dann könnte man statt Blk_Move auch 2 Transferbefehle nutzen.
    Es geht nur um 2 Zeichen,hab aber in meinem DB 4 Zeichen vorgesehen.
    Die Anweisung "L DBX.DDY" ist in meinem Fall dan L DB161.DBD 4, richtig? Wenn ich die Länge auf 2 festlege.

    Gruß
    AndyM

Ähnliche Themen

  1. String kopieren?!
    Von blueColt im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.09.2010, 12:53
  2. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  3. String Variable kopieren
    Von cindy im Forum Programmierstrategien
    Antworten: 10
    Letzter Beitrag: 25.06.2009, 15:47
  4. Ein String kopieren in einen anderen String
    Von CanYouHelpMe im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2008, 17:21
  5. String 20 kopieren in DB
    Von ice6461 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 24.04.2008, 17:03

Lesezeichen

Berechtigungen

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