# CP340 ASCII Zeichen senden und empfangen



## Technikfreak (22 August 2011)

Erstmal Hallo an alle. Bin neu hier und wollte erstmal alle User grüßen 

Ich  habe schon einige Hilfetreads zur CP340 Baugruppe hier gelesen, was mir  schon etwas weitergeholfen hat, aber ein paar Sachen sind mir noch  nicht ganz klar.

Meine Aufgabe ist es Werte einer Waage, die im  ASCII Format vorliegen auszulesen. Zu allererst muss ich selbst mehrere  Befehle im ASCII Format an die Wage senden. Sobald die Befehle ankommen  sendet die Waage ihrerseits die Werte in ASCII Zeichen. Das Ganze wird  über die serielle Schnittstelle übertragen. (RS232) 
Ich habe eine CPU 314 zur Verfügung.

Ich habe die  Verbindung bereits Parametriert (Parametrierungssoftware installiert und  eingestellt) und die FBs 2 (empfangen) und 3 (senden) inklusive Instanz  DB sind vorhanden. Der Sende und Empfang Baustein wird mit OB1  aufgerufen.
Ausserdem liegt am REQ Eingang des Sende Bausteins ein 1 Signal an.
Baudrate Start/Stopbit usw. ist richtig eingestellt.

Nun zu meinen Fragen:
Wie  kann ich die ASCII Zeichenkette "COF1" senden? Muss ich dazu ein Aray  of Char in einem neuen DB anlegen (z.B. DB1) auf den ich bei DB_NO im  Sende Baustein (P_Send) verweise? Könnte mir jemand bitte ein Code  Beispiel in AWL schreiben wie der Inhalt des DB1 geschrieben werden  muss, damit diese Zeichenkette gesendet wird?

Den Baustein zum Empfangen habe ich eingerichtet mit den korrekten Adressen aus der Baugruppe. EN_R ist gesetzt.
Wie  kann ich die übertragenen ASCII Werte in einen DB schreiben? Die Werte  kommen als ASCII Code mit 6 Stellen an und sollten als Double Integer in  einen neuen DB geschrieben werden.
Vieleicht kann mir auch hier jemand mit AWL Code schreiben wie ich die Werte in den DB bekomme.

Auf alle Fällle möchte ich mich schonmal bedanken für alle die sich die Mühe machen mir weiterzuhelfen


----------



## SoftMachine (22 August 2011)

Hallo !

Benutze erst mal die Suchfunktion hier im Forum mit Schlüsselwort "CP 340"...

Hier schon mal einige "Fundstellen":

http://www.spsforum.de/showthread.php?t=33071&highlight=cp+340
http://www.spsforum.de/showthread.php?t=40169&highlight=cp+340
http://www.spsforum.de/showthread.php?t=13628&highlight=cp+340

Gruss


----------



## SoftMachine (22 August 2011)

Nochmal hallo...

und zeig´ vielleicht mal dein Prog.-Teil für die CP...

Gruss


----------



## bike (22 August 2011)

SoftMachine schrieb:


> Nochmal hallo...
> 
> und zeig´ vielleicht mal dein Prog.-Teil für die CP...
> 
> Gruss



Bei  send und receive ohne Daten wird sich wohl nichts tun mit der Kommunikation.
Die Beispielprojekte von BigS die zum CP gehören sind gut und selbsterklärend, nur lesen muss man können 


bike


----------



## SoftMachine (22 August 2011)

hallo zusammen,



Technikfreak schrieb:


> Ausserdem liegt am REQ Eingang des Sende Bausteins ein 1 Signal an.


 
Naja, sofern der datenbereich ok ist, werden halt Nullen versendet (oder was auch immer da drin steht)...

Vermute, sein Problem liegt vielleicht auch mit an der statischen "1" am REQ 

Grüsse


----------



## Technikfreak (22 August 2011)

Danke für die Antworten werde mich mal einlesen. Wo finde ich die Beispiele von BigS? Habe weder Beispielprogramme gefunden noch einen Benutzer mit diesem Namen.


----------



## SoftMachine (22 August 2011)

Hallo 

sowas hier ...?

http://support.automation.siemens.c...d=content&csSort=-DOCDATUMBEITRAG&csQuery4=cp 340&subtype=136000

http://support.automation.siemens.c...d=content&csSort=-DOCDATUMBEITRAG&csQuery4=cp 340&subtype=136000

Gruss und viel Erfolg !!


----------



## corrado (22 August 2011)

dem CP340/341 sollte eine CD mit den Ergänzungen zu Step7 und den besagten Beispielen beiliegen. 

Gruss Corrado


----------



## Technikfreak (23 August 2011)

SoftMachine schrieb:


> Hallo
> 
> sowas hier ...?
> 
> ...



Achso die Siemens Seite war gemeint 
Danke für die Beispiele. Das Senden klappt schon mal einwandfrei. Mein Fehler war dass ich permanent 1 auf REQ hatte und nicht mit DONE zurückgesetzt habe.

Jetzt werde ich mich noch ums Empfangen kümmern.


----------



## jabba (23 August 2011)

Vieleicht hilft dir meine Beschreibung weiter.


----------



## Technikfreak (23 August 2011)

Sehr gute Beschreibung vielen Dank an alle!
Funktioniert jetzt alles so wie ich wollte. Die ASCII Zeichen werden in ein ARRAY OF CHAR eingelesen und jetzt von dort weiterverarbeitet.


----------



## Technikfreak (24 August 2011)

Ich würde meine Steuerung jetzt noch gerne modifizieren.

Momentan wird mein FB3 noch zyklisch aufgerufen. Der FB3 muss allerdings nur einmal aufgerufen werden am Anfang um ASCII Befehle zu senden, dann werden die Daten gesendet und mit dem FB2 in einen DB geschrieben.

Ich suche also eine Möglichkeit den FB3 nur dann aufzurufen wenn keine Daten ankommen.

Den FB3 mit OB100 nur einmal aufzurufen nutzt mir nichts weil ich nach Möglichkeit gerne alle 5 Sekunden überprüfen würde ob noch Daten ankommen im FB2 und falls nicht soll der FB3 wieder aufgerufen werden.

Ich hoffe ihr könnt mir weiterhelfen.


----------



## bike (24 August 2011)

Wenn du nur in Zeitscheibe aufrufen willst, dann programmiere doch einen Timer.

Oder wie kannst du erkennen, dass keine (neuen) daten kommen?


bike


----------



## Technikfreak (24 August 2011)

Mein Problem ist dass ich nicht weiß wie ich abfragen kann dass keine Daten ankommen. Wenn Daten ankommen werden diese alle 500ms in ein ARRAY OF CHAR in einen DB geschrieben. Kommen keine Daten mehr an, bleibt der letzte Datensatz stehen.

Ich bräuchte daher eine Abfrage ob regelmäßig Daten an meine CP 340 gesendet werden.


----------



## Verpolt (24 August 2011)

Hallo



> Kommen keine Daten mehr an, bleibt der letzte Datensatz stehen.



den Datensatz könntest auf Veränderung vergleichen. 

Oder den Empfangsbaustein auf "DONE" abfragen.(Eventuell Zeitabhängig).


----------



## Technikfreak (24 August 2011)

Auf Veränderungen vergleichen ist zu riskant weil die Möglichkeit besteht dass mehrmals der selbe Wert gesendet wird.
Im FB P_RCV gibts kein Done aber ein NDR wenn die Daten übernommen wurden, allerdings ändert sich NDR nicht wenn keine Daten mehr ankommen


----------



## LargoD (24 August 2011)

Technikfreak schrieb:


> allerdings ändert sich NDR nicht wenn keine Daten mehr ankommen


Genau das kannst Du ausnutzen. NDR ausschaltverzögert 500ms über einen Timer, Wenn keine Daten mehr kommen geht der Ausgang des Timers nach 0 und Du sendest erneut Deinen String.
Gruß
Erich


----------



## jabba (24 August 2011)

Z.B. Eine Nachlaufzeit auf den Empfang, wenn diese abgelaufen ist damit senden, damit die Zeit direkt wieder anläuft das "wurde gesendet" mit verknüpfen.


```
UN #Datengesendet
Un #Datenempfangen
L S5t#5s
SA T1


UN T1
= #Datensenden
```


----------



## Technikfreak (24 August 2011)

Ich habe es jetzt genauso gemacht wie Jabba und LargoD vorgeschlagen haben. Funktioniert wunderbar vielen Dank an dieser Stelle!

Jetzt habe ich nur noch ein kleines Problem. 
Meine Daten (6 stellige Zahl z.B."123000"+\c\n) werden als ARRAY OF CHAR [1..8] in einem DB abgelegt. Die ersten 6 Bytes habe ich in einen String umgewandelt z.B. Name[8]. Diesen String möchte ich in DINT umwandeln mit dem FC37. 
Leider sind die ersten Zeichen im String "Name[8]" keine Zahlen sondern Angaben wie lang der String ist und noch was. Der FC37 verarbeitet aber leider nur Zeichenfolgen wenn alle ausser das erste Zeichen Zahlen sind.

Gibt es eine Möglichkeit in String umzuwandeln ohne die Zusatzangaben bzw gibt es die Möglichkeit den String trotzdem in DINT umzuwandeln?


----------



## jabba (24 August 2011)

Da steht nicht irgendetwas drin, sondern die deklarierte Länge und die belegte Länge.

Wenn Name[8] in einem DB ab DW0 anfängt , so ist
DB.DBB0 die deklarierte Länge
DB.DBB1 die belegte Länge
DB.DBB2... der Inhalt.

Wenn Du die 6 Stellen kopieren willst müßen die nach DBB2 und folgend. Zusätzlich muß aber noch einer 6 in DBB1 für die belegte Länge.


----------



## SoftMachine (24 August 2011)

Hallo !



Technikfreak schrieb:


> ... Gibt es eine Möglichkeit in String umzuwandeln ohne die Zusatzangaben bzw gibt es die Möglichkeit den String trotzdem in DINT umzuwandeln?


 
Mit der SuFu hier im Forum gibt es schon Themen ASCII--> INT oder zu DINT... 

Hier ein erstes Ergebnis:
http://www.sps-forum.de/showthread.php?t=17309&highlight=ASCII+INT

Das kannst du von INT auf DINT aufbohren, ohne den String-Header nutzen zu müssen !

Und natürlich die ASCII-Tabelle bereithalten...

Gruss


----------



## Technikfreak (25 August 2011)

Direkt von ARRAY OF CHAR in DINT umwandeln wäre natürlich noch besser.
Allerdings sind mir noch ein paar Dinge unklar bei dem Codebeispiel:
Soviel ich verstanden habe Lade ich das entsprechende Byte aus meinem ARRAY OF CHAR [1..8] also zb DB4.DBB1 dann ==> ITD und je nach dem welche Wertigkeit die Stelle hat *1 *10 *100 usw.


```
// ASCII-Tabelle
//
// CHAR '0' = HEX 30 = DEZ 48
// CHAR '1' = HEX 31 = DEZ 49 
// CHAR '2' = HEX 32 = DEZ 50 
// CHAR '3' = HEX 33 = DEZ 51 
// CHAR '4' = HEX 34 = DEZ 52 
// CHAR '5' = HEX 35 = DEZ 53 
// CHAR '6' = HEX 36 = DEZ 54 
// CHAR '7' = HEX 37 = DEZ 55 
// CHAR '8' = HEX 38 = DEZ 56 
// CHAR '9' = HEX 39 = DEZ 57 
 
      AUF   DB   200
 
      L     0
      T     MD   200                    // Ergebnis
 
      L     DBB    0                    // Wert x 10000
      ITD   
      L     L#48
      -D    
      L     L#10000
      *D    
      T     MD   200                    // Ergebnis
 
      L     DBB    1                    // Wert x 1000
      ITD   
      L     L#48
      -D    
      L     L#1000
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    3                    // Wert x 100
      ITD   
      L     L#48
      -D    
      L     L#100
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    4                    // Wert x 10
      ITD   
      L     L#48
      -D    
      L     L#10
      *D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
 
      L     DBB    5                    // Wert x 1
      ITD   
      L     L#48
      -D    
      L     MD   200
      +D    
      T     MD   200                    // Ergebnis
```
So weit so klar aber wieso lade ich eine 0 und ziehe diese ab? ( L     L#48 )
Dann Lade ich den Wert aus MD 200 addier eine 0 und Transferiere wieder nach MD200. Warum?


----------



## jabba (26 August 2011)

Du hasst die Bedeutung des ASCII-Code nicht verstanden.

Wenn du die Zeichen '12345' erhälst ist das eine Zeichenfolge aber keine Zahl .
Die SPS kann dies halt nicht als Zahl umwandeln, soweit ist dir das ja klar.

In deinem Posting ist ja die Umsetzung der Zahlen als ASCII schon aufgeführt.

Eine Null als Text wird durch ein Byte mit dem Inhalt 48Dez beschrieben.
Um jetzt die Null als Zahl 0 zu erhalten zieht man 48 ab.
'0' = 48dez -48dez = 0dez
'1' = 49dez -48dez = 1dez

Das erste laden der 0dez löscht des MD200 ab (Fehler es muß dort L L#0 heissen)
In  dem MD200 summiert man jetzt jede Stelle in dem Chararray mit der Wertigkeit der jeweiligen Stelle zusammen.
z.B. 01234

```
1. Stelle '0' = 48dez-48dez =0dez*10000 = 0
2. Stelle '1' = 49dez-48dez =1dez*1000  = 1000+0 =1000
3. Stelle '2' = 50dez-48dez =2dez*100   = 200 +1000 = 1200
4. Stelle '3' = 51dez-48dez =3dez*10    = 30+1200 =1230
5. Stelle '5' = 52dez-48dez =4dez*1      = 4+1230 = 1234
```


----------



## SoftMachine (26 August 2011)

Hallo TF !



jabba schrieb:


> Du hasst die *Bedeutung des ASCII-Code nicht verstanden*.
> Wenn du die Zeichen '12345' erhälst ist das eine Zeichenfolge aber keine Zahl Die SPS kann dies halt nicht als Zahl umwandeln, soweit ist dir das ja klar.
> In deinem Posting ist ja die Umsetzung der Zahlen als ASCII schon aufgeführt.


 

schau dir doch noch mal die ASCII-Codetabelle an !

0dez = 30hex = "0" in ASCII
1dez = 31hex = "1" in ASCII
2dez = 32hex = usw.

Wenn du also "1234" in ASCII erhältst, dann nimm´
(1.ASCII-Zahl - 30hex) * 1000 = 1000dez
+
(2.ASCII-Zahl - 30hex) * 100 = 200dez
+
...usw. ... 
Das Tehma "Zeichenkette wandeln" findest du samt Hinweisen und Beispiel hier im Forum unter: 
http://www.sps-forum.de/showthread.php?t=46804

Grüsse


----------



## jabba (26 August 2011)

> 0dez = 30hex = "0" in ASCII
> 1dez = 31hex = "1" in ASCII
> 2dez = 32hex = usw.



0dez = 30Hex??

das must du mir mal erklären


----------



## SoftMachine (26 August 2011)

Hallo,

nu´ mach mal hier nich´ auf Erbsenzähler...! 

*DU* weisst schon, was gemeint ist !

Aber hast recht, ist unverständlich ausgedrückt...

also:

0dez = 48dez in ASCII = 30hex in ASCII = "0" in CHAR der Zeichenkette

... zufrieden ? 

Gruss


----------



## Matze001 (26 August 2011)

SoftMachine schrieb:


> *DU* weisst schon, was gemeint ist !



Und andere bleiben dumm...




SoftMachine schrieb:


> ... zufrieden ?



Nein

Grüße

Marcel


----------



## SoftMachine (26 August 2011)

@marcel

Hä,
versteh´ich jetzt nich´...  

hab´s doch noch erläutert ...


----------



## SoftMachine (26 August 2011)

und der jabba, der weiss schon was gemeint ist !


----------



## jabba (26 August 2011)

NEIN



> 0dez = 48dez in ASCII = 30hex in ASCII = "0"



Wenn schon richtig beschreiben  !



> Hallo,
> 
> nu´ mach mal hier nich´ auf Erbsenzähler...!



Fang hier nicht so einen schwulen Verzähl an.

Alles was zu sagen war , steht in meiner Antwort.
Ein Zitat darauf mit falschen Aussagen verwirrt alle Leute.

Aber Hauptsache was zum Thema geschrieben


----------



## SoftMachine (26 August 2011)

Hi jabba + matze001,

ok, ihr habt recht

 macht´s gut


----------



## SoftMachine (26 August 2011)

Hi TF,

hier noch ein weiterer (wegen der hier vorangegangenen Beiträge ein sehr diskussionsnaher) Link für dein Problem...

http://www.sps-forum.de/showthread.php?t=17309&page=1

... insbesondere die *Beiträge #44 und #47* auf Seite 5 beachten bezüglich der richtigen ASCII-Darstellung... 

Gruss


----------



## jabba (26 August 2011)

Nennt man so etwas Minderwertigkeitskomplex oder Profilneurose ?

Isses jetzt gut oder was ?


----------



## SoftMachine (26 August 2011)

Lass mich einfach in Ruhe ...


----------



## Lupo (27 August 2011)

@Jabba:
Ich muss gestehen, dass ich die Art der Beitragserstellung von SM auch so dann und wann für "ein wenig" gewöhnungsbedürftig halte. In diesem Fall hat er sich aber doch durchaus mehr Mühe gegeben  und die ASCII-Hex-Dezi-Beschreibung ging doch wohl


----------



## Zefix (27 August 2011)

@lupo,

Jein, erst erklärt ers halb Falsch und dann nur fast richtig 



SoftMachine schrieb:


> 0dez = 30hex = "0" in ASCII
> 1dez = 31hex = "1" in ASCII
> 2dez = 32hex = usw.


Erst dieser Lappsus, der so stehen müsste:


```
[COLOR=Red]48dez[/COLOR] = 30hex = "0" in ASCII
 [COLOR=Red]49dez[/COLOR] = 31hex = "1" in ASCII
 [COLOR=Red]50dez[/COLOR] = 32hex = usw.
```





SoftMachine schrieb:


> 0dez = 48dez in ASCII = 30hex in ASCII = "0" in CHAR der Zeichenkette
> 
> ... zufrieden ?
> 
> Gruss



Dann hier wieder, das erste 0dez ist hier sprich weg falsch.


----------



## SPSKILLER (27 August 2011)

was soll denn das hier werden??? 
Warum geilt ihr euch an so ner Kleinigkeit so auf?

Als ob man jeden Beitrag so genau unter die Lupe nehmen würde...

Wer die erste (nicht ganz korrekte) Erklärung von SM nicht verstanden hat, der hat eh ein ganz anderes Problem.


----------



## Zefix (27 August 2011)

Für uns ist es vielleicht ne kleinigkeit, aber für jemand wie den Fragesteller der sich grad in das Thema arbeitet, sollte das geschriebene schon stimmen.
Denn für die SPS ist 0dez und 30hex schon ein kleiner unterschied


----------



## Larry Laffer (27 August 2011)

... ich kann da auch nur dem Micha zustimmen :
"Nicht päpstlicher sein als der Papst ..."

Gruß
Larry


----------



## SoftMachine (28 August 2011)

Hallo zusammen !

Ja, da hab ich mich wohl falsch oder fehlerhaft ausgedrückt...

Und hier habe ich aufgrund der massiven Intervention von J. versucht, dies mit dem eigenen Beitrag von J. richtig zu stellen:



SoftMachine schrieb:


> Hi TF,
> hier noch ein weiterer (wegen der hier vorangegangenen Beiträge ein sehr diskussionsnaher) Link für dein Problem...
> http://www.sps-forum.de/showthread.php?t=17309&page=1
> ... insbesondere die Beiträge #44 und #47 auf Seite 5 beachten bezüglich der richtigen ASCII-Darstellung...
> Gruss


 
leider war das die Reaktion darauf: 



jabba schrieb:


> ...Nennt man so etwas Minderwertigkeitskomplex oder Profilneurose ?...


 

Nun habe ich mal die Beiträge der letzten 3 Monate von J. angeschaut und dabei festgestellt, dass KEINER der Beiträge von J. eine konkrete Hilfe zu der jeweiligen Fragestellung enthält, vielmehr nur allgemeine Hinweise auf Handbücher/ Vorschriften/andere Links usw., also keine eigene konstruktive Hilfe zum jeweiligen Thema...


Liebe(r) Jabba, bei allem Respekt:

Wann hast du zuletzt konkret eine Hilfestellung gegeben und hast gezielt auf die Probleme des Fragestellers geantwortet ?
In deinen Beiträgen des letzten 1/4-Jahres habe ich nur Allgemeines rausgelesen...

Nun habe ich hier in diesem Thread versucht, konkrete Lösungen aufzuzeigen und du pickst dir hier einen Fehler heraus, 
um dich daran... <... was weiss ich ...ist deine Sache...>

Gern kannst du mich auf meine Fehler aufmerksam machen, da bin ich offen und gestehe diese sicher auch ein. 
Aber dies sollte auf jeden Fall im fachlichen und themenbezogenen Rahmen geschehen und nicht mit persönlichen Anfeindungen... 

Mein Ziel wie das vieler anderer ist es, dem TE zu helfen !

Ich denke erstmal, das ist wohl auch bei dir vordergründig, oder ...?
Gruss


----------



## Larry Laffer (28 August 2011)

Ähh ... Hallo ...
jetzt aber nicht gleich wieder Oberwasser bekommen ...
Ich weiß zwar, dass Jabba durchaus in der Lage ist, für sich selbst zu sprechen - in diesem Fall nehme ich ihm das aber mal ab ...

Das was du da jetzt geschrieben hast, mein lieber SoftMachine, ist kompletter Blödsinn. Wenn Jabba mit Antworten auf Links etc. verwiesen hat, so war das mit Sicherheit auch vollkommen ausreichend. Für mich persönlich waren die Hilfestellungen, die ich von Jabba erhalten habe, immer gut und absolut verwendbar und ich weiß auch mit Sicherheit, dass das bei ettlichen Anderen auch so gewesen ist/war.

Nun also mal schön "die Kirche im Dorf lassen".
Ich denke mal, dass du dem Guten auf deine (ich zitiere sinnhemäß) "mitunter etwas gewöhnungsbedürftige Art und Weise" vielleicht "ein bißchen auf den Keks" gegangen bist.

Also ... bei allem Respekt ...

Gruß
Larry


----------



## Technikfreak (28 August 2011)

Erstmal vielen Dank an alle die mir weitergeholfen haben insbesondere Jabba, Softmachine und LagoD.
Ich habe auf jeden Fall mal kapiert wie der ASCII Code aufgebaut ist und jetzt funktioniert alles so wie ich es mir vorgestellt habe


----------



## SoftMachine (28 August 2011)

Gern geschehen !

Gruss


----------



## DieBoese0815 (25 September 2015)

*Programmbeispiel CP340*



corrado schrieb:


> dem CP340/341 sollte eine CD mit den Ergänzungen zu Step7 und den besagten Beispielen beiliegen.
> 
> Gruss Corrado



Sollte - im Handbuch steht dagegen _"Die Installation des Programmbeispiels erfolgt zusammen mit der Installation der Parametrieroberfläche... Nach der Installation befindet sich das Programmbeispiel im folgenden Projekt: *CP340p*"_.

Ich habe die Installation nun auf zwei PC ausgeführt, das Beispiel findet sich jedoch nicht...


----------



## PN/DP (25 September 2015)

Bei mir finde ich die Beispiele via Datei > Öffnen > Beispielprojekte > zXX21_...

Harald


----------

