Der „Prototyp“ nimmt Gestalt an
In den vorangegangenen Tagen habe ich einzelne Module getestet und geschaut, ob diese mit den vorliegenden Einstellungen funktionieren und wo auf was geachtet werden muss. Da aber einzelne Module eher ungünstig als ganzes Programm funktionieren, war es an der Zeit, alle Teilprogramme in einem zu verheiraten und mal zu schauen, was passiert (und zu hoffen, das nichts in Flammen aufgeht).
Zu diesem Zweck musste natürlich zuerst ein Datenbaustein angelegt werden, der eine Datenplatzhalter enthält und nicht optimiert ist.

Anschließend ging es zurück zur IDE Geany, um das Programm in Python zu schreiben. Unten im Beitrag ist der Code nochmal soweit komplett aufgeführt, aber ich erläutere diese nochmal vorab:
Es werden alle bisher erwähnten Bibliothek benötigt – als da wären: busio, snap7, adafruit_dht, adafruit_ads1x15.ads1115 und die Klassenfunktion .analog_in.
Der Verbindungsaufbau erfolgt auf gleichem Weg wie in den Testläufen auch, allerdings nun in einer gewissen Reihenfolge, um die Daten sinnvoll verarbeiten zu können. Demnach werden zuerst alle Sensoren abgefragt und deren Werte in entsprechenden Variablen gespeichert. Anschließend wird die Verbindung zur SPS aufgebaut und die Daten werden an den dafür vorgesehenen Plätzen in den Datenbaustein geschrieben – hier ist gleichzeitig gut zu sehen, dass eine Datentyp-Umwandlung vorgenommen werden muss, da die Werte als float-Datentyp im Raspberry Pi ankommen, allerdings als real-Datentyp weitergegeben werden müssen. Daher erfahren die Temperatur, die Luftfeuchtigkeit und die Bodenfeuchtigkeit hier eine Typenumwandlung.
Schließlich werden die Daten auch nochmal in der Konsole zu Kontrollzwecken ausgegeben. Innerhalb der SPS ist ein kleines Programm, das einen binären Datenpunkt im Datenbaustein setzt, sobald die Temperatur einen gewissen Wert überschreitet. Anschließend wird der Wert an den Raspberry Pi zurückgegeben, der in quasi klont und diese Daten dann wieder an die SPS zurückspielt.
In diesem Programm sind alle grundlegenden Elemente enthalten, die für den späteren Ablauf wichtig sind.
#----------------------------------------------------------------------#
# Progam: Sensor Test
# Author: Florian F.
#
# Description:
# Evaluating values of sensors and send those values to Siemems S7
# 1211C to work with those values. In exchange getting back values
# and states from S7
#
# Version: 0.1
#----------------------------------------------------------------------#
# import libraries
import time
import board
import busio
import snap7
import adafruit_dht # attention: the class .DHT11 has to be used inside the code, because there is no external module
# compared to ads1x15
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
# global variables
plc = snap7.client.Client()
i2c = busio.I2C(board.SCL, board.SDA)
# defining functions
# main
#--- analog values from ADS1115
chan0 = AnalogIn(ADS.ADS1115(i2c), ADS.P0)
moist_chan0 = chan0.voltage
#--- analog values from DHT
dhtDevice0 = adafruit_dht.DHT11(board.D4)
temp_chan0 = dhtDevice0.temperature
hum_chan0 = dhtDevice0.humidity
#--- establish connection to S7-1211C
plc.connect('192.168.0.1', 0, 1) # IP, rack, slot
#--- real values into S7
data_dht11_temp = bytearray(4)
data_dht11_hum = bytearray(4)
data_ads_chan0 = bytearray(4)
snap7.util.set_real(data_dht11_temp, 0, temp_chan0) #Bytearray, Byte to start, value
snap7.util.set_real(data_dht11_hum, 0, hum_chan0)
snap7.util.set_real(data_ads_chan0, 0, moist_chan0)
plc.db_write(1,0,data_dht11_temp)
plc.db_write(1,4,data_dht11_hum)
plc.db_write(1,8,data_ads_chan0)
print(temp_chan0)
print(hum_chan0)
print(moist_chan0)
print("Written successfull")
#--- binary commands from S7
cmd = plc.db_read(1,12,1)
cmd0 = snap7.util.get_bool(cmd, 0, 0)
cmd1 = cmd0
data_fb = bytearray(1)
snap7.util.set_bool(data_fb, 0, 1, cmd1)
plc.db_write(1, 12, data_fb)
print(cmd0)
#--- disconnect from S7-1211C
plc.disconnect()