CPU-ID oderMAc-Adresse aus Raspi in Codesys auslesen

JüKo

Level-2
Beiträge
97
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Euch,
ich möchte in Codesys die CPU-ID (oder MAC-Adressse) meiner Pixtend-Steuerung lesen und in eine Stringvariable schreiben.
Diese möchte ich dann mit einer Stringvariablen in meinem Programm vergleichen. Wenn diese beiden Strings nicht gleich sind dann kann das Programm nicht benützt werden. Gibt es da eine Möglichkeit?
Der Grund dafür ist, sofern das Programm kopiert wird, es dann nicht verwendet werden kann. Oder gibt es da auch andere Möglichkeiten?
Danke und Grüße,
Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel,
das habe ich im Link gefunden >> DeviceNet MAD ID. Das sieht schonmal gut aus, aber mit welchem Befehl kann ich nun die Mac-Id in Codesys erfragen? Ich benötige eine Stringvariable zum vergleichen.
Zu den Stückzahlen kann ich noch nichts sagen, werden aber nicht so hoch sein.
Danke und Grüße,
Jürgen
 
Probiere es mal hiermit, die MAC Adresse kann durchaus geändert werden, die CPU ID sollte recht sicher sein.


Code:
PROGRAM PLC_PRG
VAR
    fbGetDeviceInfo : CAA.DeviceDiagnosis.DeviceGetInfo;
    stDeviceInfo : CAA.DeviceDiagnosis.ST_DeviceInfo;
    xDone : BOOL;
    xError : BOOL;
    uiState : UINT := 0;
    myDeviceID : STRING(100);
    expectedID : STRING(100) := 'ABC123XYZ'; // Deine Ziel-ID
END_VAR

CASE uiState OF
    0:
        fbGetDeviceInfo(
            pDeviceInfo := ADR(stDeviceInfo),
            xExecute := TRUE
        );
        uiState := 1;

    1:
        IF fbGetDeviceInfo.xDone THEN
            xDone := TRUE;
            myDeviceID := stDeviceInfo.sDeviceId;   // oder sSerialNumber prüfen
            fbGetDeviceInfo.xExecute := FALSE;
            uiState := 2;
        ELSIF fbGetDeviceInfo.xError THEN
            xError := TRUE;
            fbGetDeviceInfo.xExecute := FALSE;
            uiState := 100;
        END_IF

    2:
        IF myDeviceID <> expectedID THEN
            // Zugriff verweigern
        ELSE
            // Zugriff gewähren
        END_IF

    100:
        // Fehlerbehandlung

END_CASE
 
Hallo Onkel,

super, vielen Dank für deine Mühe, den Programmcode hab ich reinkopiert.
Dann einige Fehlermeldungen
1753041395278.png
Bin nun draufgekommen, dass ich noch eine Bibliothek brauche.
Kannst Du mir sagen welche das ist? Ich hätte ansonsten einfach die oberste Zeile genommen :unsure:
Ich merk schon, dass ich ein bisschen programmieren kann, aber ansonsten noch große Lücken hab.
1753041338079.png
Danke nochmals für die tolle Arbeit, das hätte ich so nie hinbekommen.

Grüße,
Jürgen
 
Ich habe mal ein Versuch unternommen und bin nicht zu einem Ergebnis gekommen, aber ich sehe es mir bei Gelegenheit mal an, die oben genannten Funktion läuft wohl nur bis SP14 und wahrscheinlich nicht auf dem PI.

Du könntest auch die CmpSysProcess Lib benutzen und per Konsole auslesen.

Code:
VAR
    hProcess : RTS_IEC_HANDLE;
    szCommand : STRING(255) := 'cat /proc/cpuinfo | grep Serial';
    sOutput   : STRING(64);
    Result    : RTS_IEC_RESULT;
    xDone     : BOOL := FALSE;
END_VAR

IF NOT xDone THEN
    hProcess := SysProcessExecuteCommand2(szCommand, ADR(sOutput), SIZEOF(sOutput), ADR(Result));
    xDone := TRUE;  // Nur einmal ausführen
END_IF
 
VAR
hProcess : RTS_IEC_HANDLE;
pszCommand : STRING(255) := 'cat /proc/cpuinfo | grep Serial';
sOutput : STRING:= '';
xDone : BOOL := FALSE;
END_VAR

IF NOT xDone THEN
SysProcess.SysProcessExecuteCommand2(pszCommand, pszStdOut:=sOutput, SIZEOF(sOutput), ADR(hProcess));
xDone := TRUE; // einmal ausführen
END_IF
 
Useless use of 🐈 has been detected.
Bash:
cat /proc/cpuinfo | grep Serial

Der Befehl grep kann auch Dateien einlesen:
Bash:
grep Serial /proc/cpuinfo
Das hat den Vorteil, dass nur ein Programm gestartet wird.


Könnte man auch mit AWK machen:
Bash:
awk -F ': ' '/Serial/ { print $2 }' /proc/cpuinfo
Vorteil: Es wird nur die Seriennummer ausgegeben. Serial : wird dann nicht mit ausgeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Ich hab die Variablen vom Onkel in die Variablenliste und den Code in den Programmteil kopiert.
Nun kommen diese beiden Fehlermeldungen:
[FEHLER] Xup_20250723_2: PLC_PRG [Device: SPS-Logik: Application](Zeile 23, Spalte 1 (Impl)): C0032: Typ 'POINTER TO STRING(64)' kann nicht in Typ 'REFERENCE TO STRING' konvertiert werden

[FEHLER] Xup_20250723_2: PLC_PRG [Device: SPS-Logik: Application](Zeile 23, Spalte 1 (Impl)): C0417: VAR_IN_OUT- beziehungsweise REFERENCE-Parameter 'pszStdOut' von 'SysProcessExecuteCommand2' benötigt eine Variable mit Schreibzugriff als Eingang

Da ich den Code nicht verstehe dann ich auch nichts mit den Fehlermeldungen anfangen.
Hab auch noch nie etwas mit einem Pointer gemacht.

Danke an euch und Grüße,
Jürgen
 
Zurück
Oben