Skip to content

Commit a8bf1b8

Browse files
committed
feat(#414): RSR-1047 - add reportType attribute to HMI controlblock creation
Signed-off-by: massifben <[email protected]>
1 parent 837ff3f commit a8bf1b8

File tree

3 files changed

+51
-18
lines changed

3 files changed

+51
-18
lines changed

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ldevice/LDeviceAdapter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public class LDeviceAdapter extends SclElementAdapter<IEDAdapter, TLDevice> {
6666
private static final long INTG_PD_VALUE_FOR_FC_MX = 2000L;
6767

6868
private static final String DA_SETSRCREF = "setSrcRef";
69+
private static final String CYC_REPORT_TYPE = "CYC";
6970

7071
/**
7172
* Constructor
@@ -94,19 +95,19 @@ public void createHmiReportControlBlocks(PO po) {
9495
findLnAdapter(tfcdaFilter.getLnClass(), tfcdaFilter.getLnInst(), tfcdaFilter.getPrefix()).filter(lnAdapter -> lnAdapter.getDaiModStValValue().map(ActiveStatus::fromValue).map(ActiveStatus.ON::equals).orElse(true)))
9596
.map(sourceLn -> sourceLn.getDAI(new DataAttributeRef(toFCDA(tfcdaFilter)), false))
9697
.filter(das -> das.stream().anyMatch(da -> TFCEnum.fromValue(tfcdaFilter.getFc().value()) == da.getFc())) // getDAI does not filter on DA.
97-
.ifPresent(dataAttributeRefs -> createHmiReportCB(ln0, toFCDA(tfcdaFilter))));
98+
.ifPresent(dataAttributeRefs -> createHmiReportCB(ln0, tfcdaFilter)));
9899
}
99100

100-
private void createHmiReportCB(LN0Adapter ln0, TFCDA fcda) {
101-
boolean isFcMx = fcda.getFc() == TFCEnum.MX;
102-
String dataSetSuffix = getInst().toUpperCase(Locale.ENGLISH) + ATTRIBUTE_VALUE_SEPARATOR + (isFcMx ? "CYPO" : "DQPO");
101+
private void createHmiReportCB(LN0Adapter ln0, TFCDAFilter tfcdaFilter) {
102+
TFCDA fcda = toFCDA(tfcdaFilter);
103+
String dataSetSuffix = getInst().toUpperCase(Locale.ENGLISH) + ATTRIBUTE_VALUE_SEPARATOR + tfcdaFilter.getReportType().substring(0, 2) + "PO";
103104
String dataSetName = DATASET_NAME_PREFIX + dataSetSuffix;
104105
DataSetAdapter dataSet = ln0.createDataSetIfNotExists(dataSetName, ControlBlockEnum.REPORT);
105-
dataSet.createFCDAIfNotExists(fcda.getLdInst(), fcda.getPrefix(), fcda.getLnClass().get(0), fcda.getLnInst(), fcda.getDoName(), fcda.getDaName(), fcda.getFc());
106+
dataSet.createFCDAIfNotExists(fcda.getLdInst(), fcda.getPrefix(), fcda.getLnClass().getFirst(), fcda.getLnInst(), fcda.getDoName(), fcda.getDaName(), fcda.getFc());
106107
String cbName = CONTROLBLOCK_NAME_PREFIX + dataSetSuffix;
107108
String cbId = ln0.generateControlBlockId(getLdName(), cbName);
108109
ControlBlockAdapter controlBlockAdapter = ln0.createControlBlockIfNotExists(cbName, cbId, dataSetName, ControlBlockEnum.REPORT);
109-
if (isFcMx) {
110+
if (tfcdaFilter.getReportType().equals(CYC_REPORT_TYPE)) {
110111
TReportControl tReportControl = (TReportControl) controlBlockAdapter.getCurrentElem();
111112
tReportControl.setIntgPd(INTG_PD_VALUE_FOR_FC_MX);
112113
tReportControl.getTrgOps().setDchg(false);
@@ -478,7 +479,7 @@ private void updateNewCreatedLnDaiValue(TLN tln, TExtRef tExtRef, String lnInst,
478479
private String createVal(TExtRef tExtRef) {
479480
String sourceLdName = getParentAdapter().getParentAdapter().getIEDAdapterByName(tExtRef.getIedName())
480481
.getLDeviceAdapterByLdInst(tExtRef.getSrcLDInst()).getLdName();
481-
String lnClass = !tExtRef.isSetSrcLNClass() ? TLLN0Enum.LLN_0.value() : tExtRef.getSrcLNClass().get(0);
482+
String lnClass = !tExtRef.isSetSrcLNClass() ? TLLN0Enum.LLN_0.value() : tExtRef.getSrcLNClass().getFirst();
482483
return sourceLdName + "/" + lnClass + "." + tExtRef.getSrcCBName();
483484
}
484485

sct-commons/src/main/resources/xsd/CB_REPORT_SUPERVISION_Config_file.xsd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ SPDX-License-Identifier: Apache-2.0
6060
<xs:attribute name="lnInst" type="xs:string" use="required"/>
6161
<xs:attribute name="doName" type="xs:string" use="required"/>
6262
<xs:attribute name="fc" type="tfc" use="required"/>
63+
<xs:attribute name="reportType" type="xs:string" use="required"/>
6364
</xs:complexType>
6465

6566
<xs:simpleType name="tfc">
@@ -69,4 +70,4 @@ SPDX-License-Identifier: Apache-2.0
6970
</xs:restriction>
7071
</xs:simpleType>
7172

72-
</xs:schema>
73+
</xs:schema>

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

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
@ExtendWith(MockitoExtension.class)
2828
class HmiServiceTest {
2929

30+
private static final String DQC_REPORT_TYPE = "DQC";
31+
private static final String CYC_REPORT_TYPE = "CYC";
3032
@InjectMocks
3133
HmiService hmiService;
3234

@@ -42,7 +44,7 @@ void setUp() {
4244
void createAllIhmReportControlBlocks_with_fc_ST_should_create_dataset_and_controlblock() {
4345
// Given
4446
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-hmi-create-report-cb/scd_create_dataset_and_controlblocks_for_hmi.xml");
45-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST);
47+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST, DQC_REPORT_TYPE);
4648
po.getFCDAs().getFCDA().add(tfcdaFilter);
4749
// When
4850
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -69,7 +71,7 @@ void createAllIhmReportControlBlocks_with_fc_ST_should_create_dataset_and_contro
6971
void createAllIhmReportControlBlocks_with_fc_MX_should_create_dataset_and_controlblock() {
7072
// Given
7173
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-hmi-create-report-cb/scd_create_dataset_and_controlblocks_for_hmi.xml");
72-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "PVOC", "1", null, "DoName2", Tfc.MX);
74+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "PVOC", "1", null, "DoName2", Tfc.MX, CYC_REPORT_TYPE);
7375
po.getFCDAs().getFCDA().add(tfcdaFilter);
7476
// When
7577
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -93,11 +95,39 @@ void createAllIhmReportControlBlocks_with_fc_MX_should_create_dataset_and_contro
9395
assertThat(reportControl.getRptEnabled().isSetClientLN()).isFalse();
9496
}
9597

98+
@Test
99+
void createAllIhmReportControlBlocks_with_fc_MX_and_DQC_REPORT_TYPE_should_create_dataset_and_controlblock_with_suffix_DQPO() {
100+
// Given
101+
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-hmi-create-report-cb/scd_create_dataset_and_controlblocks_for_hmi.xml");
102+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "PVOC", "1", null, "DoName2", Tfc.MX, DQC_REPORT_TYPE);
103+
po.getFCDAs().getFCDA().add(tfcdaFilter);
104+
// When
105+
hmiService.createAllHmiReportControlBlocks(scd, po);
106+
// Then
107+
// Check DataSet is created
108+
DataSetAdapter dataSet = findDataSet(scd, "IedName1", "LdInst11", "DS_LDINST11_DQPO");
109+
assertThat(dataSet.getCurrentElem().getFCDA()).hasSize(1).first()
110+
.usingRecursiveComparison().isEqualTo(toFCDA(tfcdaFilter));
111+
// Check ControlBlock is created
112+
LN0Adapter ln0 = findLn0(scd, "IedName1", "LdInst11");
113+
assertThat(ln0.getTControlsByType(TReportControl.class)).hasSize(1);
114+
115+
TReportControl reportControl = findControlBlock(scd, "IedName1", "LdInst11", "CB_LDINST11_DQPO", TReportControl.class);
116+
assertThat(reportControl).extracting(TReportControl::getRptID, TControl::getDatSet, TReportControl::getConfRev, TReportControl::isBuffered, TReportControl::getBufTime, TReportControl::isIndexed,
117+
TControlWithTriggerOpt::getIntgPd)
118+
.containsExactly("IedName1LdInst11/LLN0.CB_LDINST11_DQPO", "DS_LDINST11_DQPO", 1L, true, 0L, true, 60000L);
119+
assertThat(reportControl.getTrgOps())
120+
.extracting(TTrgOps::isDchg, TTrgOps::isQchg, TTrgOps::isDupd, TTrgOps::isPeriod, TTrgOps::isGi)
121+
.containsExactly(true, true, false, true, true);
122+
assertThat(reportControl.getRptEnabled().getMax()).isEqualTo(1);
123+
assertThat(reportControl.getRptEnabled().isSetClientLN()).isFalse();
124+
}
125+
96126
@Test
97127
void createAllIhmReportControlBlocks_with_FCDA_on_ln0_should_create_dataset_and_controlblock() {
98128
// Given
99129
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-hmi-create-report-cb/scd_create_dataset_and_controlblocks_for_hmi.xml");
100-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "LLN0", null, null, "DoName0", Tfc.ST);
130+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "LLN0", null, null, "DoName0", Tfc.ST, DQC_REPORT_TYPE);
101131
po.getFCDAs().getFCDA().add(tfcdaFilter);
102132
// When
103133
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -126,7 +156,7 @@ void createAllIhmReportControlBlocks_when_lDevice_ON_but_LN_Mod_StVal_missing_sh
126156
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-hmi-create-report-cb/scd_create_dataset_and_controlblocks_for_hmi.xml");
127157
LNAdapter ln = findLn(scd, "IedName1", "LdInst11", "ANCR", "1", null);
128158
ln.getCurrentElem().unsetDOI();
129-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST);
159+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST, DQC_REPORT_TYPE);
130160
po.getFCDAs().getFCDA().add(tfcdaFilter);
131161
// When
132162
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -151,7 +181,7 @@ void createAllIhmReportControlBlocks_when_lDevice_ON_but_LN_Mod_StVal_OFF_should
151181
LNAdapter ln = findLn(scd, "IedName1", "LdInst11", "ANCR", "1", null);
152182
ln.getDOIAdapterByName(CommonConstants.MOD_DO_NAME).getDataAdapterByName(CommonConstants.STVAL_DA_NAME).setVal("off");
153183
assertThat(ln.getDaiModStValValue()).hasValue("off");
154-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST);
184+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST, DQC_REPORT_TYPE);
155185
po.getFCDAs().getFCDA().add(tfcdaFilter);
156186
// When
157187
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -167,7 +197,7 @@ void createAllIhmReportControlBlocks_when_lDevice_OFF_should_not_create_dataset(
167197
LN0Adapter ln0 = findLn0(scd, "IedName1", "LdInst11");
168198
ln0.getDOIAdapterByName(CommonConstants.MOD_DO_NAME).getDataAdapterByName(CommonConstants.STVAL_DA_NAME).setVal("off");
169199
assertThat(findLDevice(scd, "IedName1", "LdInst11").getLDeviceStatus()).hasValue(ActiveStatus.OFF.getValue());
170-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST);
200+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST, DQC_REPORT_TYPE);
171201
po.getFCDAs().getFCDA().add(tfcdaFilter);
172202
// When
173203
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -183,7 +213,7 @@ void createAllIhmReportControlBlocks_when_LDevice_has_no_status_should_not_creat
183213
LN0Adapter ln0 = findLn0(scd, "IedName1", "LdInst11");
184214
ln0.getDOIAdapterByName(CommonConstants.MOD_DO_NAME).getDataAdapterByName(CommonConstants.STVAL_DA_NAME).getCurrentElem().unsetVal();
185215
assertThat(findLDevice(scd, "IedName1", "LdInst11").getLDeviceStatus()).isEmpty();
186-
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST);
216+
TFCDAFilter tfcdaFilter = createFCDAFilter("LdInst11", "ANCR", "1", null, "DoName1", Tfc.ST, DQC_REPORT_TYPE);
187217
po.getFCDAs().getFCDA().add(tfcdaFilter);
188218
// When
189219
hmiService.createAllHmiReportControlBlocks(scd, po);
@@ -192,14 +222,15 @@ void createAllIhmReportControlBlocks_when_LDevice_has_no_status_should_not_creat
192222
assertThat(streamAllControlBlocks(scd, TReportControl.class)).isEmpty();
193223
}
194224

195-
private static TFCDAFilter createFCDAFilter(String ldInst, String lnClass, String lnInst, String prefix, String doName, Tfc tfc) {
225+
private static TFCDAFilter createFCDAFilter(String ldInst, String lnClass, String lnInst, String prefix, String doName, Tfc tfc, String reportType) {
196226
TFCDAFilter tfcdaFilter = new TFCDAFilter();
197-
tfcdaFilter.setLdInst("LdInst11");
227+
tfcdaFilter.setLdInst(ldInst);
198228
tfcdaFilter.setLnClass(lnClass);
199-
tfcdaFilter.setPrefix(null);
229+
tfcdaFilter.setPrefix(prefix);
200230
tfcdaFilter.setDoName(doName);
201231
tfcdaFilter.setLnInst(lnInst);
202232
tfcdaFilter.setFc(tfc);
233+
tfcdaFilter.setReportType(reportType);
203234
return tfcdaFilter;
204235
}
205236

0 commit comments

Comments
 (0)