Adatcsere etherneten keresztül S7 PLC-k között


Az S7 300-400-as PLC-k kommunikációs lehetőségei sokrétűek. Ezek a lehetőségek tovább bővültek, amikor az automatizálásban kezdett elterjedni az ethernet/profinet. Kézenfekvő, hogy az ethernet-el szerelt PLC-ket ezen a csatlakozáson keresztül is lehessen bővíteni távoli perifériákkal (profinet), lehessen programozni őket, HMI eszközökkel összekapcsolni, stb.
És hogy egymás között is képesek legyenek adatot cserélni.

Ez az írás egy példán keresztül mutatja be két S7-300 CPU közötti ethernetes kommunikáció megvalósításának egyik módját. Igen két CPU közötti kapcsolat létrehozásának több módja is van.
Az egyik az, amikor mindkét CPU egy Step7 projectben szerepel és ugyanahhoz az ethernet buszhoz kapcsolódnak.
A másik az, amikor a kommunikációs partnerrel kapcsolatban semmi nincs megadva a NetPro-ban. Ilyenkor mindkét CPU-ban programból kell megoldani a kapcsolat felépítését, adat küldését, fogadását és a kapcsolat megszakítását is (FB65 "TCON", FB63 "TSEND", FB64 "TRCV", FB66 "TDISCON"). Ez a mód alkalmas arra is, hogy szabványos protokoll használatával a CPU egy másik "idegen" eszközzel cseréljen adatot (pl. PC).
A harmadik mód, amit meg tudok említeni (ez az írás is erről szól) az, amikor független S7 CPU-k kommunikálnak egymással, amit a NetPro-ban felvett kapcsolaton keresztül tesznek. A "független" itt azt jelenti, hogy két külön projectben vannak és két külön profinet buszra csatlakoznak. Ezt a fajta adatcserét akkor ajánlom, amikor önálló berendezések között kell átvinni adatot (pl. egy gépsor gépei között).
Az írás nem lesz kimerítő, sokmindent nem tudok még az ethernet/profinet kommunikációról. A leírt módszert azonban kipróbáltam és működött.

A konfiguráció felépítése

A példában a következő két CPU szerepel:

Típus:S7-300 CPU 315-2 PN/DP
Rendelési kód:6ES7 315-2EH13-0AB0
Beállított IP cím:192.168.0.115

Típus:S7-300 CPU 319-3 PN/DP
Rendelési kód:6ES7 318-3EL00-0AB0
Beállított IP cím:192.168.0.119

Mindkettő egy közönséges 10/100 MBPS ethernet switch-re van bekötve.
Egy-egy külön Step7 projectet hoztam létre a két CPU számára. A két HW config az alábbi:





Látható, hogy a netmask mindkét CPU-nál 255.255.255.0 és az IP cím első 3 számjegye mindkettőnél 192.168.0.és csak a cím utolsó számjegye tér el. Ez azt jelenti, hogy a két CPU egy alhálózatban van. Ez fontos, mert más esetben megfelelően konfigurált routerre is szükség lenne hogy a két CPU elérje egymást.
Egyéb extra beállításra a HW config-ban nincs szükség.

A NetPro-ban mindkét CPU-nál le kell rakni egy industrial ethernet subnet-et, majd be kell kötni a CPU PN-IO (ethernet) portjába.



Ezután mindkét CPU-nak be kell állítani egy kapcsolatot, amik egymásra mutatnak.
Ezt úgy lehet megtenni, hogy rákattintunk a NetPro-ban a CPU-ra ott, ahol a PN/DP szöveg szerepel:


Ekkor a NetPro osztott ablakának alsó felében megjelenik egy üres táblázat, amiben Local ID, Partner ID, Partner, Type, stb. oszlopokat lehet látni. Ez a táblázat tartalmazza a kapcsolatokat, amelyek segítségével a CPU-nak majd kommunikálnia kell.
A példában az SFB/FB14 és SFB/FB15 blokkok segítségével történik a kommunikáció (Read Data from a Remote CPU with SFB/FB 14 "GET" és Writing Data to a Remote CPU with SFB/FB 15 "PUT").
Ezek a blokkok csak akkor tudnak más CPU-val kommunikálni, ha az említett connections táblázatot megfelelően kitöltöttük minden érintett CPU-nál.
Ennek az az oka, hogy az említett blokk hívásoknak a kommunikációs partnert a kapcsolatokat tartalmazó táblázat ID oszlopába írt azonosító számmal adjuk meg.

A táblázatban úgy lehet új kapcsolatot létrehozni, hogy jobb gombbal kattintunk rajta és az előbukkanó menüből kiválasztjuk az Insert New Connection pontot, vagy duplán kattintunk a táblázatra. Ekkor egy ablakot kapunk, ahol beállíthatjuk a kommunikációs kapcsolat paramétereit:



A kapcsolat típusát (Type) állítsuk S7 connection-re.
A PLC-k egymás közötti kommunikációjához Connection Partner-nél válasszuk az Unspecified-et. Azért ezt, mert a kommunikációs partnerünk nem ebben a projectben van, hanem egy független, másik CPU. Ha egy projectben több CPU van ethernetre kapcsolva, akkor a Connection Partner listában felsorolja őket, amik közül választhatnánk. Ilyenkor nem kellene beállítani a partner IP címét, rack/slot számát sem, mert ezeket az adatokat kiolvassa a projectből, a másik CPU beállításai közül.
Ha azonban előre nem specifikált partner a kommunikáció célja/forrása, akkor nekünk kell specifikálni azt, méghozzá az Ok vagy az Apply gomb lenyomása után megjelenő ablakban:



A Local ID fogja azonosítani a kapcsolatot. Ez egy tetszőleges hexadecimális érték (word). Teljesen mindegy mit adunk meg, de két szabály azért van:
  1. Amilyen ID-t adunk egy kapcsolatnak, azzal az ID-vel tudjuk majd használni is. Ezt az ID-t kell átadni az SFB/FB14 és SFB/FB15 hívásoknak, ahogy azt az ablak Block Paremeters részénél is mutatja egy ábra.
  2. Egy CPU-ban nem lehet két azonos ID-jű kapcsolat (mindegyiknek másik azonosító számot kell adni)
Establish an active connection
Az opcióval tehetjük a kapcsolatot aktívvá. Ha nincs bekapcsolva, passzív lesz.
A kapcsolat feltétele, hogy az egymással kapcsolatban lévő CPU-k mindegyikében be legyen állítva egy kapcsolat ami a másikra mutat. A két CPU közül az egyikben a kapcsolatnak aktívnak kell lennie. Mégpedig abban a CPU-ban, amelyik aktív a kapcsolat felépítését tekintve. Vagyis amelyiken futtatjuk a GET vagy PUT rendszerhívást! A GET és a PUT sajátossága, hogy a kommunikációt a partner CPU-ban nem kell programozni.

Connection Path
Itt két oszlop van, Local és Partner. Local CPU az, amelyikben a kapcsolatot éppen létrehozzuk. A partner CPU pedig az, amelyikkel kommunikálni fog.

End Point
A végpont neve. Local mellett a projectben szereplő CPU neve fog itt szerepelni, nem lehet állítani. Partner oszlopban ide beírhatjuk a partner nevét. Ez tetszőleges, bármit írhatunk ide. Akkor van jelentősége, ha a kapcsolat listában sok kapcsolat szerepel. Ez a név segít, hogy ne keverjük össze őket és tudjuk melyik melyik.

Interface
Local: Itt kell kiválasztani a local CPU-ban azt a kommunikációs interfészt, amelyiken keresztül az adatcsere zajlik majd. A kiválasztás értelme az, hogy egy CPU rendelkezhet egynél több ethernet interfésszel is. Ha csak egy van, akkor természetesen itt az az egy szerepel és nem lehet másikat választani. Ha azonban több volna, elengedhetetlen lenne meghatározni melyiken keresztül kommunikáljon az éppen beállított kapcsolat.
partner: Itt nem lehet állítani az interfészt, mert Unknown, vagyis ismeretlenként határoztuk meg a kommunikációs partnert, ami annyit jelent, hogy a projectben nincs róla adat.

Address
A kommunikációban résztvevő két fél IP címe. Local mellett nem állítható,mert ezt az adatot szintén a project beállításokból veszi. Partner oszlopba be kell írnunk a másik PLC IP címét. Természetesen a címnek valósnak és elérhetőnek kell lennie.

0Eddig nem volt nehéz, de a java csak most jön.
Be kell ugyanis állítani néhány részletet. Ezt az Address Details gomb megnyomása után lehet megtenni:



Pontosan meg kell adni a kommunikációs partner CPU helyét: rack/slot.
Ezt a HW configban lehet megnézni:

A képen látható példa alapján a Rack/Slot beállítás 0 2 (Rack=0 , Slot=2).

Kell még egy Connection resource ,ami egy hexadecimális szám.
A szám jelentéséről a Step7 help ennyit ír:


Mivel nekünk "unspecified" és konfigurált kommunikációs partnerünk van, mindkét CPU-nál egy 10h-DFh tartományba eső hexa értéket kell megadni.
De mennyit?
A lényeg az, hogy minden kapcsolathoz egyedi resource kell, vagyis nem lehet két egyforma a CPU-ban. A partner resource pedig mindig a másik (partner) CPU-nál beállított resource kell hogy legyen, hogy a két CPU megfelelő kapcsolatai egymásra mutassanak.

A példában a 315-ös CPU a GET hívással olvassa a 319-es CPU MB4-MB14 és MB24-MB34 merker byte-jait.
A 319-es CPU pedig a 315-ös CPU olvassa GET hívással az MB110, MB120, DB1.DBW0-DBW2 , MB90, MB91 és DB8.DBW0-DBW2 címeit.
Ezért mindkét CPU-ban két kapcsolat van beállítva, melyek közül az egyik aktív, amásikpasszív:





Az alábbi áttekintő táblázat tartalmazza mindkét CPU kapcsolat beállítását:



A program

A program, ami a tényleges adatátvitelt végzi, igen egyszerű. Csaupán egy funkció hívás.
A példában a GET FB 14 és SFB 14 hívásokat találjuk.

A CPU315 az FB 14 hívással kiolvassa a CPU319-es CPU-ból az MB4-től kezdődően 10 merker byte-ot:


A blokk működése és paraméterezése:
A REQ bemeneten érkező fekfutó él kezdeményezi a kommunikációt. A blokk minden REQ felfutó élre kiolvassa egyszer a partner CPU-ból a megadott címet vagy címtartományt.
Az ID paraméterrel adjuk meg neki a NetPro-ban konfigurált kapcsolat azonosítóját. Ide tehát ugyanazt a hexa számot kell írni, amit a Local ID-hez beírtunk a kapcsolat beállításánál:

ADDR_1 paraméterben kell megadni azt a címet vagy tartományt, amit a partner CPU-ból ki akarunk olvasni.
RD_1 paraméterben mondjuk meg a blokknak, hogy amit a partner CPU-ból kiolvasott, azt hova tegye a local CPU-ban.
Az ADDR_1 és az RD_1 is ANY típusú paraméter. Ez lehetővé teszi, hogy bármilyen cím vagy címtartomény kiolvasható. Természetesen a két paraméter által meghatározott tartomány méretének azonosnak kell lennie, de a cím és a terület természetesen lehet eltérő.

Az NDR egy logikai kimenet, amivel a blokk jelzi, hogy éppen dolgozik-e. Ha TRUE értéket ad, akkor a kommunikáció folyamatban van, ilyenkor nem hajt végre újabb REQ kérést. Ha FALSE, akkor nincs kommunikáció, várja a REQ felfutó élét.
Az ERROR logikai kimenet jelzi, ha a hívás hibával ért véget (TRUE).
A STATUS word típusú kimenet, ami az ERROR állapotával együtt használható fel. Ha ERROR=TRUE, akkor STATUS a hiba kódját tartalmazza. Ha ERROR=FALSE, akkor a STATUS egy állapot információt tartalmaz.
A példaprogram az M77.7-es merker bekapcsolásával  a lehető legnagyobb sebességgel folyamatosan olvasni kezdi a CPU319-es CPU MB4-MB14 címeit, amit M24-M34 merker byte-okba másol be.

A 319-es CPU-ban az SFB14 dolgozik:



Működése és paraméterezése megegyezik az FB14-ével, a különbség az, hogy ezzel egyszerre 4 különböző címterületet lehet átvinni.
Ha kevesebbre van szükség, a nem használt cím paraméter üresen hagyható, ahogy az a képen is látható.

Kapcsolódó írások:
Adatcsere S7 PLC-k között MPI buszon keresztül
Két S7-300 CPU Master/Slave módban profibus-on


Szirty