オブジェクトの広場はオージス総研グループのエンジニアによる技術発表サイトです

システムズエンジニアリング

システムズエンジニアリング専門家によるSysML v2徹底解説

第二回:SysML v2の新しい構成要素やその使い道を知る―すべての要素を一貫したメタ構造で扱える Definition/Usage
株式会社オージス総研 モデルベースシステムエンジニアリング部 片山 敬介
2025年4月24日

この連載では、2025年内にはリリースされる見込みのシステムモデリング言語SysML v2を取り上げ、業界での利活用に乗り遅れないために基本的な情報や新しい構成要素の紹介、今まで使っていたSysML v1とv2の変換などを紹介していきます。第二回の今回は新しい構成要素のひとつ「Definition/Usage」を紹介します。

SysML v2の新しい構成要素やその使い道を知る:すべての要素を一貫したメタ構造で扱える Definition/Usage

SysML v1の時代、ブロック、パート、ステートマシン、ステート等の要素は名前付けに一貫性がなく、似た名前の要素の関係性も一貫性がありませんでした。 図1: SysML v1の要素同士の関係(一例)

図1: SysML v1の要素同士の関係(一例)

SysML v2では構造、振る舞い、要求などを記述する各要素がすべてDefinition(定義)とUsage(使い方)を持ちます。v2での変更は言語仕様に一貫性を持たせ、理解の助けになると考えられます。 図2: 「DefinitionとUsage」の関係を基本とし、そこから派生する各種要素(イメージ、一部)

図2: 「DefinitionとUsage」の関係を基本とし、そこから派生する各種要素(イメージ、一部)

モデル例

DefinitionとUsageの関係は様々な要素で利用可能です。ここではPart DefinitionとPart Usageのモデルを例に説明します。下記の例はエンジンそのものの定義をPart Definitionで、個々のエンジン機種の定義をPart Usageで記述しています。Definitionに宣言された属性に対し個々のUsageで異なる値を定義することが可能です。

package CarSample{
    import SI::*;
    part def Engine //エンジン自体の定義(Definition)
    {
        attribute displacement :> SI::litre;    //排気量
        attribute maxPower :> SI::kilowatt;     //最高出力
    }
    part abc123 : Engine    //エンジン機種abc123のPart Usage
    {
        displacement = 2.0; //このエンジンの排気量
        maxPower = 206;     //このエンジンの最高出力
    }
    part def456 : Engine    //エンジン機種def456のPart Usage
    {
        displacement = 1.8;
        maxPower = 150;
    }   
}

PartDefinition "Engine"を基として定義された2機種のエンジンのPartUsageがある

図3:PartDefinition “Engine"を基として定義された2機種のエンジンのPartUsageがある

DefinitionとUsageの関係はクラスとインスタンスに似ているように思いがちですが、それとは異なります。 例えばDefinitionはUsageを”所有”することが可能です。

次のモデルではPartDefinition "MotorCycle"がPartUsage "frontWheel"、"rearWheel"を所有しています。

package MotorCycleWheelSample{
    import SI::*;
    part def Wheel{ //車輪の定義(Definition)
        attribute diameter :> SI::millimetre;
        attribute width :> SI::millimetre;
    }

    part def MotorCycle{    //バイクの定義(Definition)
        part frontWheel : Wheel{    //前輪としてのWheelの「使い方」(Part Usage)
        }
        part rearWheel : Wheel{ //後輪としてのWheelの「使い方」(Part Usage)
        } 
    }

}

PartDefinition "MotorCycle"がPart "frontWheel"、"rearWheel"を所有している

図4: PartDefinition "MotorCycle"がPart "frontWheel"、"rearWheel"を所有している

またUsageはDefinitionの「ある文脈における使われ方」を表します。すなわち1つのDefinitionには複数種類のUsageが生じ得ます。 次のモデルでは、PartDefinition "Payload"が、Droneの持つPartUsageと、DeliveredPayloadの持つItemUsageの2種類のUsageで使われます。

package droneSample1 {
  part def Payload { attribute weight; }    //PartDefinition "Payload"の定義  
  part def Drone { part payload: Payload; }  //partUsageとして使われるPayload

  // itemとしてのPayload使用(ログ用)
  action def DeliveredPayload {
    item deliveredItem: Payload;  //ItemUsageとして使われるPayload
  }
  // 実体定義
  individual def Drone1 specializes Drone {}
  individual def Box1 specializes Payload {:>> weight=20.0;}

  // DroneがBox1を積んで配達している状態
  individual drone1Delivery: Drone1 {
      ref :>> payload:Box1;
  }

  // そのときのログに、itemUsageとしてPayload(Box1)を記録
  action deliveryLog1: DeliveredPayload {
      ref :>> deliveredItem:Box1;
  }
}

Definition/Usageのうれしさ:バリエーションのモデリング

Definition/Usageを使うことで、バリエーションのモデリングが言語仕様として可能になりました。このことでモデリングツール・モデル管理ツール等によるSysMLモデル上でのバリエーション管理、ひいてはプロダクトラインエンジニアリング(PLE)への活用が期待できます。 下記の例では、電気自動車のモーター個数およびバッテリー容量にバリエーションがあることをモデリングしています。

//電気自動車のグレードによるモーター数・出力とバッテリー容量のバリエーション
package CarVariationSample{
    import SI::*;
    part def ElectricVehicle{   //電気自動車の定義
        part motors : Motor[1..2];  //モーターは1個または2個になりうる
        part battery : Battery;
    }
    part def Motor{
        attribute maxPower :> SI::kilowatt;
    }
    part def Battery{
        attribute capacity :> SI::'watt hour';
    }

    //1モーター仕様
    part def singleMotorEV :> ElectricVehicle{
        part redefines motors[1]{   //モーター1個でredefine
            maxPower = 200;
        }
        part redefines battery{
            capacity = 30000;
        }
    }
    //2モーター仕様
    part def dualMotorEV :> ElectricVehicle{
        part redefines motors[2]{   //モーター2個にredefine
            maxPower = 200;
        }
        part redefines battery{
            capacity = 50000;
        }
    }
}

モデル全体

図5:モデル全体

ElectricVehicleの定義部分のみ抜粋。Motorが1..2の多重度を取りうることがわかる。

図6:ElectricVehicleの定義部分のみ抜粋。Motorが1..2の多重度を取りうることがわかる。

A仕様の定義のみ抜粋

図7:A仕様の定義のみ抜粋

B仕様の定義のみ抜粋

図8:B仕様の定義のみ抜粋

Definition/Usageのうれしさ:要求とのトレーサビリティ

要求と設計のトレーサビリティを示すために、Usageにsatisfyキーワードを使うことができます。SatisfyはUsageが特定の要求(Requirement)を実際に満たしていることを示します。下記の例では、"Engine"の具体的なUsageである"def456"機種が要求"MaxPowerRequiment_US"を実際に満たすことを記述しています。 ここで、DefinitionはRequirementをsatisfyできないのか?と思うでしょうが、これは文法上許されていません。Definitionは型の定義であり、文脈に依存する具体的なスペックを(通常は)持たないためDefinitionが直接要求をsatisfyすることはふさわしくないという事でしょう。

package ReqPartSample1{
    import SI::*;
    requirement def MaxPowerRequiment_US {
        //北米向け機種の最高出力要求
        text="エンジンの最高出力は150[kW]以上であること";
    }
    part def Engine //エンジン自体の定義(Definition)
    {
        attribute displacement :> SI::litre;    //排気量
        attribute maxPower :> SI::kilowatt; //最高出力 ※Definitionは要求をsatisfyできない
    }
    part hogepiyo : Engine  //エンジン機種hogepiyoのPart Usage
    {
        satisfy requirement MaxPowerRequiment_US by maxPower;   //要求MaxPowerRequimentを属性maxPowerが満足していることを示す
        displacement = 1.8;
        maxPower = 150; //要求を満たすスペックを与えている
    }   
}

要求と設計のトレーサビリティを取るための手段は複数あります。これは別途Requirementを扱う連載回で説明します。

次回予告

SysML v2のモデル要素を詳しく説明する回の一回目はDefinition/Usageを扱いました。いかがでしたか? 次回は「システムのある期間・ある時点の姿を記述する Occurrence」を説明します。