Chris200 Geschrieben August 12, 2019 at 16:47 Geschrieben August 12, 2019 at 16:47 Hallo, ich habe ein Programm auf C# geschrieben, bei dem unter anderem die Zeit- und Datumsangabe des Red Bricks ausgegeben werden sollte (z.B.: DateTime.Now.Second). Bekomme dabei aber jedesmal, wenn ich es auf dem Red Brick laufen lasse die Fehlermeldung: "Unhandled Exception: System.IO.FileNotFoundException: Could not find file "/etc/localtime" File name: '/etc/localtime'" Beim Debuggen des Programms über Visual Studio funktioniert es hingegen einwandfrei, hierbei wird wahrscheinlich einfach die Computer-Zeitangabe verwendet. Wäre hierbei sehr dankbar für Hilfe. Meine zweite Frage wäre, wie ein Befehl aussieht die Red Brick Zeit über einen Programmtext individuell abzuändern. Also beispielsweise irgendein Datum mit beliebeiger Zeit vorzugeben. Vielen herzlichen Dank. Zitieren
rtrbt Geschrieben August 13, 2019 at 07:29 Geschrieben August 13, 2019 at 07:29 Moin, das ist vermutlich auf einen Bug im Brick Viewer zurückzuführen, der mit Version 2.4.5 gefixt wurde. /etc/localtime ist ein Symlink auf die gewünschte Zeitzone in /usr/share/zoneinfo/. Vor Version 2.4.5 hat der Brick Viewer aber localtime auf nicht vorhandene Dateien gelinkt, C# gibt dann die FileNotFoundException aus. Wenn du mit dem aktuellen Brick Viewer die Zeitzone des RED-Brick neu setzt, sollte das Problem behoben sein. Um die Zeit des RED-Bricks zu setzen kannst du date auf der Kommandozeile oder mit System.Diagnostics.Process verwenden. Zum Beispiel mit date +%s -u -s @1565681174 (als Unix-Timestamp, so macht es der Brick Viewer) oder mit date -s "13 AUG 2019 09:25:30" Zitieren
Chris200 Geschrieben August 22, 2019 at 11:29 Autor Geschrieben August 22, 2019 at 11:29 Vielen Dank für die Hilfe👌 Das Programm läuft jetzt auf dem Red Brick. Mir ist leider noch nicht ganz genau klar, wie ich die Zeit auf dem Red Brick manuell manipulieren kann. Muss ich dazu using System.Diagnostics bzw. Using System.Diagnostics.Process einbinden? Denn wenn ich im Programm-Code alleine date verwenden möchte, kennt das Programm den Befehl nicht. Mein Ziel wäre es nämlich die Red Brick Zeit anhand von integer Variablen zu setzen. Zum Beispiel: int stunde = 12; int minute = 5; int sekunde = 12; Diese Daten dann neu als Red Brick Zeit setzen. Vielen Dank.😊 Zitieren
rtrbt Geschrieben August 22, 2019 at 12:41 Geschrieben August 22, 2019 at 12:41 Process kannst du verwenden, wie hier beschrieben. In deinem Fall müsste myProcess.StartInfo.FileName = "C:\\HelloWorld.exe"; stattdessen myProcess.StartInfo.FileName = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stunde, minute, sekunde); (o.Ä.) sein. Zitieren
rtrbt Geschrieben August 22, 2019 at 15:25 Geschrieben August 22, 2019 at 15:25 Was gerade noch aufgefallen ist: Datum/Zeit zu setzen geht nur mit Root-Rechten. Du kannst aber dem Standarduser (also tf) erlauben, das ohne Root-Passwort zu tun, in dem du auf der seriellen Konsole des RED-Brick einmalig folgenden Befehl ausführst: echo 'tf ALL=(root) NOPASSWD: /bin/date' | sudo tee -a /etc/sudoers Wenn du dann in deinem Programm /bin/date durch /usr/bin/sudo /bin/date ersetzt, sollte es klappen. Zitieren
Chris200 Geschrieben August 22, 2019 at 17:54 Autor Geschrieben August 22, 2019 at 17:54 Danke für die Infos. Hab jetzt einmalig den Befehl: echo 'tf ALL=(root) NOPASSWD: /bin/date' | sudo tee -a /etc/sudoers auf der Red Brick Serial Consol ausgeführt. Zusätzlich habe ich in meinem Code folgende Zeilen geschrieben: using (Process myProcess = new Process()) { //myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.FileName = String.Format("/usr/bin/sudo /bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund); //myProcess.StartInfo.CreateNoWindow = true; myProcess.Start(); } Die auskommentierten Zeilen brauch ich ja nicht oder? Bei diesem Programm kommt jedenfalls immer ein Fehler beim Aufrufen von myProcess.Start(); Wenn ich diesen Befehl weglasse, wird zwar das Programm ausgeführt jedoch wird die Zeit nicht verändert. (Die Bibliotheken using System; using System.Diagnostics; using System.ComponentModel; habe ich oben in mein Programm eingebunden) Macht ja nichts, dass ich diesen Programmtext erst mitten in meinem Code geschrieben habe oder? Vielen Dank für weitere Hilfe :) Zitieren
rtrbt Geschrieben August 23, 2019 at 07:50 Geschrieben August 23, 2019 at 07:50 Was für eine Fehlermeldung bekommst du, wenn du myProcess.Start(); aufrufst? Zitieren
Chris200 Geschrieben August 23, 2019 at 17:29 Autor Geschrieben August 23, 2019 at 17:29 Der nachfolgende Fehler tritt dann auf wenn die myProcess.Start() aufgerufen wird.continuous_stdout.log Zitieren
rtrbt Geschrieben August 26, 2019 at 07:52 Geschrieben August 26, 2019 at 07:52 Ah, manchmal ist man einfach betriebsblind, sorry dafür. Das Problem ist, dass StartInfo den Namen der ausführbaren Datei und die Argumente getrennt will, da ja auch keine Shell benutzt wird (deshalb optionalerweise UseShellExecute = false). So funktioniert es bei mir: using (Process myProcess = new Process()) { myProcess.StartInfo.FileName = "/usr/bin/sudo"; myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund); myProcess.Start(); } Zitieren
Chris200 Geschrieben August 26, 2019 at 16:12 Autor Geschrieben August 26, 2019 at 16:12 Ja jetzt läufts, vielen herzlichen Dank Falls ich den Tag, Monat und Jahr ebenfalls noch als integer Variable zu Anpassung der Red Brick Zeit verwenden würde, wie würde sich da die Zeile: myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund); noch ändern? Zitieren
Chris200 Geschrieben September 1, 2019 at 16:36 Autor Geschrieben September 1, 2019 at 16:36 Hallo, könnte mir bitte jemand noch bei der Anpassung der Zeit mit der Berücksichtigung der Jahreszahl, Monatsangabe und Anzahl des Tages als integer Variabel helfen. Ich weiß nicht genau wie ich die Zeile myProcess.StartInfo.Arguments dementsprechend abändern muss, dass ich diese drei Variablen auch vorgeben kann. Vielen herzlichen Dank im Voraus😊👍 Zitieren
rtrbt Geschrieben September 2, 2019 at 09:07 Geschrieben September 2, 2019 at 09:07 Dafür musst du die Teile in dem Datumsstring auch durch Platzhalter ersetzen, die du dann mit String.Format einsetzt, z.B so: myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"{0:00} {1} {2:0000} {3:00}:{4:00}:{5:00}\"", jahr, monat, tag, stunde, minute, sekunde); Den Monat musst du als String reingeben, also z.b. AUG oder SEP. Alternativ kannst du dir mal die anderen Formate ansehen, die date versteht, die sind z.B. hier dokumentiert. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.