SysProcessExecuteCommand mit übergebenem String

Toffeebonbon

Level-2
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo in die Runde,

da es etwas länger wird ein TL;DR vorneweg:
Gibt eine SysProcessExecuteCommand-Alternative, die mit WSTRING umgehen kann?
Gibt es eine Möglichkeit mit Mitteln der SPS direkt die Systemzeit des Betriebssystems zu setzen (Debian Linux im besonderen)?

Nun die ganze Geschichte:
Ich habe mit Codesys 3.5SP12 ein Programm erstellt, mit dem ich aus der SPS-Umgebung heraus einen Betriebssystembefehl in Debian (Raspberry Pi) auslösen möchte.
Der Test mit

Code:
SysProcess.SysProcessExecuteCommand('shutdown -h now', ADR(Result));

funktioniert soweit problemlos.

Der nächste Schritt sollte sein, mit diesem Prinzip durch Benutzereingaben in der SPS das Datum des Betriebssystems zu ändern, da der Raspberry nicht ins Internet soll und seine interne Uhr driftet doch arg.

Die Syntax sieht vor, dass dem (Linux-)Befehl ein String übergeben und dessen Format deklariert wird. Zum Beispiel:

Code:
//           |   Übergabe   |  | Formatierung |
sudo date -s 2018-18-12T17:00 +'%Y-%m-%dT%H:%M'

Der Benutzer darf Eingaben über die WebVisu machen, die ich dann zu einem String zusammenbasteln und an den Befehl übergeben möchte:

Code:
PROGRAM VisuSystemTime
VAR
    Result: SysTypes.RTS_IEC_RESULT;
    
    uiYear:    UINT;    //
    uiMonth:   UINT;    //
    uiDay:     UINT;    // Eingabe über die WebVisu
    uiHour:    UINT;    //
    uiMinute:  UINT;    //
    
    strYear:   STRING;  //
    strMonth:  STRING;  //
    strDay:    STRING;  // Die zur Zeichenkette umgewandelten Eingaben
    strHour:   STRING;  //
    strMinute: STRING;  //
    
    strSetStr: STRING;  // Der temporäre String der Zusammenfassung
    strFinal:  STRING;  // Der finale Befehls-String, damit nicht unfertige Befehle übergeben werden können
END_VAR

strSetStr:='sudo date -s ';
strSetStr:= CONCAT(strSetStr,UINT_TO_STRING(uiYear));
strSetStr:= CONCAT(strSetStr,'-');
strSetStr:= CONCAT(strSetStr,UINT_TO_STRING(uiMonth));
strSetStr:= CONCAT(strSetStr,'-');
strSetStr:= CONCAT(strSetStr,UINT_TO_STRING(uiDay));
strSetStr:= CONCAT(strSetStr,'T');
strSetStr:= CONCAT(strSetStr,UINT_TO_STRING(uiHour));
strSetStr:= CONCAT(strSetStr,':');
strSetStr:= CONCAT(strSetStr,UINT_TO_STRING(uiMinute));
strSetStr:= CONCAT(strSetStr,' +$27%Y-%m-%dT%H:%M$27');    // $27 bzw. $' sind anscheinend das Problem
strFinal := strSetStr;

Der Formatierungsteil des Linuxbefehls erwartet einfache Anführungszeichen, die ich in der SPS mit dem $-Zeichen maskiere. Lasse ich mir strFinal in der Visu anzeigen ist die Zeichenkette auch exakt so, wie ich sie an das Betriebssystem übergeben möchte. Die Überwachung zeigt jedoch die $-Zeichen mit an und mit den $-Zeichen wird die Zeichenkette auch übergeben.

Um das Problem dieser gleichen Anführungszeichen zu umgehen, habe ich alle STRING-Typen und -Operationen in WSTRING-Typen und -Operationen geändert, was zumindest den Ausgabe-String korrekt darstellt. Leider kann SysProcessExecuteCommand nicht mit WSTRING umgehen und auch eine Konvertierung WSTRING_TO_STRING hat da nichts geholfen. Was kann ich noch ausprobieren? Bin auch der Verwendung von Bibliotheken gegenüber offen, die einen Betriebssystembefehl überflüssig machen. Das Lesen der Systemzeit habe ich mir auch aus dem Beispiel aus dem CODESYS-Store abgeschaut.

Vielen Dank schon mal!
Robert
 
Zurück
Oben