• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Internetprogrammierung

Mitglied seit
01.08.2000
Beiträge
1.782
Reaktionen
0
Ort
Hamburg
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?

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)
					               
		}

	}
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?
 
Mitglied seit
01.08.2000
Beiträge
1.782
Reaktionen
0
Ort
Hamburg
Also um das mal zu konkretisieren und weil ich keine Threads mit 0 Antworten mag:

http://ds14.etech.haw-hamburg.de/~nahm_h/Start.html

Da darf nun leider nur 1 gleichzeitig zwei Minuten lang messen (evtl. sogar nur noch solang bis der Rechner inner FH ausgemacht wird).
Das Problem ist wie gesagt, dass der rechte Messscreen erst nach ca. 100 Werten aktualisiert wird. D.h. bei ner Abtastrate von 1 ms ist sofort der Stopknopf da, bei 100 ms dauerts schon 'n paar Sekunden, bis er dann inklusive den ersten 100 Werten auftaucht. Programmiert war eigentlich, dass der Stopknopf sofort, noch vor dem ersten Wert zu sehen ist. :[

Ansonsten noch ne andere Frage: Gibt es 'n PHP Applet, Funktion oder so, mit dem man die Werte einigermaßen leicht in 'ne Grafik einbinden kann - am besten in Echtzeit?
 
Mitglied seit
01.08.2000
Beiträge
1.782
Reaktionen
0
Ort
Hamburg
Ich weiß nicht, ob ich hier gegen irgendwelche Regeln verstoße, oder obs überhaupt wen interessiert, wenn ich meine eigenen Probleme hier "löse".
Aber sone Grafik scheint schön schick mit http://code.google.com/apis/chart/ und dazu noch recht einfach in sone Messerfassungsgeschichte reinzustecken zu sein.
Das mit der Verzögerung mit dem Stop-Knopf war wohl 'n Grund auf Serverseite, der irgendein Buffer mit printf-Anweisungen zubuffert. An den kam man aber von unserer Seite nicht ran...
Mal gucken was das für ne Note wird. :elefant:
 

Jesus0815

Guest
Original geschrieben von SchlumpfVI
Ich weiß nicht, ob ich hier gegen irgendwelche Regeln verstoße, oder obs überhaupt wen interessiert, wenn ich meine eigenen Probleme hier "löse".

Die Datenbank freuts. Ein Problem mehr das erfasst und gelöst wurde :)
 
Oben