Hallo,
ich habe auf meinem RPi ein Python Script installiert welches ich automatisch nach dem Start starten lasse. Das ganze funktioniert so wie es soll.
Es liest meinen Stromzähler über die serielle Schnittstelle aus, verarbeitet die Daten und sendet diese per UDP an meine SPS.
Seit dem ich das Script aufgespielt habe hängt sich der RPi aber nach 3-6 Stunden auf.
Muss ich evtl. irgendwelche Speicher oder dergleichen freigeben?
Bin leider generell kein IT-Profi und dies ist mein erstes Prog mit Python, daher stehe ich ein wenig auf dem Schlauch.
Hier mal der Code:
Code
#!/usr/bin/env python
import serial
import time
import socket
Miniserver_IP = "192.168.0.192"
Miniserver_PORT = 8886
WirkArbeitLaenge = 5
WirkLeistungLaenge = 4
WirkArbeitPos = 142
WirkLeistungPos = 205
Ausleseintervall = 50 #Ausleseintervall in Sekunden (so oft werden die Daten per UDP gesendet !) Bei Eingabe von 0 wird kontinuierlich ausgelesen und gesendet
#Zielordner = "Testdatei.txt"
ser = serial.Serial ("/dev/ttyAMA0",9600,timeout=10000) # open first serial port
ser.close()
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
def PortON():
ser.open()
def PortOFF():
ser.close()
def Auslesen():
S = 0
datensatz1_auslesen = False
datensatz2_auslesen = False
anfangsuchen = True
i = 0
j = 0
while ser.inWaiting() <600:
print(ser.inWaiting())
time.sleep(0.5)
s = ser.read(ser.inWaiting())
# print(s.encode("hex"))
while anfangsuchen: #suchen des Datensatzanfang's
if (s[i:i+8])== b'\x1b\x1b\x1b\x1b\x01\x01\x01\x01':
anfangsuchen = False
print ("Der Anfang liegt bei",i)
datensatz1_auslesen = True
datensatz2_auslesen = True
elif i > 600:
anfangsuchen = False
else:
i = i +1
while datensatz1_auslesen: #WirkArbeit
if j == 0:
S = ord(s[i+WirkArbeitPos+j])
j = j+1
else:
S = (S*256) + ord(s[i+WirkArbeitPos+j]) # den wert *256 nemen um es eine stelle Weiterzu setzen
j = j+1
if j >= WirkArbeitLaenge:
datensatz1_auslesen = False
S = (float(S)/10000) #teilen fuer die Kommastelle
Zaehlerstand = "Wirkarbeit in kWh: "+str(S)
print (Zaehlerstand+"\n")
sock.sendto(Zaehlerstand, (Miniserver_IP, Miniserver_PORT))
j = 0
S = 0
while datensatz2_auslesen: #WirkLeistung
if j == 0:
S = ord(s[i+WirkLeistungPos+j])
j = j+1
else:
S = (S*256) + ord(s[i+WirkLeistungPos+j]) # den wert *256 nemen um es eine stelle Weiterzu setzen
j = j+1
if j >= WirkLeistungLaenge:
datensatz2_auslesen = False
S = (float(S)/10) #teilen fuer die Kommastelle
Zaehlerstand = "Wirkleistung in W: "+str(S)
print (Zaehlerstand+"\n")
sock.sendto(Zaehlerstand, (Miniserver_IP, Miniserver_PORT))
j = 0
S = 0
while datensatz2_auslesen: #WirkLeistung
if j == 0:
S = ord(s[i+WirkLeistungPos+j])
j = j+1
else:
S = (S*256) + ord(s[i+WirkLeistungPos+j]) # den wert *256 nemen um es eine stelle Weiterzu setzen
j = j+1
if j >= WirkLeistungLaenge:
datensatz2_auslesen = False
S = (float(S)/10) #teilen fuer die Kommastelle
Zaehlerstand = "Wirkleistung in W: "+str(S)
print (Zaehlerstand+"\n")
sock.sendto(Zaehlerstand, (Miniserver_IP, Miniserver_PORT))
# Main
while True:
PortON()
Auslesen()
PortOFF()
time.sleep (Ausleseintervall)
Alles anzeigen
Wäre für jede Hilfe dankbar.
Gruß Iksi