No me dí cuenta cuando subí el .txt me falto escribir el procedimiento avanzar(), este hace:
procedure avanzar(){
P(s)
P(s)
avanzo();
V(com_tapar);
V(com_llenar);
}
La idea es que luego de avanzar la cinta el procedimiento avanzar() habilite a poder tapar y llenar otras botellas, haciendo V(com_tapar) y V(com_llenar).
El tema de que el avanzar se ejecuta una vez tenes razon, deberia poner todo lo que esta en cobegin coend dentro de un loop infino.
Con respecto a tu solución:
(*
la cinta como avanza a pasos muy chicos se asume que no es necesario
hacer un stop de la cinta al llenar y/o tapar la botella *)
procedure avanzar()
begin
while(true)do
avanzar_cinta();
end;
Haciendo simplemente avanzar_cinta() no estas esperando que la bottela se llene/tape, si le sacas el cpu a mientras se esta llenando y se lo da a avanzar() podrias avanzar sin nada que te tranque, me explico?, para mi tenes que implementar algo de que antes de avanzar se fije si lleno o tapo.