ConfigModeler and VClipse Languages and IDEs for Product Modeling on Different Abstraction Levels

Preview:

Citation preview

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

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

Recommended