String für Meldungen erstellen

Bööscher

Level-1
Beiträge
37
Reaktionspunkte
1
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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 habe;)mir ist schon bewusst, dass der Ladebefehl nicht VKE-abhängig ist. Erst denken, dann schreiben...:-D

@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:-D) 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
 
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
 
Zurück
Oben