ROBO Funk

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

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