PYTHON – Volně programovatelný blok v jazyce Python

Symbol blokuPotřebná licence: REXLANG
PIC

Popis funkce

V některých případech se může stát, že je do řídícího algoritmu nutné implementovat funkci, kterou nelze efektivně vytvořit z dostupné množiny bloků. Pro takový účel byl vyvinut blok REXLANG, který je vhodný zejména pro aplikace se striktními požadavky na běh programu v reálném čase. V opačném případě lze jako alternativu využít blok PYTHON.

Blok PYTHON implementuje algoritmus definovaný skriptovacím jazykem Python. V porovnání s blokem REXLANG nabízí snazší vývoj algoritmu a umožňuje rozšířit škálu funkcí poskytovaných systémem REXYGEN prostřednictvím balíčků a knihoven dostupných v ekosystému jazyka Python.

Upozornění: blok PYTHON je určen pro prototypování a experimentální aplikace, proto prosím zvažte velmi pečlivě jeho použití ve vaší aplikaci. PYTHON je experimentální blok a vždy bude. Existují situace, které mohou vést k neočekávanému chování nebo dokonce zamrznutí exekutivy. Balíčky mohou být špatně napsány nebo mohou mít špatně implementovanou reinicializaci a jejich použití že vést až k pádu. Pro tento blok poskytujeme pouze velmi omezenou podporu.

Skriptovací jazyk
Skriptovacím jazykem bloku je standardní Python 3 (see [5]). Každý blok se odkazuje na skript napsaný v *.py zdrojovém souboru. Zdrojový kód může volitelně obsahovat funkce s danými jmény, které jsou spouštěny systémem REXYGEN.

Funkce main() je spouštěna periodicky za běhu systému REXYGEN. Krom funkce main() jsou spouštěny funkce init() při startu řídicího algoritmu a po resetu bloku, funkce exit() při skončení řídicího algoritmu a před resetem bloku a funkce parchange() při změně hodnot parametrů bloku.

Scripty na cílovém zařízení
Standardní interpretr umožňuje načítání modulů/skriptů z různých lokací na cílovém zařízení. Blok PYTHON se může odkazovat na jakýkoliv skript dostupný standardnímu interpretru a navíc umožňuje načítání skriptů z adresáře /rex/scripts/python. Uživatelské skripty mohou být nahrávány přímo do této složky a nebo lze nastavit parametr embedded na hodnotu on. To způsobí, že referovaný skript je vložen do exekutivy při kompilaci a je následně dočasně extrahován do složky /rex/scripts/python/embedded při inicializaci bloku po nahrání a spuštění exekutivy na cílovém zařízení.

API pro výměnu dat
Pro výměnu dat mezi interpretrem jazyka Python a systémem REXYGEN byl vyvinut modul PyRexExt v podobě nativního rozšíření interpretru. Modul obsahuje objekt REX, který obsluhuje veškeré operace výměny dat. Pro inicializaci API lze použít následující úryvek kódu na začátku skriptu.

from PyRexExt import REX

I/O objekty

REX.u0 - REX.u15

– objekty reprezentující vstupy bloku v prostředí jazyka Python

REX.p0 - REX.p15

– objekty reprezentující parametry bloku v prostředí jazyka Python

REX.y0 - REX.y15

– objekty reprezentující výstupy bloku v prostředí jazyka Python

Čtení a zápis hodnot
Všechny I/O objekty obsahují atribut v. Čtení atributu v provádí konverzi z datových typů systému REXYGEN na datové typy jazyka Python. Vrácena hodnota pak může být uložena do proměnné a použita v algoritmu bloku. Pole systému REXYGEN jsou konvertovány na seznam hodnot v případě jednodimenzionálního pole, nebo na seznam seznamů v případě multidimenzionálního pole.

Příklad čtení hodnoty vstupu bloku:

x = REX.u0.v

Zápis atributu v naopak provádí konverzi z datových typů jazyka Python na datové typy systému REXYGEN a zápis hodnoty na příslušný výstup/parametr bloku.

Příklad zápisu hodnoty na výstup bloku:

REX.y0.v = 5

Pole
Objekty vstupů a výstupů obsahují atribut size. Tento atribut je jen pro čtení a vrací objet typu tuple s počtem řádek a počtem sloupců.

S poli lze manipulovat prostřednictvím atributu v, ale tento přístup není příliš efektivní kvůli konverzi mezi poli a seznamy jazyk Python. Proto objekty vstupů a výstupů podporují operátor indexace [], který provádí konverzi pouze dané položky v poli.

Příklad čtení vstupu bloku pro jednodimenzionální pole:

x = REX.u0[0]

Příklad zápisu hodnoty do multidimenzionálního pole výstupu bloku:

REX.u0[1, 3] = 5

Externí položky
Objekt REX obsahuje metodu Item, která vrací handle na požadovanou externí položku systému REXYGEN specifikovanou přípojným řetězcem předaným v prvním parametru metody.

Příklad vytvoření externí položky a nastavení její hodnoty:

cns = REX.Item("myproject_task.CNS:scv")  
cns.v = "abc"

Trasování
Objekt REX obsahuje metody Trace, TraceError, TraceWarning, TraceVerbose and TraceInfo, které mohou být použity pro zápis zpráv do logu systému REXYGEN. Každá zpráva má k sobě připojený stacktrace.

Příklad logování zprávy:

REX.Trace("abc")

Dodatečné vlastnosti
REX.RexDataPath – RexDataPath je konstantní řetězec obsahující cestu k datovému adresáři systému REX na dané platformě. Tato vlastnost může být užitečné při psaní platformově nezávislého kódu manipulujícímu se souborovým systém pomocí absolutních cest.

Vstupy

HLD

Hold – Algoritmus bloku není spuštěn při nastavení vstupu na on.

Bool

RESET

Náběžná hrana resetuje blok. Blok je opět inicializován, takže všechny globální proměnné jsou uvolněny a je zavolána funkce init().

Bool

u0..u15

Vstupní signály, které jsou přístupné ve skriptu.

Unknown

Výstupy

iE

Chybový kód.

Error

0 ....

Žádná chyba nenastala, celá funkce main() byla úspěšně spuštěna. (včetně funkce init()).

xxx ..

Chybový kód systému REXYGEN, viz Appendix C

iRes

Výstupní kód exekuce bloku.

Long (I32)

y0..y15

Výstupní signály, které jsou dostupné ve skriptu.

Unknown

Parametry

srcname

Jméno zdrojového souboru  program.py

String

embedded

Vestavění skriptu  on

Bool

p0..p15

Parametry bloku, které jsou dostupné ve skriptu.

Unknown

Definování datových typů
Pro správnou výměnu dat mezi systémem REXYGEN a prostředím jazyka Python musí být striktně definované datové typy vstupních signálů u0..u15, výstupních signálů y0..y15 a parametrů p0..p15.

Z toho důvodu musí být vytvořen konfigurační soubor pro každý skript se stejným názvem a s přidanou příponou .cfg (e.g. program.py.cfg). Pokud tento soubor chybí, je vytvořen při kompilaci projektu s tím, že všechny datové vstupy jsou nastaveny na defaultní hodnotu double. Nepředpokládá se, že by tento soubor byl editován přímo. Ke konfiguraci datových typů lze použít editor REXYGEN studia specifický pro blok PYTHON. Pro vstupy výstupy a parametry jsou dostupné datové typy boolean, uint8, int16, uint16, int32, uint32, int64, float, double, string a pro vstupy a výstupy jsou navíc dostupné datové typy array, numpy a image.

Pro tyto datové typy numpy a image musí být na cílovém zařízení nainstalován balíček numpy. Pro vstupy typu numpy je předpokládáno, že vstupní signál je typu pole, které je následně překonvertováno na nativní reprezentaci objektu numpy. Pro vstupy typu image je předpokládáno, že vstupní signál je datového typu image z modulu RexVision, který je rovněž překonvertován na nativní reprezentaci typu numpy a může tedy být přímo použitý s OpenCV balíčkem jazyka Python.

Pro výstupy datového typu numpy je předpokládáno, že budou nastaveny ve skriptu pomocí objektu typu numpy, který je následně překonvertován na běžné pole. Pro výstupy datového typu image je předpokládáno, že budou nastaveny ve skriptu pomocí objektu typu numpy, který je následně překonvertován na objekt typu image definovaný modulem RexVision.

Příklad definice datových typů
Následující příklad ukazuje zkrácenou verzi souboru ve formátu JSON, který popisuje datové typy vstupů, výstupů a parametrů bloku.

{  
    "types": {  
        "in": [  
            {  
                "idx": 0,  
                "type": "double"  
            },  
             . . .  
            {  
                "idx": 15,  
                "type": "double"  
            }  
        ],  
        "param": [  
            {  
                "idx": 0,  
                "type": "double"  
            },  
             . . .  
            {  
                "idx": 15,  
                "type": "double"  
            }  
        ],  
        "out": [  
            {  
                "idx": 0,  
                "type": "double"  
            },  
             . . .  
            {  
                "idx": 15,  
                "type": "double"  
            }  
        ]  
    }  
}

Příklad skriptu v jazyce Python
Následující příklad ukazuje jednoduchý zdrojový kód v jazyce Python, který sčítá dva vstupní signály a dva uživatelem definované parametry.

from PyRexExt import REX  
 
def main():  
    REX.y0.v = REX.u0.v + REX.u1.v  
    REX.y1.v = REX.p0.v + REX.p1.v  
    return

Instalace - Debian
Prostředí jazyka Python by mělo být korektně nastaveno po instalaci debian balíčku PythonBlk_T. Pro instalaci s volitelnými balíčky numpy a OpenCV je třeba spustit následující příkazy z terminálu.

sudo apt install rex-pythonblkt  
sudo apt install python3-numpy python3-opencv

Instalace - Windows
Pro instalaci správné verze prostředí Python je doporučeno stáhnout a nainstalovat 64-bitovou verzi z oficiálního repozitáře (https://www.python.org/ftp/python/3.8.9/). Při instalaci je vhodné se ujistit, že je zvolena možnost instalace programu pip a že cesta k binárním souborům interpretru bude přidána do systémové proměnné PATH.

Pro instalaci volitelných balíčků numpy a OpenCV je třeba spustit následující příkazy z příkazové řádky.

pip install numpy  
pip install opencv-python

Omezení
Vzhledem k omezením zakořeněným v implementaci standardního interpretru jazyka Python není doporučeno používat více instancí bloku PYTHON na rozdílných úrovních exekutivy. Takové použití může vést k nepředvídatelnému chování a nestabilitě programu RexCore.

2023 © REX Controls s.r.o., www.rexygen.com