☆★★腾空720度大翻转 急求645规约读电表总电量的例子!!★★☆顶者有分 如题,现在需要做个很简单的读数字电表当天总电量的例子,但不熟悉DL/T 645规约,来不急看了,马上要要,请哪位做过的大哥给个提示吧!只要能读取当天总电量就行!有例子最好,VC和delphi的demo都行!!谢过先!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 my mail:[email protected]再up 查了一下,基本思路:找个串口控件,然后《多功能电能表通信规约》......估计就没什么问题了!多功能电能表通信规约Multi-function watt-hour meter communication protocolDL/T 645—1997中华人民共和国电力行业标准DL/T 645—1997多功能电能表通信规约Multi-function watt-hour meter communication protocol中华人民共和国电力工业部1998-02-10 批准 1998-06-01 实施 看了下,按照规约,从串口发送68 13 04 18 11 00 00 68 01 02 43 C3 19 16 13 04 18 11 00 00 表示电表地址000011180413 这里随便举的个例子,主要提醒你不要弄反了68是起始标志01为控制码,表示“读”02为数据长度 43 C3 就是数据域的数据标识,90 10 反位后加33(发送时加33,接收减33)表示有功总电能,就是你要读的。接收68 13 04 18 11 00 00 68 81 06 43 C3 33 33 33 33 69 16收的时候数据域数据减33,你要的数据就是除去数据类型标识后的 33 33 33 33分别-33(记得要反过来读),得到000000.00就是你要的结果了!!!!理论上将应该是这样的!!程序我就不想写了,应该很简单的! *******--------------------------------------------数据库B结构-----------------------------------*********协议库define database A aCID : N,3 &&命令ID aCmd : C,4 &&命令标识符 aName : C,30 &&命令名称 aFlag : N,1 &&标识 1只读,2只写,3 可读可写 aLen : N,2 &&数据长度 aCustom : N,1 && 1命令 2 基本命令 aIsBlock : N,1 &&用来标记是否是块命令 0非块,1块,2,集合 aIsSave : N,1 &&是否记录 0 ,不记录 ,非0记录 aUnit : C,10 &&单位 aDisplay : C,12 &&显示数据格式 aMenuID : N,3 aKind : N,1 &&表类型enddef**协议库define database B bCid : N,3,0 bWriteData : C,80enddef**抄表数据库&&此表用来保存日常抄表记录define database C cBH : C,12 &&表种类 cRQ : C,10 &&读表日期 cSJ : C,8 &&读表时间 c90FF : C,80 &&当前 c91FF : C,240 c94FF : C,80 &&上月 c95FF : C,240 c98FF : C,80 &&上上月 c99FF : C,240 cA0FF : C,60 &&当前 cA1FF : C,180 cA4FF : C,60 &&上月 cA5FF : C,180 cA8FF : C,60 &&上上月 cA9FF : C,180 cB0FF : C,80 &&当前 cB1FF : C,240 cB4FF : C,80 &&上月 cB5FF : C,240 cB8FF : C,80 &&上上月 cB9FF : C,240 cB210 : C,8 &&最近一次编程时间 cB211 : C,8 &&最近一次最大需量清零时间 cB212 : C,4 &&编程次数 cB213 : C,4 &&最大需量清零次数 cB214 : C,6 &&电池工作时间 cB630 : C,6 &&瞬时有功功率 cB631 : C,6 &&A相有功功率 cB632 : C,6 &&B相有功功率 cB633 : C,6 &&C相有功功率 cB634 : C,4 &&正向有功功率上限值 cB635 : C,4 &&反向有功功率上限值 cB31F : C,16 &&断相 CB32F : C,24 &&断相时间累计 CB33F : C,32 &&断相起始时间 CB34F : C,32 &&断相恢复时间 CB61F : C,12 &&电压 CB62F : C,12 &&电流 CB64F : C,16 &&瞬时无功功率 CB65F : C,16 &&总功率因数 cC010 : C,8 &&日期 cC011 : C,6 &&时间 cC020 : C,2 &&电表运行状态字 cC021 : C,2 &&电网状态字 cC022 : C,2 &&周休状态字 cC030 : C,6 &&电表常数(有功) cC031 : C,6 &&电表常数(无功) cC033 : C,12 &&用户号 cC034 : C,12 &&设备码 cC211 : C,4 &&输出脉冲宽度 cC111 : C,2 &&最大需量周期 cC117 : C,4 &&自动抄表日 cC118 : C,2 &&负荷代表日 cC119 : C,8 &&有功电能起始读数 cC11A : C,8 &&无功电能起始读数 Cc310 : C,2 &&年时区数P cC311 : C,2 &&日时段表数 cC312 : C,2 &&日时段数 cC313 : C,2 &&费率数 cC314 : C,2 &&公共假日数 cC32F : C,60 &&时区表 cC33F : C,72 &&时段表 cC34F : C,72 cC35F : C,72 cC36F : C,72 cC37F : C,72 cC38F : C,72 cC39F : C,72 cC3AF : C,72 cC3BF : C,72 cC3CF : C,72 &&时段表 cC41F : C,60 &&假日时区表 cC41E : C,2 &&周休状态字enddef*用来菜单项目define database D DID :N,3 DName :C,10 DKind :N,1 PID :N,3 DHelp :C,50enddefdefine var nMenuChoice : N,1,0 cMenu : C,10[12] &&菜单数组 cMenuHelp : C,200[12] &&菜单帮助 nMenuKind : N,1,0 &&菜单类型 nMenuID : N,3,0 &&当前菜单ID nMenu : N,3[12] &&菜单ID数组 nMenuCount : N,2,0 &&菜单总数 nIsMenu : N,1,0 nxMenu : N,2,0 &&菜单位置 nyMenu : N,2,0 && cAddressAdv : C,12 &&临时表号 cAddress : C,12 &&电表表号 Address : C,6 &&表号 nRecvWait : N,2,0 &&通讯延时 tnRecvWait : N,2,0 CID : N,3,0 cCommand : C,4 cCMD : C,2 Waken : C,4 SBuffer : C,250 RBuffer : C,250 nTimes : N,2,0 nResult : N,2,0 nDataLen : N,3,0 cData : C,250 nData : N,12,0 cGetStr : C,250 cDisplayStr : C,250 cFormat : C,12 nIsBlock : N,1,0 nBlockLength : N,2,0 nPageCount : N,2,0 &&页面总数 nPageSize : N,2,0 &&每页显示的记录数 nPage : N,2,0 &&当前页 cPageStr : C,250 nCom : N, 1,0 LeftTopx : N, 3 LeftTopy : N, 3 RightEndx : N, 3 RightEndy : N, 3 Box_Mode : N, 1 cWriteStr : C, 250 WriteStr : C,125 i : N,3,0 j : N,3,0 cStr : C,250 cStr1 : C,2 cHex : C,125 nStrLen : N,3,0 nIsBCD : N,1,0 k : N,3,0 l : N,4,0 r : N,3,0 cxWin : N,2,0 cyWin : N,2,0 nCmd : N,3,0[250] &&250个命令数据记录号 nCount : N,3,0 &&命令总数 cCT : C,100 nCustom : N,1 cArray1 : C, 2[5]={"总","尖","峰","平","谷"} cArray2 : C, 2[4]={"T","A","B","C"} cArray3 : C, 6[6]={"正 向","反 向","一象限","四象限","二象限","三象限"} chKey :C,1 nBrowserFlag :N,1,0 cSzTitle :C,30 cszTitle1 :C,30 cPass :C,8 Pass :C,4 cPass1 :C,8 cPass2 :C,8 nSetFlag :N,1 nOperate :N,1 nYear :N,2 nMonth :N,2 nDay :N,2 nTemp :N,5,2 nFloat :N,5,2 nLeap :N,1 nLen :N,3,0enddef*/====================================================================================**说明:字符转换成十六进制数据**作者:李文凯**时间:2003-12-03**相关变量 cStr :转换字符串** cHex :输出字符串** nStrLen:字符长度** j,k:临时变量 Procedure fStrToHex i=0 cHex="" Do While i<nStrLen cStr1=substr(cStr,i*2+1,2) Do Case Procedure SendCom i=sBuffer{9,1} do Case case i=8FH @4,2 say " 更改密码 " otherwise if i<>08H @4,2 Say "正在发送..."+cCommand endif Endcase Initsio 1200,"E",8 Sends Waken{1,4} SBuffer{1,1} = 068h SBuffer{2,6} = Address{1,6} SBuffer{8,1} = 068h l = SBuffer{10, 1} SBuffer{11 + l,1} = CheckSum(SBuffer{1, 10 + l}) SBuffer{12 + l,1} = 016h Sends SBuffer{1,12 + l} ReturnEndproProcedure ReadCom nTimes=0 nResult = 0 i=sBuffer{9,1} do Case case i=8FH @4,2 say " 更改密码 " otherwise @4,2 Say "正在接收..."+cCommand Endcase Do While .t. j = Receives(Rbuffer{1,1},nRecvWait) If j = 0 nTimes = nTimes + 1 If nTimes >= 5 nResult = 10 k = MessageBox("电表无应答!"+Chr(13)+"是否重试?",258,"信 息") If k = 3 nResult = 930 Endif If k = 4 nResult = 999 Endif Return Endif @6,5 Say "重试 "+Str(nTimes,1)+" 次" else l=0 l=RBuffer{1,1} If l=068H @6,5 Say Space(10) Exit Endif Endif Enddo j = Receives(RBuffer{2,9}, 5) If j < 9 nResult = 11 k = MessageBox("数据帧长度不足!"+Chr(13)+"是否重试?",258,"错 误") If k = 3 nResult = 930 Endif If k = 4 nResult = 999 Endif Return Endif l=RBuffer{9,1} Do Case Case l=0C1H i=MessageBox("应答异常!",0,"错 误") Return Case l=0C4H i=MessageBox("写表失败!",0,"错 误") nSetFlag=1 Return Case l=84H i=MessageBox("写表成功!",0,"提 示") nSetFlag=0 Return Case l=8FH i=MessageBox("密码更改成功!",0,"提 示") Return Case l=08AH i=MessageBox("表号设置成功!",0,"提 示") Return Case l=08CH i=MessageBox("更改速率成功!",0,"提 示") Return Case l=81H l = RBuffer{10,1} nDataLen=l-2 j = Receives(RBuffer{11,l + 2}, 5) If j <> l + 2 nResult = 12 k = MessageBox("读不到后续数据!"+Chr(13)+"是否重试?",258,"错 误") If k = 3 nResult = 930 Endif If k = 4 nResult = 999 Endif Return Endif otherwise i=MessageBox("接收到未知数据!",0,"提 示") Return Endcase j = RBuffer{11 + l,1} If j <> Asc(Chr(CheckSum(RBuffer{1, 10 + l}))) nResult= 13 k = MessageBox("数据校验错误!"+Chr(13)+"是否重试?",258,"错 误") If k = 3 nResult = 930 Endif If k = 4 nResult = 999 Endif Return Endif nResult = 0 cData{1,nDataLen} = RBuffer{13,nDataLen} ReturnEndpro 请教个事务问题:循环大约上万次删除记录,用一个事务,是否会不安全? 关于treeview的问题 收到了google关于“google和yahoo在打架”的回复 关于ListBox的问题 急求大家,请进! 简单数据库问题,急! 关于在dbgrid中的列中加入动态下拉框选项的问题. 紧急求助,vcl控件,我怎样写属性编辑器 高手来帮忙看看~ 查询字符串的问题 替换 VCL pagecontrol的應用:如何實現從tabsheet1跳到tabsheet2? 很久没有提问了,关于c++的DLL在delphi中调用的问题
再up
多功能电能表通信规约
Multi-function watt-hour meter communication protocol
DL/T 645—1997
中华人民共和国电力行业标准
DL/T 645—1997
多功能电能表通信规约
Multi-function watt-hour meter communication protocol
中华人民共和国电力工业部1998-02-10 批准 1998-06-01 实施
13 04 18 11 00 00 表示电表地址000011180413 这里随便举的个例子,主要提醒你不要弄反了
68是起始标志
01为控制码,表示“读”
02为数据长度
43 C3 就是数据域的数据标识,90 10 反位后加33(发送时加33,接收减33)表示有功总电能,就是你要读的。
接收68 13 04 18 11 00 00 68 81 06 43 C3 33 33 33 33 69 16
收的时候数据域数据减33,你要的数据就是除去数据类型标识后的 33 33 33 33分别-33(记得要反过来读),得到000000.00就是你要的结果了!!!!
理论上将应该是这样的!!程序我就不想写了,应该很简单的!
*******--------------------------------------------数据库B结构-----------------------------------*******
**协议库
define database A
aCID : N,3 &&命令ID
aCmd : C,4 &&命令标识符
aName : C,30 &&命令名称
aFlag : N,1 &&标识 1只读,2只写,3 可读可写
aLen : N,2 &&数据长度
aCustom : N,1 && 1命令 2 基本命令
aIsBlock : N,1 &&用来标记是否是块命令 0非块,1块,2,集合
aIsSave : N,1 &&是否记录 0 ,不记录 ,非0记录
aUnit : C,10 &&单位
aDisplay : C,12 &&显示数据格式
aMenuID : N,3
aKind : N,1 &&表类型
enddef
**协议库
define database B
bCid : N,3,0
bWriteData : C,80
enddef**抄表数据库
&&此表用来保存日常抄表记录
define database C
cBH : C,12 &&表种类
cRQ : C,10 &&读表日期
cSJ : C,8 &&读表时间
c90FF : C,80 &&当前
c91FF : C,240
c94FF : C,80 &&上月
c95FF : C,240
c98FF : C,80 &&上上月
c99FF : C,240
cA0FF : C,60 &&当前
cA1FF : C,180
cA4FF : C,60 &&上月
cA5FF : C,180
cA8FF : C,60 &&上上月
cA9FF : C,180
cB0FF : C,80 &&当前
cB1FF : C,240
cB4FF : C,80 &&上月
cB5FF : C,240
cB8FF : C,80 &&上上月
cB9FF : C,240
cB210 : C,8 &&最近一次编程时间
cB211 : C,8 &&最近一次最大需量清零时间
cB212 : C,4 &&编程次数
cB213 : C,4 &&最大需量清零次数
cB214 : C,6 &&电池工作时间
cB630 : C,6 &&瞬时有功功率
cB631 : C,6 &&A相有功功率
cB632 : C,6 &&B相有功功率
cB633 : C,6 &&C相有功功率
cB634 : C,4 &&正向有功功率上限值
cB635 : C,4 &&反向有功功率上限值
cB31F : C,16 &&断相
CB32F : C,24 &&断相时间累计
CB33F : C,32 &&断相起始时间
CB34F : C,32 &&断相恢复时间
CB61F : C,12 &&电压
CB62F : C,12 &&电流
CB64F : C,16 &&瞬时无功功率
CB65F : C,16 &&总功率因数
cC010 : C,8 &&日期
cC011 : C,6 &&时间
cC020 : C,2 &&电表运行状态字
cC021 : C,2 &&电网状态字
cC022 : C,2 &&周休状态字
cC030 : C,6 &&电表常数(有功)
cC031 : C,6 &&电表常数(无功)
cC033 : C,12 &&用户号
cC034 : C,12 &&设备码
cC211 : C,4 &&输出脉冲宽度
cC111 : C,2 &&最大需量周期
cC117 : C,4 &&自动抄表日
cC118 : C,2 &&负荷代表日
cC119 : C,8 &&有功电能起始读数
cC11A : C,8 &&无功电能起始读数
Cc310 : C,2 &&年时区数P
cC311 : C,2 &&日时段表数
cC312 : C,2 &&日时段数
cC313 : C,2 &&费率数
cC314 : C,2 &&公共假日数
cC32F : C,60 &&时区表
cC33F : C,72 &&时段表
cC34F : C,72
cC35F : C,72
cC36F : C,72
cC37F : C,72
cC38F : C,72
cC39F : C,72
cC3AF : C,72
cC3BF : C,72
cC3CF : C,72 &&时段表
cC41F : C,60 &&假日时区表
cC41E : C,2 &&周休状态字
enddef
*用来菜单项目define database D
DID :N,3
DName :C,10
DKind :N,1
PID :N,3
DHelp :C,50
enddef
define var
nMenuChoice : N,1,0
cMenu : C,10[12] &&菜单数组
cMenuHelp : C,200[12] &&菜单帮助
nMenuKind : N,1,0 &&菜单类型
nMenuID : N,3,0 &&当前菜单ID
nMenu : N,3[12] &&菜单ID数组
nMenuCount : N,2,0 &&菜单总数
nIsMenu : N,1,0
nxMenu : N,2,0 &&菜单位置
nyMenu : N,2,0 &&
cAddressAdv : C,12 &&临时表号
cAddress : C,12 &&电表表号
Address : C,6 &&表号
nRecvWait : N,2,0 &&通讯延时
tnRecvWait : N,2,0
CID : N,3,0
cCommand : C,4
cCMD : C,2
Waken : C,4
SBuffer : C,250
RBuffer : C,250
nTimes : N,2,0
nResult : N,2,0
nDataLen : N,3,0
cData : C,250
nData : N,12,0
cGetStr : C,250
cDisplayStr : C,250
cFormat : C,12
nIsBlock : N,1,0
nBlockLength : N,2,0
nPageCount : N,2,0 &&页面总数
nPageSize : N,2,0 &&每页显示的记录数
nPage : N,2,0 &&当前页
cPageStr : C,250
nCom : N, 1,0
LeftTopx : N, 3
LeftTopy : N, 3
RightEndx : N, 3
RightEndy : N, 3
Box_Mode : N, 1
cWriteStr : C, 250
WriteStr : C,125
i : N,3,0
j : N,3,0
cStr : C,250
cStr1 : C,2
cHex : C,125
nStrLen : N,3,0
nIsBCD : N,1,0
k : N,3,0
l : N,4,0
r : N,3,0
cxWin : N,2,0
cyWin : N,2,0
nCmd : N,3,0[250] &&250个命令数据记录号
nCount : N,3,0 &&命令总数
cCT : C,100
nCustom : N,1
cArray1 : C, 2[5]={"总","尖","峰","平","谷"}
cArray2 : C, 2[4]={"T","A","B","C"}
cArray3 : C, 6[6]={"正 向","反 向","一象限","四象限","二象限","三象限"}
chKey :C,1
nBrowserFlag :N,1,0
cSzTitle :C,30
cszTitle1 :C,30
cPass :C,8
Pass :C,4
cPass1 :C,8
cPass2 :C,8
nSetFlag :N,1
nOperate :N,1
nYear :N,2
nMonth :N,2
nDay :N,2
nTemp :N,5,2
nFloat :N,5,2
nLeap :N,1
nLen :N,3,0
enddef
*/====================================================================================
**说明:字符转换成十六进制数据
**作者:李文凯
**时间:2003-12-03
**相关变量 cStr :转换字符串
** cHex :输出字符串
** nStrLen:字符长度
** j,k:临时变量
Procedure fStrToHex
i=0
cHex=""
Do While i<nStrLen
cStr1=substr(cStr,i*2+1,2)
Do Case
Procedure SendCom
i=sBuffer{9,1}
do Case
case i=8FH
@4,2 say " 更改密码 "
otherwise
if i<>08H
@4,2 Say "正在发送..."+cCommand
endif
Endcase
Initsio 1200,"E",8
Sends Waken{1,4}
SBuffer{1,1} = 068h
SBuffer{2,6} = Address{1,6}
SBuffer{8,1} = 068h
l = SBuffer{10, 1}
SBuffer{11 + l,1} = CheckSum(SBuffer{1, 10 + l})
SBuffer{12 + l,1} = 016h
Sends SBuffer{1,12 + l}
Return
EndproProcedure ReadCom
nTimes=0
nResult = 0
i=sBuffer{9,1}
do Case
case i=8FH
@4,2 say " 更改密码 "
otherwise
@4,2 Say "正在接收..."+cCommand
Endcase
Do While .t.
j = Receives(Rbuffer{1,1},nRecvWait)
If j = 0
nTimes = nTimes + 1
If nTimes >= 5
nResult = 10
k = MessageBox("电表无应答!"+Chr(13)+"是否重试?",258,"信 息")
If k = 3
nResult = 930
Endif
If k = 4
nResult = 999
Endif
Return
Endif
@6,5 Say "重试 "+Str(nTimes,1)+" 次"
else
l=0
l=RBuffer{1,1}
If l=068H
@6,5 Say Space(10)
Exit
Endif
Endif
Enddo
j = Receives(RBuffer{2,9}, 5)
If j < 9
nResult = 11
k = MessageBox("数据帧长度不足!"+Chr(13)+"是否重试?",258,"错 误")
If k = 3
nResult = 930
Endif
If k = 4
nResult = 999
Endif
Return
Endif
l=RBuffer{9,1}
Do Case
Case l=0C1H
i=MessageBox("应答异常!",0,"错 误")
Return
Case l=0C4H
i=MessageBox("写表失败!",0,"错 误")
nSetFlag=1
Return
Case l=84H
i=MessageBox("写表成功!",0,"提 示")
nSetFlag=0
Return
Case l=8FH
i=MessageBox("密码更改成功!",0,"提 示")
Return
Case l=08AH
i=MessageBox("表号设置成功!",0,"提 示")
Return
Case l=08CH
i=MessageBox("更改速率成功!",0,"提 示")
Return
Case l=81H
l = RBuffer{10,1}
nDataLen=l-2
j = Receives(RBuffer{11,l + 2}, 5)
If j <> l + 2
nResult = 12
k = MessageBox("读不到后续数据!"+Chr(13)+"是否重试?",258,"错 误")
If k = 3
nResult = 930
Endif
If k = 4
nResult = 999
Endif
Return
Endif
otherwise
i=MessageBox("接收到未知数据!",0,"提 示")
Return
Endcase
j = RBuffer{11 + l,1}
If j <> Asc(Chr(CheckSum(RBuffer{1, 10 + l})))
nResult= 13
k = MessageBox("数据校验错误!"+Chr(13)+"是否重试?",258,"错 误")
If k = 3
nResult = 930
Endif
If k = 4
nResult = 999
Endif
Return
Endif
nResult = 0
cData{1,nDataLen} = RBuffer{13,nDataLen}
Return
Endpro