Files
Mapo-IOB-WIN/IOB-WIN-PSER/Readme.md
T
Samuele Locatelli 1775e6a37d test nuitka compiler (rimosso)
test altri config x logging handler
2024-06-12 07:13:36 +02:00

168 lines
5.9 KiB
Markdown

# IOB-PI Versione Python
E' la versione compilata come eseguibile da upgrade versione python per WinXp (usata in Colcom su pc XP)
## Setup preliminare
Va selezionato in VSCode l'interprete python corretto (3.11 al momento della stesura), tramite **CTRL+Shift+P** e poi *Python: Select Interpreter*
Vanno installate eventuali dipendenze (es **pip install redis**) x moduli non standard
## Modifiche principali
Le modifiche principali per passare dalla versione WinXp (interpretata) alla nuova (compilata) hanno riguardato
* migrazione Python2 (2.7) --> Python3 (3.11)
* impiego di VSCode come editor e debugger soluzione
* revisione gestione parser e lettura configurazione
* nuova configurazione logfile (con rotate gestito dalla libreria)
* introduzione librerie x Redis
* gestione oggetto stato IOB da serializzare su Redis x comunicazione WatchDog con IOB-WIN
* intruzione compilazione del python con PyInstaller
* configurazione compilazione + copia conf tramite script bat (**createExe.bat**)
## Creazione exe
Impieghiamo PyInstaller.
sito: https://pyinstaller.org/en/stable/usage.html
Deve essere aggiunto tramite pip sulla macchina di build
```python
pip install PyInstaller
```
Viene generato exe con il comando PyInstaller che nella versione minimale è qualcosa come
```python
python -m PyInstaller IOB-WIN-PSER-TEST.py
```
Se si volesse generare un unico file exe + icona la sintassi diventa
```python
python -m PyInstaller --onefile --icon SteamWare.ico IOB-WIN-PSER.py
```
Il file exe + le varie librerie accessorie saranno salvate in **dist/nome_progetto/**
NB: bisogna poi a mano copiare i file di conf, ma non nella cartella principale ma in **_internal**, ovvero **dist/nome_progetto/_internal**
Esempio bat finale:
```bat
REM script creazione EXE da python
python -m PyInstaller --onefile --icon SteamWare.ico IOB-WIN-PSER.py
REM effettua copia delle conf x poter avviare...
xcopy CONF\*.cfg dist\CONF\
```
## Lancio dell'eseguibile
L'eseguibile è richiamabile direttamente o tramite BAT, si aspetta in ingresso un parametro, ovvero il nome del file *.cfg con cui avviarsi, che conterrà
* configurazioni base x gestione letture varie
* parametri connessioni porta comm(virtuale tramite MOXA)
* parametri accessori x log, ...
## Integrazione con IOB-MAN
Per poter venire integrata con IOB-MAN è necessario che ci sia una specifica modalità di comunicazione, tramite Redis, che ritorna lo stato dell'adapter al manager per effettuare le procedure di watchdog ed evitare riavvio automatico per mancata comunicazione.
Si è impiegata questa calsse helper serializzata e salvata su redis con un thread separato
```python
class IobWinStatus:
def toJSON(self):
return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)
#stream = 'cse' # Class Variable
def __init__(self,codIob,iobType):
self.CodIob = codIob
self.IobType = iobType
self.counterIOB = 0
self.counterMAC = 0
self.freeNotes = ''
self.lastDataIn = ''
self.lastDataOut = ''
self.lastUpdate = ''
self.online = False
self.queueAlLen = 0
self.queueEvLen = 0
self.queueFlLen = 0
self.queueMsLen = 0
self.queueRawTransfLen = 0
self.queueUlLen = 0
self.semIn = 'ND'
self.semOut = 'ND'
```
Periodicamente sia ggiornano indicazioni dei valori **lastDataIn** (Out,...) e il boolean di **online** e poi serializza su redis
## Configurazione IOB-MAN
IOB Man va configurato in modo che vada correttamente a lanciare gli eseguibili **IOB-WIN-PSER** (ovvero del compilato Python-Seriale), andando ad agire sul file *.config:
```XML
<appSettings>
...
<add key="appNameExt" value="IOB-WIN-PSER" />
...
<add key="targetExe" value="C:\Temp\CNC_XP\IOB-WIN-PSER\IOB-WIN-PSER.exe" />
<add key="TargetNLogConf" value="C:\Temp\CNC_XP\IOB-WIN-PSER\CONF\NLog.config" />
<add key="TargetLogDir" value="C:\Temp\CNC_XP\IOB-WIN-PSER\logs\" />
...
<add key="BaseArg" value="" />
...
</appSettings>
```
ottenendo alla fine qualcosa come
```XML
<appSettings>
<add key="appName" value="IOB-MAN" />
<add key="appNameExt" value="IOB-WIN-PSER" />
<add key="uiPeriod" value="100" />
<add key="checkPeriod" value="3000" />
<add key="forceCheckPeriodMult" value="20" />
<add key="autoRestartTimeoutMin" value="15" />
<add key="autoStartProc" value="true" />
<add key="closeOnChildUpdate" value="true" />
<add key="targetExe" value="C:\Temp\CNC_XP\IOB-WIN-PSER\IOB-WIN-PSER.exe" />
<add key="TargetNLogConf" value="C:\Temp\CNC_XP\IOB-WIN-PSER\CONF\NLog.config" />
<add key="TargetLogDir" value="C:\Temp\CNC_XP\IOB-WIN-PSER\logs\" />
<add key="ApiUrl" value="https://liman.egalware.com/ELM.Api/" />
<add key="BaseArg" value="" />
<add key="ArgsConfFile" value="/CONF/process.json" />
<!--Gestione riavvio periodico: ora e min di avvio, periodo ripetizione in minuti -->
<add key="fullRestartHour" value="0" />
<add key="fullRestartMinute" value="30" />
<add key="fullRestartIntervMin" value="1440" />
<add key="waitForExitMsec" value="250" />
<!--gestione REDIS-->
<add key="RedisConn" value="localhost,abortConnect=false,ssl=false" />
<add key="RedisConnAdmin" value="localhost,abortConnect=false,ssl=false" />
<add key="redisDb" value="10" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
```
## Approfondimenti
### Link vari impiegati per la preparazione
Di seguito pagine link varie usate x sistemare progetto
* https://pyinstaller.org/
* https://pyinstaller.org/en/stable/usage.html
* https://datatofish.com/executable-pyinstaller/
Valutati ma non impiegati
* https://github.com/Nuitka/Nuitka
* https://pypi.org/project/py2exe/