| |
Zur Beschreibung des eingesetzten ROBO RF Datalink
Route Through und Message Router
Das auf dem PC laufende Programm betreibt ein über das RF Datalink
zugeordnetes ROBO Interface (mit Funk-Platine) transparent, d.h. es beteht aus
Sicht des Programms kein Unterschied zwischen einem Anschluß über Kabel und
dem "Anschluß" über Funk. Zusätzlich ist es möglich mit weiteren
ROBO Interfaces (mit Funk-Platine) Nachrichten auszutauschen.
Die Funk-Nachrichten sind Broadcast-Nachrichten. D.h. alle Teilnehmer des
Funkverkehrs (mit gleicher Frequenz, hier 2) können sie hören, eine Quittung
wird nicht gesendet.
Beispiel : Fernsteuerung einer Raupe
Konfiguration
- PC-Programm zur Steuerung des Gesamtablaufs und zum Betrieb des
zugeordneten Interfaces (RF 2/1) über das ROBO RF Datalink (RF 2/0). Das
Programm ist in VC++ 6.0 unter Nutzung der Klasse CFishFace auf Basis von
umFish40.DLL (v4.1.59.1) erstellt.
- ROBO RF Datalink über USB, Kennung RF 2/0. Aufgabe Route Through (RF 2/1)
und Message Routing (RF 2/2).
- ROBO Interface mit Funk-Platine, Kennung RF 2/1. Fernsteuerung der Raupe
mit Tastern an I1 .. I4 und Lampen an O1 und O2. Steuerung der Raupe :
Vor, Zurück, Rechts, Links.
- ROBO Interface mit Funk-Platine, Kennung RF 2/2.
Antrieb der Power-Motoren der Raupe an M1 und M2.
VC++ 6.0 Source : FunkRaupe4.CPP
#include <windows.h>
#include <iostream.h>
#include <string>
#include "FishFace40.h"
const USHORT cVor = 0x0A00;
const USHORT cRueck = 0x0500;
const USHORT cLinks = 0x0900;
const USHORT cRechts = 0x0600;
const USHORT cAus = 0x0000;
CFishFace ft;
void main() {
cout << "--- FunkRaupe4 gestartet ---" << endl;
cout << "To end : ESC Key" << endl;
try {
ft.OpenInterface(ftROBO_first_USB, 0);
MessageData outN;
outN.HwId = 2;
outN.SubId = 1;
outN.MsgId = 0x01;
outN.Msg = cAus;
ft.SetLamp(outO1, dirEin);
cout << "Ready, waiting for your orders : I1 .. I4" << endl;
do {
if(ft.GetInputs() != 0) {
if (ft.GetInput(inpI1)) outN.Msg = outN.Msg == cVor ? cAus : cVor;
else if(ft.GetInput(inpI2)) outN.Msg = outN.Msg == cLinks ? cAus : cLinks;
else if(ft.GetInput(inpI3)) outN.Msg = outN.Msg == cRechts ? cAus : cRechts;
else if(ft.GetInput(inpI4)) outN.Msg = outN.Msg == cRueck ? cAus : cRueck;
ft.SendRFMessage(outN);
if(outN.Msg != cAus) {
ft.SetLamp(outO1, dirAus);
ft.SetLamp(outO2, dirEin);
cout << "--- Busy ---" << endl;
}
else {
ft.SetLamp(outO1, dirEin);
ft.SetLamp(outO2, dirAus);
cout << "--- Ready ---" << endl;
}
}
ft.Pause(555);
} while(!ft.Finish());
ft.CloseInterface();
}
catch(CFishFaceException& fte) {
cout << "Error " << fte.Nr() << " : " << fte.Text() << endl;
}
} |
Gezeigt wird das komplette Betriebsprogramm (Console Application), es fehlt
FishFace40.H / .CCP
- Konstanten für die auszuführenden Befehle im Interface (Gleichzeitiges
Schalten aller M-Ausgänge)
- Deklarieren der Struktur für die ausgehenden Nachrichten outN. Von der
Anwendung im ROBO Interface wird nur outN.Msg ausgewertet, der Rest ist der
Form halber ... Ausgabe : "Ready ..."
- Endlosschleife in der gefragt wird, ob irgendeine Taste gedrückt wurde
(GetInputs())
- Dann Auswerten welche Taste und Zuordnen des entsprechenden Steuerbefehls.
- Senden der so modifizierten Nachricht.
- Wenn die Nachricht nicht cAus war : Lampe Busy an, Ausgabe
"Busy"
- Sonst Lampe Ready an, Ausgabe "Ready"
- Pause um "Wackelkontakte" zu vermeiden.
Renesas C : Das ausführende Programm im ROBO Interface der Raupe
#include
"TA_Firmware\TAF_00D.h"
#include "TA_Firmware\TAF_00P.h"
#include "Message\Msg_00D.h"
#include "Message\Msg_00P.h"
UCHAR main(void) {
SMESSAGE
inMessage;
UCHAR res;
UCHAR i;
InitMessage();
SetFtMessageReceiveAddress((void far*)&WriteMessageToBuffer);
sTrans.MPWM_Update = 0x01;
for(i = 0; i<8; i++) sTrans.MPWM_Main[i] = 7;
do {
if(GetMessageFromBuffer(&inMessage) ==
ERROR_SUCCESS) {
sTrans.M_Main = inMessage.B.ucB3;
}
} while(1);
return(0);
} |
Das Programm nutzt die mitgelieferte Software für das ROBO Interface. Es
bleibt dann nur noch eine Endlosschleife, die die einkommenden Nachrichten
entgegennimmt und ausführt. Dazu wird aus dem gesendeten outN.Msg ein Byte
gefiltert (Union) inMessage.B.ucB3 und an die entsprechende Stelle der
TransferArea gestellt, das war's dann schon.
Stand : 07.04.2007
|