DLMS/COSEM规约解析(本地部分)
19 07 DA 06 0A 04 0E 04 00 FF 80 00 00 - 19 07 DA 09 0A 05 0E 04 00 FF 80 00 00 00就是开始时间和结束时间了。。
后面两个00固定
那如果换成其他的事件的话只是OBIS和19 07 DA 06 0A 04 0E 04 00 FF 80 00 00 - 19 07 DA 09 0A 05 0E 04 00 FF 80 00 00 00变化的。。
4.1.1. Get. Request
数据请求帧
GET-Request ::= CHOICE {
get-request-normal [1] IMPLICIT Get-Request-Normal, get-request-next
[2] IMPLICIT Get-Request-Next, get-request-with-list
[3] IMPLICIT Get-Request-With-List
}
Get-Request-Normal ::= SEQUENCE {
invoke-id-and-priority
Invoke-Id-And-Priority, cosem-attribute-descriptor
Cosem-Attribute-Descriptor,
access-selection-parameters
Selective-Access-Descriptor OPTIONAL
}
Get-Request-Next ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, block-number Unsigned32 }
Cosem-Attribute-Descriptor ::= SEQUENCE {
class-id Cosem-Class-Id,
instance-id Cosem-Object-Instance-Id, attribute-id Cosem-Object-Attribute-Id }
Cosem-Object-Instance-Id ::= OCTET STRING (SIZE(6))
Cosem-Object-Attribute-Id ::= Integer8
26
DLMS/COSEM规约解析(本地部分)
以请求反向有功为例:
客户端: 7E A0 1C 48 68 FE FF 75 54 XX XX E6 E6 00 C0 01 81 00 03 01 01 02 08 00 FF 02 00 XX XX 7E
解释:
7e a0 1c 00 22 00 23 03 54 XX XX e6 e6 00 //Hdlc head c0 // get-request
Cosem apdu[192]
01 //Request Nomal(因此,在DLMS认证第一阶段,规约里所有的读操作ID均为C001) 81 // invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81或C1,超过则为8C CC)没超过128 直接就一个字节,超过128字节,则加81 后边的字节是长度,超过255字节,则加82 后边的2个字节是长度
00 03//Class id
01 01 02 08 00 ff //反向总有功 OBIS 02 //反向总有功的第二属性,值域。 00 // haven’t access-selection-parameters XX XX 7E //HDLC Tail
4.1.2. Get. Response
数据响应帧。
GET-Response ::= CHOICE {
get-response-normal [1] IMPLICIT Get-Response-Normal, get-response-with-datablock
[2] IMPLICIT Get-Response-With-Datablock, get-response-with-list
[3] IMPLICIT Get-Response-With-List
}
Get-Response-Normal ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, result
Get-Data-Result
}
Get-Response-With-Datablock ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, result DataBlock-G }
Get-Data-Result ::= CHOICE {
data [0] Data,
data-access-result [1] IMPLICIT Data-Access-Result }
Data ::= CHOICE
27
DLMS/COSEM规约解析(本地部分)
{ null-data [0] IMPLICIT NULL,
array
[1] IMPLICIT SEQUENCE OF Data, structure [2] IMPLICIT SEQUENCE OF Data, boolean [3] IMPLICIT BOOLEAN, bit-string
[4] IMPLICIT BIT STRING, double-long [5] IMPLICIT Integer32,
double-long-unsigned [6] IMPLICIT Unsigned32,
floating-point [7] IMPLICIT OCTET STRING(SIZE(4))33, octet-string [9] IMPLICIT OCTET STRING, visible-string
[10] IMPLICIT VisibleString, time [11] IMPLICIT GeneralizedTime, bcd [13] IMPLICIT Integer8, integer [15] IMPLICIT Integer8, long
[16] IMPLICIT Integer16, unsigned
[17] IMPLICIT Unsigned8, long-unsigned [18] IMPLICIT Unsigned16,
compact-array
[19] IMPLICIT SEQUENCE
{
contents-description [0] TypeDescription, array-contents
[1] IMPLICIT OCTET STRING
}
long64 [20] IMPLICIT Integer64, long64-unsigned [21] IMPLICIT Unsigned64, enum
[22] IMPLICIT ENUMERATED,
float32 [23] IMPLICIT OCTET STRING (SIZE(4)), float64 [24] IMPLICIT OCTET STRING (SIZE(8)), don’t-care
[255] IMPLICIT NULL
}
Data-Access-Result ::= ENUMERATED { success
(0), hardware-fault
(1), temporary-failure (2), read-write-denied (3), object-undefined (4), object-class-inconsistent
(9), object-unavailable (11), type-unmatched
(12), scope-of-access-violated (13), data-block-unavailable
(14),
28
DLMS/COSEM规约解析(本地部分)
long-get-aborted long-set-aborted other-reason }
(15), (16), (17), (18), (250)
no-long-get-in-progress no-long-set-in-progress
DataBlock-G ::= SEQUENCE -- G == DataBlock for the GET.response service {
last-block BOOLEAN, block-number Unsigned32, result CHOICE {
raw-data [0] IMPLICIT OCTET STRING, data-access-result [1] IMPLICIT Data-Access-Result } }
81 D3 01 0C D3是数据块长度, 01--数组对象 0C--12个数组
81 DB 01 81 C8 DB-是数据块长度, 01---数组对象 C8--200个数组
当长度超过127字节时,带81
然后后续1个字节表示长度
超过255字节,带82,然后后续2个字节是长度
以响应“请求反向有功”为例,读数据成功:
服务端: 7E A0 18 75 48 68 FE FF 74 XX XX E6 E7 00 C4 01 81 00 06 00 35 7B 18 XX XX 7E
解释:
7E A0 18 03 00 22 00 23 74 XX XX E6 E7 00 //Hdlc head
C4 01 //Response Normal(在DLMS认证第一阶段,规约里所有的回应读操作操作ID均为C401)
81 // invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81,超过则为8C) 00 //by data 06 //数据类型
00 35 7B 18 //反向有功值 XX XX 7E//HDLC Tail
读数据不成功,以object-undefined为例:
服务端: 7E A0 14 75 48 68 FE FF 74 XX XX E6 E7 00 C4 01 81 01 04 XX XX 7E
解释:
29
DLMS/COSEM规约解析(本地部分)
7E A0 14 03 00 22 00 23 74 XX XX E6 E7 00 //Hdlc head
C4 01 //Response Normal(在DLMS认证第一阶段,规约里所有的回应读操作操作ID均为C401)
81 // invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81,超过则为8C)
01// data-access-result [1] IMPLICIT Data-Access-Result 04 //object-undefined XX XX 7E//HDLC Tail
4.1.3. 读数据块
当一次读取数据量较大时,表计可采用Get-Response-With-Datablock的方式回复。以读取负荷曲线数据为例:
客户端: 7E A0 1C 48 68 FE FF 75 54 XX XX E6 E6 00 C0 01 81 00 07 00 00 62 01 00 7E 03 00 XX XX 7E 服务端: 7E A0 LL 75 48 68 FE FF 74 XX XX E6 E7 00 C4 02 81 00 00 00 00 01 00 73 01 0E 02 04 12 00 08 09 06 00 00 01 00 00 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 00 00 01 00 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 08 01 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 08 02 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 08 03 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 08 04 FF 0F 02 12 00 00 02 04 12 00 04 XX XX 7E
C4 02//Get-Response-With-Datablock 81// invoke-id and priority 00//不是最后的数据块 00 00 00 01//数据块序号 1
00//raw-data,表明回复的是数据;如果为01则表示回复的是data-access-result 73//此数据块长度
01 0E//此负荷曲线记录了14列数据项
02 04 12 00 08 09 06 00 00 01 00 00 FF 0F 02 12 00 00//第1个数据项:时间 02 04 12 00 03 09 06 01 00 00 01 00 FF 0F 02 12 00 00//第2个数据项:结算次数
02 04 12 00 03 09 06 01 01 01 08 01 FF 0F 02 12 00 00//第3个数据项:A+ T1 02 04 12 00 03 09 06 01 01 01 08 02 FF 0F 02 12 00 00//第4个数据项:A+ T2 02 04 12 00 03 09 06 01 01 01 08 03 FF 0F 02 12 00 00//第5个数据项:A+ T3 02 04 12 00 03 09 06 01 01 01 08 04 FF 0F 02 12 00 00//第6个数据项:A+ T4 02 04 12 00 04//接下一个数据块中
客户端: 7E A0 1C 48 68 FE FF 75 76 XX XX E6 E6 00 C0 02 81 00 00 00 01 XX XX 7E
c0 02// get-request-next
81 00 00 00 01//已经接收第一个数据块
服务端: 7E A0 LL 75 48 68 FE FF 96 XX XX E6 E7 00 C4 02 81 00 00 00 00 02 00 73 09 06 01 01 01 06 01 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 06 02 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 06 03 FF 0F 02 12 00 00 02 04 12 00 03 09 06 01 01 01 06 04 FF 0F 02 12 00 00 … XX XX 7E
C4 02//Get-Response-With-Datablock 81// invoke-id and priority 00//不是最后的数据块 00 00 00 02//数据块序号 2
30