Hello,
I’m trying to model state machines and I’m wondering if:
-
Is it possible to create transition between states crossing hierarchies?
-
Can I have two transitions (in the same direction) between two states?
Below is what I’ve been trying.
Thanks!
Tom
state def StateMachine {
entry;
then Unpowered;
state Unpowered;
then Powered.Standby;
state Powered {
state Standby;
}
}
Tom,
State definitions (state def) declares the state machine itself; states within are usages (just state).
Within a state are three actions, entry, do, and exit, so entry; is inappropriate. Consider this hierarchical state machine example by Richard Page, leader of the Execution Working Group of OMG’s Systems Modeling Community:
item def TriggerItem;
state def ContextState {
state MyInterruptableState {
do action wait {
accept after 5 [SI::s];
}
state one;
state two;
transition t1 first start accept after 1 [SI::s] then one;
transition t2 first one accept after 1 [SI::s] then two;
}
transition tStart first start then MyInterruptableState;
transition tInterrupt first MyInterruptableState accept TriggerItem then done;
}
case 'test state interruption' {
subject s : ContextState;
// As per minimum time rule, executed immediately before any "waiting"
send new TriggerItem() to s;
}
MD messed up the formatting, but you can get the idea.
Thanks for your reply! I tried out your example, I don’t think it’s answering my question (unless I am not understanding it). I’ve attached a diagram of my above example using SysML v1. How can I model this state machine in v2?
It took a while, but I think I have figured it out (it is supposed to be the SysML v2 version of the image above).
package StateMachineExample {
item def TurnOn;
item def SecondTurnOn;
state def StateMachineExample {
state Unpowered;
transition first start then Unpowered;
state Powered {
state Standby;
}
transition first Unpowered accept TurnOn then Powered.Standby;
transition first Unpowered accept SecondTurnOn then Powered.Standby;
}
}