configmodeler and vclipse languages and ides for product modeling on different abstraction levels
TRANSCRIPT
ConfigModeler and VClipse
Languages and IDEs for Product Modeling
on Different Abstraction Levels
Tim Geisler
webXcerpt Software GmbH
CWG 2010, Vienna 2010-04-20
Product Modeling Gap
● Post-merger consolidation:harmonize SAP and non-SAP systemsfor 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 @
Fabric-like Modeling
NSN VC framework
IPC extensions
coding conventions
Nearshore VC modeling team
Company-wide generic product structure
Standardizedproduct descriptions
Fabric-like Modeling
NSN VC framework
IPC extensions
coding conventions
Nearshore VC modeling team
Company-wide generic product structure
Standardizedproduct descriptions
Standardized Product Descriptions
● Product structure● Characteristics
(domains, texts, default values, interface design)
● Quantity rules for materials
● Other rules
In-house product experts specify product models
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
Standardized Product Descriptions
Standardized Product Descriptions
Formalized Product Descriptions
Formalized Product Descriptions
Domain specific language● problem-oriented● human-understandable● text-based● machine-processable
Configuration Modeling Language (CML)
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;...
};...
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;...
};...
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;...
};...
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;...
};...
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
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
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
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
Configuration Modeling Language
Parallel conditions● Value domains● Default values● Visibility
hw/sw inif isNewDeliverythen 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;
Configuration Modeling Language
Parallel conditions● Value domains● Default values● Visibility
hw/sw inif isNewDeliverythen 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;
Configuration Modeling Language
Parallel conditions● Value domains● Default values● Visibility
hw/sw inif isNewDeliverythen 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;
ConfigModeler
Integrated Development Environment (IDE)
for CML● Eclipse-based
General IDE Features
Syntax checks
General IDE Features
Syntax checks
Checking references
General IDE Features
Syntax checks
Checking references
Checking types
General IDE Features
Syntax checks
Checking references
Checking types
Code completion
General IDE Features
Syntax checks
Checking references
Checking types
Code completion
Cycle detection
General IDE Features
Diff and history
Domain-specific IDE Features
Additional information
Domain-specific IDE Features
Additional information
Dependency graph
Domain-specific IDE Features
Additional information
Dependency graph
IPC preview for user interface
VC Code Generation
Automatic generation of SAP product modelfrom formal specification in CML
VC Code Generation
Uses NSN VC framework and coding conventions...* count slotable materialPFUNCTION Z_VC_GEN_AGG_INST_02 ( GEN_CSTIC_IN_PREFIX_01 = 'XYZ_CWGSWITCH_SLOT', GEN_CSTIC_IN_PREFIX_02 = 'NA', GEN_CSTIC_IN_PREFIX_03 = 'NA', GEN_CSTIC_IN_PREFIX_04 = 'NA', GEN_CSTIC_QTY_PREFIX = 'NA', GEN_DIGITS = 2, GEN_CSTIC_OUT = 'GEN_CML_AGG_MODULES', GEN_INSTANCE_START = 'PARENT', GEN_INCL_START_INST = 'T', GEN_INCL_SELF_INST = 'F', GEN_RECURSIVE = 'F', GEN_AGG_CTRL_SUFFIX = 'NA', GEN_AGG_CTRL_MATNR_LIST = 'NA', GEN_AGG_CTRL_CLASS = 'NA', GEN_AGG_CTRL_CSTIC = 'NA', GEN_AGG_CTRL_VAL = 'NA', GEN_MODE = 'DELETE'),* slotable material #2x10GEPFUNCTION Z_VC_GEN_GET_COMP_DATA_01 ( GEN_CSTIC_IN = 'GEN_CML_AGG_MODULES', GEN_INSTANCE_IN = 'SELF', GEN_VAL_CHAR_01 = '2x10GE', GEN_INDEX_NUM = 1, GEN_COMP_QTY = $SELF.GEN_AUX_NUM_01),PFUNCTION Z_VC_GEN_SET_VBOM_MU ( GEN_MU_ID = 'ABC00001000634', GEN_MU_QTY = $SELF.GEN_AUX_NUM_01, GEN_VBOM_CSTIC = 'GEN_VBOM_CURR') IF $SELF.GEN_AUX_NUM_01 GT 0,...
VC Code Generation
Automated model setupvia Product Data Replication
PDR
Use of ConfigModeler at NSN
● Product specialists specify and set upproducts models in SAP
● 20 users (10 regular)● up to now 60 products● but: not a tool for all products
System Overview
RFC
Editor
ConfigModeler
CML
Compiler
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
System Overview
RFC
Editor
ConfigModeler
CML
Compiler
System Overview
RFC
Editor
Editor
ConfigModeler
VClipse
CML
VCML
Compiler
VCML: DSL for SAP VC
● Simple DSL for SAP VC objectswith embedded languages for procedures and constraints
● DSL design:● Make it simple● Model only important properties of SAP objects,
others are hard-wired or defaulted
VCML Example: Characteristic
characteristic WP_OPTIONS { description "Web Phone Options" documentation "Some long documentation on Web Phone Options" symbolic { numberOfChars 3 values { '001' { description "Cable for connecting monitor" } '002' { description "Voice mail" } '003' { description "Camera" } '004' { description "Additional Antenna" } '005' { description "Memory Upgrade" dependencies { WP_MEMORY_UPGRADE } } '006' { description "Self-Cleaning Screen" } } } status released [ multiValue required ]}
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'. }}
VClipse: Eclipse-based IDE for VCML
Syntax check
VClipse: Eclipse-based IDE for VCML
Syntax check
Jump to definition
VClipse: Eclipse-based IDE for VCML
Syntax check
Jump to definition
VClipse: Eclipse-based IDE for VCML
Syntax check
Jump to definition
Code completion
VClipse: Eclipse-based IDE for VCML
Syntax check
Jump to definition
Code completion
Outline
Document order PMEVC order
VClipse: Eclipse-based IDE for VCML
Syntax check
Jump to definition
Code completion
Outline
Diff / merge
History
Interfaces to SAP: RFC-based
CRUD operations
Recursive model extraction
Interfaces to SAP: IDoc-based
Send complete product modelsvia Product Data Replication (PDR)
VCML JCo IDocs UPSPDR
VClipse is Free
VClipse is Free
VClipse.org: Open Source
Use, adapt, integrate, contribute!
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
Summary
Thanks to ...
● various persons at Nokia Siemens Networks● Peter Muthsam (VC knowledge)● Daniel Naus (CWG Sandbox)● itemis (Xtext)● webXcerpt team