node ValvePerfect state rate : [0,2] : public; init rate := 0; event dec, inc; trans true |- dec -> rate := rate - 1; true |- inc -> rate := rate + 1; rate = 0 |- dec -> ; rate = 2 |- inc -> ; edon node Valve state rate : [0,2] : public; stucked : bool; init rate := 0; stucked := false; event dec, inc; trans ~stucked |- dec -> rate := rate - 1; ~stucked |- inc -> rate := rate + 1; ~stucked |- dec -> stucked := true; ~stucked |- inc -> stucked := true; stucked |- dec -> ; stucked |- inc -> ; rate = 0 |- dec -> ; rate = 2 |- inc -> ; edon node Tank state level : [0,4] : public; init level := 2; flow amont : [0,4]; aval : [0,2]; event time; trans amont > aval |- time -> level := level + 1; amont < aval |- time -> level := level - 1; amont = aval & amont = 0 |- time -> ; amont = aval & amont > 0 |- time -> level := level + 1; amont = aval & amont > 0 |- time -> level := level - 1; amont = aval & amont > 0 |- time -> ; level = 4 & (amont > aval) |- time -> ; level = 0 & (amont < aval) |- time -> ; edon node Ctrl // les observations du controleur flow r : [0,2][3]; l : [0,4]; event ddd, ddi, ddn, did, dii, din, dnd, dni, dnn, idd, idi, idn, iid, iii, iin, ind, ini, inn, ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn; trans true |- ddd, ddi, ddn, did, dii, din, dnd, dni, dnn, idd, idi, idn, iid, iii, iin, ind, ini, inn, ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn -> ; edon node SystemPerfect sub V : ValvePerfect[3]; T : Tank; //C : Ctrl; C : Ctrl_SystemPerfect; state ctrl : bool; init ctrl := true; // d pour dec, i pour inc, n pour nop event action; time; trans ctrl |- action -> ctrl := false; ~ctrl |- time -> ctrl := true; assert T.amont = (V[0].rate + V[1].rate); T.aval = V[2].rate; // liens avec le controleur C.r[0] = V[0].rate; C.r[1] = V[1].rate; C.r[2] = V[2].rate; C.l = T.level; sync ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; edon node System sub V : Valve[3]; T : Tank; //C : Ctrl; C : Ctrl_System; state ctrl : bool; init ctrl := true; // d pour dec, i pour inc, n pour nop event action; time; trans ctrl |- action -> ctrl := false; ~ctrl |- time -> ctrl := true; assert T.amont = (V[0].rate + V[1].rate); T.aval = V[2].rate; // liens avec le controleur C.r[0] = V[0].rate; C.r[1] = V[1].rate; C.r[2] = V[2].rate; C.l = T.level; sync ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; edon