Skip to content

Commit 5f3757b

Browse files
authored
Merge pull request #556 from com-pas/develop
Release 0.2.50
2 parents ce73bd0 + ac1db81 commit 5f3757b

File tree

6 files changed

+181
-10
lines changed

6 files changed

+181
-10
lines changed

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
223223
public List<SclReportItem> manageMonitoringLns(SCL scd) {
224224
errorHandler.get().clear();
225225
try {
226+
//Preprocessing : clean LSVS/LGOS if inst!=1 and monitor them if needed
227+
removeLsvsLgos(scd);
226228
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains(IED_TEST_NAME))
227229
.forEach(tied -> {
228230
Map<TServiceType, List<IedSource>> serviceTypeToIedSource = ldeviceService.getLdevices(tied)
@@ -245,6 +247,14 @@ public List<SclReportItem> manageMonitoringLns(SCL scd) {
245247
}
246248
}
247249

250+
private void removeLsvsLgos(SCL scd) {
251+
scd.getIED().stream().flatMap(tied -> ldeviceService.findLdevice(tied, LDEVICE_LDSUIED).stream())
252+
.forEach(tlDevice -> {
253+
List<TLN> tlnList = tlDevice.getLN();
254+
tlnList.removeIf(tln -> (tln.getLnClass().contains("LGOS") || tln.getLnClass().contains("LSVS")) && !tln.getInst().equals("1"));
255+
});
256+
}
257+
248258
private void manageMonitoringLns(List<IedSource> iedSources, SCL scd, TIED tied, TLDevice ldsuiedLdevice, String doName, MonitoringLnClassEnum monitoringLnClassEnum) {
249259
List<TLN> lgosOrLsvsLns = lnService.getFilteredLns(ldsuiedLdevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList();
250260
if (lgosOrLsvsLns.isEmpty())

sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ void manageMonitoringLns_when_no_extRef_should_not_update_and_not_create_lsvs_an
572572
assertThat(lDeviceAdapter.getLNAdapters())
573573
.hasSize(2)
574574
.extracting(LNAdapter::getLNClass, LNAdapter::getLNInst).containsExactlyInAnyOrder(
575-
Tuple.tuple("LGOS", "3"), Tuple.tuple("LSVS", "9"));
575+
Tuple.tuple("LGOS", "1"), Tuple.tuple("LSVS", "1"));
576576
assertIsMarshallable(scd);
577577
}
578578

@@ -582,9 +582,9 @@ void manageMonitoringLns_when_dai_not_updatable_should_not_update_and_not_create
582582
SCL scd = SclTestMarshaller.getSCLFromFile("/monitoring_lns/scd_monitoring_lsvs_lgos.xml");
583583
SclRootAdapter sclRootAdapter = new SclRootAdapter(scd);
584584
LDeviceAdapter lDeviceAdapter = sclRootAdapter.getIEDAdapterByName("IED_NAME1").getLDeviceAdapterByLdInst(LD_LDSUIED);
585-
getDAIAdapters(lDeviceAdapter, "LGOS", "3", "GoCBRef", "setSrcRef")
585+
getDAIAdapters(lDeviceAdapter, "LGOS", "1", "GoCBRef", "setSrcRef")
586586
.forEach(daiAdapter -> daiAdapter.getCurrentElem().setValImport(false));
587-
getDAIAdapters(lDeviceAdapter, "LSVS", "9", "SvCBRef", "setSrcRef")
587+
getDAIAdapters(lDeviceAdapter, "LSVS", "1", "SvCBRef", "setSrcRef")
588588
.forEach(daiAdapter -> daiAdapter.getCurrentElem().setValImport(false));
589589
// When
590590
List<SclReportItem> sclReportItems = sclService.manageMonitoringLns(scd);
@@ -597,7 +597,7 @@ void manageMonitoringLns_when_dai_not_updatable_should_not_update_and_not_create
597597
assertThat(lDeviceAdapter.getLNAdapters())
598598
.hasSize(2)
599599
.extracting(LNAdapter::getLNClass, LNAdapter::getLNInst).containsExactlyInAnyOrder(
600-
Tuple.tuple("LGOS", "3"), Tuple.tuple("LSVS", "9"));
600+
Tuple.tuple("LGOS", "1"), Tuple.tuple("LSVS", "1"));
601601
assertIsMarshallable(scd);
602602
}
603603

@@ -664,4 +664,39 @@ void manageMonitoringLns_should_update_and_create_lsvs_and_goose_when_contains_p
664664
.containsExactlyInAnyOrder("IED_NAME2LD_INST21/LLN0.smv2", "IED_NAME2LD_INST22/LLN0.smv2");
665665
});
666666
}
667+
668+
@Test
669+
void manageMonitoringLns_should_clean_remove_all_lsvs_lgos_with_instance_not_equals_one(){
670+
// Given
671+
SCL scd = SclTestMarshaller.getSCLFromFile("/monitoring_lns/scd_monitoring_lsvs_lgos_with_inst_one_and_not_one.xml");
672+
// When
673+
List<SclReportItem> sclReportItems = sclService.manageMonitoringLns(scd);
674+
//Then
675+
assertThat(sclReportItems).hasSize(1)
676+
.extracting(SclReportItem::isError, SclReportItem::xpath, SclReportItem::message)
677+
.containsExactly(tuple(false, "IED_NAME1/LDSUIED/LSVS", "There is no LN LSVS present in LDevice"));
678+
679+
assertThat(scd.getIED())
680+
.filteredOn(tied -> tied.getName().equals("IED_NAME1"))
681+
.flatExtracting(TIED::getAccessPoint)
682+
.extracting(TAccessPoint::getServer)
683+
.flatExtracting(TServer::getLDevice)
684+
.filteredOn(tlDevice -> tlDevice.getInst().equals(LD_LDSUIED))
685+
.extracting(TLDevice::getLN)
686+
.allSatisfy(tlns -> {
687+
// Expected number of LGOS and LSVS
688+
assertThat(tlns).hasSize(2).extracting(tln -> tln.getLnClass().getFirst(), TLN::getInst).containsExactlyInAnyOrder(
689+
Tuple.tuple("LGOS", "1"), Tuple.tuple("LGOS", "2"));
690+
// LGOS setSrcRef values
691+
assertThat(tlns)
692+
.filteredOn(tln -> tln.getLnClass().contains("LGOS") && tln.getInst().equals("1")
693+
|| tln.getLnClass().contains("LGOS") && tln.getInst().equals("2"))
694+
.flatExtracting(TAnyLN::getDOI)
695+
.filteredOn(tdoi -> tdoi.getName().equals("GoCBRef"))
696+
.flatExtracting(TDOI::getSDIOrDAI)
697+
.filteredOn(tUnNaming -> tUnNaming.getClass().equals(TDAI.class) && ((TDAI)tUnNaming).getName().equals("setSrcRef"))
698+
.map(tUnNaming -> ((TDAI)tUnNaming).getVal().getFirst().getValue())
699+
.containsExactlyInAnyOrder("IED_NAME2LD_INST21/LLN0.goose1", "IED_NAME2LD_INST22/LLN0.goose1");
700+
});
701+
}
667702
}

sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
<LDevice inst="LDSUIED" ldName="PLOE53CBO1BCU1LDSUIED">
3333
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
3434
</LN0>
35-
<LN lnClass="LSVS" inst="9" lnType="LNLSVS">
35+
<LN lnClass="LSVS" inst="1" lnType="LNLSVS">
3636
<DOI name="SvCBRef">
3737
<DAI name="setSrcRef" valKind="RO" valImport="true">
3838
</DAI>
3939
</DOI>
4040
</LN>
41-
<LN lnClass="LGOS" inst="3" lnType="LNLGOS">
41+
<LN lnClass="LGOS" inst="1" lnType="LNLGOS">
4242
<DOI name="GoCBRef">
4343
<DAI name="setSrcRef" valKind="RO" valImport="true">
4444
</DAI>
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<!-- SPDX-FileCopyrightText: 2021 RTE FRANCE -->
3+
<!-- -->
4+
<!-- SPDX-License-Identifier: Apache-2.0 -->
5+
6+
<SCL version="2007" revision="B" release="4" xmlns="http://www.iec.ch/61850/2003/SCL">
7+
<Header id="hId" version="2007" revision="B" toolID="COMPAS"/>
8+
<IED name="IED_NAME1">
9+
<AccessPoint name="AP_NAME">
10+
<Server>
11+
<Authentication/>
12+
<LDevice inst="LD_INST11" ldName="IED_NAME1LD_INST11">
13+
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
14+
<Inputs>
15+
<ExtRef srcCBName="goose1" srcLDInst="LD_INST22" iedName="IED_NAME2" ldInst="LD_INST22"
16+
serviceType="GOOSE" desc="a" pDO="GoCBRef"/>
17+
<ExtRef srcCBName="smv2" srcLDInst="LD_INST22" iedName="IED_NAME2" ldInst="LD_INST22"
18+
serviceType="SMV" desc="b" pDO="GoCBRef"/>
19+
</Inputs>
20+
</LN0>
21+
</LDevice>
22+
<LDevice inst="LD_INST21" ldName="IED_NAME1LD_INST21">
23+
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
24+
<Inputs>
25+
<ExtRef srcCBName="goose1" srcLDInst="LD_INST21" iedName="IED_NAME2" ldInst="LD_INST22"
26+
serviceType="GOOSE" desc="a" pDO="GoCBRef"/>
27+
<ExtRef srcCBName="smv2" srcLDInst="LD_INST21" iedName="IED_NAME2" ldInst="LD_INST22"
28+
serviceType="SMV" desc="b" pDO="GoCBRef"/>
29+
</Inputs>
30+
</LN0>
31+
</LDevice>
32+
<LDevice inst="LDSUIED" ldName="PLOE53CBO1BCU1LDSUIED">
33+
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
34+
</LN0>
35+
<LN lnClass="LSVS" inst="2" lnType="LNLSVS">
36+
<DOI name="SvCBRef">
37+
<DAI name="setSrcRef" valKind="RO" valImport="true">
38+
</DAI>
39+
</DOI>
40+
</LN>
41+
<LN lnClass="LGOS" inst="1" lnType="LNLGOS">
42+
<DOI name="GoCBRef">
43+
<DAI name="setSrcRef" valKind="RO" valImport="true">
44+
</DAI>
45+
</DOI>
46+
</LN>
47+
</LDevice>
48+
</Server>
49+
</AccessPoint>
50+
</IED>
51+
<IED name="IED_NAME2">
52+
<AccessPoint name="AP_NAME">
53+
<Server>
54+
<Authentication/>
55+
<LDevice inst="LD_INST21" ldName="IED_NAME2LD_INST21">
56+
<LN0 lnClass="LLN0" inst="" lnType="LNEX2">
57+
<DataSet name="dataset3">
58+
<FCDA fc="ST"/>
59+
</DataSet>
60+
<DataSet name="dataset6">
61+
<FCDA ldInst="LD_INST22" lnClass="ANCR" lnInst="1" doName="Do21.sdo21" fc="ST"/>
62+
<FCDA ldInst="LD_INST22" lnClass="LLN0" lnInst="1" doName="Do21.sdo21" fc="ST"/>
63+
</DataSet>
64+
<GSEControl name="goose1" appID="g1" datSet="dataset6"/>
65+
<SampledValueControl name="smv2" smvID="s2" smpRate="1" nofASDU="1" datSet="dataset3">
66+
<SmvOpts/>
67+
</SampledValueControl>
68+
</LN0>
69+
</LDevice>
70+
<LDevice inst="LD_INST22" ldName="IED_NAME2LD_INST22">
71+
<LN0 lnClass="LLN0" inst="" lnType="LN11">
72+
<DataSet name="dataset1">
73+
<FCDA fc="ST" doName="Do20"/>
74+
</DataSet>
75+
<DataSet name="dataset6">
76+
<FCDA ldInst="LD_INST22" lnClass="LLN0" lnInst="1" doName="Do21" fc="ST"/>
77+
<FCDA ldInst="LD_INST22" lnClass="CSWI" lnInst="1" doName="Do22" fc="ST"/>
78+
</DataSet>
79+
<DataSet name="dataset5">
80+
<FCDA ldInst="LD_INST22" lnClass="CSWI" lnInst="1" doName="Do23"
81+
daName="da21.bda211.bda212.bda213" fc="ST"/>
82+
<FCDA ldInst="LD_INST22" lnClass="LLN0" lnInst="1" doName="Do24" fc="ST"/>
83+
</DataSet>
84+
<GSEControl name="goose1" appID="g1" datSet="dataset5"/>
85+
<SampledValueControl name="smv2" smvID="s2" smpRate="1" nofASDU="1" datSet="dataset6">
86+
<SmvOpts/>
87+
</SampledValueControl>
88+
</LN0>
89+
<LN lnClass="ANCR" inst="1" lnType="LN12">
90+
<DataSet name="dataset1">
91+
<FCDA fc="ST" doName="Do25"/>
92+
</DataSet>
93+
<ReportControl name="rpt1" confRev="1" datSet="dataset1" rptID="r1">
94+
<OptFields/>
95+
</ReportControl>
96+
</LN>
97+
</LDevice>
98+
</Server>
99+
</AccessPoint>
100+
</IED>
101+
<DataTypeTemplates>
102+
<LNodeType lnClass="LLN0" id="LNEX1">
103+
<DO name="Do22" type="DO12"/>
104+
</LNodeType>
105+
<LNodeType lnClass="LSVS" id="LNLSVS">
106+
<DO name="SvCBRef" type="DOLN"/>
107+
</LNodeType>
108+
<LNodeType lnClass="LGOS" id="LNLGOS">
109+
<DO name="GoCBRef" type="DOLN"/>
110+
</LNodeType>
111+
<LNodeType lnClass="LLN0" id="LN11">
112+
<DO name="Do22" type="DO12"/>
113+
</LNodeType>
114+
<LNodeType lnClass="LLN0" id="LNEX2">
115+
<DO name="Do22" type="DO12"/>
116+
</LNodeType>
117+
<LNodeType lnClass="ANCR" id="LN12">
118+
<DO name="Do22" type="DO12"/>
119+
</LNodeType>
120+
<DOType id="DO12" cdc="WYE">
121+
</DOType>
122+
<DOType id="DOLN" cdc="ORG">
123+
<DA name="setSrcRef" bType="ObjRef" dchg="true" fc="SP"/>
124+
</DOType>
125+
</DataTypeTemplates>
126+
</SCL>

sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos_with_many_extref_for_same_ied_source.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@
4040
<LDevice inst="LDSUIED" ldName="PLOE53CBO1BCU1LDSUIED">
4141
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
4242
</LN0>
43-
<LN lnClass="LSVS" inst="9" lnType="LNLSVS">
43+
<LN lnClass="LSVS" inst="1" lnType="LNLSVS">
4444
<DOI name="SvCBRef">
4545
<DAI name="setSrcRef" valKind="RO" valImport="true">
4646
</DAI>
4747
</DOI>
4848
</LN>
49-
<LN lnClass="LGOS" inst="3" lnType="LNLGOS">
49+
<LN lnClass="LGOS" inst="1" lnType="LNLGOS">
5050
<DOI name="GoCBRef">
5151
<Private type="RTE-PARAM">
5252
<rte:RTEPARAM shortLabel="REF-GO-LGOS-1" longLabel="REFERENCE DU GOOSE SUPERVISE PAR LGOS 1" conf="true"/>

sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos_with_privates.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
<LDevice inst="LDSUIED" ldName="PLOE53CBO1BCU1LDSUIED">
3333
<LN0 lnClass="LLN0" inst="" lnType="LNEX1">
3434
</LN0>
35-
<LN lnClass="LSVS" inst="9" lnType="LNLSVS">
35+
<LN lnClass="LSVS" inst="1" lnType="LNLSVS">
3636
<DOI name="SvCBRef">
3737
<DAI name="setSrcRef" valKind="RO" valImport="true">
3838
</DAI>
3939
</DOI>
4040
</LN>
41-
<LN lnClass="LGOS" inst="3" lnType="LNLGOS">
41+
<LN lnClass="LGOS" inst="1" lnType="LNLGOS">
4242
<DOI name="GoCBRef">
4343
<Private type="RTE-PARAM">
4444
<rte:RTEPARAM shortLabel="REF-GO-LGOS-1" longLabel="REFERENCE DU GOOSE SUPERVISE PAR LGOS 1" conf="true"/>

0 commit comments

Comments
 (0)