AFAIK, arrays of arrays are not directly supported.
You can either create a different name for each instance of an element module (see machine01
), or scrap the element module and push its content within the machine module (see machine02
).
e.g.:
MODULE element()
VAR
pressionLevel : { BELOW, NORMAL, OVER };
action : { START, PAUSE, STOP, RESTART };
MODULE machine01()
VAR
el1 : element();
el2 : element();
el3 : element();
el4 : element();
MODULE machine02()
VAR
pressionLevel : array 1..4 of { BELOW, NORMAL, OVER };
action : array 1..4 of { START, PAUSE, STOP, RESTART };
MODULE main()
VAR
m1 : machine01();
m2 : machine02();
The elements of an array can be accessed using constant indexes, e.g.:
next(precisionLevel[0]) := BELOW
When using the constraint-style modeling, it is easy to model something which has unintended consequences, or to write some constraint that is manageable for very small arrays but, for some reasons, it quickly blows up for larger ones. So I would advice using the assignment-style modeling only, or to expand a constraint like
precisionLevel[i] = BELOW => ... some consequence ...
as follows
((i = 0 & precisionLevel[0] = BELOW) => ... some consequence ...)
&
((i = 1 & precisionLevel[1] = BELOW) => ... some consequence ...)
&
...
where i
is a variable acting as an index for the array precisionLevel
, and the constraint is expanded over the entire domain of i
.