Feldbuskoppler paralleler Prozess

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:

Modbus Feldbuskoppler parallele Prozesse