Messdaten von S7-300 an PC (Software:Testpoint) übertragen

Zuviel Werbung?
-> Hier kostenlos registrieren
Welches Datenformat muss ich nehmen?

So,
habs das Teil jetzt an ne 313C gehängt und die Kommunikation klappte auch schon soweit...

Hab das CP aus ASCII eingestellt.
Dann ne Verbindung mit Hyperterminal aufgebaut.

MIt dem FC3 will ich nun zum Testen eine Integerzahl auf den PC übertragen.
Im Hyperterminal kommen aber nur Buchstaben an.

Wie stell ich das jetzt an, dass ich am PC wieder Zahlen habe?

Vielen Dank für eure Hilfe!

Gruß
Johannes
:-D
 
Hallo Jupp,
du must deine Zahl, die du übertragen willst zunächst in eine Zeichenkette (String) wandeln. Das hatte ich aber auch schon mal geschrieben.
 
Lösung

Hi,
hab mir folgenden FC geschrieben, um Integer in ASCII umzuwandeln:

------------------------------------------------------------------

L #Zahl
T #Integer

L LB 0
T #Dekate1
T #Dekate2

L LB 1
T #Dekate3
T #Dekate4

R L 2.0
R L 2.1
R L 2.2
R L 2.3

R L 3.4
R L 3.5
R L 3.6
R L 3.7

R L 4.0
R L 4.1
R L 4.2
R L 4.3

R L 5.4
R L 5.5
R L 5.6
R L 5.7

L #Dekate1
+ 48
T #Dekate1

L #Dekate2
+ 48
T #Dekate2

L #Dekate3
+ 48
T #Dekate3

L #Dekate4
+ 48
T #Dekate4

L LD 2
T #ASCII

------------------------------------------------------------------

Jetzt kommen Werte wie 0007 bei #Integer = 7 im PC an.
Sieht aus, als würde es so klappen... ;)

Gruß
Johannes
 
Irgendwie hab ich den Eindruck, dein Code wird so nicht richtig funktionieren.
Ich hab mal eine Quelle eingefügt, die kannst du importieren und übersetzen. Du hast anschließend einen FC210, FC211, DB210. Schau es dir mal an, vielleicht kannst du was davon verwenden.

Hier noch der Code:

Code:
DATA_BLOCK DB 210
TITLE =
VERSION : 0.1


  STRUCT     
   String_1 : STRING  [10 ];    
  END_STRUCT ;    
BEGIN
   String_1 := ''; 
END_DATA_BLOCK

FUNCTION FC 210 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  ZahlINT : INT ;    
  ZahlDINT : DINT ;    
  AdrString : ANY ;    
END_VAR
VAR_OUTPUT
  ASCIIDWORD : DWORD ;    
END_VAR
VAR_TEMP
  Integer : INT ;    
  Dekade1 : BYTE ;    
  Dekade2 : BYTE ;    
  Dekade3 : BYTE ;    
  Dekade4 : BYTE ;    
  TempString : STRING  [10 ];    
  RetVal : INT ;    
  OutStringAny : ANY ;    
  SAVE_VKE : BOOL ;    
  RETTAR1 : DWORD ;    
  RETTAR2 : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Sichere VKE im BIE

      SET   ; 
      SAVE  ; 
      =     #SAVE_VKE; 
NETWORK
TITLE =Adtressregister retten

      TAR1  #RETTAR1; 
      TAR2  #RETTAR2; 
NETWORK
TITLE =ich würde das in etwa so machen

      L     P##TempString; 
      LAR1  ; 

//Stringkopf vorbelegen
      L     10; 
      T     B [AR1,P#0.0]; 
      L     0; 
      T     B [AR1,P#1.0]; 
//mit Leerzeichen vorbelegen
      L     W#16#20; 
      T     B [AR1,P#2.0]; 
      T     B [AR1,P#3.0]; 
      T     B [AR1,P#4.0]; 
      T     B [AR1,P#5.0]; 
      T     B [AR1,P#6.0]; 
      T     B [AR1,P#7.0]; 
      T     B [AR1,P#8.0]; 
      T     B [AR1,P#9.0]; 
      T     B [AR1,P#10.0]; 
      T     B [AR1,P#11.0]; 
      T     B [AR1,P#12.0]; 

//String wandeln mit FC5 aus den IEC Functions der Standard-Library (DI_STRNG)
      CALL FC     5 (
           I                        := #ZahlDINT,
           RET_VAL                  := #TempString);

//Adressen laden
      L     P##AdrString; 
      LAR1  ; 
      L     P##OutStringAny; 
      LAR2  ; 

//Zeiger umkopierenm da ma Blockmove DSTBLK keinen String (OUT) zuweisen kann, aber einen Any (OUT)
      L     W [AR1,P#0.0]; 
      T     W [AR2,P#0.0]; 
      L     W [AR1,P#2.0]; 
      T     W [AR2,P#2.0]; 
      L     W [AR1,P#4.0]; 
      T     W [AR2,P#4.0]; 
      L     W [AR1,P#6.0]; 
      T     W [AR2,P#6.0]; 

      CALL SFC   20 (
           SRCBLK                   := #TempString,
           RET_VAL                  := #RetVal,
           DSTBLK                   := #OutStringAny);

NETWORK
TITLE =Dein Code, aber die Lokaldaten nicht direkt adressiert
//Int darf nur 3-stellig sein, sonst funktioniert BTI nicht
//man kann das auch mit DINT und DTB
      L     P##Integer; 
      LAR1  ; 

      L     #ZahlINT; 
      ITB   ; 
      T     W [AR1,P#0.0]; 

      L     B [AR1,P#0.0]; 
      L     W#16#F; 
      UW    ; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade2; 

      L     B [AR1,P#0.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade1; 

      L     B [AR1,P#1.0]; 
      L     W#16#F; 
      UW    ; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade4; 

      L     B [AR1,P#1.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade3; 

      L     P##Dekade1; 
      LAR1  ; 

      L     D [AR1,P#0.0]; 
      T     #ASCIIDWORD; 

      SPA   ENDE; 
NETWORK
TITLE =Dein Code für Integer und korrigiert

      L     #ZahlINT; 
      ITB   ; 
      T     #Integer; 

      L     LB     0; 
      L     W#16#F; 
      UW    ; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade2; 

      L     LB     0; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade1; 

      L     LB     1; 
      L     W#16#F; 
      UW    ; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade4; 

      L     LB     1; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Dekade3; 
      L     LD     2; 
      T     #ASCIIDWORD; 
NETWORK
TITLE =Zurückübertragen der geretteten Adressregister

ENDE: NOP   0; 
      LAR1  #RETTAR1; 
      LAR2  #RETTAR2; 
NETWORK
TITLE =

      U     #SAVE_VKE; 
      SAVE  ; 
      BE    ; 
END_FUNCTION

FUNCTION FC 211 : VOID
TITLE =
VERSION : 0.1

BEGIN
NETWORK
TITLE =

      CALL FC   210 (
           ZahlINT                  := MW   100,
           ZahlDINT                 := MD   104,
           AdrString                := DB210.String_1,
           ASCIIDWORD               := MD   110);

END_FUNCTION
Mag sein, daß noch was besser geht, aber dafür gibts andere KAndIdaten hier im Forum :ROFLMAO::ROFLMAO:!

PS: Die Zahl darf im Beispiel mit Vorzeichen 10 Stellen haben und landet im DB210 als String. Von da kann man dann ja beliebige Teile rauskopieren und weiterverwenden.
 

Anhänge

  • FC211_Ascii_Wandl.zip
    1,3 KB · Aufrufe: 16
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke!!!

Ja, mein Code funktioniert leider nur für einstellige Zahlen...
Da war ich wohl etwas zu euphorisch... ;)

Danke für deine Hilfe!
Bin grade dabei, deine FCs auszuprobieren.

Gruß
Johannes :-D
 
Probleme mit DONE

Guten Morgen!

Die Bausteine funktionieren gut. Vielen Dank!!! :-D

Ich hatte vor, die Übertragung mit ner Schrittkette zu realisieren.

Es wird für die 6 Prüfstände nacheinander abgefragt, ob ein neuer Messwert vorhanden ist (Bit im Datenbaustein des Prüfstandes).

Also:
Prüfstand 1 > kein neuer Messwert
springe zu Prüfstand 2
Prüfstand 2 > neuer Messwert
übertrage
wenn fertig (DONE des FB3 P_SEND)
springe zu Prüfstand 3
usw...

Problem:
Das DONE-Signal steht viel zu kurz an
Die Übertragung des 1. Schrittes läuft, dann geht es aber nicht weiter, weil der nächste Schritt auf das DONE-Signal wartet...

Es kommt zwar, (habs mit dem SR getestet), aber es reicht halt nicht aus, um es vernümftig weiterverarbeiten zu können.

Hab zunächst versucht, es mit dem SR zu speichern und diesen dann, nachdem der erste Schritt zurückgesetzt wurde, ebenfalls zurück zu setzen... klappt aber auch nicht wirklich...

Habt ihr noch ne Idee dazu?
Schonmal vielen Dank!!! ;)

Gruß
Johannes
 
Zuletzt bearbeitet:
Bin dumm...

Hätte mich mal etwas besser mit temporären Variablen beschäftigen sollen... :???:
Irgendwie hatte ich das Temporäre an diesen Variablen noch nicht so ganz begriffen...

Naja, zum Glück läuft es jetzt und ich bin mal wieder etwas schlauer... ;)

Gruß
Johannes
 
Zurück
Oben