Home

Bauanleitungen

Links

Gästebuch

Gästebuch

News

Projekte

Impressum

Die RS232-Schnittstelle des RoboInterface

 

Das RoboInterface verfügt über eine RS232-Schnittstelle, die nicht nur dazu taugt, das Interface an alten Computern ohne USB-Anschluss zu betreiben... Diese Schnittstelle kann auch genutzt werden, um z.B. zwei RoboInterfaces miteinander zu verbinden, oder - noch interessanter - um andere Peripherie daran zu betreiben. Dazu müssen allerdings zwei Hürden genommen werden: Man braucht ein gekreuztes RS232-Kabel mit zwei männlichen Steckverbindern oder verwendet bei Eigenbauten einen entsprechenden Steckern. Die zweite Hürde ist das propietäre RoboPro-Protokoll, das einen direkten Anschluss z.B. eines alten Plotters verhindert. Um dieses Protokoll soll es hier gehen.

Jede vom Robointerface ausgehende Übertragung besteht grundsätzlich aus 7 Bytes und wird mit 38400 Baud, 8 Bit, No Parity gesendet.

Byte Nr. Bedeutung
1 Startbyte, immer 0x90 (dez. 144)
2 Hardware-ID
3 Geräte-Nummer
4 Befehl, low-Byte
5
Befehl, high-Byte
6 Daten, low-Byte
7 Daten, high-Byte

Achtung: Die Nutzung der RS232-Schnittstelle funktioniert ausschließlich im Download-Betrieb!

Verbindet man zwei Interfaces miteinander, ist die Kommunikation kein Problem, denn beide Interfaces kennen das Protokoll... Um nun eigene Basteleien anschließen zu können, muss man wissen, wie man mit RoboPro Daten übertragen kann.

Dies geschieht mit dem Sender, dieser Befehl ist ab Level 2 verfügbar, aber um die Option via RS232 zu kommunizieren wählen zu können, muss man mindestens Level 4 gewählt haben.

 Sender-Symbol

Mit einem Mausklick-rechts bekommt man die Eigenschaften des Befehls angezeigt:

Eigenschaftsfenster

Im Bereich "Sende Befehl" kann der Befehl ausgewählt werden, der bei der Übertragung verwendet wird, außerdem muss man die Option "Dateneingang für den Befehlswert verwenden" auswählen.
Um die Übertragung an der RS-232-Schnittstelle einzuschalten, muss die Option "COM Port" ausgewählt sein.
Theoretisch könnte man mehrere Geräte an der RS232-Schnittstelle betreiben und mit der "Gruppen-ID" adressieren.
Nachdem diese Änderungen gemacht sind, sieht das Symbol so aus:
Sender, geändert

Um nun bei dem angeschlossenen Gerät nicht nur Daten, sondern auch Befehle senden zu können, kann man im Bereich "Sende Befehl" mit dem Pull-down Menü verschiedene Befehle auswählen. Diese Befehle werden später bei der Übertragung durch Zahlenwerte ersetzt.
Befehl Zahlenwert (Hex)
Rechts 0xFFFE
Links 0xFFFD
Stopp 0xFFFC
An 0xFFFB
Aus 0xFFFA
Gleich 0xFFF9
Plus 0xFFF8
Minus 0xFFF7
Hinzu 0xFFF6
Entferne 0x2184 (fällt aus der Reihe...)
Vertauschen 0xFFF4

Es ist auch möglich, selbstdefinierte Befehel zu versenden. Mit dieser Möglichkeit habe ich mich noch nicht beschäftigt, da die standardmäßig verfügbaren befehle durchaus ausreichen, um z.B. ein Grafik-LCD anzusteuern.

Ein Code-Ausschnitt aus einem C-Programm macht die Verwendung der Befehle deutlich:

#define RoboRechts 0xFFFE
#define RoboLinks 0xFFFD
#define RoboStopp 0xFFFC
#define RoboAn 0xFFFB
#define RoboAus 0xFFFA
#define RoboGleich 0xFFF9
#define RoboPlus 0xFFF8
#define RoboMinus 0xFFF7
#define RoboHinzu 0xFFF6
#define RoboEntferne 0x2184        // Nobody knows, why it's not 0xFFF5
#define RoboVertauschen 0xFFF4

uint8_t RoboNumber;
uint16_t RoboCommand;
uint16_t RoboValue;

uint16_t RS232_getint(void)
{
    uint8_t high;
    uint8_t low;
   
    low = RS232_getc();
    high = RS232_getc();
   
    return (high<<8) + low;
}

void lcd_printhex(uint16_t value)
{
    uint8_t string[10];
    itoa(value,string,16);
    lcd_print(string);
}

int main (void)
{
    RS232_init(38400);
    while (1)
    {
        if (RS232_getc() == 0x90)                // Startbyte
        {
            RS232_getc();                        // Hardware-ID überlesen (wird verworfen)
            RoboNumber = RS232_getc();            // Gerätenummer (wird verworfen)
            RoboCommand = RS232_getint();
            RoboValue = RS232_getint();
            switch (RoboCommand)
            {
                case RoboRechts:
                    break;
                case RoboLinks:
                    break;
                case RoboStopp:
                    break;
                case RoboAn:
                    break;
                case RoboAus:
                    break;
                case RoboGleich:
                    break;
                case RoboPlus:
                    break;
                case RoboMinus:
                    break;
                case RoboHinzu:
                    break;
                case RoboEntferne:
                    break;
                case RoboVertauschen:
                    break;
            }
       
        }
    }
    return 0;
}

Natürlich ist es auch möglich, Daten an das RoboInterface zu senden, z.B. Sensorwerte, Tasten etc. Hierbei muss sich der Sender natürlich ebenfalls an das Protokoll halten. Mit dem untenstehenden Codesegment ist dies möglich:


void Robo_ReturnMessage (uint8_t group, uint16_t command, uint16_t data)
{

    RS232_putc(0x90);
    RS232_putc(0x00);
    RS232_putc(group);
    RS232_putc(command & 0xFF);
    RS232_putc(command >> 8);
    RS232_putc(data & 0xFF);
    RS232_putc(data >> 8);
}

In RoboPro werden dann die Werte mit  "Empfänger" und "Warten auf Befehl" ausgewertet. Im unten gezeigten Beispiel wird auf den Befehl "Gleich" gewartet, über den "W"-Ausgang bekommt man den Wert.

Empfänger

Der Empfänger wird der Einfachheit so eingerichtet, dass er die Gruppenadresse nicht abfragt:

Empfänger Eigenschaften