Skip to content

Asset Management Service – Assets 建模

本示例说明了如何在 MindSphere 中对 assets 进行建模和构建。在本示例中,一家在世界范围内拥有多个风电场的全球风力发电公司在 MindSphere 中创建了他们的第一批 assets。有关本示例中所用端点的详细信息,请参见 API 规范

该公司有一种名为 WindTurbine1000 的风力涡轮机,可从中收集以下电气和机械指标:

  • 功率输出(单位 MW)
  • 电压
  • 每分钟旋转(单位 RPM)
  • 转子振动(单位 Hz)

该公司在北海和波罗的海设有多个风电场。对于每个风电场,应创建两个 assets。

北海风电场 波罗的海风电场
GPS 坐标 54.008333,6.598333 54.834,14.068
涡轮机 1 N-001 B-001
涡轮机 2 N-002 B-002

先决条件

  • 您具有 MindSphere 租户的访问权限
  • 您具有 mdsp:core:assetmanagement.admin 角色

准备模板

创建 Aspect 类型

应创建两个 aspect 类型,一个用于电气指标,另一个用于机械指标。为此可使用端点:

PUT /aspecttypes/{id}

对于电气指标的 aspect 类型,{id} 命名为 {tenantId}.ElectricalMetrics,请求文本为:

{
 "name":"ElectricalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Electrical metrics for wind turbines",
 "variables": [
 {
 "name":"PWR_OUT",
 "dataType":"DOUBLE",
 "unit":"MW",
 "qualityCode":true,
 "searchable" :true
 },
 {
 "name":"V_OUT",
 "dataType":"DOUBLE",
 "unit":"Volt",
 "qualityCode":true,
 "searchable" :true
 }
 ]
}

可以通过检查响应文本来验证结果:

{
 "id": "{tenantId}.ElectricalMetrics",
 "tenantId": "{tenantId}",
 "name":"ElectricalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Electrical metrics for wind turbines",
 "variables": [
 {
 "name":"PWR_OUT",
 "unit":"MW",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"DOUBLE",
 "length":null
 },
 {
 "name":"V_OUT",
 "unit":"Volt",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"DOUBLE",
 "length":null
 }
 ],
 "etag": {etagvalue},
 "_links": {
 "self": {
 "href": "{link}"
 }
 }
}

对于机械指标的 aspect 类型,{id} 命名为 {tenantId}.MechanicalMetrics,请求文本为:

{
 "name":"MechanicalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Mechanical metrics for wind turbines",
 "variables": [
 {
 "name":"V",
 "dataType":"INT",
 "unit":"RPM",
 "qualityCode":true,
 "searchable" :true
 },
 {
 "name":"VIB",
 "dataType":"INT",
 "unit":"Hz",
 "qualityCode":true,
 "searchable" :true
 }
 ]
}

可以通过检查响应文本来验证所创建的 aspect 类型:

{
 "id": "{tenantId}.MechanicalMetrics",
 "tenantId": "{tenantId}",
 "name":"MechanicalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Mechanical metrics for wind turbines",
 "variables": [
 {
 "name":"V",
 "unit":"RPM",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"INT",
 "length":null
 },
 {
 "name":"VIB",
 "unit":"Hz",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"INT",
 "length":null
 }
 ],
 "etag": {etagValue},
 "_links": {
 "self": {
 "href": "{link}"
 }
 }
}

创建 Asset Types

创建所需的 aspect 类型后,可使用以下端点创建 WindTurbine1000 的 asset type:

PUT /assettypes/{id}

此处,{id} 命名为 {tenantId}.WT1000,请求文本为:

{
 "name":"WindTurbine 1000",
 "description":"WindTurbine 1000 with best reliability.",
 "parentTypeId": "core.basicdevice",
 "instantiable":true,
 "scope": "private",
 "variables": [
 {
 "name":"InstallationDate",
 "dataType":"TIMESTAMP",
 "searchable":true,
 "defaultValue":"1970-01-01T09:00:00+00:00"
 }
 ],
 "aspects": [
 {
 "name":"ElectricalMetrics",
 "aspectTypeId": "{tenantId}.ElectricalMetrics"
 },
 {
 "name":"MechanicalMetrics",
 "aspectTypeId": "{tenantId}.MechanicalMetrics"
 }
 ]
}

可以通过检查响应文本来验证所创建的 asset type:

{
 "parentTypeId": "core.basicdevice",
 "instantiable":true,
 "tenantId": "{tenantId}",
 "name":"WindTurbine 1000",
 "description":"WindTurbine 1000 with best reliability.",
 "scope": "private",
 "variables": [
 {
 "name":"InstallationDate",
 "unit":null,
 "searchable":true,
 "defaultValue":"1970-01-01T09:00:00+00:00",
 "dataType":"TIMESTAMP",
 "length":null
 }
 ],
 "aspects": [
 {
 "name":"ElectricalMetrics",
 "aspectType": {
 "id": "{tenantId}.ElectricalMetrics",
 "tenantId": "{tenantId}",
 "name":"ElectricalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Electrical metrics for wind turbines",
 "variables": [
 {
 "name":"PWR_OUT",
 "unit":"MW",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"DOUBLE",
 "length":null
 },
 {
 "name":"V_OUT",
 "unit":"Volt",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"DOUBLE",
 "length":null
 }
 ],
 "etag": {etagValue},
 "_links": {
 "self": {
 "href": "{link}"
 }
 }
 }
 },
 {
 "name":"MechanicalMetrics",
 "aspectType": {
 "id": "{tenantId}.MechanicalMetrics",
 "tenantId": "{tenantId}",
 "name":"MechanicalMetrics",
 "category": "dynamic",
 "scope": "private",
 "description":"Mechanical metrics for wind turbines",
 "variables": [
 {
 "name":"V",
 "unit":"RPM",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"INT",
 "length":null
 },
 {
 "name":"VIB",
 "unit":"Hz",
 "searchable":true,
 "qualityCode":true,
 "defaultValue":null,
 "dataType":"INT",
 "length":null
 }
 ],
 "etag": {etagValue},
 "_links": {
 "self": {
 "href": "{link}"
 }
 }
 }
 }
 ],
 "fileAssignments": [],
 "etag": {etagValue},
 "_links": {
 "self": {
 "href": "{link}"
 },
 "parent": {
 "href": "{link}"
 }
 },
 "id": "{tenantId}.WT1000"
}

Assets 建模

创建 Asset 站点

为降低复杂性,为每个风电场创建 type 为 basic.site 的 asset。为此可使用以下端点:

POST /assets

对于北海的风电场,文本为:

{
 "name":"North Sea",
 "description":"Wind Farm North Sea",
 "location": {
 "longitude":54.008333,
 "latitude":6.598333
 },
 "typeId": "core.basicarea",
 "parentId": "{parentAssetId}",
 "timezone":"Europe/Berlin"
}

调用的响应结果包含新创建的北海站点 asset,因此您可以验证创建是否正确:

{
 "assetId": "{assetId}",
 "tenantId": "{tenantId}",
 "name":"North Sea",
 "etag": {etagValue},
 "externalId":null,
 "t2Tenant":null,
 "subTenant":null,
 "description":"Wind Farm North Sea",
 "timezone":"Europe/Berlin",
 "parentId": "{parentAssetId}",
 "typeId": "core.basicarea",
 "location": {
 "country":null,
 "region":null,
 "locality":null,
 "streetAddress":null,
 "postalCode":null,
 "longitude":54.008333,
 "latitude":6.598333
 },
 "fileAssignments": [],
 "variables": [],
 "aspects": [],
 "locks": [],
 "hierarchyPath": [
 {
 "assetId": "{assetId}",
 "name": "{tenantId}"
 }
 ],
 "deleted":null,
 "_links": {
 "self": {
 "href": "{link}"
 },
 "aspects": {
 "href": "{link}"
 },
 "variables": {
 "href": "{link}"
 },
 "location": {
 "href": "{link}"
 },
 "parent": {
 "href": "{link}"
 }
 }
}

{parentAssetId} 是根 asset。可使用以下端点请求其 ID:

GET /assets/root

对于波罗的海的风电场,文本为:

{
 "name":"Baltic Sea",
 "description":"Wind Farm Baltic Sea",
 "location": {
 "longitude":54.834,
 "latitude":14.068
 },
 "typeId": "core.basicarea",
 "parentId": "{parentAssetId}",
 "timezone":"Europe/Berlin"
}

调用的响应结果包含新创建的波罗的海站点 asset,因此您可以验证创建是否正确:

{
 "assetId": "{assetId}",
 "tenantId": "{tenantId}",
 "name":"Baltic Sea",
 "etag":0,
 "externalId":null,
 "t2Tenant":null,
 "subTenant":null,
 "description":"Wind Farm Baltic Sea",
 "timezone":"Europe/Berlin",
 "parentId": "{parentAssetId}",
 "typeId": "core.basicarea",
 "location": {
 "country":null,
 "region":null,
 "locality":null,
 "streetAddress":null,
 "postalCode":null,
 "longitude":54.834,
 "latitude":14.068
 },
 "fileAssignments": [],
 "variables": [],
 "aspects": [],
 "locks": [],
 "hierarchyPath": [
 {
 "assetId": "{parentAssetId}",
 "name": "{tenantId}"
 }
 ],
 "deleted":null,
 "_links": {
 "self": {
 "href": "{link}"
 },
 "aspects": {
 "href": "{link}"
 },
 "variables": {
 "href": "{link}"
 },
 "location": {
 "href": "{link}"
 },
 "parent": {
 "href": "{link}"
 }
 }
}

创建 Assets

设置 asset 站点后,可使用以下端点创建实际 assets:

POST /assets/

北海风电场的第一 asset 的文本为:

{
 "name":"N-001",
 "description":"Wind turbine 001 in North Sea",
 "variables": [
 {
 "name":"InstallationDate",
 "value":"2018-08-28T09:00:00+00:00"
 }
 ],
 "typeId": "{tenantId}.WT1000",
 "parentId": "{AssetIdNorthSea}"
}

{AssetIdNorthSea} 是北海站点 asset 的 asset ID。

调用的响应包含北海风电场新创建的 asset,因此您可以验证正确的创建:

{
 "assetId": "{assetId}",
 "tenantId": "{tenantId}",
 "name":"N-001",
 "etag": {etagValue},
 "externalId":null,
 "t2Tenant":null,
 "subTenant":null,
 "description":"Wind turbine 001 in North Sea",
 "timezone":"Europe/Berlin",
 "parentId": "{AssetIdNorthSea}",
 "typeId": "{tenantId}.WT1000",
 "location": {
 "country":null,
 "region":null,
 "locality":null,
 "streetAddress":null,
 "postalCode":null,
 "longitude":54.008333,
 "latitude":6.598333
 },
 "fileAssignments": [],
 "variables": [
 {
 "name":"InstallationDate",
 "value":"2018-08-28T09:00:00+00:00"
 }
 ],
 "aspects": [],
 "locks": [],
 "hierarchyPath": [
 {
 "assetId": "{rootAssetId}",
 "name": "{tenantId}"
 },
 {
 "assetId": "{AssetIdNorthSea}",
 "name":"North Sea"
 }
 ],
 "deleted":null,
 "_links": {
 "self": {
 "href": "{link}"
 },
 "aspects": {
 "href": "{link}"
 },
 "variables": {
 "href": "{link}"
 },
 "location": {
 "href": "{link}"
 },
 "parent": {
 "href": "{link}"
 }
 }
}

响应显示 asset 的 type variable InstallationDate 值设置为请求文本中的给定值。Asset type 定义的默认值已覆盖。
该 asset 已从北海站点 asset 继承了其位置。
该 asset 已实例化其 asset type WK1000 定义的 aspects,但 aspect 列表为空。这是因为其所有 aspects 都是动态的,如果 aspect 被定义为静态,则 aspect 列表仅在 asset 级别上填充。

创建其它三个 assets 的文本如下所示:

{
 "name":"N-002",
 "description":"Wind turbine 002 in North Sea",
 "variables": [
 {
 "name":"InstallationDate",
 "value":"2018-08-28T09:00:00+00:00"
 }
 ],
 "typeId": "{tenantId}.WT1000",
 "parentId": "{AssetIdNorthSea}"
}
{
 "name":"B-001",
 "description":"Wind turbine 001 in Baltic Sea",
 "variables": [
 {
 "name":"InstallationDate",
 "value":"2018-08-28T09:00:00+00:00"
 }
 ],
 "typeId": "{tenantId}.WT1000",
 "parentId": "{AssetIdNorthSea}"
}
{
 "name":"B-002",
 "description":"Wind turbine 002 in Baltic Sea",
 "variables": [
 {
 "name":"InstallationDate",
 "value":"2018-08-28T09:00:00+00:00"
 }
 ],
 "typeId": "{tenantId}.WT1000",
 "parentId": "{AssetIdNorthSea}"
}

注意

在此示例中,波罗的海风力涡轮机的 parentId 故意设置错误。下一部分基于此设置。

移动 assets

在上面给出的代码中,风力涡轮机 B-001B-002 是继承自北海 asset 站点,而不是波罗的海 asset 站点。这可以通过使用移动端点移动两个 assets 来更正:

POST /assets/{id}/move

该请求需要以下参数:

  • If-Match:必须设置为 asset 的 {etagValue}{etagValue} 在创建 asset 时设置为零,并在 asset 每次成功修改后递增。
  • id:必须设置为 asset 的 assetId。创建 asset 时,其会在响应中列出。
  • moveParameters
{
"newParentId": "{AssetIdBalticSea}"
}

{AssetIdBalticSea} 是波罗的海站点 asset 的 asset ID。执行移动操作后,B-001B-002 的位置是正确的。

提示

如果您忘记了单个 asset ID,则可通过调用以下端点来获取所有 assets 及其 ID 的列表:

GET /assets

您可以使用 filter 参数 缩小结果:

{"name":"Baltic Sea"}

还有问题?

向社区提问


除非另行声明,该网站内容遵循MindSphere开发许可协议.


Last update: July 11, 2019