-> Hier kostenlos registrieren
Hallo,
ich bin seit einigen Wochen an einem Projekt mit serieller Schnittstelle.
Ich lese und schreibe Daten von/an einen Motorregler (Plettenberg).
Das Senden klappt einwandfrei bis auf vernachlässigbare Kleinigkeiten.
Das Empfangen bereitet mir größere Probleme.
In einer Funktion FC1, welche ich im OB1 aufrufe, habe ich dies erledigt.
Receive-Beispiel:
S=5.000V,A=5.000V,PWM= 0,U= 25.7V,I= 0.5A,RPM= 0,con= 24°C,mot= 24°C
(diese Zeile wird fortlaufend im Leerlauf ca. jede Sekunde und im Betrieb ca. 5 mal in der Sekunde neu gesendet.)
75 CHAR + Carriage Return '$R' + Line Feed '$L' = 77 CHAR/BYTEs
Wie man sieht schreibe ich diese emfangenen CHAR's in den DB1.
Dieser besteht nur einem ARRAY[0..76] of CHAR.
Die Länge der empfangenen Daten (#Len) sind 77.
Da ich beim Senden eines CHAR's z.B. einem 's' für serielle Ansteuerung das erste BYTE (hier in dem Fall ein 'S') überschrieben wird,
verschieben sich anschließend alle BYTE's um eine Zeile nach unten im DB1.
Zuerst wollte ich die Länge #Len variabel einstellen lassen um das Verschieben zu kompensieren, allerdings ist das nach meinem SPS Wissenstand zu kompliziert.
Also habe ich die Idee gehabt, eine SCL Quelle zu erstellen, die nach einem bestimmten CHAR sucht. Da es ein CHAR sein sollte, der nur einmal im ARRAY auftaucht, habe ich den Line Feed '$L' verwendet. Das große 'S' ist keine Möglichkeit, da dies überschrieben wird, beim Senden eines CHAR's (siehe oben).
SCL-Quelle:
Diese Funktion sollte mir eine INT Dezimalzahl ausgeben, in welchem DB1 DBB der '$l' CHAR steht.
Klappt auch soweit, außer dass mir manchmal eine -1 ausgegeben wird, da der Line Feed nicht gefunden wird. Allerdings wird auch manchmal ein Wert >76 ausgegeben.
z.B. 6987, 6148, ... (habe ich im Fehlerspeicher der SPS entdeckt, als ich mithilfe eines ANY-Pointers ein DBB aufrufen wollte. Geht allerdings nur bis 76!
Fehler:
Hat jemand eine Idee wie ich nur Werte zwischen 0...76 ausgeben lassen kann?
Oder weiß jemand wie man dies auf einem anderen Weg lösen kann (Allerdings habe ich nur den Antrieb mit serieller Schnittstelle, ein anderer würde nicht in Frage kommen)?
Danke für jeden, der mir helfen kann
Beni
ich bin seit einigen Wochen an einem Projekt mit serieller Schnittstelle.
Ich lese und schreibe Daten von/an einen Motorregler (Plettenberg).
Das Senden klappt einwandfrei bis auf vernachlässigbare Kleinigkeiten.
Das Empfangen bereitet mir größere Probleme.
In einer Funktion FC1, welche ich im OB1 aufrufe, habe ich dies erledigt.
Code:
CALL SFB 61 , DB61
EN_R :=
R :=FALSE
LADDR :=W#16#0
NDR :=#ndr
ERROR :=
STATUS:=
RD_1 :=P#DB1.DBX0.0 BYTE 75
LEN :=#Len
Receive-Beispiel:
S=5.000V,A=5.000V,PWM= 0,U= 25.7V,I= 0.5A,RPM= 0,con= 24°C,mot= 24°C
(diese Zeile wird fortlaufend im Leerlauf ca. jede Sekunde und im Betrieb ca. 5 mal in der Sekunde neu gesendet.)
75 CHAR + Carriage Return '$R' + Line Feed '$L' = 77 CHAR/BYTEs
Wie man sieht schreibe ich diese emfangenen CHAR's in den DB1.
Dieser besteht nur einem ARRAY[0..76] of CHAR.
Die Länge der empfangenen Daten (#Len) sind 77.
Da ich beim Senden eines CHAR's z.B. einem 's' für serielle Ansteuerung das erste BYTE (hier in dem Fall ein 'S') überschrieben wird,
verschieben sich anschließend alle BYTE's um eine Zeile nach unten im DB1.
Zuerst wollte ich die Länge #Len variabel einstellen lassen um das Verschieben zu kompensieren, allerdings ist das nach meinem SPS Wissenstand zu kompliziert.
Also habe ich die Idee gehabt, eine SCL Quelle zu erstellen, die nach einem bestimmten CHAR sucht. Da es ein CHAR sein sollte, der nur einmal im ARRAY auftaucht, habe ich den Line Feed '$L' verwendet. Das große 'S' ist keine Möglichkeit, da dies überschrieben wird, beim Senden eines CHAR's (siehe oben).
SCL-Quelle:
Code:
FUNCTION FC200 : VOID
CONST
ANZ := 76; // Größe des Arrays
END_CONST
VAR_INPUT
data : ARRAY[0..76] OF CHAR; // zu durchsuchendes Array
ptrn : CHAR; // zu suchender CHAR
END_VAR
VAR_OUTPUT
pos : INT; // Position, wenn nicht gefunden dann -1
END_VAR
VAR_TEMP
i : INT;
END_VAR
BEGIN
pos := -1;
FOR i := 0 TO ANZ DO
IF data[i] = ptrn THEN
pos := i;
EXIT;
END_IF;
END_FOR;
END_FUNCTION
Diese Funktion sollte mir eine INT Dezimalzahl ausgeben, in welchem DB1 DBB der '$l' CHAR steht.
Klappt auch soweit, außer dass mir manchmal eine -1 ausgegeben wird, da der Line Feed nicht gefunden wird. Allerdings wird auch manchmal ein Wert >76 ausgegeben.
z.B. 6987, 6148, ... (habe ich im Fehlerspeicher der SPS entdeckt, als ich mithilfe eines ANY-Pointers ein DBB aufrufen wollte. Geht allerdings nur bis 76!
Fehler:
Hat jemand eine Idee wie ich nur Werte zwischen 0...76 ausgeben lassen kann?
Oder weiß jemand wie man dies auf einem anderen Weg lösen kann (Allerdings habe ich nur den Antrieb mit serieller Schnittstelle, ein anderer würde nicht in Frage kommen)?
Danke für jeden, der mir helfen kann
Beni
Zuletzt bearbeitet: