8. Tag 服务
通过 client.tag() 访问。Tag 是数据点(传感器值、计数器、状态)的 定义(元数据)。在 V5 中,可通过 按标签页划分的 10 种 PATCH 安全地部分修改报警、聚合、计算等详细设置。
ID 规则:必须使用
TAG_前缀。详细内容请参考 域 ID 规则。
8.1 方法一览
CRUD
| 方法 | 返回类型 | HTTP | 端点 |
|---|---|---|---|
create(TagRequestV5) | TagResponseV5 或 null | POST | /api/v5/tag |
update(tag_id, TagRequestV5) | TagResponseV5 或 null | PUT | /api/v5/tag/{id} |
delete(tag_id) | boolean | DELETE | /api/v5/tag/{id} |
get(tag_id) | TagResponseV5 或 null | GET | /api/v5/tag/{id} |
exists(tag_id) | boolean | GET | /api/v5/tag/{id}/exists |
列表 / 计数
| 方法 | 返回类型 | HTTP | 端点 |
|---|---|---|---|
list() | List<TagResponseV5> | GET | /api/v5/tag |
listBySite(site_id) | List<TagResponseV5> | GET | /api/v5/tag?site_id=... |
listByOpc(opc_id) | List<TagResponseV5> | GET | /api/v5/tag?opc_id=... |
listByAsset(asset_id) | List<TagResponseV5> | GET | /api/v5/tag?asset_id=... |
count() | long | GET | /api/v5/tag/count |
countBySite(site_id) | long | GET | /api/v5/tag/count?site_id=... |
countByOpc(opc_id) | long | GET | /api/v5/tag/count?opc_id=... |
countByAsset(asset_id) | long | GET | /api/v5/tag/count?asset_id=... |
PATCH — 按标签页部分修改(V5 核心功能)
10 种 PATCH 遵循 null 字段 = 不变更 规则(由服务端 DAO 进行 COALESCE 处理)。部分 PATCH 还会在服务端自动执行 CEP/EQL 重新部署。
| 方法 | HTTP | 端点 | 附带效果 |
|---|---|---|---|
patchBasic(id, TagBasicPatchRequestV5) | PATCH | /api/v5/tag/{id}/basic | — |
patchAlarm(id, TagAlarmPatchRequestV5) | PATCH | /api/v5/tag/{id}/alarm | CEP/EQL 重新部署 |
patchMetadata(id, TagMetadataPatchRequestV5) | PATCH | /api/v5/tag/{id}/metadata | — |
patchCalculation(id, TagCalculationPatchRequestV5) | PATCH | /api/v5/tag/{id}/calculation | 重新调用 deployCalculation |
patchSampling(id, TagSamplingPatchRequestV5) | PATCH | /api/v5/tag/{id}/sampling | — |
patchAggregation(id, TagAggregationPatchRequestV5) | PATCH | /api/v5/tag/{id}/aggregation | 重新调用 deployAggregation |
patchAi(id, TagAiPatchRequestV5) | PATCH | /api/v5/tag/{id}/ai | — |
patchPublish(id, TagPublishPatchRequestV5) | PATCH | /api/v5/tag/{id}/publish | — |
patchAttribute(id, TagAttributePatchRequestV5) | PATCH | /api/v5/tag/{id}/attribute | — |
patchLink(id, TagLinkPatchRequestV5) | PATCH | /api/v5/tag/{id}/link | — |
8.2 TagRequestV5 / TagResponseV5(用于完整注册·修改)
| 字段 | 类型 | 说明 |
|---|---|---|
tag_id | String | 标签 ID(PK,必须为 TAG_) |
tag_name | String | 显示名称 |
opc_id | String | 所属 OPC(FK) |
site_id | String | 所属站点 |
linked_asset_id | String | 关联的资产(Equipment) |
java_type | String | 值数据类型 — Double、Float、Int、Long、Short、Boolean、String、Date |
unit | String | 单位(例:℃、RPM、kPa) |
tag_source | String | 数据来源(例:OPC、API、FILE) |
description | String | 说明 |
8.3 PATCH DTO 字段(按标签页)
TagBasicPatchRequestV5(基本)
| 字段 | 说明 |
|---|---|
tag_name | 显示名称 |
java_type | 数据类型 |
description | 说明 |
TagMetadataPatchRequestV5(元数据)
| 字段 | 说明 |
|---|---|
tag_type | 标签类型 |
importance | 重要度(1~10) |
tag_source | 来源 |
use_metric | 是否用作指标 |
rate | 采集周期(ms) |
rw | 读/写(R/W/RW) |
alias_name | 别名 |
min_value / max_value | 测量范围 |
display_format | UI 显示格式 |
unit | 单位 |
number_round / number_scale | 四舍五入 / 小数位 |
io_address / source_tag_name | I/O 地址·原始标签名 |
lat / lng | 经纬度 |
TagAlarmPatchRequestV5(报警)
| 字段 | 说明 |
|---|---|
trip_hi、hi_hi、hi、lo、lo_lo、trip_lo | 阈值(6 级) |
bool_true、bool_true_priority、bool_true_message | 布尔 TRUE 报警 |
bool_false、bool_false_priority、bool_false_message | 布尔 FALSE 报警 |
band_message | 正常区间消息 |
duplicate_check_minutes | 重复报警抑制分钟数 |
user_defined_alarm_class | 用户自定义类别 |
use_alarm | 启用报警(Y/N) |
recieve_me、recieve_others | 本人/他人接收 |
send_email、send_sms | 邮件/短信发送 |
TagCalculationPatchRequestV5(计算)
| 字段 | 说明 |
|---|---|
calculation_eql | EQL 表达式 |
use_calculation | 是否启用(Y/N) |
TagSamplingPatchRequestV5(采样)
| 字段 | 说明 |
|---|---|
use_sampling | 是否启用(Y/N) |
TagAggregationPatchRequestV5(聚合)
| 字段 | 说明 |
|---|---|
use_aggregation | 是否启用 |
aggregation_1_minutes ~ aggregation_1_hours | 5 种周期的启用标志 |
TagAiPatchRequestV5(AI 异常诊断)
| 字段 | 说明 |
|---|---|
use_target | 学习对象 |
use_category | 启用类别分类 |
TagPublishPatchRequestV5(发布)
| 字段 | 说明 |
|---|---|
publish_mqtt | MQTT 发布(Y/N) |
publish_kafka | Kafka 发布(Y/N) |
TagAttributePatchRequestV5(备注)
| 字段 | 说明 |
|---|---|
note | 自由格式备注 |
TagLinkPatchRequestV5(设备映射)
| 字段 | 说明 |
|---|---|
linked_asset_id | 关联资产 ID。空字符串 = 解除映射 |
8.4 使用示例
创建 Tag(OPC 连接标签)
import plantpulse.api.v5.dto.request.TagRequestV5;
import plantpulse.api.v5.dto.response.TagResponseV5;
TagRequestV5 req = new TagRequestV5();
req.setTag_id("TAG_EDGE_00303_90007");
req.setTag_name("Spindle RPM");
req.setOpc_id("OPC_EDGE_00303");
req.setSite_id("SITE_DJ");
req.setLinked_asset_id("ASSET_DJ_M_0001");
req.setJava_type("Double");
req.setUnit("RPM");
req.setTag_source("OPC");
req.setDescription("Spindle 회전수");
TagResponseV5 created = client.tag().create(req);
单条查询 / 存在性检查
TagResponseV5 tag = client.tag().get("TAG_EDGE_00303_90007");
if (tag != null) {
System.out.println(tag.getTag_name() + " (" + tag.getUnit() + ")");
}
boolean exists = client.tag().exists("TAG_EDGE_00303_90007");
按站点 / OPC / 资产的列表
List<TagResponseV5> siteTags = client.tag().listBySite("SITE_DJ");
List<TagResponseV5> opcTags = client.tag().listByOpc("OPC_PLC_L1_001");
List<TagResponseV5> assetTags = client.tag().listByAsset("ASSET_DJ_M_0001");
计数
long total = client.tag().count();
long siteTotal = client.tag().countBySite("SITE_DJ");
long opcTotal = client.tag().countByOpc("OPC_PLC_L1_001");
long assetTotal = client.tag().countByAsset("ASSET_DJ_M_0001");
全量修改(PUT)
重新发送全部字段时:
TagRequestV5 update = new TagRequestV5();
update.setTag_id("TAG_EDGE_00303_90007");
update.setTag_name("Spindle RPM (변경됨)");
update.setOpc_id("OPC_EDGE_00303");
update.setSite_id("SITE_DJ");
update.setJava_type("Double");
update.setUnit("RPM");
// ... 모든 필드 ...
client.tag().update("TAG_EDGE_00303_90007", update);
部分修改 — patchBasic
仅修改名称和说明:
import plantpulse.api.v5.dto.request.TagBasicPatchRequestV5;
TagBasicPatchRequestV5 patch = new TagBasicPatchRequestV5();
patch.setTag_name("Spindle RPM (보정 후)");
patch.setDescription("2026-05-14 보정 적용");
// java_type 은 null 로 두면 변경 안 함
client.tag().patchBasic("TAG_EDGE_00303_90007", patch);
部分修改 — patchAlarm
设置报警阈值(服务端会重新部署 CEP/EQL):
import plantpulse.api.v5.dto.request.TagAlarmPatchRequestV5;
TagAlarmPatchRequestV5 alarm = new TagAlarmPatchRequestV5();
alarm.setUse_alarm("Y");
alarm.setLo_lo("0");
alarm.setLo("10");
alarm.setHi("80");
alarm.setHi_hi("95");
alarm.setTrip_hi("100");
alarm.setDuplicate_check_minutes(5);
alarm.setSend_email("Y");
client.tag().patchAlarm("TAG_EDGE_00303_90007", alarm);
部分修改 — patchMetadata
修改别名和显示格式:
import plantpulse.api.v5.dto.request.TagMetadataPatchRequestV5;
TagMetadataPatchRequestV5 meta = new TagMetadataPatchRequestV5();
meta.setAlias_name("HMI_TAG_RPM_01");
meta.setDisplay_format("#,##0");
meta.setNumber_scale(0);
meta.setImportance(8);
client.tag().patchMetadata("TAG_EDGE_00303_90007", meta);
部分修改 — patchCalculation
附加 EQL 计算公式(服务端重新调用 deployCalculation):
import plantpulse.api.v5.dto.request.TagCalculationPatchRequestV5;
TagCalculationPatchRequestV5 calc = new TagCalculationPatchRequestV5();
calc.setUse_calculation("Y");
calc.setCalculation_eql("VAL('TAG_RAW_RPM') * 60 / 1000"); // 가상의 EQL
client.tag().patchCalculation("TAG_EDGE_00303_90007", calc);
部分修改 — patchAggregation
启用 5 种周期聚合(重新调用 deployAggregation):
import plantpulse.api.v5.dto.request.TagAggregationPatchRequestV5;
TagAggregationPatchRequestV5 agg = new TagAggregationPatchRequestV5();
agg.setUse_aggregation("Y");
agg.setAggregation_1_minutes("Y");
agg.setAggregation_5_minutes("Y");
agg.setAggregation_10_minutes("Y");
agg.setAggregation_30_minutes("N");
agg.setAggregation_1_hours("Y");
client.tag().patchAggregation("TAG_EDGE_00303_90007", agg);
部分修改 — patchPublish
MQTT/Kafka 发布开关:
import plantpulse.api.v5.dto.request.TagPublishPatchRequestV5;
TagPublishPatchRequestV5 pub = new TagPublishPatchRequestV5();
pub.setPublish_mqtt("Y");
pub.setPublish_kafka("N");
client.tag().patchPublish("TAG_EDGE_00303_90007", pub);
部分修改 — patchLink(资产映射)
import plantpulse.api.v5.dto.request.TagLinkPatchRequestV5;
// 자산에 연결
TagLinkPatchRequestV5 link = new TagLinkPatchRequestV5();
link.setLinked_asset_id("ASSET_DJ_M_0001");
client.tag().patchLink("TAG_EDGE_00303_90007", link);
// 매핑 해제 — 빈 문자열
TagLinkPatchRequestV5 unlink = new TagLinkPatchRequestV5();
unlink.setLinked_asset_id("");
client.tag().patchLink("TAG_EDGE_00303_90007", unlink);
删除
boolean ok = client.tag().delete("TAG_EDGE_00303_90007");
8.5 应用场景
场景 — 新产线标签自动分类后批量设置
// 1) 자동 등록된 태그 목록 (OPC 연결 직후)
List<TagResponseV5> tags = client.tag().listByOpc("OPC_PLC_L2_001");
// 2) 이름 패턴으로 자산 자동 연결 + 알람 일괄 설정
for (TagResponseV5 t : tags) {
String name = t.getTag_name();
// 자산 매핑
TagLinkPatchRequestV5 link = new TagLinkPatchRequestV5();
if (name.contains("CNC1")) {
link.setLinked_asset_id("ASSET_DJ_M_CNC1");
} else if (name.contains("CNC2")) {
link.setLinked_asset_id("ASSET_DJ_M_CNC2");
} else {
continue;
}
client.tag().patchLink(t.getTag_id(), link);
// 온도 태그는 알람 임계치 자동 설정
if (name.endsWith("_TEMP")) {
TagAlarmPatchRequestV5 alarm = new TagAlarmPatchRequestV5();
alarm.setUse_alarm("Y");
alarm.setHi("80");
alarm.setHi_hi("95");
client.tag().patchAlarm(t.getTag_id(), alarm);
}
}
场景 — 一次性启用聚合与发布
String tagId = "TAG_EDGE_00303_90007";
TagAggregationPatchRequestV5 agg = new TagAggregationPatchRequestV5();
agg.setUse_aggregation("Y");
agg.setAggregation_1_minutes("Y");
agg.setAggregation_1_hours("Y");
client.tag().patchAggregation(tagId, agg);
TagPublishPatchRequestV5 pub = new TagPublishPatchRequestV5();
pub.setPublish_mqtt("Y");
client.tag().patchPublish(tagId, pub);