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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: String aus DB in FC OUT-Variable kopieren

  1. #11
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von AndyM Beitrag anzeigen
    Danke an Alle für die schnelle Unterstützung.

    @Ralle

    Hab ich leider nicht...


    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
    Ja genau, Byte 0 und 1 enthalten standardmäßig die Längenangabe, also Byte0=2 und Byte 1=2, in Byte 2 und 3 steht dann jeweils der Charcode für ein Zeichen (Hex31 z.Bsp für '1').

    Das kann man prima sehen, wenn man sich den betreffenden Bereich des DB in der Variablentabelle Byteweise ansieht. Das ist im übrigen auch die einzige Möglichkeit, Strings Online zu beobachten bzw. deren Wert einzusehen!
    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

  2. #12
    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

    Ich hab jetzt mal meine FC umgeschrieben, funktioniert alles bis auf das Umkopieren in die OUT-Variable.
    Die SFC 20 braucht man zum umkopieren, da man ja nicht direkt auf die Variable schreiben kann, Oder hab ich da einen Denkfehler?

    Das Ganze sollte in etwa so fonktionieren, aber an die SFC20 kann ich die OUT-Variable nicht anhängen.

    Code:
      L     #T_NR
          L     P#20.0                      //plus 20  (Ofset im DB)
          *I                                //T_Nr*20
          T     #Zeiger_4                   //Ergebnis speichern
    
          L     #Zeiger_4
          L     P#140.0                     //plus 140  (Startadresse im DB)
          +I    
          LAR1                              //In AR1 bereitstellen
    //---------------------------------------------------------------------------------
          L     #TYP
          L     P#4.0                       //plus 4 (Ofset im DB)
          *I                                //T_Nr*4
          T     #Zeiger_5                   //Ergebnis speichern
    
          L     #Zeiger_5
          L     P#0.0                       //plus0  (Startadresse im DB)
          +I    
          LAR2                              //In AR2 bereitstellen
    //---------------------------------------------------------------------------------
          L     DBD [AR2,P#0.0]             // Lade Festwert (String[2])
          T     DBD [AR1,P#0.0]             // Transferiere nach Betriebsart im Timerspeicher
    
          LAR2  P##Modus_tmp
          L     B#16#10                     // 10H für S7
          T     B [AR2,P#0.0]
          L     B#16#2                      // 2 für Datentyp BYTE
          T     B [AR2,P#1.0]
          L     2                           // für Wiederholfaktor
          T     W [AR2,P#2.0]
          L     161                         // für DB-Nummer
          T     W [AR2,P#4.0]
          L     DBB [AR1,P#0.0]             // 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 [AR2,P#6.0]
    
    
    
          CALL  SFC   20
           SRCBLK :=#Modus_tmp
           RET_VAL:=#RET_1
           DSTBLK :=#MODUS
    gibt´s da noch `ne Möglichkeit das zu realisieren?

    Gruß
    AndyM

  3. #13
    Registriert seit
    22.09.2006
    Ort
    Bodenseeraum
    Beiträge
    1.022
    Danke
    61
    Erhielt 136 Danke für 122 Beiträge

    Beitrag

    Hi,
    also dein Code oben ist schon booaa hei.. was passiert da überhaupt?
    Wo initialisierst du die Variablen modus_tmp und modus?

    Vladi
    ______________________________________
    relax, take it easy
    Zitieren Zitieren Code..  

  4. #14
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von AndyM Beitrag anzeigen
    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.
    Hier ist mal ein kurzes Programmbeispiel, in dem ein STRING mit ANY-Zeigern und dem SFC20 BLKMOV kopiert wird.

    Im ersten Programmteil wird ein STRING innerhalb des DB200 kopiert.

    Im zweiten Programmteil wird ein STRING aus dem DB200 als OUT-Variable des FC100 ausgegeben.

    Code:
    ORGANIZATION_BLOCK OB 1
    TITLE =Hauptprogramm
    //18
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'STRING'
    VERSION : 1.0
     
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ; //Reserved for system
      OB1_RESERVED_2 : BYTE ; //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =STRING kopieren
     
          CALL FC   100 (
               QUELLE_NUMMER            := MW   100,
               ZIEL_NUMMER              := MW   102,
               ZIEL_STRING              := DB200.ZIEL_5);
          NOP   0; 
     
    END_ORGANIZATION_BLOCK
    Code:
    FUNCTION FC 100 : VOID
    TITLE =STRING kopieren
    //14
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'STRING'
    VERSION : 1.0
     
    VAR_INPUT
      QUELLE_NUMMER : INT ; 
      ZIEL_NUMMER : INT ; 
    END_VAR
    VAR_OUTPUT
      ZIEL_STRING : STRING  [254 ]; 
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ; 
      AR1_REGISTER : DWORD ; 
      STARTADRESSE : INT ; 
      QUELLE_ANY : ANY ; 
      ZIEL_ANY : ANY ; 
      DB_NUMMER : WORD ; 
      BEREICHSZEIGER : DWORD ; 
      BLKMOV : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =DB-Register und AR1-Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =QUELLE STARTADRESSE
    //STARTADRESSE = (QUELLE_NUMMER - 1) * 6
    //   
          L     #QUELLE_NUMMER; // QUELLE Nummer
          T     #STARTADRESSE; // Startadresse
     
          L     #STARTADRESSE; // Startadresse > 4
          L     4; 
          >I    ; 
          SPBN  M10; 
          L     4; 
          T     #STARTADRESSE; // Startadresse
     
    M10:  L     #STARTADRESSE; // Startadresse < 1
          L     1; 
          <I    ; 
          SPBN  M11; 
          L     1; 
          T     #STARTADRESSE; // Startadresse
     
    M11:  L     #STARTADRESSE; // Startadresse
          L     1; 
          -I    ; 
          L     6; 
          *I    ; 
          T     #STARTADRESSE; // Startadresse
     
    NETWORK
    TITLE =QUELLE_ANY (ANY)
     
          L     P##QUELLE_ANY; // QUELLE ANY (ANY) 
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     LB [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     LB [AR1,P#1.0]; 
     
          L     6; // Anzahl
          T     LW [AR1,P#2.0]; 
     
          L     200; // DB-Nummer
          T     LW [AR1,P#4.0]; 
     
          L     #STARTADRESSE; // Bereichszeiger
          ITD   ; 
          SLD   3; 
          T     LD [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     LB [AR1,P#6.0]; 
     
    NETWORK
    TITLE =ZIEL STARTADRESSE
    //STARTADRESSE = ((ZIEL_NUMMER - 1) * 6) + 24
    //   
          L     #ZIEL_NUMMER; // ZIEL Nummer
          T     #STARTADRESSE; // Startadresse
     
          L     #STARTADRESSE; // Startadresse > 4
          L     4; 
          >I    ; 
          SPBN  M20; 
          L     4; 
          T     #STARTADRESSE; // Startadresse
     
    M20:  L     #STARTADRESSE; // Startadresse < 1
          L     1; 
          <I    ; 
          SPBN  M21; 
          L     1; 
          T     #STARTADRESSE; // Startadresse
     
    M21:  L     #STARTADRESSE; // Startadresse
          L     1; 
          -I    ; 
          L     6; 
          *I    ; 
          L     24; 
          +I    ; 
          T     #STARTADRESSE; // Startadresse
     
    NETWORK
    TITLE =ZIEL_ANY (ANY)
     
          L     P##ZIEL_ANY; // ZIEL ANY (ANY) 
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     LB [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     LB [AR1,P#1.0]; 
     
          L     6; // Anzahl
          T     LW [AR1,P#2.0]; 
     
          L     200; // DB-Nummer
          T     LW [AR1,P#4.0]; 
     
          L     #STARTADRESSE; // Bereichszeiger
          ITD   ; 
          SLD   3; 
          T     LD [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     LB [AR1,P#6.0]; 
     
    NETWORK
    TITLE =QUELLE (STRING) => ZIEL (STRING)
     
          CALL SFC   20 (
               SRCBLK                   := #QUELLE_ANY,
               RET_VAL                  := #BLKMOV,
               DSTBLK                   := #ZIEL_ANY);
          NOP   0; 
     
    NETWORK
    TITLE =ZIEL_STRING (POINTER)
     
          L     P##ZIEL_STRING; // ZIEL STRING (POINTER)
          LAR1  ; 
     
          L     W [AR1,P#0.0]; // DB-Nummer
          T     #DB_NUMMER; 
     
          L     D [AR1,P#2.0]; // Bereichszeiger
          T     #BEREICHSZEIGER; 
     
    NETWORK
    TITLE =ZIEL_ANY (ANY)
     
          L     P##ZIEL_ANY; // ZIEL ANY (ANY)
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     LB [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     LB [AR1,P#1.0]; 
     
          L     6; // Anzahl
          T     LW [AR1,P#2.0]; 
     
          L     #DB_NUMMER; // DB-Nummer
          T     LW [AR1,P#4.0]; 
     
          L     #BEREICHSZEIGER; // Bereichszeiger
          T     LD [AR1,P#6.0]; 
     
    NETWORK
    TITLE =QUELLE (STRING) => ZIEL_STRING (STRING)
     
          CALL SFC   20 (
               SRCBLK                   := #QUELLE_ANY,
               RET_VAL                  := #BLKMOV,
               DSTBLK                   := #ZIEL_ANY);
          NOP   0; 
     
    NETWORK
    TITLE =DB-Register und AR1-Register wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // AR1-Register
     
    END_FUNCTION
    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien

  5. Folgende 3 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

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

  6. #15
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Was mich immer wundert:

    Als Beispiel, ganz normaler Blockmove:

    CALL SFC 20 (
    SRCBLK := P#M100.0 byte 10
    RET_VAL := #BLKMOV,
    DSTBLK := P#M150.0 byte 10
    Logisch...Die Bytes ab MB100 werden nach MB150 kopiert.





    Wenn ich jetzt aber vorher meine Bytes ab MB150 mit dem Anypointer füttere


    L P##ZIEL_ANY; // ZIEL ANY (ANY)
    LAR1 ;

    L B#16#10; // Syntax-ID
    T MB150

    L 2; // Datentyp
    T MB151

    L 6; // Anzahl
    T MW152

    L 200; // DB-Nummer
    T MW154

    L #STARTADRESSE; // Bereichszeiger
    ITD ;
    SLD 3;
    T MD156

    L B#16#84; // Operandenbereich
    T MB156


    CALL SFC 20 (
    SRCBLK := P#M100.0 byte 10
    RET_VAL := #BLKMOV,
    DSTBLK := P#M150.0 byte 10
    Jetzt werden die Bytes ja nicht nach MB150-159, sondern in den DB200 kopiert.

    Woher weiß das Ding das??
    Wieso kopiert der das nicht wieder nach MB150? Denn, der Movebefehl wird ja gleich "gefüttert"...

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

    Wohin in DB200 wurden denn die Daten kopiert?
    Probiere mal, was passiert, wenn du asl DB.Nummer eine 0 eingibst in MW154.
    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

  8. #17
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Hab es einfach mal vom Kai kopiert, den Pointer. Ist ja auch richtig wenn er es in den DB200 kopiert. (Habs nehrlich gesagt nicht ausprobiert)

    Wollte nur wissen woher die SPS, bei der gleichen "Versorgung" des SFC20, weiß ob sie die Daten jetzt ins die MB150-159 kopieren soll ODER in das Ziel was in den MB150-159 steht. Also worauf der Anypointer "zeigt".

    Liegt es an der SyntaxID oder woran...

  9. #18
    Registriert seit
    15.10.2007
    Ort
    St.Pölten
    Beiträge
    875
    Danke
    98
    Erhielt 200 Danke für 188 Beiträge

    Standard

    Code:
    L P##ZIEL_ANY; // ZIEL ANY (ANY) 
    LAR1 ; 
    
    L B#16#10; // Syntax-ID
    T MB150 
    
    L 2; // Datentyp
    T MB151
    
    L 6; // Anzahl
    T MW152
    
    L 200; // DB-Nummer
    T MW154
    
    L #STARTADRESSE; // Bereichszeiger
    ITD ; 
    SLD 3; 
    T MD156
    
    L B#16#84; // Operandenbereich hier wird vorgegeben ob M,DB...
    T MB156
    Hoffe du verstehst das jetzt.
    Volker hat das auch sehr gut beschrieben unter FAQ. Any-Pionter.
    gruß gerhard k

  10. Folgender Benutzer sagt Danke zu Gerhard K für den nützlichen Beitrag:

    Jordy (06.04.2008)

  11. #19
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Danke!

    Das mein ich leider nicht...

    Weiß auch nicht wie ich es sonst erklären soll. Egal.
    Funktioniert ja...


    Gruß
    Geändert von Jordy (06.04.2008 um 10:06 Uhr)

  12. #20
    Registriert seit
    15.10.2007
    Ort
    St.Pölten
    Beiträge
    875
    Danke
    98
    Erhielt 200 Danke für 188 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
     
    L P##ZIEL_ANY; // ZIEL ANY (ANY) 
    LAR1 ; 
     
    L B#16#10; // Syntax-ID
    T MB150 
     
    L 2; // Datentyp
    T MB151
     
    L 6; // Anzahl
    T MW152
     
    L 200; // DB-Nummer // 0 =kein DB 
    L MW154
     
    L #STARTADRESSE; // Bereichszeiger
    ITD ; 
    SLD 3; 
    T MD156
     
    L B#16#84; // Operandenbereich hier wird vorgegeben ob M,DB...
    T MB156
    vielleicht ist das deine Lösung
    Hab mir die ganzen vorherigen Sachen nicht durchgelesen.

Ä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
  •