EDMI Command Line 协议(红相电度表规约)mk6

更新时间:2024-04-06 10:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EDMI Command Line 通信协议

Command Line 是EDMI电能表与外部终端进行通信所用的协议。对于设计者,本规约提供了一整套与电能表直接通信的可行的方法。 Command Line为设计者提供详细读取EDMI电能表数据的方法。它是以命令行的格式发送一系列固定的指令。以下将详细表述了通过RS485或RS232通信口进行通信的方法。

命令的结构

所有命令均以字符“STX”开始,以字符“ETX”结束,并符合以下通用格式:

的内容是要被发送的命令信息

是按CCITT标准定义的16位的CRC-16多项校验码.。该CRC是通过对整个信息进行计算的。(含“STX”,但不含“CRC”本身及“ETX”字符,如果在之间没有命令,那么将不需要CRC校验)

电能表对发送过来的命令产生应答,应答命令格式如下所示: 的内容可能是:

(16进制的“6”)----指令操作成功

(16进制的“18”)----CRC校验正确,但指令有误 或是含有数据的应答信息:

的内容都是以二进制发送,因此,一些特殊控制字符有可能出现在传输的数据中,该字符与发送的真正的

1

起始和结束字符混淆。为了避免这样的问题,采用填充字符的方式处理。特殊控制字符由一个DLE(16进制的“10”)字符跟第六位置1的原字符组成,以双控制字符发送。在接收端,截下并除去所有的“DLE”字符,而对跟在“DLE”后面的字符的第六位清零。下述字符以这种方式处理:

(hex02) 发送为:(hex10)(hex42) (hex03) 发送为:(hex10)(hex43) (hex11) 发送为:(hex10)(hex51) (hex13) 发送为:(hex10)(hex53) (hex10) 发送为:

(hex10)(hex50)

命令行的响应

命令行的格式定义如下:

“test” 表示一个以0为结束符的字符串。(“”字符不发送) {5} 表示一个8位的整数。 [10] 表示一个16位的整数。 (1000) 表示一个32位的整数。 <1.23> 表示一个32位的浮点数。

注意:所有多字节数(包括整数和浮点数),首先传送高位(Motorola格式)。

接收成功时,应答码为

接收失败时,应答码为跟上错误代码 错误代码如下:

2

代码 1 2 3 4 5 6 7 8 9 解释 不能写入(如:序列号已被设置) 操作未完成 寄存器未找到 访问被拒绝(安全原因) 字节数错误(要求的字节数不正确) 无效的类型码(内部错误) 数据未准备好(处理中),稍候再试 超出范围,输入值超出了定义的范围 未登录 表1命令行应答码

命令行模式 Command: Response:

这个初始化消息用于启动访问命令行。由于命令主体为空,CRC被省略,收到信息后,终端进入命令行模式。

登录命令 Command:L“id, pw” Response:

本命令用于登录系统。“id”、“pw”分别是用户名和密码,密码以0为结束符。

注意:对用户ID和密码的保密以及字符串以0结束。

3

退出命令 Command:x Response: 本命令用于退出系统。

注意:登陆电表进行数据通信后,请用该命令退出。

信息命令 Command:I[reg_num] Response: I[reg_num]/data/ 本命令将返回所要查询的寄存器信息。 /data/是以0为结束符的字符串:

为寄存器的类型,以字母表示(见前面的有关类型的列表)。字母序列在未来若需要扩展的话,将使用小写字母。由信息命令返回的是外部类型。

〈测量单位〉 测量单位 A D H M N P Q

Amps 角度值 Hz(赫兹) 分钟 No Unit 百分比 功率因素 4

R S T U V W X Y Z Vars(无功功率) VA(视在功率) 秒 未定义 Volts(伏特) Watts(瓦特) Wh(有功) Varh(无功) Vah(视在) 表2信息命令单位

结构组成:是具有高达16个字符并以0为结束符的格式的寄存器描述。

当寄存器不能正常访问时(任何原因,包括安全原因),将返回一个“N”和数据类型“U”(说明该数据类型未知)。在这种情况下描述的内容将是“Register xxxx”。

读寄存器命令 Command:R[reg_num] Response:R[reg_num]/data/

这条命令返回寄存器存储的数据。所有寄存器将在后续章节《寄存器列表》中列出。32位寄存器地址码的前16位置为0。读命令后可加一个大写字母“D”,使得设置复费率电能量(TOU)的寄存器返回的是一个单精度浮点数,如果需要得到的是双精度浮点数可以在上面提

5

到的读寄存器命令后增加一个大写字母D。它的命令的格式是:

R[reg_num]D

注意:对于不支持双精度浮点数的寄存器,这个“D”将是无效。

写寄存器命令 Command:W[reg_num] /data/ Response: or

这条命令功能是将数据写入寄存器。/data/的数据类型必须与寄存器的类型相匹配。所有的寄存器将在后续章节《寄存器列表》中列出。当指令执行成功,终端应答是码,而若试图对只读寄存器进行写操作时,应答则是码。32位寄存器地址码的前16位置为0。

读扩展寄存器命令 Command:M(reg_num)

Response Success:M(reg_num)/data/ Response Failure:Response Code

这条命令返回寄存器的数据。所有的寄存器将在后续章节中《寄存器列表》中列出。

使用这条命令,设置复费率的寄存器(TOU)总是以双浮点数而非单浮点数返回。 读多个寄存器命令 利用从特殊寄存器读的读扩展寄存器命令,就能读取多个地址不连

续的寄存器,从而提高整个效率。除了可读取地址非连续的寄存器外,其它与普通的读寄存器命令相似。对应于读多个命令的两种不同类

6

型,有两种特殊的寄存器。

FFF0----对整块寄存器的读取,返回一个错误码。如果出现一个读出错误,整条命令将返回一个“CAN”码。

FFF1----对每个寄存器的读取,均返回一个错误码。即使全部的读出都发生错误,整个应答仍返回操作成功信息。当一个读取错误时,结果代码n(“Result Code n”)将为非0值,并且/data/将被标准的错误提示字符串所代替。 (1) 多个读,单个错误码

Command: M <0000FFF0> ….

Response Success: M <0000FFF0> /Data1 /Data2/.… /Data n/ Response Failure: CAN {Error code} (2) 多个读,多个错误码

Command: M <0000FFF1> ….

Response

Success/Failure:

M

<0000FFF1>

{Result

Code1}/Datat1/ {Result code2}/Data2/…. {Result Code n}/Data n/

写扩展寄存器命令 Command: N(reg_num)/data/ Response: Response Code

这条命令将数据写入寄存器(寄存器地址码为reg_num)。数据的类

7

型必须与寄存器的类型匹配。所有的寄存器将在后继章节《寄存器列表》中列出。当命令执行成功,终端应答将是〈ACK〉码,而若试图对只读寄存器进行写操作时,应答则是〈CAN〉码。

写多个寄存器命令 利用从一个特殊寄存器读取的读扩展寄存器命令,就能读取多个地址不连续的寄存器,从而提高整个效率。除了可读取地址非连续的寄存器外,其它与普通的读寄存器命令相似。对应于读多个命令的两种不同类型,有两种特殊的寄存器。 (1) 多个写,单个错误码

Command:

N

<0000FFF0>

/Data1/

/Data2…. /Data n/ Response Success: ACK

Response Failure: CAN {Error code} (2) 多个写,多个错误码

Command:

N

<0000FFF1>

/Data1/

/Data2…. /Data n/

Response Success/Failure: {Result Code1} {Result Code2}….{Result Code n}

只要有一个写入错误发生于任何一个寄存器,即使写入成功,仍将返回一个“CAN”码。数据的长度必须正确。如果一个应答码是非零的(如发生错误),则其后会跟随一个以0为结束符的错误码字符串。就整条信息而言,即使全部写入都错误,应答仍是成功的。

8

注意:当写多个寄存器时应小心。一个写入错误就会使命令终止,会产生一些寄存器已写入数据,而一些却没有被写入的情况。

扩展信息的命令

Command: O(reg_num)

Response: O(reg_num)/data/ or Response code if invalid command

本命令返回寄存器的信息。

/data/是一个以0为结束符的字符串,格式为: “

如果某个寄存器不能访问(由于任何原因,包括安全原因),将返回一个“N”和数据类型为“U”(类型未知)。在这种情况下的“描述”(Description)是“Register××××”。

读多个扩展寄存器命令

Command: A(reg_num){num_reg}

Response Success: A(reg_num){num_reg}/data/

Response Failure: Response Code

本命令返回从地址reg_num开始的数值寄存器存储的数据。这里应注意读取的字符串的长度是可变的。

对于TOU复费率电能量寄存器,此命令返回双浮点数而非单浮点数。 写多个扩展寄存器命令

Command: B(reg_num){num_reg}/data/

Response: Response Code

9

本命令功能将数据写入以地址reg_num开始的数值寄存器中。 /data/的类型必须与寄存器的类型匹配。注意字符串长度是可变的,并且“J”型寄存器不能用这种方式写入。所有的寄存器将在后继章节《寄存器列表》中列出。当命令执行成功时,终端将返回〈ACK〉,而如果寄存器不能写入时,终端将反回〈CAN〉。

EziPort 数据命令 Command: none

Response: S(reg_num){data type}/data/

本命令仅有应答形式。EziPort利用这种格式发送数据。发送的寄存器在电能表中已进行设置,并且在以上格式中,数据每次仅发送到一个寄存器中。如果某个寄存器读取错误的话,这个寄存器就根本不能用于发送。

对于TOU复费率电能量寄存器,此命令返回双浮点数。

文件访问 测量信息存储于结构化文件中,以下详细介绍了这些命令。 文件访问----读命令 Command:

FR(reg_num)

(startrecord)

[numberofrecords]

[record offset][record size]

Response: FR (reg_num)(Actual start record)[Actual number of

records][Actual record offset][Actual record size]/data/

Response fail: Response Code

起始记录若过早,文件指针将向前跳到第一个记录上;若太迟,文件

10

指针将跳到最后记录,发送的文件将是个空记录文件。如果记录数太大,将减小为文件尾的值或块长度限定值。如果记录簇过大,可设置为记录的长度。如果记录长度过长,可减小为实际记录长度或块长度最大值。

文件访问----写命令

Command: FW(reg_num)(start record)[record offset][record size]/data/ Response: Response Code

如写入文件的数据在长度设置上的出现错误会引起写操作无法进行。 文件访问信息命令

Command: FI(reg_num)

Response: FI(reg_num)(start record)(number of records)[record size]{file type}“File Name”

Response Fail: Response code File type:

Bit0: 可用于查找时间 文件访问----查找命令 Command:FS(reg_num)(startrecord){date}{month}{year}{hour}

{minute}{second}{dir}

这里的“date/time”就是要查找的日期和时间。Response:FS(reg_num)(start

record){date}{month}{year}{hour}{minute}{second}{result} 这里的“date/time”就是所要查找的日期和时间。

11

Response Fail: Response code

查找指定的时间。

Dir=0: 从起始记录开始往后查找,停在匹配的第一个记录,并给

出该记录的入口地址。当文件指针移过指定的时间而未能找到匹配的记录时,指针将指向指定时间的后一记录的入口地址。

Dir=1: 从起始记录开始往前查找,停在匹配的第一个记录,并给出该记录的入口地址。当文件指针移过指定的时间而未能找到匹配的记录时,指针将指向指定时间的前一记录的入口地址。 Result=0: 找到匹配记录。 Result=1: 到达文件末尾。 Result=2: 找到相邻时间的记录。

Result=3: 不能找到任何记录----测量时无时间标记。 Result=4: 测量时无记录数据。

扩展命令

Command: E(Destination’s#)(Source’s#)[Sequence]/normal

command/

Response: E(Source’s#)(Destination’s#)[Sequence]/normal response/

E命令是为扩展命令行协议而设计的,允许多点通信和消息的重发、广播。所有其它命令都能通过“E”命令执行。

(Destination’s#) 目标地址: 电能表的序列号就是命令的目标地址。实际应用中只要将EDMI电能表的序列号直接转换为四个字节的

12

十六进制码。

(Source’s#)源地址:该地址是所需软件的序列号。

[Sequence]帧号:帧号是一个从1到32767的数字,并且对每次请求应该互不相同。

在应答中,源序列号和目的序列号相互交换,因此,所需软件的序列号此时在目的地址的位置上。

广播消息 序列号FFFFFFFF是一个广播地址,所有终端都能接收,不作出应答。 序列号FFFFFFFE是一个广播地址,所有终端都能接收,并作出应答。 序列号FFFFFFFD是一个广播地址(保留给RS485接口的站点使用),所有终端都能接收,且在随后的随机时间段内作出应答。最大的时间周期是由原来的命令来指定。 返回的包将用终端地址替换广播地址。 帧号

每次发送都必须有一个帧号,这个帧号应不同于前一序号。应答时带有相同的帧号,这样就可以以此校验这个应答是否对应于相应的请求。

重发命令采用与原先相同的序号。通过这种方式,如果电能表没有收到原先的请求,那么将作出应答,否则,则将上次发送的应答重新发送,但是命令并没有重新执行。电能表上次发送的内容保存在缓冲区中,一旦需要重发,便可再次发送。

帧号的最高有效位保留,并且通常情况下为0。有个特殊是帧号

13

65536,它从不重发。这可用于上次发送的未知帧号的情况。 如果在扩展命令执行了一个普通命令,扩展命令的应答就不可能重发,而扩展命令将以一个新的帧号重新执行。

命令行访问指南 本节将详细、逐步地说明利用命令行模式访问电能表的例子,同时也涉及了IEEE浮点格式的细节。

读电能表的例子

本例为读取电能表的序列号。从本手册的寄存器列表中,可找到存储序列号的寄存器地址是F002。

首先以一个STX开始,即十六进制的02, Hexadecimal: [02] Decimal: 2

接下来的内容由命令决定。读取寄存器的命令是“R”,即十进制的82。

Hexadecimal: [02]R

Decimal: 2,82

要读取的寄存器的地址跟在命令后,高字节在前面: Hexadecimal: [02]R[F0][02] Decimal: 2,82,240,2

然后为这4个数加一个16位的CRC校验码。这个校验码在十六进制中是EE45,即十进制中的60997,分成两个8位的数,高字节放在前面。因此现在命令是:

14

Hexadecimal: [02]R[F0][02][EE][45] Decimal: 2,82,240,2,238,69

某些特殊字符一旦出现在信息中,必须采用以下方法进行替换掉处理。(不含电能表命令行的起始和结束标志符)

这些特殊字符是2,3,16,17,19;处理方法是:如果其中的任何一个出现在信息体中,就将数字16插入他的前面,并将此数值加上64。 例如:数字2出现在本例的第三个位置,它将被数字16和其后的数字66代替。这样的话,结果将是:

Decimal: 2,82,240,16,66,238,69 现在在末尾加上结束标志符,数字3(EXT) 如下: Decimal: 2,82,240,16,66,238,69,3

这就是发送给电能表的数据。电能表将以如下格式的数据应答: Hexadecimal:[02][52][F0][10][42][39][33][30][30][30][30] [30][00][1B][10][42][03]

Decimal: 2,82,240,16,66,57,51,48,48,48,48,48,0,27,16,66,3

注意:命令行的起始和结尾是分别由数字2(STX)和数字3(ETX)标记的。

对于经过特殊处理的字符在处理该数据时应该按以下方法给予恢复。方法是:在有数字16出现的位置,先把16去掉,并把后面跟着的数字减去64。这个例子中,有两个位置出现了这种情况: Hexadecimal:

15

[02][52][F0][02][39][33][30][30][30][30][30][00][1B][02][03]

Decimal: 2,82,240,2,57,51,48,48,48,48,48,0,27,2,3

倒数第2个和倒数第3个数字是16位的CRC校验和数据(高位在前面)。

校验码是这样进行校验的:对CRC码前的所有数字算出16位CRC校验码(CRC数字例如2到0不计算在内)。若所得校验码是错的,将丢弃此条信息。

校验码以及STX/ETX字符可以去掉了。

Hexadecimal:[52][F0][02][39][33][30][30][30][30][30][00] Decimal: 82,240,2,57,51,48,48,48,48,48,0 第一个数字表示应答的类型。在本例中,第一个数字是82,即ASCII码的字母“R”,表示这是对一个读请求的应答。跟在后面的两个数字组成的F002是所读取的寄存器的地址,这些信息对于处理应答是十分有用的。没有应答类型时,数据如下:

Hexadecimal: [39][33][30][30][30][30][30][00]

Decimal: 57,51,48,48,48,48,48,0

通过查询本手册的列表,寄存器F002是字符串类型。数据由一系列字符组成,在字符串末尾用数字0表示结束。 我们可用ASCII码字符将这些数据表示为: Text: 9300000

16

用数字0表示结束。“930000”就是从电能表读到的序列号。

访问电能表的例子

为了访问电能表,必须获得授权,登录电能表,进行一定量数据的读、写,然后退出电能表,我们将用如下例子说明。

发送一个“Escape”字符,其后跟着只有起始和停止码的短信息。 Hexadecimal: [1B][02][03] Decimal: 27,2,3 返回一个确认〈ACK〉。

Hexadecimal: [02][06][06][A4][03] Decimal: 2,6,164,3

这是一个应答命令〈ACK〉,没有相关数据。

注意:该方式仅适用于RS232的通信方式,用于唤醒电表使用。多点的RS485通信方式不能使用。

使用登录命令“L”来登录电能表。出厂的缺省的用户名和密码分别为“EDMI”“IMDEIMDE”。 Hexadecimal:

[02][4C][45][44][4D][49][2C][49][4D][44][45][49][4D][44][45][00][D9][69][03]

Text: [02]LEDMI,IMDEIMDE[00][D9][69][03] 如果登录成功,将会发送一个〈ACK〉码。 Hexadecimal: [02][06][06][A4][03] Decimal: 2,6,6,164,3

17

如果登录不成功,将会发送一个〈ACK〉码。 Hexadecimal: [02][18][F5][5B][03] Decimal: 2,24,245,91,3

登录成功后,就可以对寄存器进行读、写操作。 如:读取序列号,

Hexadecimal: [02][52][F0][10][02][EE][45][03] Decimal: 2,82,240,10,66,238,69,3 则应答如下:

Hexadecimal:[02][52][F0][10][42][39][33][30][30][30][30][30][00][1B][10][42][03]

Decimal: 2,82,240,10,66,57,51,48,48,48,48,48,0,27,16,66,3

当访问结束时,用“X”命令退出本次登录。 Hexadecimal: [02][58][BD][9F][03] Decimal: 2,88,189,159,3 正常退出时将返回一个〈ACK〉码。 Hexadecimal: [02][06][06][A4][03] Decimal: 2,6,6,164,3 注意:

EDMI的应用程序REGTEST.EXE用于对电能表访问的测试。利用“-H”参数可以显示所有发送和接受到的字符。这对需求的测试是十分有用的。

18

若有一字节是十进制的DLE,带有“-H”参数的Regtest程序将显示跟在DLE后的字符,此字符的第6位没有设置。

例:REGTEST程序显示的[02][52][10][02][69][46][2B][03]将以[02][52][10][02][69][46][2B][03]发送。

为了在简单系统中简化操作,可以对请求进行测试(包括校验码)和发送。在可靠媒介中,对接受到的CRC的校验可以跳过,以避免任何计算CRC的操作,虽然这可能导致错误的数据被接受。

19

本文来源:https://www.bwwdw.com/article/k5wr.html

Top