DLMS/COSEM规约解析(本地部分)
00//raw-data,表明回复的是数据;如果为01则表示回复的是data-access-result 73//此数据块长度
09 06 01 01 01 06 01 FF…//接上一数据块的后续数据
客户端: 7E A0 1C 48 68 FE FF 75 98 XX XX E6 E6 00 C0 02 81 00 00 00 02 XX XX 7E
服务端: 7E A0 LL 75 48 68 FE FF B8 XX XX E6 E7 00 C4 02 81 FF 00 00 00 03 00 LL …XX XX 7E
C4 02//Get-Response-With-Datablock 81// invoke-id and priority FF//是最后的数据块
00 00 00 03//数据块序号 3 …//剩余的数据
客户端: 7E A0 1C 48 68 FE FF 75 BA XX XX E6 E6 00 C0 02 81 00 00 00 03 XX XX 7E
4.1.4. 读数据不成功情况的典型原因
1. 不支持的读操作,如表计中只支持get-response-normal的读操作,而试图用
get-response-with-datablock或者其他来读数据,如CTT发送:7EA0190321326FD8E6E600C004C1000F0000280000FF0100DAF97E,则表计回应的get.response数据域中应该为01 0C(scope-of-access-violated)
2. Get.Request的数据域中缺少参数或者没有的OBIS,比如缺少Class ID和属性,CTT发
送:7EA0150321767B4BE6E600C001C1000028000100C23A7E或者7EA0190321BA2FD0E6E600C001C1000FFFFFFFFFFFFF0100EF6C7E,则表计回应的get.response数据域中应该为01 04(object-undefined)
3. 读取对象不存在的属性,如CTT发送:
7EA0190321FE0FD4E6E600C001C1000F0000280000FF090039B77E,则表计回应的get.response数据域中应该为01 03(read-write-denied)
写操作(Set)
分为Set. Request和Set.Response。
4.2.1. Set. Request
数据设置请求帧
SET-Request::=CHOICE {
Normal-Set-request [1] IMPLICIT Set-request-pdu
Set-request-with-first-datablock [2]IMPLICIT Set-request-with-first-datablock-pdu Set-request-with-datablock [3] IMPLICIT Set-request-with-datablock-pdu Normal-Set-request-with-list [4] IMPLICIT Set-request-with-list-pdu Set-request-with-list-and-first-datablock [5]IMPLICIT Set-request-with--list-and-first-datablock-pdu }
31
DLMS/COSEM规约解析(本地部分)
Set-request-PDU::=SEQUENCE {
invoke-id-and-priority Class-ld Instance-ld Attribute-ld
Invoke-Id-And-Priority,
COSEM-CLASS-ID,
COSEM-OBJECT-INSTANCE-ID, COSEM-OBJECT-ATTRIBUTE-ID,
Access_Selection selective-access-descriptor OPTIONAL, Value Data }
Set-Request-With-First-Datablock ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, cosem-attribute-descriptor Cosem-Attribute-Descriptor,
access-selection Selective-Access-Descriptor OPTIONAL, datablock DataBlock-SA }
DataBlock-SA ::= SEQUENCE -- SA == DataBlock for the SET.request and ACTION.request services {
last-block BOOLEAN, block-number Unsigned32, raw-data OCTET STRING }
以设置时钟时间为例:
客户端:7E A0 29 48 68 FE FF 75 98 XX XX E6 E6 00 C1 01 81 00 08 00 00 01 00 00 FF 02 00 09 0C 07 D2 0C 04 03 0A 06 0B FF 00 78 00 XX XX 7E
解释:
7E A0 27 95 75 98 B8 DB E6 E6 00//Hdlc head
C1 01// SET.normal request(在DLMS认证第一阶段,规约里所有的设置操作ID均为C101) 81// invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81,超过
则为8C)
00 08// class id 00 00 01 00 00 FF// LN
02// set the 2nd attribute, time
00// haven’t access-selection-parameters
09 0C 07 D2 0C 04 03 0A 06 0B FF 00 78 00// just SET the value read before XX XX 7E//HDLC Tail
4.2.2. Set. Response
数据设置响应。
SET-Response::=CHOICE
32
DLMS/COSEM规约解析(本地部分)
{
Normal-Set-response [1] IMPLICIT Set-response-pdu
Set-response-datablock [2] IMPLICIT Set-response-for-datablock-pdu Set-response-last-datablock [3] IMPLICIT Set-response-for-last-datablock-pdu Set-response-for-last-datablock-with-list [4]IMPLICIT Set-response-for-last-datablock-with-list-pdu
Set-response-with-list [5]IMPLICIT Set-response-with-list-pdu }
Set-response-PDU::=SEQUENCE {
invoke-id-and-priority result }
Get-Data-Result ::= CHOICE {
data [0] Data,
data-access-result [1] IMPLICIT Data-Access-Result }
Set-Response-Datablock ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, block-number Unsigned32 }
Set-Response-Last-Datablock ::= SEQUENCE {
invoke-id-and-priority Invoke-Id-And-Priority, result Data-Access-Result, block-number Unsigned32 }
已设置时间回应为例,设置成功情况如下:
服务端:7E A0 12 75 48 68 FE FF B8 XX XX E6 E7 00 C5 01 81 00 XX XX 7E
Invoke-Id-And-Priority, Get-Data-Result
解释:
7E A0 12 75 48 68 FE FF B8 XX XX E6 E7 00//Hdlc head
C5 01// SET.normal response(在DLMS认证第一阶段,规约里所有的设置操作响应ID均为C501) 81// invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81,超过
则为8C)
00// success XX XX 7E//HDLC Tail 设置失败,如temporary-failure:
服务端:7E A0 13 75 48 68 FE FF B8 XX XX E6 E7 00 C5 01 81 01 02 XX XX 7E
解释:
7E A0 13 75 48 68 FE FF B8 XX XX E6 E7 00//Hdlc head
33
DLMS/COSEM规约解析(本地部分)
C5 01// SET.normal response(在DLMS认证第一阶段,规约里所有的设置操作响应ID均为C501) 81// invoke-id(000 0001) and priority(1) (数据域数据不超过数据域规定长度时,固定为81,超过
则为8C)
01// data-access-result [1] IMPLICIT Data-Access-Result 02 //temporary-failure XX XX 7E//HDLC Tail
4.2.3. 设置数据块
当一次设置的数据量很大时可采用Set-request-with-first-datablock/ Set-request-with-datablock的方式实现,以设置节假日为例:
客户端:7E A0 29 48 68 FE FF 75 54 XX XX E6 E6 00 C1 02 81 00 0B 00 00 0B 00 00 FF 02 00 00 00 00 00 01 BA 01 14 02 03 12 07 D8 09 05 FF FF 01 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 02 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 03 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 04 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 05 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 06 01 FF 11 01 02 03 12 07 D8 09 05 XX XX 7E
C1 02//Set-request-with-first-datablock 81// invoke-id and priority
00 0B 00 00 0B 00 00 FF 02 00//设置项的CLASS ID\\OBIS和属性等 00//不是最后一个数据块 00 00 00 01//第1数据块 BA//数据块长度 01 14//20个节假日
02 03 12 07 D8 09 05 FF FF 01 01 FF 11 01//第1个节假日 02 03 12 07 D8 09 05 FF FF 02 01 FF 11 01//第2个节假日 …
02 03 12 07 D8 09 05//续下一个数据块
服务端:7E A0 13 75 48 68 FE FF 74 XX XX E6 E7 00 C5 02 81 00 00 00 01 XX XX 7E
C5 02//Set-response-datablock 00 00 00 01//收到第1数据块
客户端:7E A0 29 48 68 FE FF 75 76 XX XX E6 E6 00 C1 03 81 00 00 00 00 02 LL FF FF 07 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 08 01 FF 11 01 … XX XX 7E
C1 03//Set-request-with-datablock 81// invoke-id and priority 00//不是最后一个数据块 00 00 00 02//第2数据块 LL//数据块长度
FF FF 07 01 FF 11 01 02 03 12 07 D8 09 05 FF FF 08 01 FF 11 01 … //紧接上一数据快数据
服务端:7E A0 13 75 48 68 FE FF 96 XX XX E6 E7 00 C5 02 81 00 00 00 02 XX XX 7E
//收到第2数据块
客户端:7E A0 29 48 68 FE FF 75 98 XX XX E6 E6 00 C1 03 81 FF 00 00 00 03 LL… XX XX 7E
C1 03//Set-request-with-datablock 81// invoke-id and priority 00//不是最后一个数据块
34
DLMS/COSEM规约解析(本地部分)
00 00 00 03//第3数据块 LL//数据块长度
… //紧接上一数据快数据
服务端:7E A0 13 75 48 68 FE FF 96 XX XX E6 E7 00 C5 03 81 00 00 00 00 03 XX XX 7E
C5 03//Set-response-last-datablock 81//
00// Data-Access-Result:OK 00 00 00 03//收到弟3数据块
4.2.4. 写数据不成功情况的典型原因
1. 不支持的写操作,如表计中只支持Normal-Set-request l的写操作,而试图用其他来写数
据,如CTT发送:7EA0210321324571E6E600C106C1000F0000280000FF010009060000280000FF4F967E则表计回应的get.response数据域中应该为01 0C(scope-of-access-violated)
2. Set.Request的数据域中缺少参数或者没有的OBIS,比如缺少Class ID和属性 3. 设置对象不存在的属性
方法操作(Action)
分为ACTION Request和ACTION.Response。
4.3.1. ACTION. Request
ACTION-Request::=CHOICE {
Normal-Action-request
[1] IMPLICIT Normal-Action-request-pdu
Action-request-for-next-pblock [2] IMPLICIT Action-request-for-next-pblock-pdu Action-request-with-list [3] IMPLICIT Action-request-with-list-pdu Action-request-with-list-and-first-pblock [4] IMPLICIT Action-request-with-list-and-first-pblock-pdu
Action-request-with-pblock [5]IMPLICIT Action-request-with-pblock-pdu }
Normal-Action-request-pdu::=SEQUENCE {
invoke-id-and-priority Class-ld Instance-ld Method-ld }
以清当前正向有功电量为例:
35
Invoke-Id-And-Priority,
COSEM-CLASS-ID,
COSEM-OBJECT-INSTANCE-ID, COSEM-OBJECT-OPERATION-ID,
Method_Inv_Params Data OPTIONAL,(有些执行动作需要带参数)