Page 1 of 1

ProfiNet Gateway schaltet wert alleine wenn Programm läuft

Posted: 21 May 2019, 11:34
by jkunath
Hallo zusammen,

wir haben einen kleinen Testaufbau gemacht. Auf der einen Seite ist ein normaler Pi mit zwei Tastern. Über Netzwerk verbunden hängt der Revolution Pi mit ProfiNET Gateway dran. Ich schicke den Tasten druck als ein Byte via TCP/IP socket. Das Byte kann 0 (keine Taste), 1 (Taster 1 gedrückt) und 2 (Taster 2 gedrückt) sein. Ich schreibe dieses Byte bei empfangen mit dem RevPiModIO auf Output_1. Wenn ich mir nun mit dem Befehl piTest -r 512,1 das Byte in der Konsole ausgeben lasse. Wechselt es bei Tastendruck 2 auf den Wert 2 und bei loslassen wieder auf 0. Soweit so gut. Nun springt dieses Byte aber weiter von 0 auf 2 auf 0. Es ist keine Taste gedrückt. Debuggen hat gezeigt das ich den Wert auch nicht mehr beschreibe.
Das ProfiNet Gateway ist im Moment noch nicht an eine Netz angeschlossen. Sobald ich das Programm beende, hört das springen auf des Wertes auf, und der Wert bleibt auf dem, den es beim Abschalten des Programmes hatte.
Muss ich irgendwo etwas "quitieren" oder "setzen"?

Das Programm:

Code: Select all

#!/usr/bin/env python3.5

import socket
import revpimodio2

TCP_IP = '172.31.1.155'
TCP_PORT = 5005
BUFFER_SIZE = 1  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
while 1:
    s.listen(1)

    conn, addr = s.accept()
    print('Connection address:', addr)
    while 1:
        data = conn.recv(BUFFER_SIZE)
        if not data: break
        rpi = revpimodio2.RevPiModIO(autorefresh=True)
        rpi.io.Output_1.set_intvalue(int(data))
        print("received data:", rpi.io.Output_1.value)
        print("ioerrors: ", rpi.ioerrors)
    conn.close()
consolen output piTest -r 512,1
pi@RevPi13243:~ $ piTest -r 512,1
0
0
2
2
0
0
0
2
0
0
0
2
0
2
2
2
2
2
0
0
2
2
2
0
2
2
2
0
2
0
2
2
0
0
2
2
0
0
2
2
2
0
Ausgabe Python-Konsole
sudo+ssh://pi@172.31.1.155:22/usr/bin/python3.5 -u /home/pi/tmp/pycharm_project_38/TCPServer.py
Connection address: ('172.31.1.69', 42332)
received data: 2
ioerrors: 0
Connection address: ('172.31.1.69', 42334)
received data: 0
ioerrors: 0
Connection address: ('172.31.1.69', 42336)
received data: 2
ioerrors: 0
Connection address: ('172.31.1.69', 42338)
received data: 0
ioerrors: 0
Connection address: ('172.31.1.69', 42340)
received data: 2
ioerrors: 0
Connection address: ('172.31.1.69', 42342)
received data: 0
ioerrors: 0
Wenn Ihr noch etwas braucht, lasst es mich wissen. Danke schon mal für die Antwort.

Re: ProfiNet Gateway schaltet wert alleine wenn Programm läuft

Posted: 22 May 2019, 07:43
by RevPiModIO
Moin jkunath!

Der Fehler sollte sehr leicht behoben werden können. Du müsstest bitte die Zeile

Code: Select all

rpi = revpimodio2.RevPiModIO(autorefresh=True)
nur ein einziges Mal in deinem Programm aufrufen. Man könnte es vergleichen mit deinem Socket, den du ja auch nur ein einziges Mal Instantiierst. Mit der erzeugten Instanz von RevPiModIO arbeitet das gesamte Programm. Wenn dieser Aufruf in der While-Schleife ist, wird bei jedem Durchlaufen eine neue Instanz erzeugt und auch ein Aktualisierungs-Task, das könnte deine CPU evtl. auch überlastet werden :D

Code: Select all

# (...)
BUFFER_SIZE = 1  # Normally 1024, but we want fast response

# Hier nur ein einziges Mal RevPiModIO verwenden
rpi = revpimodio2.RevPiModIO(autorefresh=True)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
while 1:
    s.listen(1)

    conn, addr = s.accept()
# (...)
Perfekt wäre es noch, wenn Ihr einen Mechanismus schafft, um die While-Schleife sauber zu verlassen, damit

Code: Select all

conn.close()
erreicht werden kann. Dort könnte dann auch RevPiModIO sauber verlassen werden um die Zustände sicherzustellen.

Code: Select all

conn.close()

rpi.cleanup()
Lieben Gruß, freue mich von dir zu hören ob es nun sauber läuft!

Sven