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 AllowedDevices - list povolených zařízení, ze kterých když přijdou data během blokace pracoviště, tak budou "puštěny" do modulů - Pozn. VK: kdo bude potřebovat do tohoto seznamu přidat nějaký SGDeviceType, tak učiní ve svém modulu/službě a potom po sobě "uklidí". Nemám šanci kontrolovat, co vše je v tom seznamu už popřidávané během runtime.

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 AllowedDevices), tak se data pošlou standartně do logiky tj. data zpracuje modul, který má aktuálně kontrolu

Podmínky nasazení

Spuštěné a korektně proběhnuté skripty upravující tabulky a procedury viz. část Změny v SQL DB