|
@@ -604,7 +604,7 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
|
|
|
//iedRelationMgr := new(SysCheckModelIedRelationMgr)
|
|
|
modelFcda := sync.Map{}
|
|
|
//已经加载过遥信的装置
|
|
|
- isLoadYxIed := map[string]map[*node_attr.NExtRef]string{}
|
|
|
+ isLoadYxIed := map[string]map[*node_attr.NExtRef][]string{}
|
|
|
//已经处理过遥信端子的装置
|
|
|
isDealYxIed := map[string]int{}
|
|
|
//已获取端子的装置
|
|
@@ -854,11 +854,13 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
|
|
|
}
|
|
|
}
|
|
|
//判断装置是否具备遥信功能,具备时需要单独处理遥信类端子
|
|
|
- //遥信类端子处理规则:以scd中实际配置为准,通过检查装置双方的端子名称是否完全一致,以及是否有缺失和多余的遥信端子
|
|
|
+ //遥信类端子处理规则:以scd中实际配置为准,通过检查装置双方的端子名称是否完全一致以及单双点类型是否相同,以及是否有缺失和多余的遥信端子
|
|
|
if len(yx) > 0 && isDealYxIed[iedname] == 0 {
|
|
|
//logger.Logger.Debug(fmt.Sprintf("=============正在处理装置%s遥信端子数:%d %+v", iedname, len(yx), isDealYxIed))
|
|
|
isDealYxIed[iedname] = 1
|
|
|
- for extref, doiDesc := range yx {
|
|
|
+ for extref, doiinfo := range yx {
|
|
|
+ doiDesc := doiinfo[0]
|
|
|
+ doiCdc := doiinfo[1]
|
|
|
daname := ""
|
|
|
if extref.DaName != "" {
|
|
|
daname = "." + extref.DaName
|
|
@@ -882,7 +884,31 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
|
|
|
}
|
|
|
//检查未通过
|
|
|
scdNodeRule.AppendFcdaCheckResult(re)
|
|
|
- } else if outFcdaDoi.(*node_attr.NDOI).Desc != doiDesc {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if doiCdc != "" && (!YaoXinDBType[doiCdc] || !YaoXinSiType[doiCdc]) {
|
|
|
+ //判断是否是双点或单点遥信端子
|
|
|
+ fcdaCdcCode := new(ScdMgr).GetDoiCdcInfo(scdXmlObj, c.ScdId, outFcdaDoi.(*node_attr.NDOI))
|
|
|
+ if doiCdc != fcdaCdcCode {
|
|
|
+ //错误:cdc类型不一致
|
|
|
+ parse_result := fmt.Sprintf("间隔%s的接收装置%s遥信端子%s与输出装置%s端子%s的CDC类型不一致(%s,%s)", area_name, iedname, doiDesc, tmpIedObj.Name, outFcdaDoi.(*node_attr.NDOI).Desc, doiCdc, fcdaCdcCode)
|
|
|
+ re := map[string]interface{}{"scdid": c.ScdId, "lineno": 0, "ruleid": area_ruleid, "nodeid": 0, "parse_result": parse_result,
|
|
|
+ "ied_name": iedname,
|
|
|
+ "ied_desc": iedObj.Desc,
|
|
|
+ "out_ied_name": tmpIedObj.Name,
|
|
|
+ "out_ied_desc": tmpIedObj.Desc,
|
|
|
+ "fcda_desc": doiDesc,
|
|
|
+ "fcda_addr": extref.IntAddr,
|
|
|
+ "out_fcda_desc": outFcdaDoi.(*node_attr.NDOI).Desc,
|
|
|
+ "out_fcda_addr": fmt.Sprintf("%s/%s%s%s.%s%s", extref.LdInst, extref.Prefix, extref.LnClass, extref.LnInst, extref.DoName, daname),
|
|
|
+ "error_type": "2",
|
|
|
+ }
|
|
|
+ //检查未通过
|
|
|
+ scdNodeRule.AppendFcdaCheckResult(re)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if outFcdaDoi.(*node_attr.NDOI).Desc != doiDesc {
|
|
|
//关联错误
|
|
|
parse_result := fmt.Sprintf("间隔%s的装置%s遥信端子%s与装置%s端子%s名称不匹配", area_name, iedname, doiDesc, tmpIedObj.Name, outFcdaDoi.(*node_attr.NDOI).Desc)
|
|
|
re := map[string]interface{}{"scdid": c.ScdId, "lineno": 0, "ruleid": area_ruleid, "nodeid": 0, "parse_result": parse_result,
|