(hex10)(hex50)
命令行的响应
命令行的格式定义如下:
“test”表示一个以0为结束符的字符串。
(“”字符不发送)
{5}表示一个8位的整数。
[10]表示一个16位的整数。
(1000)表示一个32位的整数。
<1.23>表示一个32位的浮点数。
注意:
所有多字节数(包括整数和浮点数),首先传送高位(Motorola格式)。
接收成功时,应答码为
接收失败时,应答码为跟上错误代码
错误代码如下:
代码
解释
1
不能写入(如:
序列号已被设置)
2
操作未完成
3
寄存器未找到
4
访问被拒绝(安全原因)
5
字节数错误(要求的字节数不正确)
6
无效的类型码(内部错误)
7
数据未准备好(处理中),稍候再试
8
超出范围,输入值超出了定义的范围
9
未登录
表1命令行应答码
命令行模式
Command:
Response:
这个初始化消息用于启动访问命令行。
由于命令主体为空,CRC被省略,收到信息后,终端进入命令行模式。
登录命令
Command:
L“id,pw”
Response:
本命令用于登录系统。
“id”、“pw”分别是用户名和密码,密码以0为结束符。
注意:
对用户ID和密码的保密以及字符串以0结束。
退出命令
Command:
x
Response:
本命令用于退出系统。
注意:
登陆电表进行数据通信后,请用该命令退出。
信息命令
Command:
I[reg_num]
Response:
I[reg_num]/data/
本命令将返回所要查询的寄存器信息。
/data/是以为0结束符的字符串:
“”
为寄存器的类型,以字母表示(见前面的有关类型的列表)。
字母序列在未来若需要扩展的话,将使用小写字母。
由信息命令返回的是外部类型。
〈测量单位〉
测量单位
A
Amps
D
角度值
H
Hz(赫兹)
M
分钟
N
NoUnit
P
百分比
Q
功率因素
R
Vars(无功功率)
S
VA(视在功率)
T
秒
U
未定义
V
Volts(伏特)
W
Watts(瓦特)
X
Wh(有功)
Y
Varh(无功)
Z
Vah(视在)
表2信息命令单位
结构组成:
是具有高达16个字符并以0为结束符的格式的寄存器描述。
当寄存器不能正常访问时(任何原因,包括安全原因),将返回一个“N”和数据类型“U”(说明该数据类型未知)。
在这种情况下描述的内容将是“Registerxxxx”。
读寄存器命令
Command:
R[reg_num]
Response:
R[reg_num]/data/
这条命令返回寄存器存储的数据。
所有寄存器将在后续章节《寄存器列表》中列出。
32位寄存器地址码的前16位作为0处理。
设置复费率电能量(TOU)的寄存器返回的是一个单精度浮点数,如果需要得到的是双精度浮点数可以在上面提到的读寄存器命令后增加一个大写字母D。
它的命令的格式是:
R[reg_num]D
注意:
对于不支持双精度浮点数的寄存器,这个“D”将是无效。
写寄存器命令
Command:
W[reg_num]/data/
Response:
or
这条命令功能是将数据写入寄存器。
/data/的数据类型必须与寄存器的类型相匹配。
所有的寄存器将在后续章节《寄存器列表》中列出。
当指令执行成功,终端应答是码,而若试图对只读寄存器进行写操作时,应答则是码。
32位寄存器地址码的前16位作为0处理。
读扩展寄存器命令
Command:
M(reg_num)
ResponseSuccess:
M(reg_num)/data/
ResponseFailure:
ResponseCode
这条命令返回寄存器的数据。
所有的寄存器将在后续章节中《寄存器列表》中列出。
使用这条命令,设置复费率(TOU)的寄存器总是以双浮点数而非单浮点数返回。
读多个寄存器命令
利用从特殊寄存器读的读扩展寄存器命令,就能读取多个地址不连续的寄存器,从而提高整个效率。
除了可读取地址非连续的寄存器外,其它与普通的读寄存器命令相似。
对应于读多个命令的两种不同类型,有两种特殊的寄存器。
FFF0----对整块寄存器的读取,返回一个错误码。
如果出现一个读出错误,整条命令将返回一个“CAN”码。
FFF1----对每个寄存器的读取,均返回一个错误码。
即使全部的读出都发生错误,整个应答仍返回操作成功信息。
当一个读取错误时,结果代码n(“ResultCoden”)将为非0值,并且/data/将被标准的错误提示字符串所代替。
(1)多个读,单个错误码
Command:
M<0000FFF0>….
ResponseSuccess:
M<0000FFF0>/Data1/Data2/.…/Datan/
ResponseFailure:
CAN{Errorcode}
(2)多个读,多个错误码
Command:
M<0000FFF1>….
ResponseSuccess/Failure:
M<0000FFF1>{ResultCode1}/Datat1/{Resultcode2}/Data2/….{ResultCoden}/Datan/
写扩展寄存器命令
Command:
N(reg_num)/data/
Response:
ResponseCode
这条命令将数据写入寄存器(寄存器地址码为reg_num)。
数据的类型必须与寄存器的类型匹配。
所有的寄存器将在后继章节《寄存器列表》中列出。
当命令执行成功,终端应答将是〈ACK〉码,而若试图对只读寄存器进行写操作时,应答则是〈CAN〉码。
写多个寄存器命令
利用从一个特殊寄存器读取的读扩展寄存器命令,就能读取多个地址不连续的寄存器,从而提高整个效率。
除了可读取地址非连不同类型,有两种特殊的寄存器。
(1)多个写,单个错误码
Command:
N<0000FFF0>/Data1//Data2…./Datan/
ResponseSuccess:
ACK
ResponseFailure:
CAN{Errorcode}
(2)多个写,多个错误码
Command:
N<0000FFF1>/Data1//Data2…./Datan/
ResponseSuccess/Failure:
{ResultCode1}{ResultCode2}….{ResultCoden}
只要有一个写入错误发生于任何一个寄存器,即使写入成功,仍将返回一个“CAN”码。
数据的长度必须正确。
如果一个应答码是非零的(如发生错误),则其后会跟随一个以0为结束符的错误码字符串。
就整条信息而言,即使全部写入都错误,应答仍是成功的。
注意:
当写多个寄存器时应小心。
一个写入错误就会使命令终止,会产生一些寄存器已写入数据,而一些却没有被写入的情况。
扩展信息的命令
Command:
O(reg_num)
Response:
O(reg_num)/data/orResponsecodeifinvalidcommand
本命令返回寄存器的信息。
/data/是一个以0为结束符的字符串,格式为:
“”
如果某个寄存器不能访问(由于任何原因,包括安全原因),将返回一个“N”和数据类型为“U”(类型未知)。
在这种情况下的“描述”(Description)是“Register××××”。
读多个扩展寄存器命令
Command:
A(reg_num){num_reg}
ResponseSuccess:
A(reg_num){num_reg}/data/
ResponseFailure:
ResponseCode
本命令返回从地址reg_num开始的num_reg个寄存器存储的数据。
这里应注意读取的字符串的长度是可变的。
对于设置复费率(TOU)的寄存器,此命令返回双浮点数而非单浮点数。
写多个扩展寄存器命令
Command:
B(reg_num){num_reg}/data/
Response:
ResponseCode--
本命令功能将数据写入以地址reg_num开始的num_reg个寄存器中。
/data/的类型必须与寄存器的类型匹配。
注意字符串长度是可变的,并且“J”型寄存器不能用这种方式写入。
所有的寄存器将在后继章节《寄存器列表》中列出。
当命令执行成功时,终端将返回〈ACK〉,而如果寄存器不能写入时,终端将返回〈CAN〉。
EziPort数据命令
Command:
none
Response:
S(reg_num){datatype}/data/
本命令仅有应答形式。
EziPort利用这种格式发送数据。
发送的寄存器在电能表中已进行设置,并且在以上格式中,数据每次仅发送到一个寄存器中。
如果某个寄存器读取错误的话,这个寄存器就根本不能用于发送。
对于设置复费率(TOU)的寄存器,此命令返回双浮点数。
文件访问
负荷调研信息存储于结构化文件中,以下详细介绍了这些命令。
文件访问----读命令
Command:
FR(reg_num)(startrecord)[numberofrecords][recordoffset][recordsize]
Response:
FR(reg_num)(Actualstartrecord)[Actualnumberofrecords][Actualrecordoffset][Actualrecordsize]/data/
Responsefail:
ResponseCode
StartRecord---要读的起始记录。
若太早,不在该文件记录范围之内,文件指针将向前跳到第一个记录上;若太新,不在该文件记录范围之内,文件指针将向后跳过最后记录,到达文件尾,则发送的文件将是零个记录的文件。
numberofrecords---读文件的记录数。
若太大,默认减小为文件尾的值或缓冲区的大小。
recordoffset---记录偏移量。
若太大,默认为记录的长度。
recordsize---记录长度。
若太大,默认减小为实际记录长度或缓冲区长度的最大值。
文件访问----写命令
Command:
FW(reg_num)(startrecord)[recordoffset][recordsize]/data/
Response:
ResponseCode
写入文件的数据在长度设置上出现任何错误都会引起写操作无法进行。
文件访问信息命令
Command:
FI(reg_num)
Response:
FI(reg_num)(startrecord)(numberofrecords)[recordsize]{filetype}“FileName”
ResponseFail:
Responsecode
Filetype:
Bit0:
可用于查找时间
文件访问----查找命令
Command:
FS(reg_num)(startrecord){date}{month}{year}{hour}{minute}{second}{dir}
这里的“date/time”就是要查找的日期和时间。
Response:
FS(reg_num)(startrecord){date}{month}{year}{hour}{minute}{second}{result}
这里的“date/time”就是查找到的日期和时间。
ResponseFail:
Responsecode
查找指定的时间。
Dir=0:
从起始记录开始往后查找,停在匹配的第一个记录,并给出该记录的入口地址。
当文件指针移过指定的时间而未能找到匹配的记录时,指针将指向随后记录的入口地址。
Dir=1:
从起始记录开始往前查找,停在匹配的第一个记录,并给出该记录的入口地址。
当文件指针移过指定的时间而未能找到匹配的记录时,指针将指向指定时间的前一记录的入口地址。
Result=0:
找到匹配记录。
Result=1:
到达文件尾。
Result=2:
找到相邻时间的记录。
Result=3:
不能找到任何记录----负荷调研时无时间标记。
Result=4:
负荷调研时无记录数据。
扩展命令
Command:
E(Destination’s#)(Source’s#)[Sequence]/normalcommand/
Response:
E(Source’s#)(Destination’s#)[Sequence]/normalresponse/
E命令是为扩展命令行协议而设计的,允许多点通信和消息的重发、广播。
所有其它命令都能通过“E”命令执行。
(Destination’s#)目标地址:
电能表的序列号就是命令的目标地址。
实际应用中只要将红相MK6E系列电能表的序列号直接转换为四个字节的十六进制码。
(Source’s#)源地址:
该地址是所需软件的序列号。
[Sequence]帧号:
帧号是一个从1到32767的数字,并且对每次请求应该互不相同。
在应答中,源地址和目的地址相互交换,因此,所需软件的序列号此时在目的地址的位置上。
广播消息
序列号FFFFFFFF是一个广播地址,所有终端都能接收,不作出应答。
序列号FFFFFFFE是一个广播地址,所有终端都能接收,并作出应答。
序列号FFFFFFFD是一个广播地址(保留给RS485接口的站点使用),所有终端都能接收,且在随后的随机时间段内作出应答。
最大的时间周期是由原来的命令来指定。
返回的包将用终端地址替换广播地址。
帧号
每次发送都必须有一个帧号,这个帧号应不同于前一帧号。
应答时带有相同的帧号,这样就可以以此校验这个应答是否对应于相应的请求。
重发命令采用与原先相同的序号。
通过这种方式,如果电能表没有收到原先的请求,那么将照常作出应答,否则,则将上次发送的应答重新发送,但是命令并没有重新执行。
电能表上次发送的内容保存在缓冲区中,一旦需要重发,便可再次发送。
帧号的最高有效位保留,并且通常情况下为0。
特殊地,帧号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位的数,高字节在前。
因此现在命令是:
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(ETX)如下:
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:
[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
用数字0表示结束。
“930000”就是从电能表读到的序列号。
访问电能表的例子
为了访问电能表,必须获得授权,登录电能表,进行一定量数据的读、写,然后退出电能表,我们将用如下例子说明。
发送一个“Escape”字符,其后跟着只有起始和停止码的短信息。
Hexadecimal:
[1B][02][03]
Decimal:
27,2,3
返回一个确认〈ACK〉。
Hexadecimal:
[02][06][06][A4][03]
Decimal:
2,6,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
如果登录不成功,将会发送一个〈CAN〉码(十进制24)。
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][