Deklaration FC 30 R_String

lukasalija

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Bin der Neue
Ich möchte eine Real Zahl in einen String umwandeln.
Dieses möchte ich mit dem FC 30 tun.
Habe nun überhaupt keine Ahnung wie die Ausgangsvariable aussehen soll. Wie deklarieren oder wo die Variable herkommt. Möchte den String in einen DB ablegen.
Vielleicht gibt es ein kleines Beispielprogramm.
 
Hallo lukasalija,

wenn Du den FC30 anklickst und dann F1 drückst, kommt folgende Beschreibung:

Die Funktion FC 30 wandelt eine Variable im REAL*Format in eine Zeichenkette. Die Zeichenkette wird mit 14 Stellen darstellt:

±v.nnnnnnnE±xx ±Vorzeichenv 1 Vorkommastellen 7 Nachkommastellenx 2 Exponentenstellen
Ist die am Rückgabeparameter angegebene Variable zu kurz oder liegt am Parameter IN keine gültige Gleitpunktzahl an, findet keine Wandlung statt und das BIE*Bit wird auf "0" gesetzt.

Parameter Deklaration Datentyp Speicherbereich Beschreibung
IN INPUT REAL E, A, M, D, L, Konst. Eingangswert
RET_VAL OUTPUT STRING D, L Ergebniszeichenkette
Der Ausgangsparameter kann nur mit einer symbolisch definierten Variable belegt werden.
Die beiden rot markierten Stellen beschreiben, wie Deine Ausgangsvariable aussehen muss:
Die Zeichenkette wird mit 14 Stellen darstellt bedeutet: String[14]
Das kannst Du direkt in Deinem DB machen.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe folgendes getan

CALL "R_SRNG"
IN:=12.00e+00
RET_VAL:="Senden_Daten".Test

Senden_Daten.Test ist im DB als String[14] deklariert.
Kann aber im DB keine Änderung erkennen. Läuft nicht, was mach falsch?
 
Hallo

Beschreibung

Die Funktion FC 30 wandelt eine Variable im REAL*Format in eine Zeichenkette. Die Zeichenkette wird mit 14 Stellen darstellt:

±v.nnnnnnnE±xx ±Vorzeichenv 1 Vorkommastellen 7 Nachkommastellenx 2 Exponentenstellen
Ist die am Rückgabeparameter angegebene Variable zu kurz oder liegt am Parameter IN keine gültige Gleitpunktzahl an, findet keine Wandlung statt und das BIE*Bit wird auf "0" gesetzt.

Parameter Deklaration Datentyp Speicherbereich Beschreibung
IN INPUT REAL E, A, M, D, L, Konst. Eingangswert
RET_VAL OUTPUT STRING D, L Ergebniszeichenkette
Der Ausgangsparameter kann nur mit einer symbolisch definierten Variable belegt werden.

Wenn ich das richtig interpretiere, hasst du 2 Vorkommastellen.

Welchen Status hat das BIE-Bit
 
Habe Eingangseitig jetzt 1.1234e+000 eingeben, dennoch
keine Änderungen im DB. BIE ist auf 1.

Vielen Dank, für die schnellen Antworten. Trotzdem könnte ich schreien und davonlaufen.

Wie kann ich die Ausgangsvariable noch anders deklarieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ist deine Ziel-Variable ("Senden_Daten".Test) irgendwann einmal initialisiert worden ?
Also ist in dem String der Header (deklarierte Länge und tatsächliche Länge des String) korrekt beschreriben worden ?
Wenn nein, dann ist das die erklärung - ALLE Siemens String-Behandlung-Routinen arbeiten (auch wenn sie den zielstring erst erzeugen) nur mit einem initialisierten String.

Gruß
Larry
 
Ich möchte eine Real Zahl in einen String umwandeln.
Dieses möchte ich mit dem FC 30 tun.
Habe nun überhaupt keine Ahnung wie die Ausgangsvariable aussehen soll. Wie deklarieren oder wo die Variable herkommt. Möchte den String in einen DB ablegen.

Siehe das folgende Programmbeispiel:

Code:
ORGANIZATION_BLOCK "OB_Hauptprogramm"
TITLE =Hauptprogramm
//14
AUTHOR : Kai
FAMILY : SPSForum
NAME : '40718'
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 =Real-Wert in String umwandeln
      CALL "R_STRNG" (
           IN                       := "DB_Daten".Wert_Real,
           RET_VAL                  := "DB_Daten".Wert_String);
      NOP   0; 
END_ORGANIZATION_BLOCK

Gruß Kai
 

Anhänge

  • OB1.pdf
    5,7 KB · Aufrufe: 29
  • DB100.pdf
    4,5 KB · Aufrufe: 38
  • 40718.zip
    33,1 KB · Aufrufe: 24
Habe folgendes getan

CALL "R_SRNG"
IN:=12.00e+00
RET_VAL:="Senden_Daten".Test

Senden_Daten.Test ist im DB als String[14] deklariert.

Das sieht soweit richtig aus.

Kann aber im DB keine Änderung erkennen. Läuft nicht, was mach falsch?

Einen String in einem DB kannst Du nicht online beobachten

- wenn Du den DB offline (in dem Programm) öffnest und dann auf Beobachten gehst (siehe DB100_ONLINE.jpg).

Einen String in einem DB kannst Du online beobachten

- in einer VAT (siehe VAT.jpg)

- wenn Du den DB online (in der CPU) öffnest, in die Datenansicht wechselst und dann mit F5 aktualisierst.

Gruß Kai
 

Anhänge

  • DB100_ONLINE.jpg
    DB100_ONLINE.jpg
    224,9 KB · Aufrufe: 29
  • VAT.jpg
    VAT.jpg
    307,1 KB · Aufrufe: 27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ist deine Ziel-Variable ("Senden_Daten".Test) irgendwann einmal initialisiert worden ?
Also ist in dem String der Header (deklarierte Länge und tatsächliche Länge des String) korrekt beschreriben worden ?
Wenn nein, dann ist das die erklärung - ALLE Siemens String-Behandlung-Routinen arbeiten (auch wenn sie den zielstring erst erzeugen) nur mit einem initialisierten String.

Das ist so nicht ganz richtig.

Der FC30 R_STRNG initialisiert bei seinem ersten Aufruf (zumindest in AWL/FUP) den String selber, der String muss also nicht von Hand initialisiert werden.

Gruß Kai
 
Das ist so nicht ganz richtig.

Der FC30 R_STRNG initialisiert bei seinem ersten Aufruf (zumindest in AWL/FUP) den String selber, der String muss also nicht von Hand initialisiert werden.

Gruß Kai

Sorry Kai,
ich habe es selber gerade eben noch einmal nachgestellt.
Der o.g. FC30 initialisiert (wie schon von mir geschrieben) NICHT den Ziel-String. Es MUSS minimal die deklarierte Länge des Strings im Header angegeben sein - sonst geht es nicht.

Ich muß gestehen, dass ich den FC30 bisher nicht verwendet habe - meine Antwort war also eine Verallgemeinerung, die ich aus Erfahrungen mit den von mir schon mal verwendeten String-FC's abgeleitet habe - bei denen ist es aber auch so, wie von mir genannt : nicht initiliasiert heißt : FC arbeitet nicht oder nicht sinnvoll.

Ich habe allerdings auch schon einen eigenen String-FC erstellt und dabei festgestellt, dass es nicht notwendig ist, den String vorher zu initialisieren. Bei vernünftiger Programmierung des FC's kann man darauf auch verzichten und trotzdem einen funktionierenden Rückgabewert erzeugen ...

Gruß
Larry
 
Ich habe allerdings auch schon einen eigenen String-FC erstellt und dabei festgestellt, dass es nicht notwendig ist, den String vorher zu initialisieren. Bei vernünftiger Programmierung des FC's kann man darauf auch verzichten und trotzdem einen funktionierenden Rückgabewert erzeugen ...

Aber du weist ja nie wie groß der String den du an deinen Parameter angelegt bekommen hast maximal werden darf. Es kann ja dann auch passieren, das du in einen reservierten Speicherbereich schreibst, oder nich?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen,
da hast du natürlich Recht - das kann ich auch nicht zerreden. Das liegt dann bei meinem FC tatsächlich dann in der Verantwortung des Anwenders.
Aber gar nichts zurück zu geben (nicht mal eine auswertbare Fehlermeldung) ist auch nicht so der Bringer ... :rolleyes:

Gruß
Larry
 
Zurück
Oben