We present ConfigModeler and VClipse, two domain-specific languages and corresponding Eclipse-based integrated development environments (IDEs) for product modeling on different levels of abstraction.
VClipse supports the direct specification of objects and dependencies using VC's abstraction level in a textual language called VCML.
ConfigModeler supports the specification of product models in a language supporting a high degree of abstraction. Developed in a customer project, this language has been designed according to the customer's needs and uses the customer's concepts. ConfigModeler translates the product models to VC objects and dependencies, optionally represented as VCML code.
In both cases the VC objects and dependencies can be transferred to an SAP system using RFC or product data replication (PDR) via IDocs. With VClipse, it is also possible to extract product models from an SAP system. This enables the use of standard text comparison tools and version control systems.
VClipse is released as an open-source project on http://www.vclipse.org - so you are all invited to use VClipse in your work and products, or even to contribute to it.
2010 CWG European Conference - Vienna, Austria
ConfigModeler and VClipse Languages and IDEs for Product Modeling on Different Abstraction Levels
1. ConfigModeler and VClipse
Languages and IDEs for Product Modeling
on Different Abstraction Levels
Tim Geisler
webXcerpt Software GmbH
tg@webxcerpt.com
CWG 2010, Vienna 2010-04-20
3. ●
Post-merger consolidation:
harmonize SAP and non-SAP systems
for sales and configuration
●
SAP ERP/PLM (VC) + SAP CRM 2007 (IPC)
●
Migration challenge:
How to migrate 6 product lines / more than 240
different products to VC / IPC?
(CWG 2009 Berlin talk by Gerhard Hering, NSN)
Product Modeling @
7. Problems
Excel „template“ used as graph paper
●
pseudo code – manual translation required
●
manual tracking of changes
●
no guarantee for completeness
●
no specific tool support – just general Excel
●
first visual feedback with product setup
10. Formalized Product Descriptions
Domain specific language
●
problem-oriented
●
human-understandable
●
text-based
●
machine-processable
Configuration Modeling Language (CML)
11. Configuration Modeling Language
Products
Materials
Value Domains
Parameters
Equations
product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
12. Configuration Modeling Language
Products
Materials
Value Domains
Parameters
Equations
product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
13. Configuration Modeling Language
Products
Materials
Value Domains
Parameters
Equations
product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
14. Configuration Modeling Language
Products
Materials
Value Domains
Parameters
Equations
product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
15. product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
Configuration Modeling Language
Products
Materials
Value Domains
Parameters
Equations
16. product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
Configuration Modeling Language
Identifiers
17. product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
Configuration Modeling Language
Identifiers
Slotting
18. product CWGSwitch is #ABC000010000630 {
uplink in [10GE, *1GE] is XYZ_CWGSWITCH_UPL;
domain boards =
switch uplink {
case 10GE : [*unequipped, 2x10GE, 8x1GE, 16x1GE];
case 1GE : [*unequipped, 8x1GE, 16x1GE];
};
product interfaceSubsystem is #ABC000010000640 {
slot slot1 in boards is XYZ_CWGSWITCH_SLOT01;
slot slot2 in boards is XYZ_CWGSWITCH_SLOT02;
slot slot3 in boards is XYZ_CWGSWITCH_SLOT03;
slot slot4 in boards is XYZ_CWGSWITCH_SLOT04;
slotable #2x10GE is #ABC00001000634;
slotable #8x1GE is #ABC00001000635;
slotable #16x1GE is #ABC00001000636;
check(#2x10GE > 2, "Only two 2x10GE boards allowed");
};
product powerSubsystem is #ABC000010000641 {
power in [*AC, DC] is XYZ_CWGSWITCH_PWR;
powerRedundancy in
if power == AC
then [*false, true]
else disabled false
is XYZ_CWGSWITCH_PWRRED;
amountPowerSupplies = 1 + (1 when powerRedundancy);
#POWER:AC = amountPowerSupplies when power == AC;
...
};
...
Configuration Modeling Language
Identifiers
Slotting
Conditionals
19. Configuration Modeling Language
Parallel conditions
●
Value domains
●
Default values
●
Visibility
hw/sw in
if isNewDelivery
then switch chassis {
case Chassis:A : [NoHW/SW, *HW/SW1, HW/SW2];
case Chassis:B :
case Chassis:C : [NoHW/SW, *HW/SW2, HW/SW3];
case Chassis:D : disabled HW/SW1;
default : invisible NoHW/SW;
}
else invisible NoHW/SW;
20. Configuration Modeling Language
Parallel conditions
●
Value domains
●
Default values
●
Visibility
hw/sw in
if isNewDelivery
then switch chassis {
case Chassis:A : [NoHW/SW, *HW/SW1, HW/SW2];
case Chassis:B :
case Chassis:C : [NoHW/SW, *HW/SW2, HW/SW3];
case Chassis:D : disabled HW/SW1;
default : invisible NoHW/SW;
}
else invisible NoHW/SW;
21. Configuration Modeling Language
Parallel conditions
●
Value domains
●
Default values
●
Visibility
hw/sw in
if isNewDelivery
then switch chassis {
case Chassis:A : [NoHW/SW, *HW/SW1, HW/SW2];
case Chassis:B :
case Chassis:C : [NoHW/SW, *HW/SW2, HW/SW3];
case Chassis:D : disabled HW/SW1;
default : invisible NoHW/SW;
}
else invisible NoHW/SW;
35. Use of ConfigModeler at NSN
●
Product specialists specify and set up
products models in SAP
●
20 users (10 regular)
●
up to now 60 products
●
but: not a tool for all products
37. Product Modeling in SAP VC
existing:
●
textual languages for procedures and constraints
●
interactive creation and change of VC objects
missing:
●
human-readable textual language for VC objects
– diff / merge / version control
– find / replace
– partial models
– product model as a document
40. VCML: DSL for SAP VC
●
Simple DSL for SAP VC objects
with embedded languages
for procedures and constraints
●
DSL design:
●
Make it simple
●
Model only important properties of SAP objects,
others are hard-wired or defaulted
42. VCML Example: Precondition
precondition WP_MEMORY_UPGRADE {
description "Precond. for memory upgrade"
status released
source {
* memory upgrade is only allowed with answering machine
$self.WP_options specified and
$self.WP_options = '002'.
}
}
54. Summary
Product modeling is like programming
●
Use appropriate languages
●
Use appropriate tools
Tool chain for text-based product modeling
●
CML, VCML:
two languages with different abstraction levels
●
ConfigModeler, VClipse:
two Eclipse-based IDEs
56. Thanks to ...
●
various persons at Nokia Siemens Networks
●
Peter Muthsam (VC knowledge)
●
Daniel Naus (CWG Sandbox)
●
itemis (Xtext)
●
webXcerpt team