Problem mit SysProcessExecuteCommand und SysProcess.library

Jimbo200

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte gerne LED-strips via Infrarot mit meinem Raspberry PI steuern.
Mit Putty und z.B. dem Befehl "irsend SEND_ONCE ledband_aqua KEY_RED" funktioniert alles ohne Probleme. Nun möchte ich aber mit Codesys eine Visualisierung erzeugen, mit der ich die Befehle, die ich sonst in Putty benutzen würde, ausführen kann. Im Internet bin ich auf die Funktion SysProcessExecuteCommand gestoßen, mit der dass wohl einfach zu realisieren sein soll. Jedoch bin ich nicht in der Lage die Bibliothek SysProcess.library zu finden.

Der Eintrag bei SysProcess in der CODESYSControl.cfg sieht bei mir so aus:
Code:
[SysProcess]
Command.0=shutdown
Command.1=irsend SEND_ONCE ledband_aqua KEY_RED

In Codesys habe ich es so probiert:
Code:
SysProcessExecuteCommand('irsend SEND_ONCE ledband_aqua KEY_RED')
Ich erhalte dann die Fehlermeldung
Code:
Bezeichner 'SysProcessExecuteCommand' nicht definiert

Hat jemand mit der Funktion schon gearbeit und kann mir sagen wo ich die Bibliothek finde bzw. was ich sost noch falsche mache?

Danke schonmal im Voraus
 
Hi,
ich hatte hier mal ein Beispiel gepostet:
http://forum.codesys.com/viewtopic.php?f=23&t=6247&p=12699#p12699
hier wird 'SysProcessExecuteCommand2' statt 'SysProcessExecuteCommand' aufgerufen der Unterschied ist lediglich das man die Ausgabe aus der Konsole in die IEC Welt als Rückgabe reingereicht bekommt

Denke das Problem ist hier, du solltest nur ein Command angeben also nicht irsend SEND_ONCE ledband_aqua KEY_RED sondern nur irsend,
den Rrest übergibst du in IEC 'SysProcessExecuteCommand'.
In der SysProcess Sektion gibt frei was erlaubt ist aus IEC auszurufen.

[SysProcess]
Command.0=shutdown
Command.1=irsend SEND_ONCE ledband_aqua KEY_RED (SEND_ONCE ledband_aqua KEY_RED entfernen aus der Zeile)


Grüße
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider kann ich mir das Beispiel nicht anschauen, da ich noch auf die Aktivierung meines Accounts warten muss.
Aber ich hab diesen Beitrag von dir gefunden http://www.sps-forum.de/codesys-und-iec61131/78630-raspberry-pi-datei-starten.html

Aus dem Programm Raspi_PlayMP3_triggered_byPLC hab ich dann die Zeilen
Code:
xPlaySound: BOOL;
    command1 : STRING := 'mpg321 /home/pi/03_-_haus_ma_see_-_stadtaffe.mp3';
    stdout : STRING(1000) := '';    
    Result : RTS_IEC_RESULT


IF xPlaySound THEN
    SysProcess.SysProcessExecuteCommand2(pszCommand:=command1, pszStdOut:=stdout, udiStdOutLen:= SIZEOF(stdout),pResult := ADR(Result));
    xPlaySound := FALSE;
END_IF
kopiert und für mein Programm so bearbeitet
Code:
rot_s: BOOL;
command1 : STRING := 'irsend SEND_ONCE ledband_aqua KEY_RED';
stdout : STRING(1000) := '';      
Result : RTS_IEC_RESULT;

IF rot_s = TRUE THEN

SysProcess.SysProcessExecuteCommand2(pszCommand:=command1, pszStdOut:=stdout, udiStdOutLen:= SIZEOF(stdout),pResult := ADR(Result));

END_IF
Leider folgt aber keine Aktion wenn rot_s auf true gesetzt wird.
codesys.jpg
 
Hallo,
Rückgabewert 25 bedeutet das es ein "nicht erlaubtes Kommando ist" das bedeute du hast dein Kommando nicht in /etc/CODESYSControl.cfg freigeschaltet.
Kannst du schauen ob wirklich nur eine Sektion von SysProcess in diesem Konfig file vorhanden ist und es müsste:


[SysProcess]
Command.0=shutdown
Command.1=irsend

sein.

Grüße
 
Hey ich melde mich hier weil ich denke das meine Fragen besser hierher passen.

Ich versuche auch einen Linux aufruf auszuführen und die Werte aus der Konsole in die IEC-Welt zu bekommen.

bei mir handelt es sich um das auswerten einer Wägezelle mit dem HX711.


Mit der Hilfe dieser Seite
http://hivetool.org/w/index.php?titl...tool_on_the_Pi
den HX711 ans Laufen bekommen.

jetzt muss ich das Ganze nur noch in die IEC-Welt bekommen. nur bekomme ich das leider noch nicht ganz hin. Gibt es zu der FUNCTION SysProcessExecuteCommand2
noch eine Beschreibung irgendwo?

Folgendes gebe ich unter Linux ein:

sudo hx711

Dann wird das Programm ausgeführt das liefert mir wie auf folgendem Bild zu sehen dann werte zurück.

Habe das ganze bei CODESYS wie folgt umgesetzt. Bild_CODESYS.jpg

meine CODESYSControl.cfg sieht wie folgt aus:

[SysProcess]
Command.0=shutdown
Command.1=mpg321
Command.2=hx711


vll könnt Ihr mir ja noch einen weiteren Tipp geben =)



MfG Hendrik
 
Hallo Herr Schwellinger
Ich möchte mich hier auch noch kurz einlinken, obwohl der letzte Thread schon eine Weile her ist.

Kann ich so auch eine Python Datei ausführen?
Code:
PROGRAM mystrom_py
VAR
    xPlaySound: BOOL;
    command1 : STRING := 'mystrom0 /home/scripte/my_strom_off.py';
    stdout : STRING(1000) := '';    
    Result : RTS_IEC_RESULT;
    xExecuteSysP: BOOL;
    xshowCPUInfo: BOOL;
END_VAR

IF xPlaySound THEN
    SysProcess.SysProcessExecuteCommand2(pszCommand:=command1, pszStdOut:=stdout, udiStdOutLen:= SIZEOF(stdout),pResult := ADR(Result));
    xPlaySound := FALSE;
END_IF

Bei der Ausführung passiert jedoch nichts. Die CodesysControl.cfg wurde angepasst und die Python Datei ist getestet.
Code:
[SysProcess]
Command.0=shutdown
Command.1=mystrom0

fg Sascha Sven Verna
 
Guten Morgen

Leider ohne Erfolg. Über das Terminal ist es kein Problem und das Script startet ohne Probleme.
Code:
pi@raspberrypi:~ $ sudo python /usr/bin/my_strom_off.py
False
bereits AUS
pi@raspberrypi:~ $ sudo python /root/my_strom_off.py
False
bereits AUS

Unter Codesys jedoch nicht. Ich habe beide Verzeichnisse /root und /usr/bin ausprobiert. Auch mit Uterschiedlichem Befehelen.
Code:
command1 : STRING := 'mystrom0 sudo python /root/my_strom_off.py';
oder
command1 : STRING := 'mystrom0 /root/my_strom_off.py';

Grüsse Sascha
 
Hey Sascha,

hast du an die Config-Datei gedacht?
Hallo,
Rückgabewert 25 bedeutet das es ein "nicht erlaubtes Kommando ist" das bedeute du hast dein Kommando nicht in /etc/CODESYSControl.cfg freigeschaltet.
Kannst du schauen ob wirklich nur eine Sektion von SysProcess in diesem Konfig file vorhanden ist und es müsste:


[SysProcess]
Command.0=shutdown
Command.1=irsend

sein.

Grüße

Ich glaube die Funktion leifert dir nur eine Zeile zurück. Dein Python Script gibt aber zwei Zeilen aus.

MfG
Hendrik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
frag lass dir mal noch den Rückgabewert geben.
Code:
diResult:=SysProcess.SysProcessExecuteCommand2(pszCommand:=command1, pszStdOut:=stdout, udiStdOutLen:= SIZEOF(stdout),pResult := ADR(Result));
daran müsste man sehen was nicht klappt die Fehler findest du hier:

Grüße
 

Anhänge

  • SysP.jpg
    SysP.jpg
    22,4 KB · Aufrufe: 88
  • Errors.jpg
    Errors.jpg
    267,4 KB · Aufrufe: 106
Zuletzt bearbeitet:
Hat leider etwas länger gedauert die Antwort. Seit Dienstag habe ich ein neues Kreuzband und bin erst seit gestern wieder zu Hause.

@Hendrik
Ja an die Config habe ich gedacht.
[SysProcess]
Command.0=shutdown
Command.1=mysrom0

Das Python liefert nicht zurück. Die zwei Zeilen sind nur zur Kontrolle des Script als print ausgegeben worden. Das Script führt nur ein JSON Befehl aus auf meine WLAN Steckdose um diese ein- bzw auszuschalten.

Code:
import urllib2
from contextlib import closing
import json
import time     

for _ in range(6):
    url = "http://192.168.XXX.XXX/report"
    with closing(urllib2.urlopen(url)) as response:
        response = json.load(response)
        print response['relay']
        if not response['relay']:
            url = "http://192.168.XXX.XXX/relay?state=1"
            urllib2.urlopen(url).read(1000)
            print response
            time.sleep(1) 
        else:
            print "bereits AN"
            break

@HausSPSler
Als Resultat kommt diResult = 1 zurück.

diResult.pngdiResult_aktiv.jpg
 
Hallo zusammen,
ich habe das selbe Problem wie bei dir.

Irgendwie bekomm ich auch nur immer eine 1 zurück. Ich möchte allerdings einen SSH Command an den Pi schicken. Über Putty funktioniert der Befehl wunderbar, nur in Codesys bekomm ich ihn einfach nicht zum laufen.
So sieht meine CODESYSControl.cfg aus.

Code:
[SysProcess]Command.0=shutdown
Command.1=ssh
Command=AllowAll

Und hier noch ein paar Screenshots von meinem Programm etc.
FehlerSSH.jpgFehlerSSH_Putty.pngFehlerSSH_Online.jpg

Wäre spitze wenn mir hier jemand weiterhelfen kann.

Vielen Dank schon im Vorraus.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Bei mir ist es so dass es funktioniert, jedoch bringt mir das Command immernoch eine 1 retour. Das Python-Script wird einwandfrei ausgeführt und schaltet meine WLAN Steckdose. Leider kann ich dir dazu auch nicht mehr weiterhelfen.

Code:
command1  := 'python /usr/bin/my_strom_on.py 192.168.XXX.XXX';

Grüsse Sascha
 
Hallo Sascha,
bei mir bekomm ichs einfach nicht zum laufen.

Habs jetzt auch mal mit einem phyton skript versucht. Selbes Ergebnis.

Grüße
 
Hallo zusammen,
hab es nun endlich zum laufen gebracht.

Lösung des Problems bei mir war, dass die codesys runtime mit dem root user ausgeführt wird und ich immer nur den Nutzer Pi dazu berechtig hab über das ssh zu kommunisieren.

Also funktioniert bei mir nun auch wunderbar.

Jetzt wird die Webvisu dazu gebastelt.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin 1cem4n und alle sonstigen Interessierten,

bin gerade mal wieder über dieses Thema gestolpert - was meinst du damit?
Lösung des Problems bei mir war, dass die codesys runtime mit dem root user ausgeführt wird und ich immer nur den Nutzer Pi dazu berechtig hab über das ssh zu kommunisieren.

Grüße
 
Moin Moin,

ich habe mich heute noch einmal zwischen durch mit dem Thema beschäftigt und wollte mal kurz ein paar Dinge zusammenfassen.
Folgendes wollte ich realisieren:
Das RFID Modul RFIO-RC522 bei Codesys einbinden. Der Hintergrund hierfür ist ein einfacheres Usermanagement für eine kleine Steuerung.

Um das ganze ans Laufen zu bekommen bin ich auf der Rpi ebene angefangen.
Hierfür habe ich mich an folgenden Anleitung gehalten
https://tutorials-raspberrypi.de/raspberry-pi-rfid-rc522-tueroeffner-nfc/
Hier erstmal die entsprechenden Python Skripte runtergeladen, installieren und testen.
Auf dem Rpi konnte ich so RFID Chips auslesen.

Damit man die Module später auch in weiteren Skripten anwenden kann muss noch eine leere Datei in folgendem Ordner angelegt werden.
WICHTIG __init__.py jeweils zwei Unterstriche vor und nach dem "init"!!

pi@raspberrypi:~ $ cd MFRC522-python/
pi@raspberrypi:~/MFRC522-python $ sudo nano __init__.py
Mit STRG+O Speichern und mit STRG+X Datei verlassen.


Jetzt das Ganze in die PLC reinholen.
Da waren sie wieder die Probleme, wenn man das nicht tägliche / regelmäßig macht.

Da ich noch ein altes Projekt hatte habe ich mir das dort abgeguckt.
In der PLC Runtime wird folgender FB Aufruf benötigt.
Code:
VAR
    commandRFID :        STRING           := 'RFID';
    stdoutRFID :             STRING(1000)  := '';    
    ResultRFID :             RTS_IEC_RESULT;
END_VAR

SysProcess.SysProcessExecuteCommand2(pszCommand:=commandRFID, pszStdOut:=stdoutRFID, udiStdOutLen:= SIZEOF(stdoutRFID),pResult := ADR(ResultRFID));

Zusätzlich muss auf dem Rpi folgende Datei angepasst werden: /etc/CODESYSControl.cfg

Hier muss für jedes Script was ausgeführt werden soll einen Eintrag tätigen
sieht zum Beispiel wie folgt aus:
[SysProcess]
Command.0=shutdown
Command.1=CPU_Temp
Command.2=RFID

Die Skripte müssen alle in folgendem Verzeichnis auf dem Rpi liegen: /usr/bin

Hier muss die Python Datei liegen.


Python Script:
sudo nano RFID.py
Die Datei wird wie folgt befüllt:
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
sys.path.append('/home/pi/MFRC522-python/') #liegt in einem anderem Verzeichniss
import RPi.GPIO as GPIO
import MFRC522
import signal
import time
 
continue_reading = True
# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()
 
# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)
 
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
 
while continue_reading:
 
        # Scan for cards
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
 
        # If a card is found
        if status == MIFAREReader.MI_OK:
                #print "Card detected"
 
                # Get the UID of the card
                (status,uid) = MIFAREReader.MFRC522_Anticoll()
                #time.sleep(0.5)
                print(uid)
                continue_reading = False
                GPIO.cleanup()
        else:
                print("NoCard")
                continue_reading = False
                GPIO.cleanup()

jetzt muss diese Datei für alle User zugelassen werden dies geht wie folgt:

sudo chmod +x RFID.py

wenn man das erledigt hat muss die Datei noch umbenannt oder kopiert werden ( Ich habe in der CodesysConfig das ganz mit "RFID" benannt)
sudo cp RFID.py RFID

jetzt ein Test in der Konsole ob alles funktioniert hat:

pi@raspberrypi:/usr/bin $ RFID
[227, 53, 7, 140, 93]

So das Ganze hat funktionier jetzt wird das Ganze in Codesys ausprobiert und auch hier bekomme ich die Werte!

Ich hoffe ich konnte einigen hiermit helfen bei Fragen meldet euch einfach!
Diese Zusammenfassung habe ich aus dem Kopf zusammen geschrieben- falls etwas nicht wie beschrieben funktionieren sollte sagt bitte kurzer Bescheid!
 
Zuletzt bearbeitet:
Hey Hendrik,
vielen Dank für den Top Eintrag zum Auslesen des RFID und die Hilfe darüber hinaus.
Hoffe es gibt noch mehr so hilfsbereite Menschen wie dich auf dieser Erde.

Viele Grüß
Oli
 
Zurück
Oben