Ich soll gerade eine Messdatenerfassung via Internet realisieren. Die Analog Digital Umsetzkarte ist soweit programmiert, nun muss "nur" noch die Geschichte erledigt werden,
dass das auch über Internet steuerbar wird.
Wens interessiert, hier die genaue Aufgabe:
http://ds2.etech.haw-hamburg.de/snd/inet/messderf_ss08_d.pdf
Wie man sieht, darf NUR CGI und PHP, sowie 'n paar Shellskripte benutzt werden.
Das Problem ist nun leider bei uns der Stopknopf, ich kann die Abtastrate nun schön in Millisekunden einstellen und die Messung starten, aber irgendwie tauchen da nach ner gewissen Verzögerung gleich 100 Werte auf einmal auf und es werden leider auch nur nach diesen Verzögerungen 100 weitere Werte jeweils angezeigt. Programmiert hab ich eigentlich (jedenfalls war es so gedacht :-o), dass mir der Server sofort den Stopknopf und den ersten Messwert anzeigt, nachdem ich die Messung mit ner gewählten Abtastrate starte. Praktisch wird der Stopknopf aber erst nach diesen 100 Werten mit angezeigt, was bei 1 ms Abstastrate ziemlich schnell passiert, aber schon bei 100 ms 'n paar Minuten dauert. Das natürlich eher ungut, jemand 'ne Idee warum das so ist und wie ich das umgehen kann?
Wirklich interessant ist glaub ich nur der Block wo die Messung geschieht:
Achso das Ganze soll unter dem Unix Quark QNX laufen, ich weiß leider wie es dem FH Server ergehen würde, wenn ich hier die URL vom kompilierten .cgi File poste, man kann glaub ich ziemlich leicht Zombies bauen, wenn man vergisst den Stop Knopf zu drücken usw., oder?
dass das auch über Internet steuerbar wird.
Wens interessiert, hier die genaue Aufgabe:
http://ds2.etech.haw-hamburg.de/snd/inet/messderf_ss08_d.pdf
Wie man sieht, darf NUR CGI und PHP, sowie 'n paar Shellskripte benutzt werden.
Das Problem ist nun leider bei uns der Stopknopf, ich kann die Abtastrate nun schön in Millisekunden einstellen und die Messung starten, aber irgendwie tauchen da nach ner gewissen Verzögerung gleich 100 Werte auf einmal auf und es werden leider auch nur nach diesen Verzögerungen 100 weitere Werte jeweils angezeigt. Programmiert hab ich eigentlich (jedenfalls war es so gedacht :-o), dass mir der Server sofort den Stopknopf und den ersten Messwert anzeigt, nachdem ich die Messung mit ner gewählten Abtastrate starte. Praktisch wird der Stopknopf aber erst nach diesen 100 Werten mit angezeigt, was bei 1 ms Abstastrate ziemlich schnell passiert, aber schon bei 100 ms 'n paar Minuten dauert. Das natürlich eher ungut, jemand 'ne Idee warum das so ist und wie ich das umgehen kann?
Code:
#include<stdio.h>
#include<stdlib.h>
#include <sys/kernel.h>
#include <sys/name.h>
#include<i86.h>
struct ad_msg1 {
char inout;
unsigned short outword;
unsigned char offset;
};
struct ad_msg2 {
char status;
unsigned short inword;
};
union {
struct ad_msg1 msg1;
struct ad_msg2 msg2;
} msg;
pid_t pid;
void analog_out(char, unsigned char, unsigned short);
unsigned short analog_in(char, unsigned char);
int main ()
{
char *delaytime=NULL;
unsigned short wert;
float wert2;
char *prog_name ="adc_serv";
char buffer[40]={'\0'};
int k=0,abtast,stoppressed=0,i,stop=0;
printf("Content-type: text/html\n\n");
delaytime = getenv("QUERY_STRING"); // hole String aus Query_String aus der get-Information vom Browser
if ((delaytime!=NULL) && (delaytime[0]=='A') ){ // wenn 1. Buchstabe A (von Abtastrate s. weiter unten) ist
while (*delaytime != '=') // suche den ersten Wert
delaytime++;
delaytime++; // hinter dem 1. '='-Zeichen
while (*delaytime != '&') {
buffer[k] =*delaytime ; // und kopiere den String in das Buffer Feld buffer[]
k++;
delaytime++;
}
abtast = atoi(buffer); // erst dann kann der String Wert mit ArrayToInt() in ein Int Wert transformiert werden
}
else if ((delaytime!=NULL) && (delaytime[0]=='s')) { // Wenn der erste Buchstabe vom Query String allerdings ein 's' ist
abtast=0; // von 'stop' (wenn stop knopf gedrückt wurde s.u.)
while (*delaytime != '=')
delaytime++;
delaytime++;
while (*delaytime != '\0') {
buffer[k] =*delaytime ; // dann kopiere den stop Wert in das Buffer Feld buffer[]
k++;
delaytime++;
}
stoppressed = atoi(buffer); // und trage die 1 oder die 0 in die Int Variable stoppressed ein
}
else
abtast=0;
printf("<html><body><div align=\"center\">"); // Standard HTML Beginn für die Seite
k=0;
if((abtast!=0) && (stoppressed==0)){ // Wenn eine Abtastrate eingetragen wurde und der Stopknopf nicht gedrückt wurde
stop=1; // setze variable stop für den folgenden Stop-Knopf auf 1
printf("<form action=\"messerfasstest.cgi\" method=\"get\"><input type=\"hidden\" name=\"stop\" value=\"%d\"><input type=\"submit\" value=\"stop\"></form>",stop); // und trage den Stopknopf in HTML in die Seite ein
pid = qnx_name_locate(0,prog_name,0,NULL); // Voreinstellungen für die Analog Digigal Umsetz/Messkarte
analog_out('O',0,0x0000);
analog_out('O',2,0x0000);
analog_out('O',2,0x0600);
analog_out('O',16,0x0040);
analog_out('O',0,0x8401);
while(1)
{
analog_in('T',0); // Mess-Umsetzung starten
wert = (analog_in('I',16) ^ 0x0800) & 0x0FFF; // Hole Wert von Messkarte ab
wert2 = ((float) wert) * 2.44/1000.0; // Rechne ihn auf korrekten Voltwert um
printf("%f<br>\n",wert2); // und printe ihn auf die Seite
fflush(stdout); // Ausgabe korrigieren
delay(abtast); // Delay für die eingestellte Abtastrate (abtast aus dem Query String von oben)
}
}
else // Wenn keine Abtastrate eingetragen wurde, oder der Stopknopf gedrück wurde
{ // Zeige das Anfangsbild mit einstellbarer Abtastrate und Startknopf (noch nich ganz optimiert)
stop=0;
printf("<form action=\"messerfasstest.cgi\" method=\"get\" >Abtastrate:<input name=\"Abtastrate\">(in Millisekunden)<p><input type=\"submit\" value=\"START\"><p>");
printf("<form action=\"messerfasstest.cgi\" method=\"get\"><input type=\"hidden\" name=\"stop\" value=\"%d\"><input type=\"submit\" value=\"stop\"></form>",stop);
}
printf("</div></body></html>"); // Schließe HTML Tags
return EXIT_SUCCESS;
}
unsigned short analog_in(char ctl, unsigned char off)
{
msg.msg1.inout = ctl;
msg.msg1.offset = off;
Send(pid, &msg, &msg, sizeof(msg), sizeof(msg));
return msg.msg2.inword;
}
void analog_out(char ctl, unsigned char off, unsigned short value)
{
msg.msg1.inout = ctl;
msg.msg1.offset = off;
msg.msg1.outword = value;
Send(pid, &msg, &msg, sizeof(msg), sizeof(msg));
}
Wirklich interessant ist glaub ich nur der Block wo die Messung geschieht:
Code:
if((abtast!=0) && (stoppressed==0)){ // Wenn eine Abtastrate eingetragen wurde und der Stopknopf nicht gedrückt wurde
stop=1; // setze variable stop für den folgenden Stop-Knopf auf 1
printf("<form action=\"messerfasstest.cgi\" method=\"get\"><input type=\"hidden\" name=\"stop\" value=\"%d\"><input type=\"submit\" value=\"stop\"></form>",stop); // und trage den Stopknopf in HTML in die Seite ein
pid = qnx_name_locate(0,prog_name,0,NULL); // Voreinstellungen für die Analog Digigal Umsetz/Messkarte
analog_out('O',0,0x0000);
analog_out('O',2,0x0000);
analog_out('O',2,0x0600);
analog_out('O',16,0x0040);
analog_out('O',0,0x8401);
while(1)
{
analog_in('T',0); // Mess-Umsetzung starten
wert = (analog_in('I',16) ^ 0x0800) & 0x0FFF; // Hole Wert von Messkarte ab
wert2 = ((float) wert) * 2.44/1000.0; // Rechne ihn auf korrekten Voltwert um
printf("%f<br>\n",wert2); // und printe ihn auf die Seite
fflush(stdout); // Ausgabe korrigieren
delay(abtast); // Delay für die eingestellte Abtastrate (abtast aus dem Query String von oben)
}
}

