ftp-Datei und Byte/Real-Wandelung

jan820813

Level-1
Beiträge
37
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe eine CP343-1 IT (1GX20-0XE0), mit dieser will ich ein paar Real-Werte (im ANSI-Format) in die CPU kopieren. Hat mich der Siemens-hilfe auch gut geklappt. Meine frage nun, ob man auch die Datei per ftp-Ordner auf den CP kopieren kann und die SPS über einen Baustein die Datei selber ausliest ohne die Kommandozeilenparameter, die man von Hand eingeben muss, ausliest. Was auch mgl. wäre, wenn sich die CPU die Datei von einem ftp-Server abholt (zyklisch ein mal an Tag) und die Datei automatisch in den File-DB kopiert.
Jetzt Problem zwei: Im DB liegen die Werte untereinander in Char-Format vor. Kein Problem Char in INT zu wandeln, wie kriege ich es aber hin, einen Wert mit Komma wieder zu einer REAL-Zahl zu wandeln? Wert z. B. 14,58, der andere 17,99 (die Werte stehen in der .txt-Datei untereinander) -> Pro Wert brauche ich dann sieben Byte Zeichen. Aus diesen sieben Zeichen soll dann wieder der REAL-Wert hergestellt werden.
 
Ein Ansatz wäre wohl der
FC 39 STRNG_R

Die Funktion FC 39 wandelt eine Zeichenkette in eine Variable im Format REAL. Die Zeichenkette muß in folgendem Format vorliegen:

±v.nnnnnnnE±xx ± Vorzeichenv 1 Vorkommastellen 7 Nachkommastellenx 2 Exponentenstellen
Ist die Länge der Zeichenkette kleiner als 14, oder ist sie nicht wie oben gezeigt aufgebaut, findet keine Wandlung statt und das BIE*Bit wird auf ”0" gesetzt. Liegt das Ergebnis der Wandlung außerhalb des REAL-Zahlenbereichs, wird das Ergebnis auf den entsprechenden Wert begrenzt und das Binärergebnis BIE auf "0" gesetzt


Parameter Deklaration Datentyp Speicherbereich Beschreibung
S INPUT STRING D, L Eingangszeichenkette
RET_VAL OUTPUT REAL E, A, M, D, L Ergebnis
Der Eingangsparameter kann nur mit einer symbolisch definierten Variablen belegt werden.
Zu finden unter stdlibs / iec im Simatic Manager
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Real fest in diesem Format vorliegen kann man auch

1. die Zahlen links vom Komma
wandeln in Real
2. die Zahlen rechts vom Komma
wandeln in Real, dividieren /100

Dann beide Real addieren.

oder noch einfacher:
Das Komma ausschneiden,
die erhaltene Zahl in Real wandeln, dann durch 100 teilen.
 
Byte in real wandeln

Hallo,
danke für den Tip. Kannst Du mir ein Beispiel für den Programmcode geben.
Ich hatte folgendes probiert: die erste Zahl (als Zehnerweert vor Komma) mal 1000, die Einerstelle vor dem Komma mal 100. Beides addiert und transferiert in real.
die Die erste Nachkommastelle dann mal 10 und mit der zweiten Nachkommastell addiert und transferiert in real. Dann beide addiert und durch 100 geteilt.
Wenn ich die Werte in "Dezimal" anschauen, ist das okay (bis auf den Kommawert). Wenn ich das in real anschauen, steht nur Müll drin.
Ich denk das liegt daren, dass ich die Werte aus einem Byte und dann mir real-Kommandos bearbeitet.
Wie kann ich von Byte direkt in Real wandeln???
 
Ich würde das Komma entfernen. Dann hast du einen String mit 4 Zeichen (5 oder 6 bei größeren Werten), die letzten 2 sind auf jeden Fall die beiden Nachkommastellen. Nun würde ich mit dem Baustein FC37 aus der Standard-Library diesen String in eine DInt wandeln. Danach einfach mit DTR in Real wandeln.

Code:
      CALL  "STRNG_DI"
       S      :=#My_String
       RET_VAL:=#My_Dint

      L     #My_Dint
      DTR   
      L     100.0
      /R    
      T     #My_Real

Du kannst natürlich auch String in Real wandeln, aber dazu mußt du die korrekte Syntax einhalten, das halte ich hier für komplizierter.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das ist aber das Problem. Ich habe das Komma nunmal drin. Sonst müßte jemand jedesmal die txt-Datei von Hand bearbeiten un das Komma rauslöschen oder gibt es eine Möglichkeit das auszublenden?
 
Hallo,
das ist aber das Problem. Ich habe das Komma nunmal drin. Sonst müßte jemand jedesmal die txt-Datei von Hand bearbeiten un das Komma rauslöschen oder gibt es eine Möglichkeit das auszublenden?

Ich würde das in der SPS rausnehmen. Du mußt ja ohnehin die einzelnen Daten ausschneiden und in die richtige Größe bringen, da kann man das Komma auch noch entfernen. Du hast ja geschrieben, die Werte liegen im DB im Char-Format. Wenn also im DB Byte 5,6,7,8,9 folgendes steht:

5: '1'
6: '7'
7: ','
8: '4'
9: '6'

dann nimmst du eine Stringvar mit der Länge 4.

Dort scheibst du hinein.

0: 4 (Länge max)
1: 4 (Länge )
2: Byte 5
3: Byte 6
4: Byte 8
5: Byte 9

Diesen String gibst du dann in den FC37.

Bsp-Code:

Code:
      L     P##My_String                //als String in Temp definiert
      LAR1  

      L     4
      T     B [AR1,P#0.0]
      T     B [AR1,P#1.0]
      L     DB1.DBB    5
      T     B [AR1,P#2.0]
      L     DB1.DBB    6
      T     B [AR1,P#3.0]
      L     DB1.DBB    8
      T     B [AR1,P#4.0]
      L     DB1.DBB    9
      T     B [AR1,P#5.0]
 
Zuletzt bearbeitet:
Zurück
Oben