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

Ergebnis 1 bis 8 von 8

Thema: String für Meldungen erstellen

  1. #1
    Registriert seit
    09.01.2006
    Beiträge
    37
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen zusammen!
    Ich hab leider in der Suche nichts gefunden, was mir weiter helfen könnte...

    Im Rahmen meiner Projektarbeit möchte ich Texte als String für Betriebszustände und Störmeldungen an meinem OP7 ausgeben.

    Leider hab ich noch gar keine Ahnung, wie man mit Strings arbeitet. Weder in der S7 noch im OP7. Mein Wellenreuther, der mir sonst immer brav bei Seite gestanden hat, hat mir da leider auch nicht mehr geholfen.
    Kann mir jemand mal erklären, wie ich da vorgehen muss? Oder hat jemand einen nützlichen Link(vielleicht sogar hier ins Fourm), in dem es verständlich erklärt ist?

    Vielen Dank im Vorraus!
    Bööscher
    Zitieren Zitieren String für Meldungen erstellen  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Also ein String in der S7 ist ein Aneinanderreihung von Bytes die die einzelnen Zeichen Darstellen.

    Also jedes Byte ein ASCII-Zeichen.

    Nun gibt es noch zwei Informationen die ein String zu einem S7-String machen.
    1. Wie lange darf dieser String werden. Da man dafür ja Speicher freihalten muss. Diese Information findet man im allerersten Byte des Strings und ist ein Zahlenwert.
    2. Wie Lange ist er denn aktuell. Da es ja unterschiedlich lange Inhalte gibt. Diese Information findet man im zweiten Byte des Strings und ist auch ein Zahlenwert.

    Daraus ergibt sich das ein String max. 254 Zeichen enthalten kann und immer zwei Byte größer ist als die Anzahl der maximalen Zeichen.

    Step7 tut sich mit Strings immer etwas schwer da diese Online auch nicht so einfach zu beobachten sind. Eine Möglichkeit ist es in einer VAT die einzelnen Bytes als Zeichen darstellen zu lassen.

    Um Strings zu manipulieren gibt es einige IEC Funktionen. Die man aber später erläutern sollte.

    Eine Grundidee wäre es einen String bereitzustellen der an das HMI übergeben wird. Diesen String kann man dann z.B. mit Vorgefertigten Strings aus einem DB Füttern und eventuell mit weiteren Informationen anzureichern. Man kann also auch z.B. Integerwerte wandeln und dem String anhängen.
    If you open your Mind too much, your Brain will fall out.

  3. #3
    Registriert seit
    09.01.2006
    Beiträge
    37
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke Zotos, für deine schnelle Antwort. Jetzt bin ich schonmal ein Stückchen weiter. Das einString max. 254 Zeichen haben kann, hatte ich schon gelesen, aber jetzt weiß ich auch, wieso es keine 256 sind

    Aber wie gehe ich nun vor?
    Kann ich in einem Datenbaustein verschiedene Strings hinterlegen und diese dann bei verschiedenen Verknüpfungen auslesen?
    So in etwa:

    U Ex.x
    U Ey.y
    L DBX.db? 2.0

    Steht dann in 2.0 ein Text, den ich im OP anzeigen kann?

    Mfg

  4. #4
    Registriert seit
    24.11.2006
    Ort
    57072 Siegen
    Beiträge
    466
    Danke
    59
    Erhielt 121 Danke für 109 Beiträge

    Standard

    Zitat Zitat von Bööscher Beitrag anzeigen
    So in etwa:

    U Ex.x
    U Ey.y
    L DBX.db? 2.0

    Hallo Bö.,

    Lade und Transferbefehle sind VKE - unabhängig.
    Daher wird das L immer ausgeführt, auch wenn die vorgeschalteten
    Bedingungen nicht "true" sind.

    CU

    Jürgen


    .

    Zur Beachtung:
    Ich distanziere mich ausdrücklich von allen Aussagen in diesem Forum
    welche nicht von mir stammen und mache mir deren Inhalte nicht zu eigen.


    www.ibn-service.com

  5. #5
    Registriert seit
    24.10.2007
    Ort
    Niederlande
    Beiträge
    676
    Danke
    22
    Erhielt 143 Danke für 135 Beiträge

    Standard

    So einfach geht dass nicht.
    Du musst ein String definieren welch Sie in die OP7 verwende fur die meldungen.
    Wenh er dan ein melding hoch ist must der String von dieser melding in die String von die OP7 gekopiert worden.
    Hierbij ein beispiel mit 25 Meldingen.
    Code:
    DATA_BLOCK DB 21
    TITLE =
    VERSION : 0.1
     
      STRUCT  
       Leeg : STRING  [20 ]; //Geen tekst
       Text : ARRAY  [1 .. 25 ] OF //Meldingen (25 stuks)
       STRING  [20 ]; 
       TextOP : STRING  [20 ]; //Tekst voop op OP7
      END_STRUCT ; 
    BEGIN
       Leeg := ''; 
       Text[1] := 'Storing 1 xxxx'; 
       Text[2] := 'Storing 2 aaaaa'; 
       Text[3] := 'Storing 3'; 
       Text[4] := 'Melding1'; 
       Text[5] := 'Melding 2'; 
       Text[6] := '12345678901234567890'; 
       Text[7] := 'reserve'; 
       Text[8] := 'reserve'; 
       Text[9] := 'reserve'; 
       Text[10] := 'reserve'; 
       Text[11] := 'reserve'; 
       Text[12] := 'reserve'; 
       Text[13] := 'reserve'; 
       Text[14] := 'reserve'; 
       Text[15] := 'reserve'; 
       Text[16] := 'reserve'; 
       Text[17] := 'reserve'; 
       Text[18] := 'reserve'; 
       Text[19] := 'reserve'; 
       Text[20] := 'reserve'; 
       Text[21] := 'reserve'; 
       Text[22] := 'reserve'; 
       Text[23] := 'reserve'; 
       Text[24] := 'reserve'; 
       Text[25] := 'reserve'; 
       TextOP := ''; 
    END_DATA_BLOCK
    FUNCTION FC 110 : INT
    TITLE =Block copy met var. bron en var. doel.
    //Kopieren van variable met een variable bron en een variabel doel.
    //Bron en doel mogen elkaar niet overlappen
    //Onderliggend bouwsteen SFC 20.
    AUTHOR : JB
    FAMILY : Kopie
    NAME : Blk_mov
    VERSION : 0.0
     
    VAR_INPUT
      DB_NR_BRON : INT ; //0 =MERKER BEREIK ANDERS DB NR VAN BRON
      BYTE_1_BRON : INT ; //NR VAN EERSTE BYTE VAN BRON
      BYTE_WORD : BOOL ; //BYTE=0 WORD=1
      LENGTE : INT ; //AANTAL TE COPIEREN BYTES OF WOORDEN
      DB_NR_DOEL : INT ; //0 =MERKER BEREIK ANDERS DB NR VAN DOEL
      BYTE_1_DOEL : INT ; //NR VAN EERSTE BYTE VAN DOEL
    END_VAR
    VAR_TEMP
      T_AR1 : DWORD ; 
      T_ANY_BRON : ANY ; 
      T_ANY_DOEL : ANY ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Opslaan inhoud van het Adresregister AR1
          TAR1  #T_AR1; 
    NETWORK
    TITLE =Samenstellen van DOEL adres in ANY formaat
          LAR1  P##T_ANY_BRON; //Beginadres ANY pointer in AR1 laden
          L     B#16#10; //Syntax-ID in de Any pointer zetten
          T     LB [AR1,P#0.0]; 
          L     B#16#2; //Bereichstyp BYTE laden
          UN    #BYTE_WORD; 
          SPB   Tran; 
          L     B#16#4; //Bereichstyp WORD laden
    Tran: T     LB [AR1,P#1.0]; //BYTE of WORD in ANY pointer zetten
          L     #LENGTE; //Aantal BYTE'S of WORD'S
          T     LW [AR1,P#2.0]; //In ANY pointer zetten
          L     #DB_NR_BRON; //DB nr 
          T     LW [AR1,P#4.0]; //In ANY pointer zetten
          L     0; 
          ==I   ; 
          SPB   Merk; //Als DB nr = 0 dan naar merkers
          L     P#DBX 0.0; //Adres voor DBX 0.0
          SPA   Offs; 
    Merk: L     P#M 0.0; //Adres voor M 0.0
    Offs: L     #BYTE_1_BRON; //Nummer van eerste BYTE
          SLD   3; //Nummer op juiste plaats zetten
          +D    ; //Adres van 1ste BYTE of WORD
          T     LD [AR1,P#6.0]; //In ANY pointer zetten
    NETWORK
    TITLE =Samenstellen van BRON adres in ANY formaat
          LAR1  P##T_ANY_DOEL; //Beginadres ANY pointer in AR1 laden
          L     B#16#10; //Syntax-ID in de Any pointer zetten
          T     LB [AR1,P#0.0]; 
          L     B#16#2; //Bereichstyp BYTE laden
          UN    #BYTE_WORD; 
          SPB   Tra1; 
          L     B#16#4; 
    Tra1: T     LB [AR1,P#1.0]; 
          L     #LENGTE; 
          T     LW [AR1,P#2.0]; 
          L     #DB_NR_DOEL; 
          T     LW [AR1,P#4.0]; 
          L     0; 
          ==I   ; 
          SPB   Mer1; 
          L     P#DBX 0.0; 
          SPA   Off1; 
    Mer1: L     P#M 0.0; 
    Off1: L     #BYTE_1_DOEL; 
          SLD   3; 
          +D    ; 
          T     LD [AR1,P#6.0]; 
    NETWORK
    TITLE =Oproep van SFC 20  (BLKMOV)
          CALL SFC   20 (
               SRCBLK                   := #T_ANY_BRON,//Adres waar data vandaan moet komen
               RET_VAL                  := #RET_VAL,//Foutmelding
               DSTBLK                   := #T_ANY_DOEL);//Adres waar data naartoe moet
    NETWORK
    TITLE =Inhoud adresregister AR1 terugzetten
          LAR1  #T_AR1; 
    END_FUNCTION
    FUNCTION FC 21 : VOID
    TITLE =
    VERSION : 0.1
     
    VAR_TEMP
      Null : BOOL ; 
      Textnr : INT ; 
      RetVal : INT ; 
      Melding : ARRAY  [1 .. 20 ] OF BOOL ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #Null; 
          R     #Null; 
    NETWORK
    TITLE =
    //Melding{x] vervangen door merkers e.d.
          U     #Melding[1]; 
          SPBN  m2; 
          L     1; 
          SPA   copy; 
    m2:   U     #Melding[2]; 
          SPBN  m3; 
          L     2; 
          SPA   copy; 
    m3:   U     #Melding[3]; 
          SPBN  m4; 
          L     3; 
          SPA   copy; 
    m4:   U     #Melding[4]; 
          SPBN  m5; 
          L     4; 
          SPA   copy; 
    m5:   U     #Melding[5]; 
          SPBN  m6; 
          L     5; 
          SPA   copy; 
    m6:   U     #Melding[6]; 
          SPBN  m7; 
          L     6; 
          SPA   copy; 
    m7:   U     #Melding[7]; 
          SPBN  m8; 
          L     7; 
          SPA   copy; 
    m8:   U     #Melding[8]; 
          SPBN  m9; 
          L     8; 
          SPA   copy; 
    // uzw
    m9:   NOP   0; 
          U     #Melding[20]; 
          SPBN  m0; 
          L     20; 
          SPA   copy; 
    m0:   L     0; 
    //geen meling lege string copieren
          SPA   copy; 
    copy: L     22; 
          *I    ; 
          T     #Textnr; 
     
    NETWORK
    TITLE =Copy meldings string naar OP string
     
          CALL FC   110 (
               DB_NR_BRON               := 21,
               BYTE_1_BRON              := #Textnr,
               BYTE_WORD                := #Null,
               LENGTE                   := 22,
               DB_NR_DOEL               := 21,
               BYTE_1_DOEL              := 572,
               RET_VAL                  := #RetVal);
    END_FUNCTION
    Wenn Sie viele meldungen had ist es einfacher diese meldingen in die OP7 te programmieren. Wehn sie das in OP7 macht benodigen Sie fur jede melding nur ein bit.

  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

    Also gerade bei den kleineren OP verwende ich Srrings aus der SPS zum Melden eigentlich fast gar nicht. Man kann, wie Joop schon erwähnte, die Texte für Meldungen und Störungen in dem OP projektieren/hinterlegen und dann mit einem Bit zur Anzeige bringen. Bei Störungen kommt dann noch das Quittierungsmanagement, der Mechanismus dafür ist im OP schon vorhanden. Variable Texte kann man mit Symbolisten bestücken. Hier kann z.Bsp.mit einem Byte (Wert 1-255) aus einer Liste ein Text ausgewählt werden, der dann in einen Text eingeblendet wird. Aus deiner Art der Fragestellung kann man aber sehen, daß du dich noch nicht allzuviel damit befaßt hast, deshalb lege ich dir schon als erstes die Dokumentationen zum OP, zur SPS und die Siemens-Ausbildungsunterlagen ans Herz. Dazu hilft auch eine Suche hier im Forum in der FAQ bei Literatur weiter.
    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
    Registriert seit
    09.01.2006
    Beiträge
    37
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Tach zusammen!
    zunächst mal vielen Dank für die schnellen Antworten!

    @IBN-Service:ich glaub es war doch ein bisschen zu früh heute morgen...hab mich grad selbst gefragt, was ich da geschrieben habemir ist schon bewusst, dass der Ladebefehl nicht VKE-abhängig ist. Erst denken, dann schreiben...

    @Joop:danke für die Antwort, werd da mal ein bisschen rumexperimentieren...

    und @Ralle:Vielleicht ist meine Fragestellung ein bisschen unglücklich(siehe lade-Befehl) aber ich habe mich schon damit beschäftigt!
    Die Möglichkeit, Ein-/Ausgabefelder einzufügen kenne ich. Damit bekomme ich auch Meldungen im OP angezeigt, kein Problem. Aber ich wollte halt mal ein bisschen mit Strings experimentieren, damit ich das auch mal lerne.
    Habe auch im Internet, meinen unterlagen usw. geschaut, ob ich was passendes finde.
    habe gehofft, dass mir es hier jemand mal verständlich erklären kann,hab vor allem in den Siemens-Unterlagen dazu nicht all zu viel gefunden. Oder welche kannst du mir da empfehlen?

    Mfg

  8. #8
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.862
    Danke
    78
    Erhielt 805 Danke für 548 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    der entscheidende baustein für den stringtransfer ist die sfc21
    z.b.
    du hast einen db(1) wo alle deine texte drinstehen.
    alle strings sollte nach möglichkeit die gleiche länge haben (vereinfacht die sache ungemein)

    du hast einen weiteren db(2), in den du den entsprechenden string, den du im op anzeigen willst.

    mit der sfc21 transt du dann einfach die entsprechende meldung aus dem db1 in den db2
    wie du dir den zeiger/pointer dafür baust, findest du in der faq


    im panal definierst du ein ausgabefeld vom typ string auf die var im db2
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

Ähnliche Themen

  1. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  2. Antworten: 13
    Letzter Beitrag: 24.09.2009, 12:54
  3. CPU-Meldungen als String
    Von nobby_nobbs im Forum HMI
    Antworten: 6
    Letzter Beitrag: 29.09.2008, 11:53
  4. Ein String kopieren in einen anderen String
    Von CanYouHelpMe im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2008, 17:21
  5. STRING aus einzelnen STRING's zusammenstellen
    Von ollibolli im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.08.2006, 09:39

Lesezeichen

Berechtigungen

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