Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Fernsteuerung der C-Control2 Kategorie: Programmierung (von André H. - 11.11.2004 22:50)
Als Antwort auf Fernsteuerung der C-Control2 von ACU - 11.11.2004 20:50
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
Hallo ACU,

Wie Rene schon schreibt, findest Du das meiste in strx.c2 .
Jedoch solltest du Dir zuerst Gedanken über die Struktur des Protokolls machen:

1. Wie werden die Daten übertragen ?
   Sollen die Eingaben über ein Terminalprogramm erfolgen, oder willst Du ein eigenes
   PC-Proggie schreiben, welches die Kommunikation übernimmt ?

2. Wie sicher soll es sein ?
   Bei einem relativ sicherem Protokoll sollte man im Datenrahmen die Länge dessen
   und auch eine Prüfsumme (Modulo 256) mit rein.
   Auch ein Senden von einem ACK bzw. NACK zum Bestätigen bzw. nicht Bestätigen
   des Empfangs sichert eine korrekte Ã?bertragung

3. Ein definiertes Anfangszeichen hilft, falsche/unvollständige Datenrahmen zu erkennen.
   Es wird hier oft gern mit ESC-Sequenzen gearbeitet. D.h. jeder Datensatz wird mit
   einem ESC-Zeichen eingeleitet. (ASCII 27)

Prinzipiell kann ich den Tip geben, die Ã?bermittlung von Werten so einfach, wie
möglich zu machen.
Wenn Du am PC ein eigenes Programm für die COM schreibst, wäre es
alles andere als Sinnvoll, Daten in Klartext zu übermitteln.
Besser wäre es einzelne Kommadobytes zu definieren.
Dies können Buchstaben sein, aber auch beliebige (Byte-)Werte.
diese können zu Kommandosequenzen zusammengefasst werden.
Auch Parameter, die z.B. in Variablen gespeichert werden sollen, sollten
Besser als Byte-Werte, statt als Text übermittelt werden.
also Statt "255" (0x32 0x35 0x35) überträgst Du liefer ein Byte mit dem Wert 0xFF.
Bei Wertbereichen grö�er Byte verwendest Du einfach Hi-Byte und Lo-Byte und
zerlegst diese auf PC-Seite:
 HiByte= wert256
  LoByte=wert and 255


In der CC2 kannst Du dies einfach wieder zusammensetzen:
Wert= (HiByte shl 8) or LoByte;

Der angenehme Nebeneffekt, wenn man so überträgt, ist, da� die Komunikation
um einiges schneller geht, als wenn Du Strings mit Klartext benutzt.

Um noch Anregungen zu geben, wie solche Datenrahmen aussehen können,
verweise ich gerne auf die Ansteuerung der Electronic Assemble Displays der KIT-Reihe
bzw. jetzt auch auf das eDIP.
In den Datenblättern kann man sehr schön sehen, wie dort mit kommandosequenzen
gearbeitet wird. Dies kann man sehr gut für eine CC2-PC-kommunikation ableiten.

Ich würde hier allerdings nichtmehr mit Strings arbeiten, sondern eher mit
normalen Bytearrays, oder sogar die Zeichen einzeln aus dem Puffer einlesen.
So wäre es am einfachsten.

Wenn Du aber lieber doch mit Klartext arbeiten möchtest,
muÃ?t Du eben mit dem Modul strx.c2 arbeiten.
Um auf Deine geplante Struktur einzugehen:
Das Aufteilen in zwei Anweisungsstrukturen mittels des ersten zeichens ist sehr einfach:
Lies dieses mit einem einfachen hwcom.get() ein und werte es aus.
Danach liest Du erst den String ein.
Der Vorteil ist hier, daÃ? Du nicht extra das erste Zeichen isolieren und entfernen muÃ?t:
...
 c=hwcom.get();
 if c=='A' Anfrage();
 else if c=='B' Befehl();
...

Dir bleibt dann noch das Einlesen des Strings und das Auswerten:
function Befehl()
{string eingabe,kommando,s;
 int value;byte sep;
 hwcom.inputstr(eingabe,0); // Eingabe muÃ? mit CRLF abgeschlossen werden !
 s="=";
 sep=strx.InStr(0,eingabe,s,str.length(eingabe),1);
 strx.left(eingabe,kommando,sep-1);
 sep=str.len(eingabe)-sep;
 strx.right(eingabe,s,sep+1);
 value=strx.getNum(s);
 //...
 // Ab hier Auswertung des Kommandos
 //...
}


Alternativ kann man das Kommando vom Wert auch so trennen,
was von der Bearbeitungszeit ca. gleich schnell sein sollte:
function getSepPos(byte s[]) returns byte
{byte i;
 for i=0 ... s[31]-1 if s[i]=='=' return i; // Position des Trennzeichens
 return 30; // kein Trennzeichen
}

function Befehl()
{string eingabe,kommando,s;
 int value;byte sep;
 hwcom.inputstr(eingabe,0); // Eingabe muÃ? mit CRLF abgeschlossen werden !
 s="=";
 sep=getSep(eingabe);
 strx.left(eingabe,kommando,sep-1);
 sep=str.len(eingabe)-sep;
 strx.right(eingabe,s,sep+1);
 value=strx.getNum(s);
 //...
 // Ab hier Auswertung des Kommandos
 //...
}




> Es wäre schön, wenn ihr die Befehle gut erklären könntet, da
> ich mit den anderen Beispielen, die ich im Forum gefunden habe (zum Beispiel:
> ...
> leider nichts anfangen kann.

Schreibe einmal dazu, was Du an diesem gefundenem Beispiel nicht verstehst bzw.
was dort unklar ist.
Es ist nämlich ein sehr einfaches Beispiel für ein Interface via Terminalproggie.
Es unterscheidet im Prinzip zwischen "Portzustand  Ã¤ndern" (P) und Port abfragen (G).
Danach wird die Portnummer eingegeben. Hier 0 bis 7 für die Ports P1H.0 -.7 (Ports 8 bis 15)
AnschlieÃ?end wird bei komanndo P mit den Worten "EIN", "AUS" oder "DEACT" bestimmt,
was mit den Ports angestellt werden soll.
Die Eingabe am Terminal könnte dann z.B. ao aussehen:
P0 ein
P1 deact
P6=aus
G4

Wichtig ist, daÃ? die Eingaben mit Enter abgeschlossen werden.
Ob zwischen einem "P0" und dem Wort nun ein Leerzeichen steht oder nicht bzw.
andere Zeichen dawischen sind, spielt keine Rolle.
Es wird lediglich geprüft, ob eines der Wörter vorkommt.
Man könnte sogar mehrere Wörter angeben.
P0 EIN AUS
erzeugt z.B. einen kurzen Impuls an P0.

Wenn Du zu Diesem Beispiel noch fragen hastm dann schreibe Sie am besten genau zu
den Zeilen, dessen Bedeutung unklar ist.
Ich glaube, das ist sinnvoller, als daÃ? ich jede Programmzeile groÃ?artig kommentieren muÃ?.

MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Fernsteuerung der C-Control2 (von Thomas - 11.11.2004 23:20)
    Re: Fernsteuerung der C-Control2 (von ACU - 12.11.2004 16:53)
        Re: Fernsteuerung der C-Control2 (von krassos - 12.11.2004 18:09)