ADS per Python und Django ansprechen

Um von Django mit der SPS kommunizieren zu können, haben wir uns für ADS entscheiden. Es gibt eine Bibliothek für Python die ADS kann. Die Bibliothek kann man zum Beispiel hier finden. Sie lässt sich auch einfach per pip mit diesem Befehl installieren.

pip install pyads

Nun kann die Bibliothek in Python verwendet werden. Dazu muss sie einfach nur importiert werden.

import pyads

Eine Dokumentation der Bibliothek findet sich hier.

Wichtig ist es dabei zu wissen, dass es bei der Verwendung Unterschiede zwischen Windows und Linux gibt. Der Unterschied besteht darin, wie die Routen konfiguriert werden. Hat die Konfiguration stattgefunden, so kann die Bibliothek unabhängig vom OS verwendet werden.

ADS Route unter Windows einrichten

Unter Windows muss die Route über TwinCat eingerichtet werden. Dazu muss auf dem Rechner die Route konfiguriert werden. Dann kann sie direkt verwendet werden.

Handelt es sich um einen Rechner, auf dem kein TwinCat installiert ist, haben wir festgestellt, dass es reicht, die Route in der Registry direkt einzutragen. Dazu werden folgende Einträge verwendet:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Beckhoff\TwinCAT3\System]
"AmsNetId"=hex:c0,a8,b2,0b,01,01
"TcAdsWin32"=dword:00000000
"DefaultTransportAmsNetId"=hex:05,25,f0,04,01,01

ADS Route unter Linux einrichten

Um ADS unter Linux verwenden zu können, wir die OpenSource Bibliothek von Beckhoff benötigt. Diese befindet sich unter anderem hier.

Unter Linux muss die Route nicht ins System eingetragen werden, sondern kann direkt aus Python heraus eingetragen werden.

import pyads

ip_adress = '192.168.178.53'
ads_adress = '192.168.178.53.1.1'
ads_port = 851
plc = pyads.Connection(ads_adress, ads_port)

pyads.open_port()
adr = pyads.AmsAddr(ads_adress, ads_port)
pyads.add_route(adr, ip_adress)

Wichtig ist hierbei, dass der Anfang der ads_adresse mit der IP Adresse übereinstimmt. Anscheinend gibt es einen Fehler in der Linux-Bibliothek. Wenn sich die IP-Adresse von der ADS Adresse unterscheidet, kann die Route nicht aufgebaut werden.

Pyads in Django verwenden

Um in Python bzw. Django die ADS Verbindung nutzen zu können reichen die folgenden Kommandos:

import pyads

ads_command = 0x80000001
ads_indexgroup = 0
ads_type = pyads.PLCTYPE_WORD

plc.open()
value = plc.read(ads_command, ads_indexgroup, ads_type)
plc.close()

Hiermit wird ein ADS Kommando zum Lesen von Daten abgesendet. Die Beckhoff Steuerung muss jetzt auf dieses Kommando warten und dementsprechend Daten zurücksenden. Dies wird in einem zukünftigen Eintrag beschrieben.

In Django kann jetzt ein Script eingebettet werden, dass aus den Views heraus aufgerufen werden kann. Dieses Script kümmert sich um die komplette Kommunikation per ADS.

Ein Beispiel dafür ist das folgende Skript für eine Django Installation auf Linux:

from enum import IntEnum
import pyads

ip_adress = '192.168.178.53'
ads_adress = '192.168.178.53.1.1'
ads_port = 851
plc = pyads.Connection(ads_adress, ads_port)
_isInitialized = False

class AdsCommand(IntEnum):
    GENERALINFOS =      0x80000001
    GETSENSOR =         0x80000002
    SETSENSOR =         0x80000003

def __send_ads_read_command(ads_command, ads_indexgroup, ads_type):
    value = 0
    try:
        plc.open()
        value = plc.read(ads_command, ads_indexgroup, ads_type)
        plc.close()
    except:
        # Do Exception handling here
    return value;

def __send_ads_write_command(ads_command, ads_indexgroup, data, ads_type):
    try:
        plc.open()
        plc.write(ads_command, ads_indexgroup, data, ads_type)
        plc.close()
    except:
        # Do Exception handling here

# Reihenfolge der Rueckgabe-Parameter:
# Licht an?
# Fenster auf?
# ...
def get_general_infos():
    infos = __send_ads_read_command(AdsCommand.GENERALINFOS, 0, pyads.PLCTYPE_WORD)
    return infos & 1 == 1, infos & 2 == 2, infos & 4 == 4

def get_sensor_data(sensorId):
    sensorData = __send_ads_read_command(AdsCommand.GETSENSOR, sensorId, pyads.PLCTYPE_REAL)
    return sensorData

def set_sensor_data(sensorId, value):
    __send_ads_write_command(AdsCommand.SETSENSOR, sensorId, value, pyads.PLCTYPE_REAL)
        
if not _isInitialized:
    pyads.open_port()
    adr = pyads.AmsAddr(ads_adress, ads_port)
    pyads.add_route(adr, ip_adress)
    _isInitialized = True

 

Eine Antwort auf „ADS per Python und Django ansprechen“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.