Jó, de minek?
Előfordul, hogy olyan feladattal találja szembe magát egy programozó, hogy a CODESYS futásidejű környezeten kívül valamiféle adatot kell tárolnia a programnak, vagy netalántán be kell olvasson egy fájlt, amit fel kell dolgoznia. A natív CODESYS megoldás a SysFile könyvtár használata, viszont a WAGO funkció gyűjteménye ennél felhasználóbarátabb megoldást kínál.
Az általános WAGO megoldás: WagoAppFileDir
A WagoAppFileDir könyvtár tartalmaz kompakt és testreszabható megoldást is általános fájlok írására és olvasására. A két legegyszerű kompakt funkcióblokk az FbReadWholeFile_cpt és FbWriteWholeFile_cpt.
1. ábra – Egész fájlok írása és olvasása
Az xWrite változó billentésével megtörténik a fájl kimentése, majd az xRead változó billentésével megtörténik a beolvasása is. Semmire nincs szükség, csupán a fájl nevére, és a memória terület pointeres helyére és méretére, amit kezeltetni szeretnénk a funkció blokkokkal. Ebben a példában STRING típusú változók ADR() utasítással lekért memória címét adtuk meg bemenetként, a mérete a karaktersorozatnak pedig első esetben a STRING karakteres hossza, második esetben pedig a változó memóriában lefoglalt területének a mérete. Ezekkel a bemenetekkel csak annyi bájtnyi adatot írunk ki, mint amire szükségünk van, és annyi bájtnyi adatot olvasunk ki, mint amennyi belefér a változónkba. A „teszt.txt” fájl a PLC fájlrendszerében a CODESYS számára ismert alapértelmezett útvonalon jön létre, tehát a „/home/admin/teszt.txt” útvonalon. Egy SD kártya „Files” mappába való mentés esetén a helyes útvonal „/media/sd/Files/teszt.txt” lenne. Fontos, hogy az írást végző funkcióblokk minden xWrite aktív jel hatására felülírja az útvonalon lévő fájlt!
Természetesen a kényelmes doboz megoldások mindig együtt járnak azzal a kellemetlenséggel, hogy nem lehet őket testre szabni. Erre megoldás az FbGeneralFile, méghozzá kész mintapéldával.
2. ábra – FbGeneralFile a Library Manager-en belül
TYPE eProgress // for the state machine
(
idle := 0,
opening,
writing1,
writing2,
closing,
terminated
); END_TYPE
VAR
Progress : eProgress; // a state machine
File : FbGeneralFile;
END_VAR
File();
CASE Progress OF
idle:
IF <startcondition> THEN
File.Open(‘Filename’,FAM_WRITE,0,FALSE);
progress := opening;
END_IF
opening:
IF File.xTerminated THEN
File.Write(ImportantData,SizeOf(ImportantData));
progress := writing1;
END_IF
writing1:
IF File.xTerminated THEN
File.Write(MoreData,SizeOf(MoreData);
progress := writing2;
END_IF
writing2:
IF File.xTerminated THEN
File.Close();
progress := closing;
END_IF
closing:
IF File.xTerminated THEN
progress := terminated;
END_IF
END_CASE
Ez a funkcióblokk tartalmazza a más programozási nyelveknél már megszokott funkciókat, és lehetővé teszi a fájl tartalmának szabad felépítését.
Az adatmentős WAGO megoldás: WagoAppDatalogger
A fájlkezelés speciális, de gyakori alkalmazásaira már vannak elérhető funkció blokkok. PLC-s rendszerekről beszélve talán az egyik leggyakoribb ilyen jellegű feladat a mérési adatok gyűjtése majd tárolása. A WAGO PLC-k legjava bővíthető SD vagy mikro SD kártyával, így célszerű lehet ezeket az adatokat ezeken az adathordozókon eltárolni legalább ideiglenesen. Erre a feladatra kész megoldásként a FbDatalogger használható, mely képes CSV fájlokba ciklikusan vagy esemény vezérelt módon mérési adatokat gyűjteni.
3. ábra – Egyszerű FbDatalogger példa egy érték ciklikus kimentésével
4. ábra – A létrehozott fájlok megnyithatók táblázatkezelő szoftverekkel
Ez a funkcióblokk együttműködik egy másik Data Plotter nevezetű WAGO megoldással, ami a lementett fájlok megnyitását, grafikus megjelenítését és letöltését teszi lehetővé. A https://www.wago.com/hu/d/7402 oldalról ingyenesen letölthető, és a PLC-re való feltelepítés után azonnal látja is a behelyezett SD kártyán lévő fájlokat.
5. ábra – Data Plotter példa
A naplózós WAGO megoldás: WagoSysLog
Ennek a munkakönyvtárnak a használata már több programozási tapasztalatot igényel, viszont nagyon egyszerűvé teszi az ideiglenesek naplófájlok készítését. Az FbLogger funkció blokk remekül használható egyszerű események naplózására, mint például egy hibával zárult Modbus lekérdezésre vagy egy kapcsoló kézi üzemmódba kapcsolására. Fontos, hogy alap esetben a létrejövő wago_plc_log.log fájl a „/var/log” mappába kerül, aminek a tartalma újraindítás során törlődik. Egy rövid példa a használatára:
VAR
myLogger : FbLogger(‘MyLogger’);
mySysLogChannel : FbLogChSysUdp(‘WAGO’);
xIsInit : BOOL;
xLogThis : BOOL;
END_VAR
IF NOT xIsInit THEN
myLogger.RegisterLogChannel(mySysLogChannel);
xIsInit := TRUE;
END_IF
IF xLogThis THEN
myLogger.writeMsg( ‘FbCustom’,
eSysLogPriority.LOG_INFO,
‘Valami történt…’
);
xLogThis := FALSE;
END_IF