Messdaten von C grafisch in Scilab darstellen



  • Hallo zusammen,
    ich komme derzeit nicht weiter und erhoffe mir, dass Ihr mir helfen könnt.

    Ich habe ein C-Programm was Messdaten misst und in eine Textdatei schreibt. Dies funktioniert so:
    Textdatei öffnen, Messwert reinschreiben, Textdatei schließen. Das wird in einer Schleife ausgeführt und alle 0,5 Sekunden kommt ein Messwert dazu. Das funktioniert problemlos.
    Nun möchte ich die Messwerte grafisch in Scilab (ähnlich wie Matlab nur Freeware) grafisch darstellen. Dazu lese ich die Daten in 0,5 Sekundentakt ein und lasse diese mir grafisch darstellen. Quasi in "Echtzeit". Das funktioniert grundsätzlich auch problemlos. Nur irgendwann, mal nach 600 Sekunden, mal nach 20 Sekunden, ganhz unterschiedlich erscheint das von Visual Studio:

    https://picload.org/view/rwapdgwr/unbenannt.png.html

    Ich vermute, dass die Programme irgendwie "kollidieren". Nun weiß ich aber nicht, wie ich das Problem lösen kann.
    Komisch ist, wenn ich die Textdatei manuell per Hand öffne durch Doppelklick, während er reinschreibt, dass er sich daran überhaupt nicht stört.

    Daher die Frage: Hat jemand eine Idee für mich? Gibt es irgendwie eine Möglichkeit, um das vielleicht robuster zu machen bzw. kann man diese Fehlermeldung irgendwie abfangen?

    Vielen Dank im Voraus!


  • Mod

    Das wird passieren, wenn die Programme versuchen, genau gleichzeitig auf die Dateien zuzugreifen. Gerade Windowssysteme sind da etwas pingelig in solchen Sachen. Das würdest du theoretisch auch mit dem Texteditor schaffen, wenn du ganz genau den richtigen Moment abpasst (aber praktisch wird das so gut wie unmöglich sein).

    Allgemein klingt das so, als wolltest du eher die Ausgabe deines Messprogramms direkt in Scilab pipen wollen, anstatt über eine Datei zu gehen. Bei einer Pipe schreibt ein Programm direkt in die Eingabe eines anderen Programms. Und dabei kann nichts in der hier gezeigten Art schief gehen. Das hat aber nichts mit C-Programmierung zu tun, sondern damit, wie du dein System korrekt bedienst. Wahrscheinlich ist es schon damit getan, wenn du

    dein_messprogramm | dein_plotprogramm
    

    als Aufruf benutzt. Deine Programme müssen natürlich noch angepasst werden, nicht mehr die Datei zu benutzen, sondern die Standardeingabe bzw. -ausgabe.

    Es gäbe gewiss auch Sachen, die man auf Ebene deines Messprogramms tun könnte, um den Fehler zu vermeiden, aber obiges ist eine sehr einfache Lösung, die schon existiert, und genau für solche Sachen gemacht ist. Die solltest du unbedingt zuerst ausprobieren.

    PS: Pipes in Windows sind viel weniger schön als in Linux. Eventuell ist mein Vorschlag doch nicht so gut deswegen. Aber du solltest es wenigstens mal ausprobieren.



  • Vielen Dank für Deine ausführliche Antwort.
    Grundsätzlich würde das gehen. Mir wäre aber eine Variante über die Textdatei deutlich lieber. Denn 1. brauche ich die Textdatei sowieso, die Werte sollen gespeichert bleiben um sie eventuell später nochmal anzusehen. Und 2. könnte es sein, dass es durch eine Erweiterung im Scilab die Messdaten noch anderweitig verarbeitet werden müssen.
    Gibt es nicht irgendwie eine Möglichkeit, im C-Code die Fehlermeldung und somit auch den Programmabbruch abzufangen? Also quasi, wenn er merkt, dass diese kollidieren, er dann einfach wieder an den Schleifenanfang springt und es beim nächsten Versuch wieder probiert?


  • Mod

    Ja, natürlich geht das. Du beschreibst doch gerade sogar schon direkt, wie es genau geht. fopen hat einen Rückgabewert, den kann man prüfen.



  • Vielen Dank.
    Ich habe es nun so probiert zu lösen, dass er dann einfach kurz wartet.
    Bis jetzt funktioniert es (kann aber auch Zufall sein). Macht das denn so Sinn?

    fopen_s(&datei, datei_name, "a");
    		if (datei== NULL)
    		{
    			Sleep(5);
    		}
    
    		else
    		{
    			fprintf(datei, "...");
    			fclose(datei);
    		}
    

  • Mod

    Ja.



  • Super, tausend Dank für Deine Hilfe. Das hat mein Problem gelöst.
    Eine Frage hätte ich aber noch.

    Ich möchte das Scilab über das C-Programm starten. Das mache ich mit system("testdatei.sce");
    Das funktioniert auch problemlos, nur leider endet da an dieser Stelle mein C-Programm. Ich möchte aber, dass das weiter läuft.
    Dazu habe ich schon fork() im Internet gefunden, dies kennt er aber nicht. Fehlt vielleich ein header dafür?
    Auch habe ich system("testdatei.sce &"); bereits versucht, welches woanders als Lösung dafür genannt ist. Erfolglos.


  • Mod

    fork & Co. sind Linux. Ich weiß aus dem Stand nicht, wie es in Windows geht, musst du im WinAPI-Forum fragen.

    Wenn du das scilab aus dem C-Programm selber startest, empfehle ich dir nochmals ganz dringend, dir Pipes anzugucken. Denn in dem Fall bietet sich das wirklich ganz toll an und macht alles viel einfacher, egal ob Linux oder Windows. Das kannst du auch direkt in WinAPI fragen, wie das dann geht (In Linux wäre es popen, was intern ein fork ist).



  • Vielen Dank für Deine Eintschätzungen und Hilfen!
    Wahrscheinlich macht es tatsächlich Sinn, früher oder später das mit einer Pipe zu realisieren.


Anmelden zum Antworten