CP340 ASCII Zeichen senden und empfangen

Technikfreak

Level-1
Beiträge
19
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren

Achso die Siemens Seite war gemeint :D
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Wenn du nur in Zeitscheibe aufrufen willst, dann programmiere doch einen Timer.

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


bike
 
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.
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
UN #Datengesendet
Un #Datenempfangen
L S5t#5s
SA T1


UN T1
= #Datensenden
 
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?
 
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.
 
Zurück
Oben