Nur konfigurierte Bytes aus Procimg übertragen

This commit is contained in:
2018-04-09 18:32:26 +02:00
parent 7f712aaf63
commit 2b296b78f9
6 changed files with 74 additions and 11 deletions

View File

@@ -26,7 +26,7 @@ bindip = *
[MQTT]
mqtt = 0
basetopic = revpi/data
sendinterval = 15
sendinterval = 10
host =
port = 1883
tls_set = 0

View File

@@ -53,6 +53,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#MqttServer.__init__">MqttServer</a></td>
<td>Init MqttServer class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#MqttServer._get_procimglength">_get_procimglength</a></td>
<td>Ermittelt aus piCtory Konfiguraiton die laenge.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#MqttServer._on_connect">_on_connect</a></td>
<td>Verbindung zu MQTT Broker.</td>
</tr><tr>
@@ -109,6 +112,17 @@ Optional Password fuer MQTT-Server
<dd>
MQTT ClientID, wenn leer automatisch random erzeugung
</dd>
</dl><a NAME="MqttServer._get_procimglength" ID="MqttServer._get_procimglength"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
MqttServer._get_procimglength</h3>
<b>_get_procimglength</b>(<i></i>)
<p>
Ermittelt aus piCtory Konfiguraiton die laenge.
</p><dl>
<dt>Returns:</dt>
<dd>
Laenge des Prozessabbilds <class 'int'>
</dd>
</dl><a NAME="MqttServer._on_connect" ID="MqttServer._on_connect"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
MqttServer._on_connect</h3>

View File

@@ -12,6 +12,7 @@ logsystem.PipeLogwriter.newlogfile?4()
logsystem.PipeLogwriter.run?4()
logsystem.PipeLogwriter.stop?4()
logsystem.PipeLogwriter?1(logfilename)
mqttserver.MqttServer._get_procimglength?5()
mqttserver.MqttServer._on_connect?5(client, userdata, flags, rc)
mqttserver.MqttServer._on_message?5(client, userdata, msg)
mqttserver.MqttServer.newlogfile?4()

View File

@@ -7,6 +7,7 @@
#
"""Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit."""
import proginit
from json import load as jload
from ssl import CERT_NONE
from paho.mqtt.client import Client
from threading import Thread, Event
@@ -39,9 +40,10 @@ class MqttServer(Thread):
# Klassenvariablen
self.__exit = False
self._evt_data = Event()
self._sendinterval = sendinterval
self._host = host
self._procimglength = self._get_procimglength()
self._port = port
self._sendinterval = sendinterval
# Topics konfigurieren
self._mqtt_picontrol = "{}/picontrol".format(basetopic)
@@ -60,9 +62,45 @@ class MqttServer(Thread):
self._mq.on_message = self._on_message
# TODO: self._mq.on_disconnect = self._on_disconnect
def _get_procimglength(self):
"""Ermittelt aus piCtory Konfiguraiton die laenge.
@return Laenge des Prozessabbilds <class 'int'>"""
try:
with open(proginit.pargs.configrsc, "r") as fh:
rsc = jload(fh)
except:
return 0
length = 0
# piCtory Config prüfen
if "Devices" not in rsc:
return 0
# Letzes piCtory Device laden
last_dev = rsc["Devices"].pop()
length += last_dev["offset"]
# bei mem beginnen, weil nur der höchste IO benötigt wird
for type_iom in ["mem", "out", "inp"]:
lst_iom = sorted(
last_dev[type_iom],
key=lambda x: int(x),
reverse=True
)
if len(lst_iom) > 0:
# Daten des letzen IOM auswerten
last_iom = last_dev[type_iom][str(lst_iom[0])]
bitlength = int(last_iom[2])
length += int(last_iom[3])
length += 1 if bitlength == 1 else int(bitlength / 8)
break
return length
def _on_connect(self, client, userdata, flags, rc):
"""Verbindung zu MQTT Broker."""
print("Connect rc:", rc)
if rc > 0:
self.__mqttend = True
raise RuntimeError("can not connect to mqtt server")
@@ -73,6 +111,7 @@ class MqttServer(Thread):
def _on_message(self, client, userdata, msg):
"""Sendet piCtory Konfiguration."""
# piCtory Konfiguration senden
with open(proginit.pargs.configrsc, "rb") as fh:
client.publish(self._mqtt_pictory, fh.read())
@@ -105,8 +144,11 @@ class MqttServer(Thread):
while not self.__exit:
self._evt_data.clear()
# FIXME: Ganzes Prozessabbild übertragen
self._mq.publish(self._mqtt_picontrol, fh_proc.read(4096))
# Prozessabbild mit Daten übertragen
self._mq.publish(
self._mqtt_picontrol,
fh_proc.read(self._procimglength)
)
fh_proc.seek(0)
self._evt_data.wait(self._sendinterval)

View File

@@ -226,7 +226,12 @@ class RevPiPlc(Thread):
# Prozess beenden
count = 0
proginit.logger.info("term plc program {}".format(self._program))
try:
self._procplc.terminate()
except ProcessLookupError:
proginit.logger.error("plc program was terminated unexpectedly")
proginit.logger.debug("leave RevPiPlc.stop()")
return
while self._procplc.poll() is None and count < 10:
count += 1

View File

@@ -32,7 +32,6 @@ begrenzt werden!
"""
import gzip
import logsystem
import mqttserver
import picontrolserver
import plcsystem
import proginit
@@ -402,7 +401,8 @@ class RevPiPyLoad():
th_plc = None
if self.mqtt:
try:
th_plc = mqttserver.MqttServer(
from mqttserver import MqttServer
th_plc = MqttServer(
self.mqttbasetopic,
self.mqttsendinterval,
self.mqtthost,
@@ -413,6 +413,7 @@ class RevPiPyLoad():
self.mqttclient_id
)
except:
# TODO: Fehlermeldung ausgeben bezüglich paho.mqtt
pass
proginit.logger.debug("leave RevPiPyLoad._plcmqtt()")
@@ -553,8 +554,8 @@ class RevPiPyLoad():
proginit.logger.info("start xmlrpc-server")
self.xsrv.start()
if self.mqtt:
# MQTT Uebertragung starten
if self.mqtt and self.th_mqtt is not None:
self.th_mqtt.start()
if self.plcslave:
@@ -599,9 +600,9 @@ class RevPiPyLoad():
proginit.logger.info("stopping revpipyload")
# Alle Sub-Systeme beenden
self.stop_plcprogram()
self.stop_plcmqtt()
self.stop_plcslave()
self.stop_plcprogram()
self.stop_xmlrpcserver()
# Logreader schließen