Nová blokace pracoviště
ChangeLog
| 21.08.2020 | VK | první verze
Topic - jedna až dvě věty, čeho se to týká.
Tento dokument pojednává o nové verzi blokace pracoviště.
Základní popis funkcionality
V tabulce s_LogPLaces se nastaví u pracoviště ve sloupci IsBlocked na 1. Core si tuto tento stav pravidelně kontroluje a po zjištění změny propisuje tento stav do coreového modulu WorkPlace. Když je pracoviště v blokaci, tak nelze načítat žádná data s vyjímkou příkazových kódů C0065 a C0066 a dat, která jsou z povoleného zdroje (tj. SGDeviceType příchozích dat je v seznamu AllowedDevices v modulu WorkPlace).
Příkazové kódy
C0065 - Příkaz pro odblkování pracoviště - po jeho nasnímaní se zavolá uložená procedura, která nastavuje IsBlocked na FALSE a vynulluje BlockedMessage C0066 - Příkaz pro odblokování pracoviště na jeden pracovní cyklus - po jeho nasnímaní se pracoviště přepne do "normálního" režimu, ale pouze na jeden pracovní cyklus tj. při překlopení z posledního levelu skriptu na nultý (NextLevel == 0) se automaticky opět nastaví režim blokace pracoviště
Změny v SQL DB
Tabulka s_LogPlaces
přibyly dva parametry: IsBlocked - bit, nemůže být NULL BlockedMessage - varchar(500), může být NULL
Upravena procedura dbo.sg_WorkPlace_GetStatus
přidány dva výstupní parametry @IsBlocked bit @BlockedMessage varchar(500)
Nová procedura dbo.sg_WorkPlace_SetIsBlockedState
Nastaví IsBlocked a BlockedMessage podle vstupnich parametrů v tabulce s_LogPlaces
Změny v CORE
Upraven coreový modul WorkPlace
Nové public property:
bool IsWorkPlaceBLocked - je pracoviště v režimu blokace? - tato properta je neustále přepisována (s každou iterací jádra se zavolá sg_WorkPlace_GetStatus), a proto se během přepsání TRUE->FALSE nebo FALSE->TRUE také přepíše hodnota property FirstTimeUnblocked - pokud je ve momentě přepisování hodnoty z FALSE->TRUE a je nastartovaný díl => dochází rovnou k nastavení property IsUnblockedForOneCycle na hodnotu TRUE (tímto je ošetřeno, že se nejprve korektně dokončí práce s dílem a až poté se zablokuje pracoviště)
string BlockedMessage - důvod blokace
bool IsUnblockedForOneCycle - je povolen režim odblokováno na jeden pracovní cyklus (na jeden cyklus skriptu) - pokud je pracoviště v režimu blokace a zároveň je IsUnblockedForOneCycle == TRUE, tak se pracoviště chová "normálně" dokud nedojde skript na první úroveň skriptu
bool FirstTimeUnblocked - bylo pracoviště poprvé přepnuto do režimu blokace - na hodnotu TRUE je přepsána pouze pokud dochází k přepsání hodnoty property IsBlocked, a to ze stavu FALSE->TRUE
List
Upraveno volání uložené procedury dbo.sg_WorkPlace_GetStatus (metoda GetWorkPlaceStatusOld)
přidány dva výstupní parametry @IsBlocked a @BlockedMessage (viz. část Změny v SQL DB)
Přidáno volání uložené procedury dbo.sg_WorkPlace_SetIsBlockedState (metoda SetWrorkPlaceIsBlockedState)
volání uložené SQL procedury a nastavení public propert podle hodnot parametrů @IsBlocked a @BlockedMessage
Změny v ModuleTreeManageru
DŮLEŽITÉ - pokud je pracoviště v režimu blokace (pouze IsWorkPlaceBlocked == true), tak je LevelStateEx POŘÁD WaitingForData - v HandlePortData tedy dojde vždy mdata.LevelState == SGLevelState.WaitingForData - během blokace se nevolá ModuleChecker, protože některé moduly můžou vracet UpLevel/ResetIndex nebo jiné stavy, a proto se nevolá nic z modulů
HandleLevelChange
Zde probíhá automatizované nastavování stavu blokace pracoviště a LevelStateEx na WaitingForData Popsání jednotlivých podmínek: 'if (Session.WorkPlace.FirstTimeBlocked && !Session.WorkPlace.IsUnblockedForOneCycle)' - pokud došlo k první změně hodnoty IsBlocked FALSE->TRUE a zároveň není nastartovaný žádný díl - vyresetuj FirstTimeBlocked, nastav příznak pracoviště ve stavu blokace IsWorkPlaceBlocked, zaloguju a nastavím LevelStateEX = SGLevelState.WaitingForData
'if (Session.WorkPlace.IsWorkPlaceBlocked && !Session.WorkPlace.IsUnblockedForOneCycle)' pokud náhodou někdo nastavil LevelStateEx během blokace na Echo, tak ho převedu zpátky na WaitingForData pravděpodobně se jedná o prasárnu, ale v hlavním cyklu očekávám stav WaitingForData, abych si mohl dotáhnout data z fronty dat ze Sessiony (Session.GetData())
'if (IsInState(s, SGLMState.UpLevel)) { if (NextLevel == 0 && Session.WorkPlace.IsUnblockedForOneCycle && Session.WorkPlace.IsWorkPlaceBlocked)' pokud je pracoviště v režimu odblokováno na jeden pracovní cyklus, pracoviště je stále blokováno, došlo z nějakého modulu SGLMState.UpLevel a je příští úroveň ve skriptu NextLevel == 0, tak vyresetuju IsUnblockedForOneCycle a opět nastavím LevelStateEx = SGLevelStateEx.WaitingForData
CallLocalModules
'if (!Session.WorkPlace.IsWorkPlaceBlocked || Session.WorkPlace.IsUnblockedForOneCycle) s = ProcessingLocalModule.ModuleChecker(dam);' ModuleChecker modulu se volá pouze pokud není pracoviště blokáno nebo je zapnut režim odblokováno na jeden cyklus
'if (Session.WorkPlace.IsWorkPlaceBlocked == false
|| Session.WorkPlace.IsUnblockedForOneCycle == true
|| (d != null ? Session.WorkPlace.AllowedDevices.Any(x => x.Equals(d.DeviceType)) : false))'
pokud pracoviště není blokováno nebo je zapnut režim odblokováno na jeden cyklus nebo jsou příchozí data
ze seznamu povolených zařízení (List
Podmínky nasazení
Spuštěné a korektně proběhnuté skripty upravující tabulky a procedury viz. část Změny v SQL DB