loader
Foto

OPC UA kommunikáció implementálása Python nyelven

Implementálásra kerül Python nyelven egy OPC UA szerver, amely tartalmaz tag-eket, amelyek megjelenítésre kerülnek a korábban telepített FreeOpcUa kliens felületén.

Sorozatunk előző részében elindítottuk az OPC UA  szervert, illetve telepítésre került egy ingyenes kliens is, amelynek a használatával ez a kommunikációs protokoll gyakorlati szinten megismerhető. Sajnos azonban a múlt cikkben bemutatott szerver nem alkalmas arra, hogy elmerüljünk az OPC UA mélységeiben, hiszen például nem tudjuk a tag-ek értékeit olvasni/írni, mert ezek nincsenek is. 
Emlékeztetőül, indítsuk el root jogosultsággal a Python-t.

sudo python3

Hozzuk létre újra és indítsuk el az OPC UA default szervert.

import opcua
serverOPCUA = opcua.server.server.Server()
serverOPCUA.start()

kep
1. ábra   Default szerver indítása
 

Végezzük el újra a port scan-t, derítsük fel a nyitott  portokat.

sudo nmap -p- IP cím

kep
2. ábra   Port scan eredménye az "nmap" alkalmazással
 

Indítsuk el az előző cikkben bemutatott FreeOpcUA klienst, és csatlakozzunk a szerverhez.

kep
3. ábra   A "FreeOpcUa Clien" kliens kapcsolódása a szerverhez,nincenek tag-ek
 

Érdemes a csatlakozás (és a leválasztást is) hálózati forgalmát nyomon követni. A hálózati forgalom kényelmes vizsgálatához használjuk a következő Wireshark filtert.

opcua

Látjuk a kapcsolódás folyamatát, először a "HEL" (hello) csomag jelenik meg a hálózati forgalomban.

kep
4. ábra   Kapcsolódás az OPCUA szerverre
 

Lekpacsolódáskor a "CLO" csomag jelenik meg.

kep
5. ábra   Lekapcsolódás az OPCUA szerverről
 

Írjunk most Python nyelven most egy olyan OPC UA szervert, amely bizonyos időközönként véletlen számokat küld el a kliensnek. Hozzunk létre három TAG-et (Temperature, Humidity, Distance) amelyeknek az értékeire a kliens oldalon kiváncsiak leszünk. Ezek lesznek a virtuális PLC-nk mérési értékei, amelyet továbbítani fogunk.
Hozzunk létre egy file-t, amelynek a neve legyen "opcServer2.py". Másoljuk be a következő programot.

import opcua, random, time

opcServer = opcua.Server()
opcServer.set_server_name("WebElektronika - OPCUA - Szerver")
opcServer.set_endpoint("opc.tcp://192.168.56.111:4840")

opcNamespace = opcServer.register_namespace("http://192.168.56.111:4840")

opcServer.start()

objPLC1 = opcServer.get_objects_node()
PLC1 = objPLC1.add_object(opcNamespace, "PLC_1")

PLC1_sensor1 = PLC1.add_variable(opcNamespace, "Temperature", 40)
PLC1_sensor1.set_writable(writable=True)
PLC1_sensor2 = PLC1.add_variable(opcNamespace, "Humidity", 50)
PLC1_sensor2.set_writable(writable=True)
PLC1_sensor3 = PLC1.add_variable(opcNamespace, "Distance", 15)
PLC1_sensor3.set_writable(writable=False)


while True:
    PLC1_sensor1.set_value(random.randrange(15, 45))
    PLC1_sensor2.set_value(random.randrange(10, 60))
    PLC1_sensor3.set_value(random.randrange(10, 70))
    time.sleep(10)

 

Jelenleg ez az egyszerű alkalmazás nem tartalmaz logolást, de jelen helyzetben ez felesleges is. Indítsuk el az alkalmazásunkat a következő utasítással.

sudo python3 opcServer_2.py

Az alkalmazás elindult, a szerver hallgatózik a 4840-es porton.

kep
6. ábra   Az "egyedi" OPCUA szerver elindítása
 

Indítsuk el az előző cikkben bemutatott FreeOpcUa klienst, és csatlakoztassuk a klienshez. A sikeres kapcsolódás után a GUI bal oldalán megjelennek a "Server", illetve a "PLC_1" nevek. Ha lenyitjuk a "PLC_1" listát, akkor láthatóvá válnak a tag-ek. Ha az egér jobb gombjával kattintunk az egyik tag-re, akkor egy menülista jelenik meg, ahol lehetőségünk van esemény-, illetve adatváltozásra is feliratkozni.

kep
7. ábra   A "FreeOpcUa Clien" kliens kapcsolódása a szerverhez, láthatók a szerver által kipublikált tag-ek
 

Iratkozunk fel az összes tag adatváltázására (8. ábra).

kep
8. ábra   Feliratkozás a tag-ek figyelésére
 

A szerveralkalmazás 10 másodpercenként elküld 3 véletlenszámot, amelyeket a korábban telepített FreeOpcUa kliens használatával nyomon tudunk követni.

Ha szeretnénk a Python nyelven írt OPC UA szerver működését logolni úgy, hogy a logolási eredményeket nem a terminálablakra, hanem egy file-ba szeretnénk kiírni, akkor egészítsük ki (a "while" ciklus előtt) a programot a következő kódrészlettel.

FORMAT = ('%(asctime)-15s %(threadName)-15s' '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(filename='logOPC_file.txt', encoding='utf-8', level=logging.INFO)
log = logging.getLogger()

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .

Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .