Modula-monitor, WAT, semestr IV, Programowanie współbieżne


(* ZADANIE: Zaprojektuj i zapisz w jezyku Modula-2 program, ktory wykorzystujac *)

(* procesy wspolbiezne, symuluje prace zakladu wykonujacego naprawy i instalacje *)

(* dalekopisow. Zakladamy, ze zaklad dysponuje dwoma zalogami wykonujacymi *)

(* naprawy i jedna zaloga instalujaca dalekopisy. Zgloszenia napraw i instalacji *)

(* nowych dalekopisow naplywaja w sposob losowy. Zadanie uzytkownika moze być *)

(* zrealizowane, jesli zaklad dysponuje wolna zaloga oraz niezbednymi *)

(* materialami i czesciami. Nowe dalekopisy oraz czesci zamienne zaklad *)

(* otrzymuje z roznych hurtowni i przechowuje we wlasnym magazynie. Dzialanie *)

(* programu nalezy zilustrowac w trybie tekstowym lub graficznym na ekranie *)

(* monitora. *)

MODULE archiv1;

FROM Process IMPORT SIGNAL,SEND,WAIT,Init,StartProcess,Awaited;

FROM IO IMPORT WrStr,WrLn,WrCard,KeyPressed;

FROM Window IMPORT Clear,GotoXY,WinDef,WinType,SingleFrame,White,Black,Color,

Open,SetTitle,Use,TitleMode,TextBackground,CursorOff;

FROM Lib IMPORT RANDOMIZE,RANDOM,Delay;

CONST

SkyLight=WinDef(40,0,79,4,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight1=WinDef(0,0,39,4,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight2=WinDef(25,5,50,9,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight3=WinDef(0,10,39,14,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight4=WinDef(40,10,79,14,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight5=WinDef(25,15,50,19,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

SkyLight6=WinDef(25,20,50,24,White,Black,FALSE,TRUE,FALSE,TRUE,

SingleFrame,White,Black);

Blink=Color(8H);

VAR praca_1,praca_2,praca_instalujacej,wolna:SIGNAL;

hurt_cz,hurt_dal,zal_1,zal_2,zal_i,zak_nap,mag:WinType;

(* Poczatek monitora *)

MODULE monitor [4];

IMPORT SIGNAL,WAIT,SEND,Init,Awaited;

IMPORT WrStr,WrCard,WrLn,GotoXY,Delay,Use,Clear,KeyPressed;

IMPORT hurt_dal,mag,hurt_cz;

EXPORT do_magazynu_dalekopisow_nowych,do_magazynu_czesci,biore_nowy,biore_czesc;

CONST ilosc_dalekopisow=10;

ilosc_czesci=5;

VAR magazyn_czesci:ARRAY[0..ilosc_czesci-1] OF BOOLEAN;

magazyn_dalekopisow:ARRAY [0..ilosc_dalekopisow-1] OF BOOLEAN;

indeks,index,indeks1,index1,licznik,licznik_czesci:CARDINAL;

(* zmienne warunkowe *)

nie_ma_dalekopisow,sa_dalekopisy:SIGNAL;

nie_ma_nowych_czesci,sa_czesci:SIGNAL;

(* Procedury monitora *)

PROCEDURE do_magazynu_dalekopisow_nowych;

BEGIN

IF licznik=ilosc_dalekopisow THEN

Use(hurt_dal);

GotoXY(0,0);

IF licznik#ilosc_dalekopisow THEN

WrStr("KTOS INNY JEST W MAGAZYNIE");

ELSE

WrStr(" MAGAZYN JEST PELNY");

END;

Delay(1000);

WAIT(nie_ma_dalekopisow);

END;

magazyn_dalekopisow[indeks]:=TRUE;

indeks:=(indeks+1)MOD ilosc_dalekopisow;

INC(licznik);

Use(hurt_dal);

Clear;

GotoXY(0,1);

WrStr("DOSTARCZYLEM NOWY DALEKOPIS");

Delay(1000);

Clear;

WrStr("WOLNY");

Delay(1000);

Use(mag);

GotoXY(13,1);

WrCard(licznik,2);

Delay(1000);

IF Awaited(sa_dalekopisy) THEN

SEND(sa_dalekopisy);

END;

END do_magazynu_dalekopisow_nowych;

PROCEDURE biore_nowy(VAR dalekopis:BOOLEAN);

BEGIN

IF licznik=0 THEN WAIT(sa_dalekopisy) END;

dalekopis:=magazyn_dalekopisow[index];

magazyn_dalekopisow[index]:=FALSE;

index:=(index+1)MOD ilosc_dalekopisow;

DEC(licznik);

Use(mag);

GotoXY(13,1);

WrCard(licznik,2);

Delay(1000);

IF Awaited(nie_ma_dalekopisow) THEN

SEND(nie_ma_dalekopisow);

END;

END biore_nowy;

PROCEDURE do_magazynu_czesci;

BEGIN

IF licznik_czesci=ilosc_czesci THEN

Use(hurt_cz);

GotoXY(0,0);

IF licznik_czesci#ilosc_czesci THEN

WrStr("KTOS INNY JEST W MAGAZYNIE");

ELSE

WrStr("MAGAZYN JEST PELNY");

END;

Delay(1000);

WAIT(nie_ma_nowych_czesci);

END;

magazyn_czesci[indeks1]:=TRUE;

indeks1:=(indeks1+1)MOD ilosc_czesci;

INC(licznik_czesci);

Use(hurt_cz);

Clear;

GotoXY(0,1);

WrStr("DOSTARCZYLEM NOWY PAKIET CZESCI");

Delay(1000);

Clear;

WrStr("WOLNY");

Delay(1000);

Use(mag);

GotoXY(13,2);

WrCard(licznik_czesci,2);

Delay(1000);

IF Awaited(sa_czesci) THEN

SEND (sa_czesci);

END;

END do_magazynu_czesci;

PROCEDURE biore_czesc(VAR czesc:BOOLEAN);

BEGIN

IF licznik_czesci=0 THEN WAIT(sa_czesci) END;

czesc:=magazyn_czesci[index1];

magazyn_czesci[index1]:=FALSE;

index1:=(index1+1) MOD ilosc_czesci;

DEC(licznik_czesci);

Use(mag);

GotoXY(13,2);

WrCard(licznik_czesci,2);

Delay(1000);

IF Awaited(nie_ma_nowych_czesci) THEN

SEND(nie_ma_nowych_czesci);

END;

END biore_czesc;

(* Inicjacja monitora *)

BEGIN

licznik:=0;

licznik_czesci:=0;

indeks:=0;

index:=0;

indeks1:=0;

index1:=0;

Init(nie_ma_dalekopisow);

Init(sa_dalekopisy);

Init(nie_ma_nowych_czesci);

Init(sa_czesci);

END monitor;

(* Koniec monitora *)

PROCEDURE hurtownik_nowych_dalekopisow;

BEGIN

LOOP

IF KeyPressed() THEN HALT; END;

Use(hurt_dal);

GotoXY(0,0);

WrStr("PRACUJE ");WrLn;

Delay(1000);

do_magazynu_dalekopisow_nowych;

END;(*loop*)

END hurtownik_nowych_dalekopisow;

PROCEDURE hurtownik_nowych_czesci;

BEGIN

LOOP

IF KeyPressed() THEN HALT; END;

Use(hurt_cz);

GotoXY(0,1);

WrStr("PRACUJE ");WrLn;

Delay(1000);

do_magazynu_czesci;

END;(*loop*)

END hurtownik_nowych_czesci;

PROCEDURE zaloga_naprawcza_1;

VAR dal1:BOOLEAN;

BEGIN

Use(zal_1);

GotoXY(1,1);

WrStr("JESZCZE NIE PRACOWALA");

LOOP

IF KeyPressed() THEN HALT; END;

WAIT(praca_1);

Use(zal_1);

Clear;

GotoXY(1,1);

WrStr("PRACUJE");

biore_czesc(dal1);

IF dal1=TRUE THEN

Use(zal_1);

GotoXY(1,2);

WrStr("NAPRAWILEM");

Delay(1000);

ELSE

Use(zal_1);

GotoXY(1,2);

WrStr("NIE MA NOWYCH CZESCI");

Delay(1000);

END;

Clear;

WrStr("WOLNA");

SEND(wolna);

END;(*loop*)

END zaloga_naprawcza_1;

PROCEDURE zaloga_naprawcza_2;

VAR dal2:BOOLEAN;

BEGIN

Use(zal_2);

GotoXY(1,1);

WrStr("JESZCZE NIE PRACOWALA");

LOOP

IF KeyPressed() THEN HALT; END;

WAIT(praca_2);

Use(zal_2);

Clear;

GotoXY(1,1);

WrStr("PRACUJE");

biore_czesc(dal2);

IF dal2=TRUE THEN

Use(zal_2);

GotoXY(1,2);

WrStr("NAPRAWILEM");

Delay(1000);

ELSE

Use(zal_2);

GotoXY(1,2);

WrStr("NIE MA NOWYCH CZESCI");

Delay(1000);

END;

Clear;

WrStr("WOLNA");

SEND(wolna);

END;(*loop*)

END zaloga_naprawcza_2;

PROCEDURE zaloga_instalujaca;

VAR ins:BOOLEAN;

BEGIN

Use(zal_i);

GotoXY(1,1);

WrStr("JESZCZE NIE PRACOWALA");

LOOP

IF KeyPressed() THEN HALT; END;

WAIT(praca_instalujacej);

Use(zal_i);

Clear;

GotoXY(1,1);

WrStr("PRACUJE");

biore_nowy(ins);

IF ins=TRUE THEN

Use(zal_i);

GotoXY(1,2);

WrStr("ZAINSTALOWALEM");

Delay(1000);

ELSE

Use(zal_i);

GotoXY(1,2);

WrStr("NIE MA NOWYCH DALEKOPISOW");

Delay(1000);

END;

Clear;

WrStr("WOLNA");

SEND(wolna);

END;(*loop*)

END zaloga_instalujaca;

PROCEDURE zgloszenia():CARDINAL;

VAR co_chce:CARDINAL;

BEGIN

RANDOMIZE;

co_chce:=RANDOM(3);

RETURN co_chce;

END zgloszenia;

PROCEDURE zaklad_napraw;

VAR generacja:CARDINAL;

BEGIN

LOOP

IF KeyPressed() THEN HALT; END;

generacja:=zgloszenia();

Use(zak_nap);

Clear;

IF generacja=0 THEN

WrStr("zadanie instalacji");WrLn;

WrStr("NIECH PRACUJE");WrLn;

WrStr("zaloga instalujaca");

ELSIF generacja=1 THEN

WrStr("zadanie naprawy");WrLn;

WrStr(" NIECH PRACUJE");WrLn;

WrStr("zaloga naprawcza 1");

ELSIF generacja=2 THEN

WrStr("zadanie naprawy");WrLn;

WrStr("NIECH PRACUJE");WrLn;

WrStr("zaloga naprawcza 2");

END;

IF generacja=0 THEN

SEND(praca_instalujacej);

ELSIF generacja=1 THEN

SEND(praca_1);

ELSIF generacja=2 THEN

SEND(praca_2);

END;

END;(*loop*)

END zaklad_napraw;

(* Wlasciwy poczatek programu*)

BEGIN

Clear;

GotoXY(0,23);

TextBackground(Blink);

WrStr(" DOWOLNY KLAWISZ");WrLn;

WrStr("WYJSCIE Z PROGRAMU !");

CursorOff;

hurt_cz:=Open(SkyLight);

SetTitle(hurt_cz,'HURTOWNIK CZESCI',CenterUpperTitle);

hurt_dal:=Open(SkyLight1);

SetTitle(hurt_dal,'HURTOWNIK DALEKOPISOW',CenterUpperTitle);

zak_nap:=Open(SkyLight2);

SetTitle(zak_nap,'ZAKLAD NAPRAW',CenterUpperTitle);

zal_1:=Open(SkyLight3);

SetTitle(zal_1,'ZALOGA NAPRAWCZA 1',CenterUpperTitle);

zal_2:=Open(SkyLight4);

SetTitle(zal_2,'ZALOGA NAPRAWCZA 2',CenterUpperTitle);

zal_i:=Open(SkyLight5);

SetTitle(zal_i,'ZALOGA INSTALUJACA',CenterUpperTitle);

mag:=Open(SkyLight6);

SetTitle(mag,'MAGAZYN',CenterUpperTitle);

Use(mag);

WrStr("NOWYCH JEST: 0");WrLn;

WrStr("CZESCI JEST: 0");WrLn;

Init(praca_1);

Init(praca_2);

Init(praca_instalujacej);

Init(wolna);

(* Start procesow sekwencyjnych programu wspolbieznego *)

StartProcess(hurtownik_nowych_dalekopisow,600,6);

StartProcess(hurtownik_nowych_czesci,600,6);

StartProcess(zaloga_naprawcza_1,600,5);

StartProcess(zaloga_naprawcza_2,600,5);

StartProcess(zaloga_instalujaca,600,5);

zaklad_napraw;

END archiv1.



Wyszukiwarka

Podobne podstrony:
semafory, WAT, semestr IV, Programowanie współbieżne
Program cwiczenia z przedmiotu BPiE, WAT, semestr IV, Bezpieczeństwo i ergonomia pracy
ZadanieNaZaliczenie, WAT, semestr IV, Inżynieria oprogramowania
dok5, Prywatne, WAT, SEMESTR IV, IO, Zaliczenie IO
Inżynieria oprogramowania syllabus IV niestac 07 08, Prywatne, WAT, SEMESTR IV, IO, io, Materiały od
Laboratorium 01, Mechatronika WAT, Semest IV, Teoria sterowania, Laboratorium, Skrypty
BADANIA OPERACYJNE wykład1, WAT, semestr IV, Modelowanie Matematyczne
wymagania, Prywatne, WAT, SEMESTR IV, IO, io, dokumentacja
dok6, Prywatne, WAT, SEMESTR IV, IO, Zaliczenie IO
ściąga(1), WAT, semestr IV, Systemy wbudowane
kody, WAT, semestr IV, Systemy wbudowane
bpie sciaga, WAT, semestr IV, Bezpieczeństwo i ergonomia pracy
Egzamin6, WAT, semestr IV, Systemy wbudowane
Mikrokontroler 8051(1), WAT, semestr IV, Systemy wbudowane

więcej podobnych podstron