Diese Dokumentation beschreibt wie mit einem Feldbuskoppler digitale Ein- sowie Ausg�nge als paralleler Prozess zu einem horstFX Programm geschaltet und verarbeitet werden k�nnen.
Hierf�r wird �ber horstFX ein Python Skript aufgerufen, das die Kommunikation mit dem Feldbuskoppler beinhaltet. Dieses Python Skript l�uft simultan zu dem horstFX Skript im Hintergrund.
Als Modbus TCP Feldbuskoppler dient in diesem Beispiel der Wago 750-362. Das Beispiel kann jedoch sehr einfach auf andere Modbus TCP Feldbuskoppler anderer Hersteller �bertragen werden.
1. Installation der Pakete
Zur Installation der Pakete muss der Schaltschrank mit dem Internet verbunden sein.
1.1 Installation / �berpr�fung der installierten Python Version
Bestimmte Versionen von Debian Linux werden bereits mit vorinstalliertem Python 3 ausgeliefert. So auch die Version, die auf unserem Schaltschrank installiert ist.
�ber die Konsole k�nnen folgende Befehle ausgef�hrt werden:
1. Anmelden als Root User:
su -l root
Das Passwort bitte direkt bei fruitcore anfragen.
2. Aktualisieren des Systems:
apt update
apt upgrade darf nicht ausgef�hrt werden.
3. �berpr�fen der installierten Python Version
python3 -V
1.2 Installation von pip
�ber die Konsole kann mittels folgenden Kommandos pip installiert werden:
apt install -y python3-pip
pip3 install --upgrade pip
1.3 Installation von pyModbusTCP
pip3 install pyModbusTCP
2. Erstellen des Python Skripts
Das Python Skript dient zur Kommunikation mit dem Feldbuskoppler. Es besitzt einen parallelen Prozess in welchem alle 100ms Eing�nge des Feldbuskopplers eingelesen werden. Sobald einer der Eing�nge 1-4 den Status "True" erh�lt, wird der dazu passende Ausgang 1-4 geschaltet. Liegt an einem der Eing�nge der Status "False" an, wird der dazu passende Ausgang wieder zur�ckgesetzt. Weitere Informationen zu den Modbus TCP Lese- und Schreibfunktionen des Python Skripts findet man in der Dokumentation der Python Bibliothek: https://pymodbustcp.readthedocs.io/en/latest/index.html#
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# modbus_thread
# start a thread for polling a set of registers, display result on console
# exit with ctrl+c
import sys
import time
from threading import Thread, Lock
from pyModbusTCP.client import ModbusClient
sys.path.insert(0, "..")
SERVER_HOST = '192.168.1.2'
SERVER_PORT = 502
# set global
regs = []
# init a thread lock
regs_lock = Lock()
c = ModbusClient(host=SERVER_HOST, port=SERVER_PORT, unit_id=1, auto_open=True, auto_close=False)
# previous state of lamps, so that ouputs were only set when the state changes
PrevStateLamp1 = False
PrevStateLamp2 = False
PrevStateLamp3 = False
PrevStateLamp4 = False
# modbus polling thread
def polling_thread():
global regs
#c = ModbusClient(host=SERVER_HOST, port=SERVER_PORT)
# polling loop
while True:
# keep TCP open
if not c.open():
c.open()
# do modbus reading on socket
reg_list = c.read_discrete_inputs(0, 8)
# if read is ok, store result in regs (with thread lock synchronization)
if reg_list:
with regs_lock:
regs = list(reg_list)
# 0.1s before next polling
time.sleep(0.1)
# start polling thread
tp = Thread(target=polling_thread)
# set daemon: polling thread will exit if main thread exit
tp.daemon = True
tp.start()
# display loop (in main thread)
while True:
# 0.1s before next loop run
time.sleep(0.1)
# print regs list (with thread lock synchronization)
with regs_lock:
#print(regs)
# lamp 1
if ( (regs[0] == True) and (PrevStateLamp1 == False) ):
# turn on lamp 1
if c.write_single_coil(0, 1):
print("turn on lamp 1")
PrevStateLamp1 = True
else:
print("write error turning on lamp 1")
if ( (regs[0] == False) and (PrevStateLamp1 == True) ):
# turn off lamp 1
if c.write_single_coil(0, 0):
print("turn off lamp 1")
PrevStateLamp1 = False
else:
print("write error turning off lamp 1")
#lamp 2
if ( (regs[1] == True) and (PrevStateLamp2 == False) ):
# turn on lamp 2
if c.write_single_coil(1, 1):
print("turn on lamp 2")
PrevStateLamp2 = True
else:
print("write error turning on lamp 2")
if ( (regs[1] == False) and (PrevStateLamp2 == True) ):
# turn off lamp 2
if c.write_single_coil(1, 0):
print("turn off lamp 2")
PrevStateLamp2 = False
else:
print("write error turning off lamp 2")
#lamp 3
if ( (regs[2] == True) and (PrevStateLamp3 == False) ):
# turn on lamp 3
if c.write_single_coil(2, 1):
print("turn on lamp 3")
PrevStateLamp3 = True
else:
print("write error turning on lamp 3")
if ( (regs[2] == False) and (PrevStateLamp3 == True) ):
# turn off lamp 3
if c.write_single_coil(2, 0):
print("turn off lamp 3")
PrevStateLamp3 = False
else:
print("write error turning off lamp 3")
#lamp 4
if ( (regs[3] == True) and (PrevStateLamp4 == False) ):
# turn on lamp 4
if c.write_single_coil(3, 1):
print("turn on lamp 4")
PrevStateLamp4 = True
else:
print("write error turning on lamp 4")
if ( (regs[3] == False) and (PrevStateLamp4 == True) ):
# turn off lamp 4
if c.write_single_coil(3, 0):
print("turn off lamp 4")
PrevStateLamp4 = False
else:
print("write error turning off lamp 4")
3. Automatisches Ausf�hren des Skripts in horstFX
Wie das obige Python Skript automatisch in horstFX gestartet werden kann, ist in folgendem Artikel beschrieben: Ausf�hren externer Python Skripte
4. horstFX Beispielprogramm
Folgendes Beispielprogramm ruft das PythonSkript auf. Anschlie�end bewegt sich der Roboter st�ndig zwischen 2 Wegpunkten. W�hrenddessen k�nnen �ber den Feldbuskoppler in Verbindung mit dem Python Skript beliebig Ein- und Ausg�nge eingelesen bzw. gesetzt werden.
Sollte eine Kommunikation zwischen dem Python Skript und horstFX notwendig sein, kann z.B. �ber TCP Sockets miteinander kommuniziert werden Sockets.
Ebenso kann auch �ber horstFX direkt mit dem Modbus TCP Feldbuskoppler kommuniziert werden Feldbuskoppler Kommunikationsbeispiel.
Das Beispielprogramm kann hier heruntergeladen werden: