@openscd/scl-lib 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCE +201 -0
- package/README.md +20 -0
- package/dist/foundation/codecomponents/nsds.d.ts +5 -0
- package/dist/foundation/codecomponents/nsds.js +22435 -0
- package/dist/foundation/codecomponents/nsds.js.map +1 -0
- package/dist/foundation/nsd.json +137748 -0
- package/dist/foundation/uniqueElementName.d.ts +2 -0
- package/dist/foundation/uniqueElementName.js +18 -0
- package/dist/foundation/uniqueElementName.js.map +1 -0
- package/dist/foundation/utils.d.ts +20 -0
- package/dist/foundation/utils.js +14 -0
- package/dist/foundation/utils.js.map +1 -0
- package/dist/generator/appIdGenerator.d.ts +21 -0
- package/dist/generator/appIdGenerator.js +53 -0
- package/dist/generator/appIdGenerator.js.map +1 -0
- package/dist/generator/lnInstGenerator.d.ts +16 -0
- package/dist/generator/lnInstGenerator.js +41 -0
- package/dist/generator/lnInstGenerator.js.map +1 -0
- package/dist/generator/macAddressGenerator.d.ts +14 -0
- package/dist/generator/macAddressGenerator.js +39 -0
- package/dist/generator/macAddressGenerator.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/tAddress/changeGseOrSmvAddress.d.ts +14 -0
- package/dist/tAddress/changeGseOrSmvAddress.js +43 -0
- package/dist/tAddress/changeGseOrSmvAddress.js.map +1 -0
- package/dist/tBaseElement/find.d.ts +6 -0
- package/dist/tBaseElement/find.js +529 -0
- package/dist/tBaseElement/find.js.map +1 -0
- package/dist/tBaseElement/getChildren.d.ts +5 -0
- package/dist/tBaseElement/getChildren.js +12 -0
- package/dist/tBaseElement/getChildren.js.map +1 -0
- package/dist/tBaseElement/getReference.d.ts +9 -0
- package/dist/tBaseElement/getReference.js +31 -0
- package/dist/tBaseElement/getReference.js.map +1 -0
- package/dist/tBaseElement/identity.d.ts +2 -0
- package/dist/tBaseElement/identity.js +566 -0
- package/dist/tBaseElement/identity.js.map +1 -0
- package/dist/tBaseElement/isPublic.d.ts +2 -0
- package/dist/tBaseElement/isPublic.js +5 -0
- package/dist/tBaseElement/isPublic.js.map +1 -0
- package/dist/tBaseElement/parentTags.d.ts +3 -0
- package/dist/tBaseElement/parentTags.js +8 -0
- package/dist/tBaseElement/parentTags.js.map +1 -0
- package/dist/tBaseElement/tags.d.ts +8 -0
- package/dist/tBaseElement/tags.js +807 -0
- package/dist/tBaseElement/tags.js.map +1 -0
- package/dist/tBay/updateBay.d.ts +5 -0
- package/dist/tBay/updateBay.js +81 -0
- package/dist/tBay/updateBay.js.map +1 -0
- package/dist/tControl/controlBlockGseOrSmv.d.ts +7 -0
- package/dist/tControl/controlBlockGseOrSmv.js +26 -0
- package/dist/tControl/controlBlockGseOrSmv.js.map +1 -0
- package/dist/tControl/controlBlockObjRef.d.ts +2 -0
- package/dist/tControl/controlBlockObjRef.js +14 -0
- package/dist/tControl/controlBlockObjRef.js.map +1 -0
- package/dist/tControl/controlBlocks.d.ts +2 -0
- package/dist/tControl/controlBlocks.js +9 -0
- package/dist/tControl/controlBlocks.js.map +1 -0
- package/dist/tControl/findControlSubscription.d.ts +2 -0
- package/dist/tControl/findControlSubscription.js +8 -0
- package/dist/tControl/findControlSubscription.js.map +1 -0
- package/dist/tControl/pathId.d.ts +1 -0
- package/dist/tControl/pathId.js +9 -0
- package/dist/tControl/pathId.js.map +1 -0
- package/dist/tControl/removeControlBlock.d.ts +14 -0
- package/dist/tControl/removeControlBlock.js +35 -0
- package/dist/tControl/removeControlBlock.js.map +1 -0
- package/dist/tControl/updateConfRev.d.ts +2 -0
- package/dist/tControl/updateConfRev.js +8 -0
- package/dist/tControl/updateConfRev.js.map +1 -0
- package/dist/tControl/updateDatSet.d.ts +6 -0
- package/dist/tControl/updateDatSet.js +22 -0
- package/dist/tControl/updateDatSet.js.map +1 -0
- package/dist/tControlWithIEDName/connctedAp.d.ts +2 -0
- package/dist/tControlWithIEDName/connctedAp.js +7 -0
- package/dist/tControlWithIEDName/connctedAp.js.map +1 -0
- package/dist/tDataSet/canAddDataSet.d.ts +4 -0
- package/dist/tDataSet/canAddDataSet.js +44 -0
- package/dist/tDataSet/canAddDataSet.js.map +1 -0
- package/dist/tDataSet/createDataSet.d.ts +9 -0
- package/dist/tDataSet/createDataSet.js +33 -0
- package/dist/tDataSet/createDataSet.js.map +1 -0
- package/dist/tDataSet/removeDataSet.d.ts +10 -0
- package/dist/tDataSet/removeDataSet.js +27 -0
- package/dist/tDataSet/removeDataSet.js.map +1 -0
- package/dist/tDataSet/updateDataSet.d.ts +7 -0
- package/dist/tDataSet/updateDataSet.js +28 -0
- package/dist/tDataSet/updateDataSet.js.map +1 -0
- package/dist/tDataTypeTemplates/foundation.d.ts +2 -0
- package/dist/tDataTypeTemplates/foundation.js +118 -0
- package/dist/tDataTypeTemplates/foundation.js.map +1 -0
- package/dist/tDataTypeTemplates/importLNodeType.d.ts +13 -0
- package/dist/tDataTypeTemplates/importLNodeType.js +88 -0
- package/dist/tDataTypeTemplates/importLNodeType.js.map +1 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.d.ts +20 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.js +187 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.js.map +1 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.d.ts +8 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.js +67 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.js.map +1 -0
- package/dist/tDataTypeTemplates/nsdToJson.d.ts +101 -0
- package/dist/tDataTypeTemplates/nsdToJson.js +433 -0
- package/dist/tDataTypeTemplates/nsdToJson.js.map +1 -0
- package/dist/tDataTypeTemplates/removeDataType.d.ts +12 -0
- package/dist/tDataTypeTemplates/removeDataType.js +62 -0
- package/dist/tDataTypeTemplates/removeDataType.js.map +1 -0
- package/dist/tDataTypeTemplates/updateLNodeType.d.ts +2 -0
- package/dist/tDataTypeTemplates/updateLNodeType.js +22 -0
- package/dist/tDataTypeTemplates/updateLNodeType.js.map +1 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.d.ts +16 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js +52 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js.map +1 -0
- package/dist/tExtRef/extRefTypeRestrictions.d.ts +17 -0
- package/dist/tExtRef/extRefTypeRestrictions.js +32 -0
- package/dist/tExtRef/extRefTypeRestrictions.js.map +1 -0
- package/dist/tExtRef/isSubscribed.d.ts +7 -0
- package/dist/tExtRef/isSubscribed.js +23 -0
- package/dist/tExtRef/isSubscribed.js.map +1 -0
- package/dist/tExtRef/matchDataAttributes.d.ts +2 -0
- package/dist/tExtRef/matchDataAttributes.js +13 -0
- package/dist/tExtRef/matchDataAttributes.js.map +1 -0
- package/dist/tExtRef/matchSrcAttributes.d.ts +2 -0
- package/dist/tExtRef/matchSrcAttributes.js +28 -0
- package/dist/tExtRef/matchSrcAttributes.js.map +1 -0
- package/dist/tExtRef/sourceControlBlock.d.ts +8 -0
- package/dist/tExtRef/sourceControlBlock.js +52 -0
- package/dist/tExtRef/sourceControlBlock.js.map +1 -0
- package/dist/tExtRef/subscribe.d.ts +47 -0
- package/dist/tExtRef/subscribe.js +187 -0
- package/dist/tExtRef/subscribe.js.map +1 -0
- package/dist/tExtRef/unsubscribe.d.ts +27 -0
- package/dist/tExtRef/unsubscribe.js +55 -0
- package/dist/tExtRef/unsubscribe.js.map +1 -0
- package/dist/tFCDA/canAddFCDA.d.ts +10 -0
- package/dist/tFCDA/canAddFCDA.js +42 -0
- package/dist/tFCDA/canAddFCDA.js.map +1 -0
- package/dist/tFCDA/fcdaBaseTypes.d.ts +11 -0
- package/dist/tFCDA/fcdaBaseTypes.js +56 -0
- package/dist/tFCDA/fcdaBaseTypes.js.map +1 -0
- package/dist/tFCDA/removeFCDA.d.ts +8 -0
- package/dist/tFCDA/removeFCDA.js +33 -0
- package/dist/tFCDA/removeFCDA.js.map +1 -0
- package/dist/tGSE/changeGSEContent.d.ts +17 -0
- package/dist/tGSE/changeGSEContent.js +53 -0
- package/dist/tGSE/changeGSEContent.js.map +1 -0
- package/dist/tGSE/createGSE.d.ts +20 -0
- package/dist/tGSE/createGSE.js +44 -0
- package/dist/tGSE/createGSE.js.map +1 -0
- package/dist/tGSEControl/canAddGSEControl.d.ts +4 -0
- package/dist/tGSEControl/canAddGSEControl.js +27 -0
- package/dist/tGSEControl/canAddGSEControl.js.map +1 -0
- package/dist/tGSEControl/createGSEControl.d.ts +49 -0
- package/dist/tGSEControl/createGSEControl.js +65 -0
- package/dist/tGSEControl/createGSEControl.js.map +1 -0
- package/dist/tGSEControl/updateGSEControl.d.ts +15 -0
- package/dist/tGSEControl/updateGSEControl.js +61 -0
- package/dist/tGSEControl/updateGSEControl.js.map +1 -0
- package/dist/tIED/insertIED.d.ts +13 -0
- package/dist/tIED/insertIED.js +245 -0
- package/dist/tIED/insertIED.js.map +1 -0
- package/dist/tIED/removeIED.d.ts +14 -0
- package/dist/tIED/removeIED.js +70 -0
- package/dist/tIED/removeIED.js.map +1 -0
- package/dist/tIED/updateIED.d.ts +17 -0
- package/dist/tIED/updateIED.js +185 -0
- package/dist/tIED/updateIED.js.map +1 -0
- package/dist/tInputs/removeInputs.d.ts +7 -0
- package/dist/tInputs/removeInputs.js +25 -0
- package/dist/tInputs/removeInputs.js.map +1 -0
- package/dist/tLN/removeSubscriptionSupervision.d.ts +7 -0
- package/dist/tLN/removeSubscriptionSupervision.js +94 -0
- package/dist/tLN/removeSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.d.ts +13 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js +116 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/createSupervisionEdit.d.ts +20 -0
- package/dist/tLN/supervision/createSupervisionEdit.js +129 -0
- package/dist/tLN/supervision/createSupervisionEdit.js.map +1 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.d.ts +10 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js +13 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js.map +1 -0
- package/dist/tLN/supervision/foundation.d.ts +37 -0
- package/dist/tLN/supervision/foundation.js +43 -0
- package/dist/tLN/supervision/foundation.js.map +1 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.d.ts +11 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.js +98 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.js.map +1 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.d.ts +10 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.js +36 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/removeSupervision.d.ts +7 -0
- package/dist/tLN/supervision/removeSupervision.js +39 -0
- package/dist/tLN/supervision/removeSupervision.js.map +1 -0
- package/dist/tReportControl/canAddReportControl.d.ts +11 -0
- package/dist/tReportControl/canAddReportControl.js +24 -0
- package/dist/tReportControl/canAddReportControl.js.map +1 -0
- package/dist/tReportControl/createReportControl.d.ts +68 -0
- package/dist/tReportControl/createReportControl.js +78 -0
- package/dist/tReportControl/createReportControl.js.map +1 -0
- package/dist/tReportControl/numberReportControlInstances.d.ts +5 -0
- package/dist/tReportControl/numberReportControlInstances.js +19 -0
- package/dist/tReportControl/numberReportControlInstances.js.map +1 -0
- package/dist/tReportControl/updateReportControl.d.ts +5 -0
- package/dist/tReportControl/updateReportControl.js +24 -0
- package/dist/tReportControl/updateReportControl.js.map +1 -0
- package/dist/tSMV/changeSMVContent.d.ts +3 -0
- package/dist/tSMV/changeSMVContent.js +5 -0
- package/dist/tSMV/changeSMVContent.js.map +1 -0
- package/dist/tSMV/createSMV.d.ts +16 -0
- package/dist/tSMV/createSMV.js +32 -0
- package/dist/tSMV/createSMV.js.map +1 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.d.ts +4 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.js +27 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.js.map +1 -0
- package/dist/tSampledValueControl/createSampledValueControl.d.ts +66 -0
- package/dist/tSampledValueControl/createSampledValueControl.js +74 -0
- package/dist/tSampledValueControl/createSampledValueControl.js.map +1 -0
- package/dist/tSampledValueControl/updateSampledValueControl.d.ts +14 -0
- package/dist/tSampledValueControl/updateSampledValueControl.js +60 -0
- package/dist/tSampledValueControl/updateSampledValueControl.js.map +1 -0
- package/dist/tServices/tConfReportControl/maxReportControl.d.ts +9 -0
- package/dist/tServices/tConfReportControl/maxReportControl.js +14 -0
- package/dist/tServices/tConfReportControl/maxReportControl.js.map +1 -0
- package/dist/tSubstation/removeProcessElement.d.ts +9 -0
- package/dist/tSubstation/removeProcessElement.js +50 -0
- package/dist/tSubstation/removeProcessElement.js.map +1 -0
- package/dist/tSubstation/updateLnType.d.ts +8 -0
- package/dist/tSubstation/updateLnType.js +96 -0
- package/dist/tSubstation/updateLnType.js.map +1 -0
- package/dist/tSubstation/updateSubstation.d.ts +5 -0
- package/dist/tSubstation/updateSubstation.js +75 -0
- package/dist/tSubstation/updateSubstation.js.map +1 -0
- package/dist/tVoltageLevel/updateVoltageLevel.d.ts +5 -0
- package/dist/tVoltageLevel/updateVoltageLevel.js +83 -0
- package/dist/tVoltageLevel/updateVoltageLevel.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
function dataAttributeSpecification(anyLn, doName, daName) {
|
|
2
|
+
const doc = anyLn.ownerDocument;
|
|
3
|
+
const lNodeType = doc.querySelector(`:root > DataTypeTemplates > LNodeType[id="${anyLn.getAttribute("lnType")}"]`);
|
|
4
|
+
const doNames = doName.split(".");
|
|
5
|
+
let leaf = lNodeType;
|
|
6
|
+
for (const doName of doNames) {
|
|
7
|
+
const dO = leaf?.querySelector(`DO[name="${doName}"], SDO[name="${doName}"]`);
|
|
8
|
+
leaf = doc.querySelector(`:root > DataTypeTemplates > DOType[id="${dO?.getAttribute("type")}"]`);
|
|
9
|
+
}
|
|
10
|
+
const cdc = leaf?.getAttribute("cdc");
|
|
11
|
+
if (!cdc)
|
|
12
|
+
return;
|
|
13
|
+
if (!daName)
|
|
14
|
+
return { cdc };
|
|
15
|
+
const daNames = daName.split(".");
|
|
16
|
+
for (const daName of daNames) {
|
|
17
|
+
const dA = leaf?.querySelector(`DA[name="${daName}"], BDA[name="${daName}"]`);
|
|
18
|
+
leaf =
|
|
19
|
+
daNames.indexOf(daName) < daNames.length - 1
|
|
20
|
+
? doc.querySelector(`:root > DataTypeTemplates > DAType[id="${dA?.getAttribute("type")}"]`)
|
|
21
|
+
: dA;
|
|
22
|
+
}
|
|
23
|
+
const bType = leaf?.getAttribute("bType");
|
|
24
|
+
if (!bType)
|
|
25
|
+
return;
|
|
26
|
+
return { cdc, bType };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Determines common data class (CDC) of a given `doName` and with present
|
|
30
|
+
* `daName` its `bType`.
|
|
31
|
+
* @param fcda - The `FCDA` element to determine the `cdc` and `bType` for
|
|
32
|
+
* @returns An object that contains the `cdc` and `bType` with given `daName`
|
|
33
|
+
* or undefined if one of them cannot be determined
|
|
34
|
+
*/
|
|
35
|
+
export function fcdaBaseTypes(fcda) {
|
|
36
|
+
const sourceIed = fcda.closest("IED");
|
|
37
|
+
const [ldInst, prefix, lnClass, lnInst, doName, daName] = [
|
|
38
|
+
"ldInst",
|
|
39
|
+
"prefix",
|
|
40
|
+
"lnClass",
|
|
41
|
+
"lnInst",
|
|
42
|
+
"doName",
|
|
43
|
+
"daName",
|
|
44
|
+
].map((attr) => fcda.getAttribute(attr));
|
|
45
|
+
if (!sourceIed || !ldInst || !lnClass || !doName)
|
|
46
|
+
return;
|
|
47
|
+
const anyLn = Array.from(sourceIed.querySelectorAll(`LDevice[inst="${ldInst}"] > LN, LDevice[inst="${ldInst}"] > LN0`)).find((anyLn) => {
|
|
48
|
+
return ((anyLn.getAttribute("prefix") ?? "") === (prefix ?? "") &&
|
|
49
|
+
anyLn.getAttribute("lnClass") === lnClass &&
|
|
50
|
+
anyLn.getAttribute("inst") === (lnInst ?? ""));
|
|
51
|
+
});
|
|
52
|
+
if (!anyLn)
|
|
53
|
+
return;
|
|
54
|
+
return dataAttributeSpecification(anyLn, doName, daName);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=fcdaBaseTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fcdaBaseTypes.js","sourceRoot":"","sources":["../../tFCDA/fcdaBaseTypes.ts"],"names":[],"mappings":"AAAA,SAAS,0BAA0B,CACjC,KAAc,EACd,MAAc,EACd,MAAqB;IAErB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CACjC,6CAA6C,KAAK,CAAC,YAAY,CAC7D,QAAQ,CACT,IAAI,CACN,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,GAA+B,SAAS,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,EAAE,GAA+B,IAAI,EAAE,aAAa,CACxD,YAAY,MAAM,iBAAiB,MAAM,IAAI,CAC9C,CAAC;QACF,IAAI,GAAG,GAAG,CAAC,aAAa,CACtB,0CAA0C,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CACvE,CAAC;KACH;IACD,MAAM,GAAG,GAAG,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,EAAE,GAA+B,IAAI,EAAE,aAAa,CACxD,YAAY,MAAM,iBAAiB,MAAM,IAAI,CAC9C,CAAC;QACF,IAAI;YACF,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC1C,CAAC,CAAC,GAAG,CAAC,aAAa,CACf,0CAA0C,EAAE,EAAE,YAAY,CACxD,MAAM,CACP,IAAI,CACN;gBACH,CAAC,CAAC,EAAE,CAAC;KACV;IACD,MAAM,KAAK,GAAG,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAa;IAEb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QACxD,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,QAAQ;KACT,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO;IAEzD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,SAAS,CAAC,gBAAgB,CACxB,iBAAiB,MAAM,0BAA0B,MAAM,UAAU,CAClE,CACF,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CACL,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YACvD,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,OAAO;YACzC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,OAAO,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Remove } from "@openscd/oscd-api";
|
|
2
|
+
import { SetAttributes } from "@openscd/oscd-api";
|
|
3
|
+
export declare function fCDAsSubscription(fcda: Element): Element[];
|
|
4
|
+
/** Utility function to remove `FCDA` element that checks for possible
|
|
5
|
+
* subscription that need to be updated or removed as well.
|
|
6
|
+
* @param remove - remove edit (remove.node must be FCDA)
|
|
7
|
+
* @returns Edit array removing FCDA and its subscriber information */
|
|
8
|
+
export declare function removeFCDA(remove: Remove): (SetAttributes | Remove)[];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { controlBlocks } from "../tControl/controlBlocks.js";
|
|
2
|
+
import { matchDataAttributes } from "../tExtRef/matchDataAttributes.js";
|
|
3
|
+
import { matchSrcAttributes } from "../tExtRef/matchSrcAttributes.js";
|
|
4
|
+
import { unsubscribe } from "../tExtRef/unsubscribe.js";
|
|
5
|
+
export function fCDAsSubscription(fcda) {
|
|
6
|
+
const doc = fcda.ownerDocument;
|
|
7
|
+
const iedName = fcda.closest("IED")?.getAttribute("name");
|
|
8
|
+
if (!iedName)
|
|
9
|
+
return [];
|
|
10
|
+
const isEd1 = !fcda.ownerDocument
|
|
11
|
+
.querySelector("SCL")
|
|
12
|
+
?.getAttribute("version");
|
|
13
|
+
if (isEd1)
|
|
14
|
+
return Array.from(doc.querySelectorAll(`:root>IED>AccessPoint>Server>LDevice>LN0>Inputs>ExtRef[iedName="${iedName}"],
|
|
15
|
+
:root>IED>AccessPoint>Server>LDevice>LN>Inputs>ExtRef[iedName="${iedName}"]`)).filter((extRef) => matchDataAttributes(extRef, fcda));
|
|
16
|
+
return controlBlocks(fcda).flatMap((controlBlock) => Array.from(doc.querySelectorAll(`:root>IED>AccessPoint>Server>LDevice>LN0>Inputs>ExtRef[iedName="${iedName}"],
|
|
17
|
+
:root>IED>AccessPoint>Server>LDevice>LN>Inputs>ExtRef[iedName="${iedName}"]`)).filter((extRef) => matchDataAttributes(extRef, fcda) &&
|
|
18
|
+
matchSrcAttributes(extRef, controlBlock)));
|
|
19
|
+
}
|
|
20
|
+
/** Utility function to remove `FCDA` element that checks for possible
|
|
21
|
+
* subscription that need to be updated or removed as well.
|
|
22
|
+
* @param remove - remove edit (remove.node must be FCDA)
|
|
23
|
+
* @returns Edit array removing FCDA and its subscriber information */
|
|
24
|
+
export function removeFCDA(remove) {
|
|
25
|
+
if (remove.node.tagName !== "FCDA")
|
|
26
|
+
return [];
|
|
27
|
+
const fcda = remove.node;
|
|
28
|
+
const removeActionFcda = [remove];
|
|
29
|
+
const extRefActions = [];
|
|
30
|
+
extRefActions.push(...unsubscribe(fCDAsSubscription(fcda)));
|
|
31
|
+
return removeActionFcda.concat(extRefActions);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=removeFCDA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeFCDA.js","sourceRoot":"","sources":["../../tFCDA/removeFCDA.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa;SAC9B,aAAa,CAAC,KAAK,CAAC;QACrB,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAE5B,IAAI,KAAK;QACP,OAAO,KAAK,CAAC,IAAI,CACf,GAAG,CAAC,gBAAgB,CAClB,mEAAmE,OAAO;yEACT,OAAO,IAAI,CAC7E,CACF,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAClD,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,gBAAgB,CAClB,mEAAmE,OAAO;yEACT,OAAO,IAAI,CAC7E,CACF,CAAC,MAAM,CACN,CAAC,MAAM,EAAE,EAAE,CACT,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;QACjC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAC3C,CACF,CAAC;AACJ,CAAC;AAED;;;sEAGsE;AACtE,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAK,MAAM,CAAC,IAAgB,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAe,CAAC;IAEpC,MAAM,gBAAgB,GAA+B,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5D,OAAO,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Insert, Remove } from "@openscd/oscd-api";
|
|
2
|
+
import { ChangeGseOrSmvAddressOptions } from "../tAddress/changeGseOrSmvAddress.js";
|
|
3
|
+
export type ChangeGseTimeOptions = {
|
|
4
|
+
MinTime?: string;
|
|
5
|
+
MaxTime?: string;
|
|
6
|
+
};
|
|
7
|
+
export type ChangeGSEContentOptions = {
|
|
8
|
+
address?: ChangeGseOrSmvAddressOptions;
|
|
9
|
+
timing?: ChangeGseTimeOptions;
|
|
10
|
+
};
|
|
11
|
+
/** Utility function to change the content of the element `GSE`
|
|
12
|
+
* including the child `Address` and the children `MinTime`/`MaxTime`
|
|
13
|
+
* @param element - the element to be updated
|
|
14
|
+
* @param options - the requested changes
|
|
15
|
+
* @returns Edit array updating GSEs children Address, MinTine and MaxTime
|
|
16
|
+
* */
|
|
17
|
+
export declare function changeGSEContent(element: Element, options: ChangeGSEContentOptions): (Insert | Remove)[];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createElement } from "../foundation/utils.js";
|
|
2
|
+
import { getReference } from "../tBaseElement/getReference.js";
|
|
3
|
+
import { changeGseOrSmvAddress, } from "../tAddress/changeGseOrSmvAddress.js";
|
|
4
|
+
function changeGseTiming(gSE, options) {
|
|
5
|
+
const edits = [];
|
|
6
|
+
const oldMinTime = gSE.querySelector("MinTime");
|
|
7
|
+
const oldMaxTime = gSE.querySelector("MaxTime");
|
|
8
|
+
if (options.MinTime) {
|
|
9
|
+
const newMinTime = createElement(gSE.ownerDocument, "MinTime", {
|
|
10
|
+
unit: "s",
|
|
11
|
+
multiplier: "m",
|
|
12
|
+
});
|
|
13
|
+
newMinTime.textContent = options.MinTime;
|
|
14
|
+
edits.push({
|
|
15
|
+
parent: gSE,
|
|
16
|
+
node: newMinTime,
|
|
17
|
+
reference: getReference(gSE, "MinTime"),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (oldMinTime)
|
|
21
|
+
edits.push({ node: oldMinTime });
|
|
22
|
+
if (options.MaxTime) {
|
|
23
|
+
const newMaxTime = createElement(gSE.ownerDocument, "MaxTime", {
|
|
24
|
+
unit: "s",
|
|
25
|
+
multiplier: "m",
|
|
26
|
+
});
|
|
27
|
+
newMaxTime.textContent = options.MaxTime;
|
|
28
|
+
edits.push({
|
|
29
|
+
parent: gSE,
|
|
30
|
+
node: newMaxTime,
|
|
31
|
+
reference: getReference(gSE, "MaxTime"),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (oldMaxTime)
|
|
35
|
+
edits.push({ node: oldMaxTime });
|
|
36
|
+
return edits;
|
|
37
|
+
}
|
|
38
|
+
/** Utility function to change the content of the element `GSE`
|
|
39
|
+
* including the child `Address` and the children `MinTime`/`MaxTime`
|
|
40
|
+
* @param element - the element to be updated
|
|
41
|
+
* @param options - the requested changes
|
|
42
|
+
* @returns Edit array updating GSEs children Address, MinTine and MaxTime
|
|
43
|
+
* */
|
|
44
|
+
export function changeGSEContent(element, options) {
|
|
45
|
+
const addressEdits = options.address
|
|
46
|
+
? changeGseOrSmvAddress(element, options.address)
|
|
47
|
+
: [];
|
|
48
|
+
const timeEdits = options.timing
|
|
49
|
+
? changeGseTiming(element, options.timing)
|
|
50
|
+
: [];
|
|
51
|
+
return addressEdits.concat(timeEdits);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=changeGSEContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeGSEContent.js","sourceRoot":"","sources":["../../tGSE/changeGSEContent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAEL,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAS9C,SAAS,eAAe,CACtB,GAAY,EACZ,OAA6B;IAE7B,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE;YAC7D,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;SACxC,CAAC,CAAC;KACJ;IACD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE;YAC7D,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;SACxC,CAAC,CAAC;KACJ;IACD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;KAKK;AACL,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,OAAgC;IAEhC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;QAClC,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;QAC9B,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Insert } from "@openscd/oscd-api";
|
|
2
|
+
export type CreateGSEOptions = {
|
|
3
|
+
/** MAC-Address within `P` element in the `GSE` element */
|
|
4
|
+
mac?: string;
|
|
5
|
+
/** APPID within `P` element in the `GSE` element */
|
|
6
|
+
appId?: string;
|
|
7
|
+
/** VLAN-ID within `P` element in the `GSE` element */
|
|
8
|
+
vlanId?: string;
|
|
9
|
+
/** VLAN-PRIORITY within `P` element in the `GSE` element */
|
|
10
|
+
vlanPriority?: string;
|
|
11
|
+
/** MaxTime element within `GSE` element */
|
|
12
|
+
MaxTime?: string;
|
|
13
|
+
/** MinTime element within `GSE` element */
|
|
14
|
+
MinTime?: string;
|
|
15
|
+
};
|
|
16
|
+
/** @returns Edit inserting new `GSE` to [[`parent`]] ConnectedAP element */
|
|
17
|
+
export declare function createGSE(parent: Element, attributes: {
|
|
18
|
+
ldInst: string;
|
|
19
|
+
cbName: string;
|
|
20
|
+
}, options?: CreateGSEOptions): Insert | null;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createElement } from "../foundation/utils.js";
|
|
2
|
+
import { macAddressGenerator } from "../generator/macAddressGenerator.js";
|
|
3
|
+
import { appIdGenerator } from "../generator/appIdGenerator.js";
|
|
4
|
+
import { getReference } from "../tBaseElement/getReference.js";
|
|
5
|
+
/** @returns Edit inserting new `GSE` to [[`parent`]] ConnectedAP element */
|
|
6
|
+
export function createGSE(parent, attributes, options = {}) {
|
|
7
|
+
if (parent.tagName !== "ConnectedAP")
|
|
8
|
+
return null;
|
|
9
|
+
const doc = parent.ownerDocument;
|
|
10
|
+
const gSE = createElement(doc, "GSE", attributes);
|
|
11
|
+
const address = createElement(doc, "Address", {});
|
|
12
|
+
gSE.appendChild(address);
|
|
13
|
+
const pTypes = {};
|
|
14
|
+
pTypes["MAC-Address"] = options.mac ?? macAddressGenerator(doc, "GSE")();
|
|
15
|
+
pTypes.APPID = options.appId ?? appIdGenerator(doc, "GSE")();
|
|
16
|
+
pTypes["VLAN-ID"] = options.vlanId ?? "000";
|
|
17
|
+
pTypes["VLAN-PRIORITY"] = options.vlanPriority ?? "4";
|
|
18
|
+
Object.entries(pTypes)
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
20
|
+
.filter(([_, value]) => value !== undefined)
|
|
21
|
+
.forEach(([type, value]) => {
|
|
22
|
+
const child = createElement(doc, "P", { type });
|
|
23
|
+
child.textContent = value;
|
|
24
|
+
address.appendChild(child);
|
|
25
|
+
});
|
|
26
|
+
const newMinTime = createElement(doc, "MinTime", {
|
|
27
|
+
unit: "s",
|
|
28
|
+
multiplier: "m",
|
|
29
|
+
});
|
|
30
|
+
newMinTime.textContent = options.MinTime ?? "10";
|
|
31
|
+
gSE.appendChild(newMinTime);
|
|
32
|
+
const newMaxTime = createElement(doc, "MaxTime", {
|
|
33
|
+
unit: "s",
|
|
34
|
+
multiplier: "m",
|
|
35
|
+
});
|
|
36
|
+
newMaxTime.textContent = options.MaxTime ?? "10000";
|
|
37
|
+
gSE.appendChild(newMaxTime);
|
|
38
|
+
return {
|
|
39
|
+
parent,
|
|
40
|
+
node: gSE,
|
|
41
|
+
reference: getReference(parent, "GSE"),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=createGSE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGSE.js","sourceRoot":"","sources":["../../tGSE/createGSE.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAiB/D,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CACvB,MAAe,EACf,UAA8C,EAC9C,UAA4B,EAAE;IAE9B,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;IAEjC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAG,CAAC;IAC1E,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAAG,CAAC;IAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,6DAA6D;SAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC3C,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,WAAW,GAAG,KAAM,CAAC;QAE3B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;QAC/C,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACjD,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;QAC/C,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IACpD,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5B,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function maxGSEControl(parent) {
|
|
2
|
+
{
|
|
3
|
+
const selector = `:scope > Services > GOOSE`;
|
|
4
|
+
const apGOOSE = parent.closest("AccessPoint")?.querySelector(selector);
|
|
5
|
+
if (apGOOSE)
|
|
6
|
+
return {
|
|
7
|
+
max: parseInt(apGOOSE.getAttribute("max") ?? "0", 10),
|
|
8
|
+
scope: "AccessPoint",
|
|
9
|
+
};
|
|
10
|
+
const iedGOOSE = parent.closest("IED")?.querySelector(selector);
|
|
11
|
+
return {
|
|
12
|
+
max: parseInt(iedGOOSE?.getAttribute("max") ?? "0", 10),
|
|
13
|
+
scope: "IED",
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Checks Services>GOOSE AccessPoint or on IED if the first is not present
|
|
18
|
+
* @param parent - parent `LN0`
|
|
19
|
+
* @returns Whether new `GSEControl` is exceeding GOOSE.max attribute */
|
|
20
|
+
export function canAddGSEControl(ln0) {
|
|
21
|
+
const { max, scope } = maxGSEControl(ln0);
|
|
22
|
+
const existingGseControls = Array.from(ln0
|
|
23
|
+
.closest(scope)
|
|
24
|
+
?.querySelectorAll(":scope Server > LDevice > LN0 > GSEControl") ?? []).length;
|
|
25
|
+
return max > existingGseControls;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=canAddGSEControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canAddGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/canAddGSEControl.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,MAAe;IACpC;QACE,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,OAAO;YACT,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;gBACrD,KAAK,EAAE,aAAa;aACrB,CAAC;QAEJ,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;YACvD,KAAK,EAAE,KAAK;SACb,CAAC;KACH;AACH,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAE1C,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;QACf,EAAE,gBAAgB,CAAC,4CAA4C,CAAC,IAAI,EAAE,CACzE,CAAC,MAAM,CAAC;IAET,OAAO,GAAG,GAAG,mBAAmB,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Insert } from "@openscd/oscd-api";
|
|
2
|
+
export type CreateGSEControlOptions = {
|
|
3
|
+
gseControl?: {
|
|
4
|
+
/** `GSEControl` name. Must be unique.
|
|
5
|
+
* When missing a unique name starting with `newGSEControl_xx` is set */
|
|
6
|
+
name?: string;
|
|
7
|
+
desc?: string | null;
|
|
8
|
+
/** Id for the new GSEControl. Default is IED.name/LDevice.inst/LLN0/GSEControl.name */
|
|
9
|
+
appID?: string;
|
|
10
|
+
/** Whether the GSEControl is of type 'GOOSE' or 'GSSE'. Default 'GOOSE' */
|
|
11
|
+
type?: "GOOSE" | "GSSE";
|
|
12
|
+
/** Whether GOOSE is coded with fixed offsets. Default is false */
|
|
13
|
+
fixedOffs?: "true" | "false";
|
|
14
|
+
/** Security option for the GSEControl acc IEC 62132. Defaults to null */
|
|
15
|
+
securityEnable?: "SignatureAndEncryption" | "Signature" | "None" | null;
|
|
16
|
+
/** Reference to an existing `DataSet` */
|
|
17
|
+
datSet?: string | null;
|
|
18
|
+
/**User-defined configuration revision (confRev). Overwrites
|
|
19
|
+
*logic to to set confRev acc. to IEC 61850.*/
|
|
20
|
+
confRev?: string | null;
|
|
21
|
+
};
|
|
22
|
+
gse?: {
|
|
23
|
+
/** The AccessPoint that shall publish the GOOSE. Default the AccessPoint holding the Server element */
|
|
24
|
+
apName?: string;
|
|
25
|
+
/** MAC-Address within `P` element in the `GSE` element */
|
|
26
|
+
mac?: string;
|
|
27
|
+
/** APPID within `P` element in the `GSE` element */
|
|
28
|
+
appId?: string;
|
|
29
|
+
/** VLAN-ID within `P` element in the `GSE` element */
|
|
30
|
+
vlanId?: string;
|
|
31
|
+
/** VLAN-PRIORITY within `P` element in the `GSE` element */
|
|
32
|
+
vlanPriority?: string;
|
|
33
|
+
/** MaxTime element within `GSE` element */
|
|
34
|
+
MaxTime?: string;
|
|
35
|
+
/** MinTime element within `GSE` element */
|
|
36
|
+
MinTime?: string;
|
|
37
|
+
};
|
|
38
|
+
/** If true, skips check for unique GSEControl name,
|
|
39
|
+
* whether `datSet` is pointing to valid `DataSet`
|
|
40
|
+
* and whether additional GSEControl is allowed in IED/AccessPoint. */
|
|
41
|
+
skipCheck?: boolean;
|
|
42
|
+
};
|
|
43
|
+
/** Utility function to create schema valid `GSEControl` and `GSE` elements
|
|
44
|
+
* @parent Parent element such as `LN0`, `LDevice`, `AccessPoint` and `IED`
|
|
45
|
+
* @options Configuration for GSEControl/GSE element
|
|
46
|
+
* @returns Edit inserting new `GSEControl` to [[`parent`]] element and when possible
|
|
47
|
+
* `GSE` to connected `ConnectedAP`
|
|
48
|
+
* */
|
|
49
|
+
export declare function createGSEControl(parent: Element, options?: CreateGSEControlOptions): Insert[];
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createElement } from "../foundation/utils.js";
|
|
2
|
+
import { getReference } from "../tBaseElement/getReference.js";
|
|
3
|
+
import { connectedAp } from "../tControlWithIEDName/connctedAp.js";
|
|
4
|
+
import { pathId } from "../tControl/pathId.js";
|
|
5
|
+
import { uniqueElementName } from "../foundation/uniqueElementName.js";
|
|
6
|
+
import { canAddGSEControl } from "./canAddGSEControl.js";
|
|
7
|
+
import { createGSE } from "../tGSE/createGSE.js";
|
|
8
|
+
function invalidGSEControl(ln0, name, datSet) {
|
|
9
|
+
const uniqueName = name
|
|
10
|
+
? !ln0.querySelector(`:scope > GSEControl[name="${name}"]`)
|
|
11
|
+
: true;
|
|
12
|
+
const validDataSet = datSet
|
|
13
|
+
? !!ln0.querySelector(`:scope > DataSet[name="${datSet}"]`)
|
|
14
|
+
: true;
|
|
15
|
+
return !(uniqueName && validDataSet && canAddGSEControl(ln0));
|
|
16
|
+
}
|
|
17
|
+
/** Utility function to create schema valid `GSEControl` and `GSE` elements
|
|
18
|
+
* @parent Parent element such as `LN0`, `LDevice`, `AccessPoint` and `IED`
|
|
19
|
+
* @options Configuration for GSEControl/GSE element
|
|
20
|
+
* @returns Edit inserting new `GSEControl` to [[`parent`]] element and when possible
|
|
21
|
+
* `GSE` to connected `ConnectedAP`
|
|
22
|
+
* */
|
|
23
|
+
export function createGSEControl(parent, options = { gseControl: {}, gse: {} }) {
|
|
24
|
+
const ln0 = parent.tagName === "LN0" ? parent : parent.querySelector("LN0");
|
|
25
|
+
if (!ln0)
|
|
26
|
+
return [];
|
|
27
|
+
const name = options.gseControl?.name;
|
|
28
|
+
const datSet = options.gseControl?.datSet;
|
|
29
|
+
if (!options.skipCheck && invalidGSEControl(ln0, name, datSet))
|
|
30
|
+
return [];
|
|
31
|
+
const attributes = { ...options.gseControl };
|
|
32
|
+
const cbName = name ? name : uniqueElementName(ln0, "GSEControl");
|
|
33
|
+
if (!options.gseControl?.name)
|
|
34
|
+
attributes.name = cbName;
|
|
35
|
+
if (!options.gseControl?.confRev)
|
|
36
|
+
attributes.confRev = "1";
|
|
37
|
+
if (!options.gseControl?.type)
|
|
38
|
+
attributes.type = "GOOSE";
|
|
39
|
+
if (!options.gseControl?.appID)
|
|
40
|
+
attributes.appID = pathId(ln0, cbName);
|
|
41
|
+
const generatedConfRev = options.gseControl?.datSet ? "1" : "0";
|
|
42
|
+
const userConfRev = options.gseControl?.confRev;
|
|
43
|
+
attributes.confRev = userConfRev ? userConfRev : generatedConfRev;
|
|
44
|
+
const gseControl = createElement(ln0.ownerDocument, "GSEControl", attributes);
|
|
45
|
+
const edits = [];
|
|
46
|
+
edits.push({
|
|
47
|
+
parent: ln0,
|
|
48
|
+
node: gseControl,
|
|
49
|
+
reference: getReference(ln0, "GSEControl"),
|
|
50
|
+
});
|
|
51
|
+
const connAp = connectedAp(ln0, options.gse?.apName);
|
|
52
|
+
if (!connAp)
|
|
53
|
+
return edits;
|
|
54
|
+
const ldInst = ln0.closest("LDevice").getAttribute("inst");
|
|
55
|
+
if (!ldInst || !cbName)
|
|
56
|
+
return edits;
|
|
57
|
+
const gseCreateOptions = options.gse ?? {};
|
|
58
|
+
delete gseCreateOptions.apName;
|
|
59
|
+
const gseAttrs = { ldInst, cbName };
|
|
60
|
+
const gseEdit = createGSE(connAp, gseAttrs, gseCreateOptions);
|
|
61
|
+
if (gseEdit)
|
|
62
|
+
edits.push(gseEdit);
|
|
63
|
+
return edits;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=createGSEControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/createGSEControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Insert, Remove, SetAttributes } from "@openscd/oscd-api";
|
|
2
|
+
/**
|
|
3
|
+
* Utility function to update GSEControl element attributes.
|
|
4
|
+
* ```md
|
|
5
|
+
* These attributes trigger additional edits such as
|
|
6
|
+
* - name: also updates GSE.cbName and supervision references
|
|
7
|
+
* - datSet: update reference DataSet.name - when DataSet is single use
|
|
8
|
+
*
|
|
9
|
+
* >NOTE: confRev attribute is updated +10000 on every data set change
|
|
10
|
+
* ```
|
|
11
|
+
* @param gseControl - GSEControl element
|
|
12
|
+
* @param attributes -
|
|
13
|
+
* @returns action array to update all `GSEControl` attributes
|
|
14
|
+
*/
|
|
15
|
+
export declare function updateGSEControl(setAttributes: SetAttributes): (SetAttributes | Remove | Insert)[];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { controlBlockGseOrSmv } from "../tControl/controlBlockGseOrSmv.js";
|
|
2
|
+
import { controlBlockObjRef } from "../tControl/controlBlockObjRef.js";
|
|
3
|
+
import { findControlBlockSubscription } from "../tControl/findControlSubscription.js";
|
|
4
|
+
import { updatedConfRev } from "../tControl/updateConfRev.js";
|
|
5
|
+
import { updateDatSet } from "../tControl/updateDatSet.js";
|
|
6
|
+
/**
|
|
7
|
+
* Utility function to update GSEControl element attributes.
|
|
8
|
+
* ```md
|
|
9
|
+
* These attributes trigger additional edits such as
|
|
10
|
+
* - name: also updates GSE.cbName and supervision references
|
|
11
|
+
* - datSet: update reference DataSet.name - when DataSet is single use
|
|
12
|
+
*
|
|
13
|
+
* >NOTE: confRev attribute is updated +10000 on every data set change
|
|
14
|
+
* ```
|
|
15
|
+
* @param gseControl - GSEControl element
|
|
16
|
+
* @param attributes -
|
|
17
|
+
* @returns action array to update all `GSEControl` attributes
|
|
18
|
+
*/
|
|
19
|
+
export function updateGSEControl(setAttributes) {
|
|
20
|
+
if (setAttributes.element.tagName !== "GSEControl")
|
|
21
|
+
return [];
|
|
22
|
+
const updates = [];
|
|
23
|
+
if (setAttributes.attributes.name) {
|
|
24
|
+
const extRefUpdates = findControlBlockSubscription(setAttributes.element).map((extRef) => ({
|
|
25
|
+
element: extRef,
|
|
26
|
+
attributes: { srcCBName: setAttributes.attributes.name },
|
|
27
|
+
}));
|
|
28
|
+
const supervisionUpdates = Array.from(setAttributes.element.ownerDocument.querySelectorAll('*[lnClass="LGOS"] Val'))
|
|
29
|
+
.filter((val) => val.textContent === controlBlockObjRef(setAttributes.element))
|
|
30
|
+
.flatMap((val) => {
|
|
31
|
+
const [path] = controlBlockObjRef(setAttributes.element).split(".");
|
|
32
|
+
const oldValContent = Array.from(val.childNodes).find((node) => node.nodeType === Node.TEXT_NODE);
|
|
33
|
+
const newValContent = setAttributes.element.ownerDocument.createTextNode(`${path}.${setAttributes.attributes.name}`);
|
|
34
|
+
return [
|
|
35
|
+
{ node: oldValContent },
|
|
36
|
+
{ parent: val, node: newValContent, reference: null },
|
|
37
|
+
];
|
|
38
|
+
});
|
|
39
|
+
const gseUpdate = [];
|
|
40
|
+
const gSE = controlBlockGseOrSmv(setAttributes.element);
|
|
41
|
+
if (gSE) {
|
|
42
|
+
gseUpdate.push({
|
|
43
|
+
element: gSE,
|
|
44
|
+
attributes: { cbName: setAttributes.attributes.name },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
updates.push(...extRefUpdates, ...supervisionUpdates, ...gseUpdate);
|
|
48
|
+
}
|
|
49
|
+
if (setAttributes.attributes.datSet) {
|
|
50
|
+
const updateDataSet = updateDatSet(setAttributes);
|
|
51
|
+
if (updateDataSet)
|
|
52
|
+
updates.push(updateDataSet);
|
|
53
|
+
// remove datSet from the update to avoid schema invalidity
|
|
54
|
+
else
|
|
55
|
+
delete setAttributes.attributes.datSet;
|
|
56
|
+
// +10000 for data set update
|
|
57
|
+
setAttributes.attributes.confRev = updatedConfRev(setAttributes.element);
|
|
58
|
+
}
|
|
59
|
+
return [setAttributes, ...updates];
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=updateGSEControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/updateGSEControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Insert } from "@openscd/oscd-api";
|
|
2
|
+
export type InsertIedOptions = {
|
|
3
|
+
addCommunicationSection: boolean;
|
|
4
|
+
};
|
|
5
|
+
/** Function to import !single IEDs with its `DataTypeTemplates` and
|
|
6
|
+
* optionally linked `Communication`section elements.
|
|
7
|
+
* >NOTE: Element are MOVED from ied document to the project not copied
|
|
8
|
+
* @param scl - the parent SCL element to insert the IED to
|
|
9
|
+
* @param ied - the new IED to be added to the project (SCL)
|
|
10
|
+
* @param options
|
|
11
|
+
* @returns An array containing diff objects representing an import IED edit
|
|
12
|
+
* section */
|
|
13
|
+
export declare function insertIed(scl: Element, ied: Element, options?: InsertIedOptions): Insert[];
|