WinCC Flexible: OP órájának szinkronizálása

Módosítva: 2012. augusztus 28
Korábbi írásokban feszegettem már a problémát, miszerint nem ritka, hogy egy S7-es rendszerben több valós idejű óra is jelen van. A legegyszerűbb esetben egy OP-val ellátott S7-PLC vezérlésű gép esetén kettő. Az egyik az S7 CPU-ban, a másik az operátor panelben.
Ha már egynél több van, akkor szinte törvényszerű, hogy előbb-utóbb nem ugyanazt az időt tartalmazzák. Főleg előbb, mivel az OP-k órája tápfeszültség nélkül nem ketyeg, így egy bekapcsolás után 1990-től újraindul. A CPU órája azonban kikapcsolva is jár.

Mikor probléma az, ha a két óra különböző időpontot mutat?
Akkor, ha az OP-ban (esetleg a CPU-ban is) műveleteket végzünk a rendszer idővel. Az OP-ban ezt szinte biztos hogy megtesszük, ha használjuk a hibaüzeneteket megjelenítő "Alarm view" objektumot. Ebben ugyanis szerepel az üzenet keletkezésének, nyugtázásának, stb időpontja. Persze az objektum tulajdonságai között (Properties/Columns) kikapcsolható az időpont megjelenítése, de azt ritkán teszik, mert hasznos ha látszik). Persze ha látszik is csak akkor hasznos, ha tényleg azt az időpontot mutatja, ami az üzenetre vonatkozik és nem 1990-et. Mivel az üzenet az OP órájától kapja az idő bélyegzőt, hamis időpontokat fog az üzenetbe írni ha az OP órája rosszul jár.
Szinkronizáljuk tehát az OP óráját a CPU órájához!

A dolog WinCC Flexible esetén rendkívül egyszerű (ProTool-ban a kisebb, nem Win alapú paneleknél sokkal nehezebb volt):
  1. Biztosítanunk kell egy változót a PLC-ben, ami mindig az aktuális dátumot és időt tartalmazza
  2. Be kell állítani az OP-nak ezt a változót és megmondani neki mennyi időnként szinkronizálja a saját óráját a változó tartalmához
1. A pontos időt tartalmazó változó elkészítése és kezelése
Lényeges, hogy ez a változó DATE_AND_TIME típusú legyen, mert az OP csak ilyen típusúhoz tudja szinkronizálni az óráját. Mivel valószínű, hogy az OP miatt ettől függetlenül is létre fogunk hozni egy DB blokkot, amiben az operátor panellel kapcsolatos változóink lesznek, célszerű ezt a dátum változót is ebben létrehozni:



A DATE_AND_TIME típusú változó után mindig hozzunk létre két word típusú változót is. Ezzel nem kell törődni később sem, de szükséges, mert a HMI 12 byte (6 word) hosszúságú területet használ az idő kiolvasásához (lásd alább), a DATE_ANDTIME pedig csak 8 byte, azaz 4 word hosszú). Ez a két word változó fenntartott változó, nem kell ide írni semmit a programból később sem a működéshez.

Több lehetőségünk is van ilyen változóba beletenni az aktuális időt.
Az egyik, hogy valamelyik program blokkban lekérdezzük az időt az SFC1 rendszer hívással. Szerencsére az SFC1 pont DATE_AND_TIME típust ad vissza, tehát közvetlenül meg lehet adni neki a változónkat:



A másik lehetőség az, hogy az OB1-ben írjuk meg azt a programrészletet, ami feltölti az OP számára a dátum változót. Minden OB blokknak vannak előre deklarált lokális (TEMP) változói, és mindegyikben van egy olyan változó, amibe a rendszer beírja az órát, amikor a blokk lefut. Mivel az OB1 minden PLC ciklusban lefut itt kvázi mindig az éppen aktuális rendszer időt találjuk. Azonban mivel ez lokális változó, csak az OB1-ben olvasható ki az értéke.
A változó neve #OB1_DATE_TIME. Ezt kell átmásolni a DB1.CPU_DT változónkba. Ezzel az a pici nehézség van, hogy a DATE_AND_TIME típus 8 byte méretű, ezért a közönséges MOVE utasítással (legalábbis egy darabbal) nem tudjuk elvégezni a másolást.
Van azonban egy BLKMOV (SFC20) nevű blokk mozgató rendszerhívás, ami nagyobb mennyiségű adat másolására is alkalmas. Adatterületet kell megadni neki, ezért a bemenő (honnan) és kimenő (hova) paramétere ANY típusú.
Ettől azonban nem kell megijedni, mert ha a változók szimbolikus nevét adjuk meg neki, akkor is tudni fogja mit kell tennie:



A rendszerhívásoknak általában van egy RET_VAL nevű kimenő paramétere. A funkció ebben egy kódot ad vissza, ami rendszerint nulla ha a hívás rendben végrehajtásra került és egy hibakód, ha valami probléma merült fel. Ezt kötelező neki megadni, ezért van a fenti példában egy INT típusú SFC_RV nevű változó. Ebben lesz az SFC visszatérési értéke. A példában nem foglalkozunk a tartalmával.Ha a fenti módon, fix paraméterekkel hívjuk ezeket az SFC-ket, nem fognak hibakódot adni, feltéve hogy a DB1 adatblokk létezik és benne van az a változó, amit átadunk nekik.

Bármelyik módszert választjuk, most már a DB1.CPU_DT változóban ott a pontos idő.

2. Mit kell beállítani WinCC Flexible-ben?
Az óra szinkronizálása egy ún. areapointerrel történik, ami kifejezetten erre való.
A neve Date/Time PLC. Az area pointereket a Connections alatt találjuk, ha rákattintunk az Area pointer fülre:



Nincs más dolgunk, mint a Date/Time PLC nevű area pointert beállítani a DB1.CPU_DT változóra:



Az Acquistion cycle oszlopban megadott időközönként olvassa ki az OP a megadott változót és állítja be az óráját hozzá.
Általában az 1-5 perc megfelelő. Ennél gyakoribbra állítani nincs értelme, hiszen 1 percen belül az OP órája biztosan nem fog jelentősen késni vagy sietni a CPU órájához képest. Nagyobb intervallum esetén az a probléma merülhet fel, hogy a berendezés (vagy az OP) bekapcsolása után túl hosszú idő telik el, mire végre beáll az óra a helyes időre.

Kapcsolódó cikkek:
WinCC Flexible tippek
S7 - OP7 óra szinkronizálás



Szirty