我是使用 pyasn1 的新手,正在尝试按照 Berkeley 发布的 PyASN1 程序员手册 文档
IEC 61850-9-2 第 8.5.2 节表 14 将 SEQUENCE 类型转换为 python 类模型SavPdu 的编码定义为
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 类:
from pyasn1.type import constraint, namedtype, tag, univ
class SavPdu(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('noASDU', univ.Integer(suptypeSpec = constraint.ValueRangeConstraint(1,65535)).tagSet.tagImplicitly(tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
namedtype.NamedType('security', univ.Any),
namedtype.NamedType('asdu', univ.Sequence(ASDU).tagSet.tagImplicitly(tag.tagClassContext, tag.tagFormatSimple, 2))
)
其中 ASDU 是文件中其他位置定义的另一个 python 类。
我是否正确地定义了我的类关于模型和库?
关于 SavPDU 类型的 pyasn1 数据结构几乎是正确的。这里有一些小修改和需要考虑的地方:
1. 可选字段:
在的
SavPdu
定义中,
security
字段是可选的。需要在 pyasn1 中明确地将其标记为可选的。
from pyasn1.type import constraint, namedtype, tag, univ, optional
class SavPdu(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('noASDU', univ.Integer(suptypeSpec = constraint.ValueRangeConstraint(1,65535)).tagSet.tagImplicitly(tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
namedtype.OptionalNamedType('security', univ.Any().tagSet.tagExplicitly(tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
namedtype.NamedType('asdu', univ.SequenceOf(componentType=ASDU()).tagSet.tagImplicitly(tag.tagClassContext, tag.tagFormatSimple, 2))
)
2. SEQUENCE OF 类型:
在
SavPdu
定义中将
asdu
字段定义为
univ.Sequence(ASDU)
。这表示
asdu
应该只包含一个
ASDU
实例。但是,根据 IEC 61850-9-2 标准,
asdu
字段应该是
ASDU
类型的序列。因此,需要使用
univ.SequenceOf
来表示它:
namedtype.NamedType('asdu', univ.SequenceOf(componentType=ASDU()).tagSet.tagImplicitly(tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)))
3. ASDU 类的定义:
没有提供
ASDU
类的定义,但我假设已经根据 IEC 61850-9-2 标准正确定义了它。请确保在
ASDU
类定义中也正确地处理了可选字段和数据类型。
4. 其他注意事项:
- 隐式和显式标签: 在的代码中,将所有标签都定义为隐式标签。请仔细检查 IEC 61850-9-2 标准,以确认哪些标签应该是隐式标签,哪些应该是显式标签。
- 约束: 确保为每个字段定义了正确的约束,例如值范围、大小限制等。
通过进行这些更改,的 pyasn1 数据结构应该能够正确地表示 IEC 61850 样本值 SavPDU 类型。
标签:python,pyasn1 From: 78780563