Dynamically Updating Controllers from Specification Changes
Dynamic Updates
Example
Getting Started
Step-by-Step Guide
system specification PickAndPlaceRobotSpecification {
domain PickAndPlaceSystem // domain model package name
define Controller as controllable
define Arm as uncontrollable
define TableSensor as uncontrollable
define DepositBelt as uncontrollable
non-spontaneous events {
Controller.arrivedAtBelt,
Controller.arrivedAtTable
}
collaboration PickAndPlaceBehavior {
static role TableSensor ts
static role Controller c
static role Arm a
static role DepositBelt belt
/* S1 */
specification scenario ArmPickUpPieceAndMoveToBelt {
message ts->c.pieceArrived()
strict requested wait until [c.armAtTable]
message strict requested c->a.pickUp()
message strict requested c->belt.startWindBelt()
message strict requested c->a.moveToBelt()
}
/* needed to know when pick-up is possible */
specification scenario SetArmAtTableFalse {
message c->a.moveToBelt()
message strict requested c->c.setArmAtTable(false)
}
/* needed to know when pick-up is possible */
specification scenario SetArmAtTableTrue {
message a->c.arrivedAtTable()
message strict requested c->c.setArmAtTable(true)
}
/* S2 */
specification scenario ArmReleasePieceOntoBelt {
message a->c.arrivedAtBelt()
message strict requested c->a.release()
}
/* S3 */
specification scenario ArmMoveToTableAfterRelease {
message c->a.release()
message strict requested c->a.moveToTable()
}
/* S4 */
specification scenario ReleaseAfterArrivedAtBelt {
message a -> c.arrivedAtBelt()
message strict requested c -> belt.stopWindBelt()
message strict requested c -> a.release()
}
/* S5 */
requirement scenario ReleaseOntoBeltAfterStartWind {
message c -> belt.startWindBelt()
message strict requested c -> belt.stopWindBelt()
}
/* A1 */
assumption scenario ArmMoveFromTableToBelt {
message c->a.moveToBelt()
message strict requested a->c.arrivedAtBelt()
}
/* A2 */
assumption scenario ArmMoveFromBeltToTable {
message c->a.moveToTable()
message strict requested a->c.arrivedAtTable()
}
/* A3 */
assumption scenario NoNewPieceArrivesBeforeArmPicksUp {
message ts->c.pieceArrived()
message strict c->a.pickUp()
}
}
}