Система управления производством - GPSS World
Пусть имеем некую систему управления производством, в которой ЭВМ циклически опрашивает три датчика информации. Информация в датчиках возникает через 10 плюс-минус 3 с и имеет размер 3000 плюс-минус 1000 символов; ЭВМ по очереди каждому датчику дает 3 с: В первые 3с обрабатывается информация с первого датчика; Во вторые 3с обрабатывается информация со второго датчика; В третье 3с обрабатывается информация с третьего датчика; В четвертые 3с обрабатывается информация с первого датчика и т.д. Если на момент начала опрашивания у датчика нету информации для обработки, имеем свободный цикл. Если за соответствующие 3 с ЭВМ успевает обработать информацию датчика, то обслуживание завершается, если нет, то остаток необработанной информации стает в специальную очередь. Задание, что находятся в этой очереди, обрабатываются во время свободных циклов. Скорость обработки информации ЭВМ равна 1000 символов за секунду. Смоделируйте 5 часов работы ЭВМ.
Листинг программы:
Листинг программы:
VRazmer VARIABLE 2000+INT(RN1#2000/1000) ;размер от 2000 до 4000 INITIAL X$XDatchik,1 ;какой датчик обслуживается INITIAL X$XNa1,0 ;сколько ждут на 1 INITIAL X$XNa2,0 ;сколько ждут на 2 INITIAL X$XNa3,0 ;сколько ждут на 3 GENERATE 10,3 ;датчик 1 ASSIGN PRazmer,V$VRazmer ;задать размер SAVEVALUE XNa1+,1 ;увеличить колво на 1 TEST E X$XDatchik,1 ;ждать обслуживания датчика 1 SAVEVALUE XNa1-,1 ;уменьшить колво на 1 TRANSFER ,LabO ;перейти на обслуживание GENERATE 10,3 ;датчик 2 ASSIGN PRazmer,V$VRazmer ;задать размер SAVEVALUE XNa2+,1 ;увеличить колво на 1 TEST E X$XDatchik,2 ;ждать обслуживания датчика 2 SAVEVALUE XNa2-,1 ;уменьшить колво на 1 TRANSFER ,LabO ;перейти на обслуживание GENERATE 10,3 ;датчик 3 ASSIGN PRazmer,V$VRazmer ;задать размер SAVEVALUE XNa3+,1 ;увеличить колво на 1 TEST E X$XDatchik,3 ;ждать обслуживания датчика 3 SAVEVALUE XNa3-,1 ;уменьшить колво на 1 TRANSFER ,LabO ;перейти на обслуживание LabO SEIZE EOM ;занять устройство ADVANCE 3 ;имитация цикла RELEASE EOM ;освободить устройство ASSIGN PRazmer-,3000 ;уменьшить размер TEST LE P$PRazmer,0,LabLink ;проверить размер SAVEVALUE XDatchik+,1 ;перейти к след датчику TEST E X$XDatchik,4,LabD1 ;проверить датчик SAVEVALUE XDatchik,1 ;перейти к датчику 1 LabD1 TEST E X$XDatchik,1,LabD2 ;проверить,свобод цикл TEST E X$XNa1,0,LabTerm ; UNLINK Line,LabO,1 ;вытащить из очереди TRANSFER ,LabTerm ;перейти на уничтожение LabD2 TEST E X$XDatchik,2,LabD3 ;проверить,свобод цикл TEST E X$XNa2,0,LabTerm ; UNLINK Line,LabO,1 ;вытащить из очереди TRANSFER ,LabTerm ;перейти на уничтожение LabD3 TEST E X$XDatchik,3,LabTerm ;проверить,свобод цикл TEST E X$XNa3,0,LabTerm ; UNLINK Line,LabO,1 ;вытащить из очереди TRANSFER ,LabTerm ;перейти на уничтожение LabTerm TERMINATE ;уничтожить LabLink LINK Line,FIFO ;занять место в очереди GENERATE 3600 ;сегмент таймера TERMINATE 1 ; START 5 ;на 5 часов