Städnige µController abfrage mit TwinCAT

egor

Level-1
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo spsforum community, ich habe wieder mal ein problem bezäglich des programmierens in twincat.

Also es geht hier um folgendes. Ich habe einen µController dem ich ständig Strings runterschicken kann mit verschiedenem Inhalt. Darunter ist auch eine einmalige Abfrage der ID. Sobald der ID Befehl beim µController engekommen ist, antwortet mir auch und ich empfange das beim TwinCat.
dazu benutze ich die beckhoff serielle kommunikation lib. 2.0 oder so dazu dann die bausteine sendstring und receivestring...

meine frage jetzt, ich möchte jetzt gerne einen Drucksensor und einen Temperatursensor abfragen. Die Informaiton soll ca alle 2s gesendet werden vom µController. Der µController schickt das nur raus, wenn ich es ihm auch sagen, das er den Druckwert und Temperaturwert senden soll.

Wie kann ich das den in TwinCAT realisieren? dass ich meinen µController nach den Werten alle 2s abfragen kann und die werte auch empfangen?

ps. ich kann glaube ich immer nur 1 string senden und empfangen

mit freundlichen grüßen
egor
 
so ich habe es zwar hinbekommen die Befehle in zeitlichen Abständen zu versenden jedoch habe ich ein problem mit dem Empfangen.

Folgede Situation.

Ich benutze den FUN ReceiveString aus der beckhoff seriallib 2.0.1 (also die neuste). Ich benutze diesen recivestring bereits für eine ID abfragen.

Also ingsemsat muss ich 3 sachen abfragen.

1. ID Abfragen, beim start des systems.
2. Druckabfrage alle 2s.
3. Temperaturabfragen alle 2s.

Wie kann ich meinen receivedstring nach der ersten Abfrage wieder freimachen? außerdem möchte ich den wert von der ID abfrage au einer Variable speicher, weil der wert der ID abfrage ist einmalig notwendig, soltle sich aber dann nicht mehr ändern sondenr bei dem aktuellen wert bleiben. Und wie kann ich dann die 2 Sensoren abfragen und die werte anzeigen lassen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich ist das einfach hier ein bisschen Code von mir...


FB_COM_Recv(
Prefix:=':' , (WICHTIG!, das hast du eingetragen)
Suffix:=';' , (WICHTIG!, das hast du eingetragen)
ReceivedString:=strRecv_String , (Empfangener String)
RXbuffer:=InOut_RxBuffer , (RecvBuffer)
StringReceived=>bRecv_String ,(einer NEUER string wurde empfangen)
Busy=>bRecv_Busy , );(empfängt gerade)

IF bRecv_String THEN (ein neuer String wurde empfangen, den abspeichern und dann den empfangenen String leer setzen, ist eine IN-Out Variable)
strRecv_Buffer:=strRecv_String;
strRecv_String:='';
END_IF
.
.
.
(String auseinandernehmen, Startzeichen und Endzeichen entfernen usw.)


Das mit den 2s kann du recht einfach mit einer Case Schleife realisieren... wenn du willst kann ich dir den Anfang schreiben...
 
huh danke für die ausfürliche antwort, ich uploade mal mein code und zeige dir was ich bereits habe und wie ich das mit den 2 sec gelöst habe!
 
sry für den Doppelpost!

also Folgendes habe ich gemacht, siehe weiterhin in dem Anhang

für die alle 2 s benutze ich eine fun namens Massage_4r von osct Release 3.20 und für die kommunikation die zwei funs SendString, ReceiveString von beckhoff Serial Communication 2.0 (die neuste)

nun ja und unten im anhang siehste meine Quellcodes.

ps. würde gerne deine variante mti der CASE anweisung lesen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
sry für den Doppelpost!

also Folgendes habe ich gemacht, siehe weiterhin in dem Anhang

für die alle 2 s benutze ich eine fun namens Massage_4r von osct Release 3.20 und für die kommunikation die zwei funs SendString, ReceiveString von beckhoff Serial Communication 2.0 (die neuste)

ALso das ist zum Befehle Schicken!!

PROGRAM SensorAbfrage
VAR
Massage:MESSAGE_4R;
fbSendStringEl6021: SendString;
stStringToSend: STRING;
stStringJustSend: STRING;
END_VAR

Massage(
M0:='T_1_25$R$N',
M1:='T_2_25$R$N',
M2:='T_3_25$R$N',
M3:='T_4_25$R$N',
MM:=4,
ENQ:=TRUE,
CLK:=TRUE,
T1:=t#2s,
MX=>stStringToSend);

IF stStringJustSend <> stStringToSend THEN (*vergleicht ob er was senden muss oder nicht*)
fbSendStringEl6021( (*FB "SendString" aufrufen*)
SendString:=stStringToSend , (*Eingngsvariable*)
TXbuffer:=El6021ComBufferOut); (*Sende Buffer*)
stStringJustSend := stStringToSend; (*Sende Buffer*)
END_IF



und zum Empfangen habe ich leider noch nichts :( aber so verwende ich das für die ID Abfrage

PROGRAM IDAbfrage
VAR
stRecievedStringID: STRING;
fbRecieveStringEl6021ID:ReceiveString;
bResetRecieveString: BOOL;
END_VAR

ID_Nummer:=DEC_TO_INT(
DEC :=stRecievedStringID);

fbRecieveStringEl6021ID( (*FB "ReceiveString" aufrufen*)
Prefix:=, (*Bestimmte den Anfang einer Kette*)
Suffix:=, (*Bestimmt das Ende einer Zeichenkette*)
Timeout:= t#500ms, (*Wenn nach 500 ms kein Zeichen mehr kommt, dann wird das als
Ende interpretiert*)
Reset:= bResetRecieveString, (*Reset des FB ReceiveString*)
ReceivedString:=stRecievedStringID , (*Empfangener String*)
RXbuffer:= el6021combufferin); (*Empfangs Buffer*)
 
fbRecieveStringEl6021ID( (*FB "ReceiveString" aufrufen*)
Prefix:=, (*Bestimmte den Anfang einer Kette*)
Suffix:=, (*Bestimmt das Ende einer Zeichenkette*)
Timeout:= t#500ms, (*Wenn nach 500 ms kein Zeichen mehr kommt, dann wird das als
Ende interpretiert*)
Reset:= bResetRecieveString, (*Reset des FB ReceiveString*)
ReceivedString:=stRecievedStringID , (*Empfangener String*)
RXbuffer:= el6021combufferin); (*Empfangs Buffer*)
[/SIZE]

Also soweit ich das weiss musst du auf jeden Fall einen Prefix eintragen, beim ersten empfangen funktioniert das nur wegen dem Timeout, wenn du nochmal was empfangen willst muesstest du vorher immer erst den Buffer leersetzen von der Klemme - sprich viel zu aufwendig. Einen Suffix würde ich dir ebenfalls auch dringend empfehlen. Wie sind denn die Nachrichten aufgebaut die der Mirco Controller dir schickt?

Zu den Ablauf selber schreibe ich gleich was dazu...
 
als der µController schickt mir dann z.b wenn ich dne Befehl E_1 runterschicke, dann gibt er mir zurück E_1_200(wert am eingang)
ich muss dann sozusagen dann nur die 200 lesen und weiter verarbeiten...
 
Zurück
Oben