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

Uhrzeit stellen mit XPort Kategorie: Programmierung (von jmanbln - 15.11.2006 11:07)
Ich nutze:
C-Control II Station, OSOPT V3.1
Für alle die, die auch immer Empfangsprobleme mit dem DCF77 haben, hier eine Alternative zum Stellen
der Systemzeit. Dabei wird über den XPort ein beliebiger HTTP-Server mit "HEAD" angefragt und der Header,
der als Echo zurückkommt ausgewertet. Sicherlich ist die Methode nicht so genau, wie ein DCF77,
da die Genauigkeit von der Genauigkeit des Webservers und der Antwortzeit abhängt.

Der ConnectMode des XPort muss auf C4 gesetzt sein.


/* ----------------------------------------------------------------- */
/*                                                                   */
/* HTTP-Request um Zeit abzufragen                                   */
/* Format:                                                           */
/* "HEAD / HTTP/1.1" + CRLF + "Host: www.tu-berlin.de" + CRLF + CRLF */
/*                                                                   */
/* ----------------------------------------------------------------- */

function requestTime()
{
  string send_String;
  // Verbindung zum Server herstellen
  cap.Capture(debug.HWCOM_CAPTURE);
  send_String = "C130.149.4.134/80";
  str.putchar(send_String, 0x0D);
  hwcom.print2(send_String);
  wait hwcom.ready();
  // jetzt Message senden
  send_String = "HEAD / HTTP/1.1";
  str.putchar(send_String, 0x0D);
  str.putchar(send_String, 0x0A);
  hwcom.print2(send_String);
  send_String = "Host: www.tu-berlin.de";
  str.putchar(send_String, 0x0D);
  str.putchar(send_String, 0x0A);
  str.putchar(send_String, 0x0D);
  str.putchar(send_String, 0x0A);
  hwcom.print2(send_String);
  wait hwcom.ready();
  cap.Release(debug.HWCOM_CAPTURE);
}


/* ----------------------------------------------------------------- */
/*                                                                   */
/*    Zeit und Datum stellen, mit Header aus HTTP-Request            */
/*                                                                   */
/* ----------------------------------------------------------------- */


function setTime(byte buffer[])
{
  int i, start, t1, t2, t3;
  for i = 0...62
  {
    if buffer[i] == 13 and buffer[i + 1] == 10
    {
      start = i + 13;
      break;
    }
  }
  t1 = (buffer[start] - 48) * 10 + (buffer[start + 1] - 48); // Tag
  t3 = (buffer[start + 7] - 48) * 1000 + (buffer[start + 8] - 48) * 100 +
  (buffer[start + 9] - 48) * 10 + (buffer[start + 10] - 48); // Jahr
  // Monat:
  i = buffer[start + 3] + buffer[start + 4] + buffer[start + 5];
  if i == 281 t2 = 1;
  if i == 269 t2 = 2;
  if i == 288 t2 = 3;
  if i == 291 t2 = 4;
  if i == 295 t2 = 5;
  if i == 301 t2 = 6;
  if i == 299 t2 = 7;
  if i == 285 t2 = 8;
  if i == 296 t2 = 9;
  if i == 294 t2 = 10;
  if i == 307 t2 = 11;
  if i == 286 t2 = 12;
  system.setdate(t3, t2, t1); // setzt auch das Sommerzeitflad DST neu

  t1 = (buffer[start + 12] - 48) * 10 + (buffer[start + 13] - 48); // Stunde
  t2 = (buffer[start + 15] - 48) * 10 + (buffer[start + 16] - 48); // Minute
  t3 = (buffer[start + 18] - 48) * 10 + (buffer[start + 19] - 48); // Sekunde
  // Zeitverschiebung zur GMT und Sommerzeit berücksichtigen
  if system.dst()
    t1 = t1 + 2;
  else
    t1 = t1 + 1;
  if t1 > 23
    t1 = t1 - 24;
  system.settime(t1, t2, t3);
}

/* ----------------------------------------------------------------- */
/*                                                                   */
/*    Empfangs-Thread                                                */
/*                                                                   */
/* ----------------------------------------------------------------- */

thread receive
{
 byte first_byte, second_byte;
 int anz_bytes, len;
 byte rec_buffer[128];

 hwcom.init();
 hwcom.setspeed(hwcom.SPEED_19200);
 hwcom.setbuf(HWcombuf,128); // Empfangspuffer auf 128 Byte erhöhen
 hwcom.flush(); // Buffer leeren

 loop
 {
   wait hwcom.rxd(); // 1. Byte empfangen
   cap.Capture(debug.HWCOM_CAPTURE);
   first_byte = hwcom.get();
   if first_byte == CMD // Befehlssequenz wird eingeleitet
   {
     // weitere Anweisungen...
   }
   else if first_byte == 72 // ein "H" empfangen
   {
     wait hwcom.rxd(); // 2. Byte empfangen
     second_byte = hwcom.get();
     if second_byte == 84 // ein "T" empfangen, HEADer eines HTTP-Requests
     {
       len = hwcom.receive(rec_buffer, 80, 2000);
       if len >= 64 setTime(rec_buffer); // Zeit und Datum stellen
     }
   }
   hwcom.flush(); // Empfangspuffer leeren
   cap.Release(debug.HWCOM_CAPTURE);
 }
}


GruÃ?
Jens


    Antwort schreiben


Antworten:

Re: Uhrzeit stellen mit XPort (von Bert - 30.10.2010 11:14)