按645规约读电表的问题
日期:2006-05-07 荐:
按645规约读电表的问题我的程序就是读电表中的数据,硬件条件是一台PC,通过RS232接到一个转换器(232-485),然后转换器的485的双绞线连接到电表的485接线口上。新问题又出现了,设置电表地址后,根本就没有任何反应,根本就没有返回数据,电表的地址也没设上(通过电表的按钮可以查看到),电表的说明书上说,在设置地址时,要按住2#按钮,我也按了,发送命令前到结束都按着。过5秒才放手,可还是没有反应。我没弄过485接口。那个转换器要10V~30v的直流电源,我也接上了。设备全是新的。我弄了一天半,也没弄出个结果来。不知道问题出在哪了.下面是我的代码,设置电表地址:我有几个地方不敢确定是正确的,1.要设置的电表地址处pBuf[10]~pBuf[15],按规约加33H,不知道是否这么写2.规约中提到校验和pBuf[16]的算法是否正确,另外这个校验和,在规约中说从帧起始符开始,可这里有两个帧起始符pBuf[0]和pBuf[7],zhezh这个校验和到底从哪里开始计算呢?从哪个位置到哪个位置呢? DWORD dwToWrite=18; char *pBuf=new char[19]; memset(pBuf,0,19); pBuf[0]=0x68; // pBuf[1]=0x99; // pBuf[2]=0x99; pBuf[3]=0x99; pBuf[4]=0x99; pBuf[5]=0x99; pBuf[6]=0x99; pBuf[7]=0x68; // pBuf[8]=0x0A; // pBuf[9]=0x06; // pBuf[10]=0x04 0x33; // pBuf[11]=0x01 0x33; pBuf[12]=0x01 0x33; pBuf[13]=0x01 0x33; pBuf[14]=0x01 0x33; pBuf[15]=0x01 0x33; int Sum=0; for(int i=0;i<16;i ) { Sum =pBuf[i]; } pBuf[16]=Sum%6; pBuf[17]=0x16; // m_Port.WriteBlock(pBuf,dwToWrite); delete [] pBuf;DL/T 645规约中这样提到:(完整的规约在http://www.powerprotocol.com.cn/可以找到)5.2 帧格式帧是传送信息的基本单元。帧格式如图8 所示。5.2.1 帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。5.2.2 地址域A0~A5:地址域由6 个字节构成,每字节2 位BCD 码。地址长度可达12 位十进制数,可以为表号、资产号、用户号、设备号等。具体使用可由用户自行决定。当使用的地址码长度不足6 字节时,用十六进制AAH 补足6 字节。低地址位在先,高地址位在后。当地址为999999999999H 时,为广播地址。5.2.3 控制码C:控制码的格式如下所示。D7=0:由主站发出的命令帧D7=1:由从站发出的应答帧D6=0:从站正确应答D6=1:从站对异常信息的应答D5=0:无后续数据帧D5=1:有后续数据帧D4~D0:请求及应答功能码00000:保留00001:读数据00010:读后续数据00011:重读数据00100:写数据01000:广播校时01010:写设备地址01100:更改通信速率01111:修改密码10000:最大需量清零5.2.4 数据长度L:L 为数据域的字节数。读数据时L≤200,写数据时L≤50,L=0 表示无数据域。5.2.5 数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。传输时发送方按字节进行加33H 处理,接收方按字节进行减33H 处理。5.2.6 校验码CS:从帧起始符开始到校验码之前的所有各字节的模256 的和,即各字节二进制算术和,不计超过256 的溢出值。5.2.7 结束符16H:标识一帧信息的结束,其值为16H=00010110B。7.6 写设备地址7.6.1 写设备地址请求命令帧功能:设置某从站的地址码控制码:C=0AH地址域:99...99H数据长度:L=06H数据域:A0-A5(设备地址码)帧格式:68H 99H ... 99H 68H 0AH 06H A0 ... A5 CS 16H注:本请求命令采用广播地址发布,要求被设置的从站有相应的按键(开关)与该命令配合,在命令发布的全部时间内按下按键者响应,其它不响应。7.6.2 从站正常应答帧功能:正确执行命令的设备应答控制码:C=8AH地址域:A0?A5(新设置的设备地址码)数据长度:L=00H帧格式:68H A0 ... A5 68H 8AH 00H CS 16HupUPUP
标签: