如题,现在需要做个很简单的读数字电表当天总电量的例子,但不熟悉DL/T 645规约,来不急看了,马上要要,请哪位做过的大哥给个提示吧!只要能读取当天总电量就行!有例子最好,VC和delphi的demo都行!!谢过先!!

解决方案 »

  1.   

    my mail:[email protected]
    再up
      

  2.   

    查了一下,基本思路:找个串口控件,然后《多功能电能表通信规约》......估计就没什么问题了!
    多功能电能表通信规约
    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 实施
      

  3.   

    看了下,按照规约,从串口发送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就是你要的结果了!!!!
    理论上将应该是这样的!!程序我就不想写了,应该很简单的!
      

  4.   


    *******--------------------------------------------数据库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
      

  5.   


    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