基于PyASN1的IEC 61850 SavPDU类型类定义是否正确?
关于PyASN1实现IEC 61850-9-2 SavPdu类的合规性验证
ASN.1定义(来自IEC 61850-9-2第8.5.2节表14)
SavPdu ::= SEQUENCE { noASDU [0] IMPLICIT INTEGER (1..65535), security [1] ANY OPTIONAL, asdu [2] IMPLICIT SEQUENCE OF ASDU } ASDU ::= SEQUENCE { svID [0] IMPLICIT VisibleString, datset [1] IMPLICIT VisibleString OPTIONAL, smpCnt [2] IMPLICIT OCTET STRING (SIZE(2)), confRev [3] IMPLICIT OCTET STRING (SIZE(4)), refrTm [4] IMPLICIT UtcTime OPTIONAL, smpSynch [5] IMPLICIT OCTET STRING (SIZE(1)), smpRate [6] IMPLICIT OCTET STRING (SIZE(2)) OPTIONAL, sample [7] IMPLICIT OCTET STRING (SIZE(n)), smpMod [8] IMPLICIT OCTET STRING (SIZE(2)) OPTIONAL }
自行实现的Python类(ASDU类已在其他位置定义)
from pyasn1.type import constraint, namedtype, tag, univ class SavPdu(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('noASDU', univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(1,65535), implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))), namedtype.OptionalNamedType('security', univ.Any().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))), namedtype.NamedType('asdu', univ.SequenceOf(componentType=ASDU()).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple,2))) )
合规性分析与结论
整体实现符合ASN.1模型定义和PyASN1库规范,但有一处细节可优化以贴合PyASN1最佳实践:
- 定义
SEQUENCE OF ASDU时,SequenceOf的componentType参数应传入类型类(ASDU)而非实例(ASDU())。SequenceOf需要的是类型模板,传递实例可能引入不必要的状态,调整后代码如下:namedtype.NamedType('asdu', univ.SequenceOf(componentType=ASDU).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple,2)))
另外需确认已定义的ASDU类是否满足以下要求:
- 各字段的隐式标签与ASN.1定义完全匹配
- OCTET STRING的SIZE约束已正确设置(如
smpCnt需添加constraint.ValueSizeConstraint(2, 2)) - 可选字段已通过
OptionalNamedType定义
内容的提问来源于stack exchange,提问作者TWhite
相关产品推荐
相关产品推荐

