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“