Step 7 Umwandeln von Zahlen

firefox711

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Zusammen.

Ich habe eine CPU317 2 PN / DP mit einem CP-343. Diese Hardware soll eine alte S5 CPU944 ersetzen. Jetzt gibt es aber ein Datenbaustein zur Übertragung von Bits an ein Rechnersystem. Dieser Rechner erhält die Daten als Telegramm.

In S5 sieht der DB so aus:

DW0 KC '0034' ;Telegrammlänge in Byte
DW2 KM 00000000 00000000
DW3 KM 00000000 00000000
DW4 KM 00000000 00000000
:
:
DW16 KM 00000000 00000000
DW17 KC 'ETX_' ;Endekennung Telegramm
DW19 KH 0000

Der übergeordnete Rechner erkennt also das jetzt ein Telegramm von der Steuerung mit einer Länge von 34 Byte kommt und das ETX_ gibt das Telegrammende an. Beides beides wird an dem Rechner auf richtigkeit kontrolliert.

Jetzt will ich diesen Datenbaustein in S7 umwandeln, also muss ich die KC's als String angeben. Leider verschieben sich dadurch bei mir die Adressen der Daten zwischen DW 2 und 16, und die ganze Telegrammlänge stimmt nun nicht mehr.

Kann mir da einer von euch einen Tipp geben?

Gruß
Torsten

P.S: An dem übergeordneten Rechner kann ich die Abfrage der Telegrammlänge nicht ändern.
 
Warum ein String?

Du hast vorne vier ASCII-Zeichen, ein paar HEX-Worte und noch mal vier ASCII.

Da würde ich den neuen DB genauso aufbauen...
 
???? Jetzt steh ich am Bahnhof, sry.

Also der Datentyp ist dann ARRAY oder CHAR??? Und die Zeile DW0 und DW17 stehen fest im DB. Da brauche ich im Programmablauf nix reinschreiben. Kannst du mir bitte kurz aufschreiben, wie der DB dann aussehen soll?

Danke dir
 
Zuviel Werbung?
-> Hier kostenlos registrieren
KC kennt S7 leider nicht.
Das ist Dein Part als erfahrener Programmierer, bestimmte S5-Anweisungen in die entsprechenden S7-Anweisungen zu übersetzen. Den automatischen Konverter könnte ja sonst jeder anschmeissen ...

Du könntest den DB z.B. so deklarieren:
Code:
 +0.0 len1  CHAR          '0'
 +1.0 len2  CHAR          '0'
 +2.0 len3  CHAR          '3'
 +3.0 len4  CHAR          '4'
 +4.0 text  ARRAY[2..16]  W#16#0
            WORD
+34.0 etx1  CHAR          'E'
+35.0 etx2  CHAR          'T'
+36.0 etx3  CHAR          'X'
+37.0 etx4  CHAR          '_'

Harald
 
Code:
Tele_START    ARRAY[1..4]        vorläufige Platzhaltervariable    
                      CHAR            
DW2    WORD    W#16#0        
DW3    WORD    W#16#0        
DW4    WORD    W#16#0        
DW5    WORD    W#16#0        
DW6    WORD    W#16#0        
DW7    WORD    W#16#0        
DW8    WORD    W#16#0        
DW9    WORD    W#16#0        
DW10    WORD    W#16#0        
DW11    WORD    W#16#0        
DW12    WORD    W#16#0        
DW13    WORD    W#16#0        
DW14    WORD    W#16#0        
DW15    WORD    W#16#0        
DW16    WORD    W#16#0        
Tele_END    ARRAY[1..4]        vorläufige Platzhaltervariable    
                         CHAR            
DW19    WORD    W#16#0
 
Jo alles klar. Die Sache klappt jetzt schonmal, zumindest das er mir "0034ETX_" sendet. Nur die paar Wörter dazwischen fehlen noch irgendwie :confused:.
 
"die paar Wörter dazwischen" fehlen Dir vielleicht nur in Deiner Beobachtung, weil Dein Beobachtungsprogramm die 0-Bytes nicht darstellt?

Harald
 
Also so sieht das jetzt bei mir in offline und online aus:

DB10_off.jpgDB10_onl.jpg

Wo ich eben das Problem hatte, das als ich irgendwo in den Datenwörtern Bits auf 1 gesetzt hatte, Ist mir die Verbindung wieder abgeraucht wegen "Telegrammlänge stimmt nicht".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Telegrammlänge stimmt nicht".
Du sendest über Ethernet? Mit AG_SEND? Was für eine Verbindung? Wie ist die Verbindung in NetPro angelegt?
Zeige doch mal einen Screenshot oder Programmauszug wo der Sendebaustein aufgerufen wird. Wie sagst Du dem Sendebaustein die Telegrammlänge?

WER beschwert sich über die falsche Telegrammlänge - der Empfänger? Kann es sein, daß dieser nur druckbare ASCII-Zeichen verträgt und andere Zeichen ignoriert/verschluckt?

Wenn Deine Informationen weiter so spärlich tröpfeln, dann kann sich die Problemlösung gut noch eine Woche hinziehen ;) Doch gut, es ist ja nicht unser Projekt sondern Deins. :cool:

Harald
 
Also ich habe einen CP343 eingebaut, und in NetPro sieht des so aus:
NetPro.jpg

Die einstellung der Verbindung ist diese:

ver_mfr.jpg

Und ich verwende den AG_Send der bei mir im Progr. so aussieht.
AG_Send.jpg


Und sry, das ihr euch mir mir so lange ärgern müsst, aber in der zwischenzeit muss ich mich noch um die Fehler in der indirekten Adressierung kümmern. Irgendwie will der Mist auch nicht so, wie ich will. :oops:
Und so lange ich nicht fertig bin mit der Steuerung, so lange wird se nicht eingebaut ;)... Ist zum Glück kein Termindruck da.
 
Ääh, noch was...

Firefox, Dir ist bekannnt das die S5 Wortweise organisiert ist und die S7 Byteweise?

Ich vermute mal das Telegramm wird bei Änderung des Inhaltes gesendet. Überprüfe mal den Sendeaufruf!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das habe ich schon berücksichtigt. Die S5 hat insgesammt 19 Wörter gesendet, deshalb hier die Länge von 38 Byte.

Und das andere hast du auch recht. es wird vorher geprüft, ob ein unterschied zwischen den merkern und dem Inhalt der DW besteht. Ist ein Unterschied, werden die MW in die DW eingetragen und weggesendet. Was mich nur wundert, ich schicke alle 5s die Wörter von '0034' bis 'etx_' weg, egal ob geändert oder nicht. Wenn ich jetzt aber im Wort 238 irgendein Bit auf 1 setze, dann meckert der "MFR" wegen der Telegrammlänge und baut die Verbindung zur Steuerung wieder ab.
 
Wenn Du Dir dein Sendeprogramm anschaust ist Dei ANY-Pointer FÜR die Sendedaten gleich den Sendedaten.

Mach hier mal einen bereichsübergreifenden Zeiger rein um den Pointer von den Daten zu trennen.
 
Zurück
Oben