1 Wstęp... 1 2 Budowa i kompilacja skryptów... 1 3 Edytor skryptów... 1 4 Zmienne i Flagi... 2 4.1 Rodzaje zmiennych... 2 4.2 Lista zmiennych... 2 4.3 Flagi... 3 4.4 Specjalny dostęp do zmiennych... 3 5 Procedury i funkcje... 3 5.1 Mechanizm blokady wykonania procedur... 3 5.2 Procedury zmieniające status... 3 5.2.1 SetNoStatus... 3 5.2.2 SetStatus... 4 5.2.3 SetStatusEx... 4 5.3 Numeracja statusu i zmienna UserName... 4 5.3.1 Przykład skryptu... 4 5.4 Braki... 4 5.5 Kasowanie liczników... 4 5.6 SetFiltr... 4 5.7 DISPLAY... 5 5.8 SetLamp... 5 5.9 ToLog... 5 6 Timery... 5 7 Wyświetlacz... 5 1 Wstęp System golem OEE SV jest w szerokim zakresie konfigurowalny. Niestety, niezależnie od tego jak bogata będzie lista ustalanych parametrów zawsze spotkamy się z taką pożądaną konfiguracją której nie będziemy mogli zrealizować. Dlatego wprowadzono możliwość tworzenia skryptów sterujących dla stacji dzięki którym można znacznie poszerzyć możliwości systemu. Skrypt to program działający w obrębie stacji zbierania danych który może manipulować dostępnymi w niej danymi. Skrypt sterujący jest prostym programem napisanym w języku Pascal. Wymaga co prawda znajomości tego języka ale tylko w stopniu absolutnie podstawowym analiza tego dokumentu powinna wystarczyć każdemu kto kiedykolwiek napisał jakikolwiek program w dowolnym języku. Ponadto w Internecie znajduje się mnóstwo kursów Pascala. Dlatego pisząc niniejszy dokument zakładamy wiec że czytelnik zna podstawy programowania. Skrypty dostępne są od wersji 2.3.16. Skrypty nie są dostępne w wersji OEM 2 Budowa i kompilacja skryptów Skrypt sterujący to program napisany w języku Pascal. Każda stacja może mieć własny skrypt sterujący który działa w ramach jej zakresu zmiennych. Znaczy to że skrypt dla stacji 1 nie ma dostępu do wejść koncentratora ani zespołów nadzorców obsługiwanych przez inną stację. Skrypt edytujemy w edytorze wbudowanym w program konstruktora. Tam też określamy czy skrypt ma zostać załączony. Skrypt ładowany jest i kompilowany w momencie uruchomienia stacji. Jeżeli skrypt będzie zawierał błędy to stacja się uruchomi ale nie wystartuje i pojawi się okno z podglądem kodu i listą błędów w tym kodzie. Należy wtedy usunąć błędy w edytorze konstruktora i ponownie uruchomić stację. UWAGA w przeciwieństwie do innych zmian w konfiguracji nie jest możliwa zmiana skryptu przez przeładowanie stacji trzeba ja zamknąć i ponownie uruchomić. Skrypt składa się z dwu części: jedna która jest wykonywana jeden raz po uruchomieniu programu i druga procedura Task która wykonywana jest cyklicznie co około 200 ms. Budowa skryptu: // procedura uruchamiana co 200 ms // wszystkie rozkazy które znajdują się pomiędzy tymi słowami rozkazami początku i końca bloku (begin / end) // wykonywane będą co 200 ms // początek programu // wszystkie rozkazy które znajdują się pomiędzy tymi słowami rozkazami początku i końca bloku (begin / end) // wykonywane zostaną jeden raz po uruchomieniu programu end. 3 Edytor skryptów Skrypt edytujemy za pomocą edytora dostępnego w konstruktorze. Po wpisaniu skryptu lub dokonaniu w nim zmian należy koniecznie wykonać test kompilacji. Jeśli skrypt będzie zawierał błędy zostaną one wyświetlone w dolnym oknie.
4 Zmienne i Flagi 4.1 Rodzaje zmiennych zmienne systemu Golem, np. KIN1 pierwsze wejście koncentratora czy SVStatus1 numer statusu nadzorcy SV1 zmienne pomocnicze globalne zmienne pomocnicze które możemy użyć w naszym skrypcie takie jak np. Vbit1 czy Vint1 zmienne globalne zadeklarowane w kodzie skryptu na jego początku, przed słowami procedure task; poprzedzone słowem kluczowym Var, zmienne lokalne dla procedury Task Zmienne zadeklarowane w skrypcie przydać się mogą bardziej zaawansowanym użytkownikom. Dodatkowo można też skorzystać ze zmiennych systemowych takich jak np. zmienna NOW która reprezentuje aktualny czas (typ TDateTime) Zmienne dzielimy też (szczególnie zmienne systemu golem) na takie które są do odczytu i zapisu oraz takie które są tylko do odczytu co zostanie wyraźnie zaznaczone przy ich opisie. WAŻNE: Zmienne systemu golem muszą mieścić się w ramach zmiennych obsługiwanych przez stacje zbierania danych. Jeżeli w skrypcie dla stacji nr 1 użyjemy np. zmiennej INSV130 to kompilator zasygnalizuje błąd. Zmienna INSV130 reprezentuje stan wejścia niefiltrowanego przypisanego do nadzorcy SV130 a ten jak wiadomo należy do zakresu nadzorców stacji numer 2. Niektóre zmienne systemu Golem które są tylko do odczytu możemy zmienić za pomocą odpowiednich procedur, np. zmienna order_cp zwraca stan licznika produktu i jest zmienną tylko do odczytu możemy jednak przypisać jej nową wartość za pomocą procedury Set_Order_CP. 4.2 Lista zmiennych xx w opisie zmiennej oznacza numer nadzorcy SV: INSVxx oznacza że zmienna może mieć nazwę od INSV1 do INSV512. jeśli w opisie nie zaznaczono inaczej to zmienne są tylko do odczytu. Niektóre zmienne które są do odczytu zapisywać można za pomocą procedur. ZMIENNA Typ opis KIN1 do KIN128 boolean Wejścia koncentratora. Wejścia 1 do 64 reprezentują fizyczne wejścia poszczególnych modułów, wejścia 65 do 128 to wejścia logiczne. Zmienne KIN1 do KIN64 i KIN112 do KIN127 należy traktować jako zmienne tylko do odczytu. Przypisanie im wartości nie spowoduje błędu ale zostanie zignorowane. INSVxx boolean Wejście filtrowane nadzorcy SV. Zmienna reprezentująca stan wejścia skojarzonego z nadzorcą. Kiedy konfigurujemy nadzorcę SV1 to wcale nie musimy mu przypisać wejścia koncentratora nr 1 a możemy przypisać inne np. wejście 10. Zmienna INSV1 będzie wiec reprezentować stan wejścia skojarzonego z 1 nadzorcą, czyli wejścia 1 INFSVxx boolean Jak zmienne INSV ale reprezentują stan wejść filtrowanych. WORKxx boolean Specjalna zmienna informująca o tym że nadzorca nalicza czas pracy STATUSxx byte Zmienna zwraca numer aktualnego statusu nadzorcy : 0-Postój Planowany 1-Postój Nieplanowany 2-Przezbrajanie 3-Ustawianie 4-Awaria 5-Praca STATUSEXxx byte Numer statusu rozszerzonego nadzorcy numer odczytujemy w konstruktorze w edytorze statusów DelayOnxx DelayOffxx DelayENxx Czas filtru opóźnienia załączenia Czas filtru opóźnienia wyłączenia Czas filtru blokady ORDER_CCxx integer Licznik cykli aktualnego zlecenia ORDER_CPxx integer Licznik produktu aktualnego zlecenia zaokrąglony do wartości całkowitej ORDER_CPFxx Double Licznik produktu aktualnego zlecenia jako liczba rzeczywista ORDER_TARGETxx Integer Ilość zamówiona dla aktualnego zlecenia ORDER_MULTIPLExx Integer Parametr gniazdo zaokrąglony do liczby całkowitej ORDER_MULTIPLEFxx Double Parametr gniazdo jako liczba rzeczywista ORDER_IDxx Integer Numer ID aktualnego zlecenia. 0 jeśli nie ma aktywnego zlecenia ORDER_OCCxx Integer Optymalny czas cyklu zlecenia ORDER_DEFECTxx Integer Licznik braków od początku zlecenia UserName String Zmienna wykorzystywana przez te procedury które dokonują operacji w systemie znakowanych operatorem. Np. procedura SetStatus zmienia status a jak wiadomo operacja ta jest logowana w rejestrze zdarzeń. W kolumnie Operator zobaczymy wartość zmiennej UserName Zmienne pomocnicze i zmienna timer są zmiennymi do zapisu i odczytu Vbit1 do Vbit64 Boolean Zmienne pomocnicze typu binarnego Vint1 do Vint64 Integer Zmienne pomocnicze typu integer (liczba całkowita) Vr1 do Vr64 Real Zmienne pomocnicze typu Real (rzeczywiste) Timer1 do Timer64 Integer Zmienna timer co 1 sekundę jest pomniejszana jeśli jest większa od zera RestartTime Integer Czas (w sekundach) jaki upłyną od zakończenia pracy stacji do ponownego uruchomienia
4.3 Flagi Flagi to specjalne zmienne które są ustawiane wewnątrz programu stacji w wyniku jakichś zdarzeń a kasowane każdorazowo po wykonaniu skryptu. Dzięki flagom możemy wykonać jakieś polecenie tylko jeden raz po jakimś zdarzeniu np. polecenie if f_order1 then Reset(3) spowoduje skasowanie wszystkich liczników kasowalnych nadzorcy SV3 po zmianie zlecenia w nadzorcy SV1. Dostępne są następujące flagi: Flaga Typ opis F_INSVxx boolean Flaga ustawiana zmianą stanu (załączeniem) wejścia filtrowanego przypisanego do wskazanego nadzorcy SV. F_ORDERxx boolean Flaga sygnalizuje zmianę zlecenia we wskazanym nadzorcy (lub skasowanie liczników kasowalnych jeżeli nadzorca jest skonfigurowany do pracy bez zlecenia) F_ENDORDER boolean Flaga sygnalizuje zakończenie zlecenia F_STATUSxx boolean Flaga sygnalizuje zmianę statusu F_OPERATORxx boolean Flaga sygnalizuje zmianę operatora F_SEC boolean Flaga ustawiana co 1 sekundę 4.4 Specjalny dostęp do zmiennych Powiedzmy że mamy następujący skrypt KIN80:= (Status1 = 5) and (order_id1 <>0) and INSV1; KIN81:= (Status2 = 5) and (order_id2 <>0) and INSV2; KIN82:= (Status3 = 5) and (order_id3 <>0) and INSV3; KIN83:= (Status4 = 5) and (order_id4 <>0) and INSV4; KIN84:= (Status5 = 5) and (order_id5 <>0) and INSV5; KIN85:= (Status6 = 5) and (order_id6 <>0) and INSV6; Nie jest istotne co ten skrypt robi, istotne jest to że robi to 6 razy dla 6 różnych nadzorców. A jest to bardzo prosta logiczna formuła. A gdybyśmy mieli bardziej złożony program a maszyn nie 6 a 15? Na taką właśnie okoliczność poza odwołaniem się do zmiennych po ich pełnej nazwie wraz z numerem zmiennej który najczęściej jest numerem nadzorcy dodano specjalne funkcje i procedury do obsługi zmiennych gdzie parametrem jest jej numer. Ten sam skrypt mógłby wyglądać tak procedure Ustaw(nrv:integer); var b:boolean; b:= ( GetTabInt(T_Status,nrv)=5) and ((GetTabInt(T_Order_Id,nrv)<>0) and GetTabBit(T_INSV,nrv); SetTabBin( T_KIN, nrv +79, b); var n:integer; for n:= 1 to 6 do Ustaw(n); Jak widać zdefiniowano procedurę ustaw która wywoływana jest 6 razy w pętli z kolejnym parametrem. Na dostęp do zmiennych pozwalają nam: funkcja GetTabBit(nazwa_zmiennej, numer_zmienej) zwracająca stan wskazanej zmiennej typu boolean funkcja GetTabInt(nazwa_zmiennej, numer_zmienej) zwracająca stan wskazanej zmiennej typu integer funkcja GetTabR(nazwa_zmiennej, numer_zmienej) zwracająca stan wskazanej zmiennej typu real (double) procedura SetTabBit(nazwa_zmiennej, numer_zmienej, wartość_do zapsiu) która ustawia wskazaną zmienną typu boolean procedura SetTabInt(nazwa_zmiennej, numer_zmienej, wartość_do zapsiu) która ustawia wskazaną zmienną typu integer Nazwa zmiennej jest taka sama jak nazwa zmiennej z numerem ale zamiast numeru na końcu ma przedrostek T_ na początku, np. T_Vbit jako nazwa zmiennej Vbitxx, T_StatusEx jako nazwa zmiennej StatusEXxx, T_Order_Target jako nazwa zmiennej Order_Targetxx itd. Należy pamiętać o właściwym doborze funkcji do odczytu zmiennej względem jej typu i o tym że procedury SetTab mogą ustawić tylko te zmienne które nie są do odczytu 5 Procedury i funkcje 5.1 Mechanizm blokady wykonania procedur Niektóre z procedur takie jak np. SetStatus posiadają wbudowany mechanizm blokowania ich kolejnego wykonania przez czas 5 sekund. Działa to tak że po wywołaniu procedury przez 5 sekund nie można jej wywołać ponownie, to znaczy wywołać można ale nie będzie żadnej reakcji. Oczywiście możemy wywołać w tym czasie tę samą procedurę z innym parametrem (dla innego nadzorcy). 5.2 Procedury zmieniające status Dostępne są trzy procedury zmiany statusu z poziomu skryptu sterującego:setnostatus, SetStatus I SetStatusEx. 5.2.1 SetNoStatus Procedura tylko numer głównego statusu bez logowania tej operacji. Jest aktywna tylko wtedy gdy w modelu ustawiony jest sposób starowania statusem na zmianę w skrypcie. procedure SetNoStatus(sv,nr:integer); przykład składni: SetNoStatus(1,2); parametry: sv numer nadzorcy, nr numer statusu który ma zostać ustawiony
5.2.2 SetStatus Procedura SetStatus zmienia status w taki sam sposób jak by to operator zmienił status. Może ona zostać użyta gdy w modelu jest ustawiony sposób sterowania statusu z panelu operatora lub ze skryptu. W pierwszym przypadku możliwa jest wymiennie zmiana statusu przez operatora i ze skryptu a drugim przypadku tylko skrypt może status zmienić. Po zmianie statusu zostanie dodana informacja do rejestru zdarzeń. Procedura posiada blokadę ponownego wykonania przez 5 sekund. procedure SetStatus(sv,nr:integer); przykład składni: SetStatus(1,2); parametry: sv numer nadzorcy, nr numer statusu który ma zostać ustawiony 5.2.3 SetStatusEx Procedura zmiania status rozszerzony w analogiczny sposób jakby to wykonał operator. Procedura SetStatusEx wykonana zostanie tylko wtedy w konstruktorze ustawiono status rozszerzony. Procedura posiada blokadę ponownego wykonania przez 5 sekund. procedure SetStatusEx(sv,nr:integer); przykład składni: SetStatusEx(1,11); parametry: sv numer nadzorcy, nr numer statusu rozszerzonego odczytany w konstruktorze który ma zostać ustawiony 5.3 Numeracja statusu i zmienna UserName Parametrem procedur SetNoStatus i SetStatus jest numer statusu. Poszczególne numery odpowiadają następującym statusom: 0-Postój Planowany 1-Postój Nieplanowany 2-Przezbrajanie 3-Ustawianie 4-Awaria 5-Praca Procedury SetStatus i SetStatusEx zapisują informację o zmianie statusu do rejestru zdarzeń. Jedną z informacji jaką opatrywane są zdarzenia jest operator który status zmienił. Zmieniając status możemy określić nazwę operatora która będzie widoczna w rejestrze przypisując ją do zmiennej UserName np. UserName:= Stacja1 ; 5.3.1 Przykład skryptu // Zmiana status przyciskami UserName:= Panel przyciaków ; SetStatus(7,5,Kin40); // Wejście 40 koncentratora wymusza zmianę statusu nadzorcy nr 7 na AWARIE SetStatusEx (8,11,Kin41); // Wejście 41 koncentratora wymusza zmianę statusu nadzorcy nr 8 na // status rozszerzony odpowiadający 11 pozycji z listy statusów rozszerzonych // Zmiana status jednego nadzorcy przy zmianie status innego nadzorcy // UWAGA nadzorcy 1 I 2 musza mieć identyczna konfigurację statusów UserName:= Skrypt sterujący; if F_Status1 then // Ten blok wykonywany jest raz po zmianie flagi F_Status1 (zmianie status w SV1) if StatusEx2 <> StatusEx1 then //Jeżeli status rozszerzony nadzorcy 2 inny niż nadzorcy 1 SetStatusEx(2,StatusEx1); //Zmień status nadzorcy 2 na taki jak nadzorca 1 5.4 Braki Braki możemy odczytać ze zmiennej Order_Defectxx (stan licznika braków od zmiany zlecenia lub skasowania liczników w prostszych trybach) Do ustawienia ilości braków mamy dwie procedury: procedure AddDefect(sv,x:integer) przykład składni AddDefect(1, 7) parametry: sv numer nadzorcy, x ilość braków która zostanie dodana do liczników braków. procedure SetDefect(sv,x:integer) przykład składni AddDefect(1, 7) parametry: sv numer nadzorcy, x ilość braków która zostanie dodana do liczników braków. Procedura SetDefect różni się od procedury SetDefect tym że działa tak jak dodawanie braków przez operatora po dodaniu braków zostaje dopisany komunikat do rejestru zdarzeń. Procedura SetDefect korzysta z mechanizmu czasowej blokady wykonania procedur. 5.5 Kasowanie liczników Procedura Reset kasuje wszystkie liczniki kasowalne (liczniki zlecenia dla trybów uwzględniających zlecenie) procedure Reset(sv:integer) przykład składni Reset(1) parametry: sv numer nadzorcy. Procedura nie loguje czynności w rejestrze zdarzeń i nie zmienia żadnych ustawień. if F_ORDER1 then // Ten blok wykonywany jest raz po zmianie flagi F_ORDER1 (zmianie zlecenia w SV1) Reset(2) //Kasowanie wszystkich liczników kasowalnych nadzorcy 2 5.6 SetFiltr Za pomocą zmiennych DelayOnxx, DelayOffxx i DelayENxx można odczytać ustawienia odpowiednio filtru opóźnienia załączenia, opóźnienia wyłączenia i blokady. Ustawić wartość filtru można za pomocą procedury SetFiltr procedure SetFiltr(sv,nr,time:integer) przykład składni SetFiltr(1,1,10) parametry: sv numer nadzorcy, nr numer filtru ( 0 opóźnienie załączenia, 1 opóźnienie wyłączenia, 2 blokada), time nowa wartość czasu.
5.7 DISPLAY procedure DISPLAY(sv,nr:integer;x:single); przykład składni: Display(5,2,Vint1); parametry: sv numer nadzorcy, nr numer wyświetlacza (1 lub 2), x wartość do wyświetlenia opis: Procedura DISPLAY wysyła daną do wyświetlenia w przeglądarce. Procedura ta jest dokładnie opisana w rozdziale wyświetlacze. 5.8 SetLamp procedure SetLamp(nr_zlr,nr_color:integer;stat:boolean); Procedura SetLamp zapala/gasi odpowiedni segment lampy sygnalizacyjnej wybranego zespołu. Tryb pracy lampy dla danego zespołu musi być ustalony na sterowanie skryptem. Parametr nr_zlr określa numer zespołu ZLR dla którego wyświetlana jest lampa, parametr nr_color określa numer segmentu lampy (1-zielony, 2- żółty, 3- czerwony) a parametr stat czy segment ma świecić czy nie. Przykład zastosowania // sterowanie lampą 7 nadzorcy // wejście 15 zapala segment zielony, wejście 17 segment żółty // jeśli wyłączone są wejścia 16 i 17 świeci segment czerwony SetLamp(7,1,KIn16); SetLamp (7,2,KIn17); SetLamp(7,3, (not KIn16) and (not KIn17); 5.9 ToLog Procedura ToLog pozwala dodać własny komunikat do rejestru zdarzeń. procedure ToLog(nr_zlr:integer;ev:string); Przykład składni: ToLog(1, Naciśnięty przycisk START ); parametry: sv numer nadzorcy, ev tekst który zostanie wpisany do rejestru zdarzeń. Procedura posiada blokadę ponownego wykonania przez 5 sekund. 6 Timery W skrypcie można użyć 64 timery. Timer działa tak że gdy do zmiennej timer np. Timer1 wpiszemy jakąś wartość to program co sekundę będzie ją pomniejszał tak długo aż osiągnie wartość 0. Gdy ją osiągnie ustawi flagę F_Timer1. Jeśli chcemy przerwać pracę timera ale bez ustawiania flagi wywołujemy procedurę ResetTimer(nr); if Work1 then Timer1:= 120; // jeśli maszyna pracuje cały czas wpisuj 120 sekund if F_Timer1 then // jeśli skończył się czas (upłyneło 120 sekund) then SetStatus(1,1); // zmień status na postój nieplanowany 7 Wyświetlacz Jednym z trybów modelu jest tryb 12 tryb wyświetlacza dla skryptu. W trybie tym wyświetlany jest pojedynczy lub podwójny wyświetlacz. golemie formacie czasu xd xx:xx:xx Format to tekst w którym program wymieni liczbę zdefiniowaną w postaci zer lub zer i znaków # na odpowiednią wartość. np. dla wartości x = 34.8705 zobaczymy: Format Zobaczymy 0 35 0.00 34.87 0.## 34.87 ale jeśli x będzie 74.00 to zobaczymy tylko 74 0.00% 34.87% 00000.00 00034.87 A+B=0.00 A+B=34.87 Wyświetlaną wartość ustala procedura DISPLAY a ustawienie modelu decyduje o formie w jakim ta dana będzie wyświetlana. Możemy ustalić czy widoczny będzie 1 czy dwa wyświetlacze, zdefiniować kolor czerwony lub zielony zdefiniować nazwę oraz format dla liczby. Określamy też sposób wyświetlania wyświetlany jest parametr X wg formatu Wyświetlany jest tekst 0 lub tekst 1 w zależności czy x=0 czy x=1 Wyświetlany jest x jako liczba sekund w przyjętym w Z boku zrzut ekranu z wyświetlaczem sterowanym następującym skryptem vint1 := order_cp1 + order_cp2; vint2 := order_defect1 + order_defect2; display(28,1,vint1); display(28,2,vint2); gdzie górny wyświetlacz wyświetla sumę produktu a dolny sumę braków dla bieżącego zlecenia nadzorców SV1 i SV2. Wyświetlacz obsługiwany jest przez nadzorcę SV28