资讯 > 正文

基于MODBUS现场总线技术的电力仪表远程通讯软件开发

发布时间:2010-04-23 来源:www.cechina.cn

        一、前言
        原来的电力系统中,高低压配电柜中往往要安装各种各样的仪表,(如电度表、电流表、电压表等)实现对电力系统的监视。而如果在一些大厂往往就有很多仪表,每隔一段时间就要有专人带着纸笔到厂区内的所有仪表点巡视一番,并将所有的数值记录下来,带回办公室作数据分析和处理。
        随着计算机科学技术的发展,计算机在电力监控领域中得到了越来越广泛的应用。使用多功能智能电力仪表代替机械式的电力仪表是工业自动化的大势所趋。由于多功能仪表不但可以一表多用,而且一般的多功能仪表都可以通过其通讯接口来实现对仪表的编程、数据采集等功能。所以使用多功能电力仪表能够在很大程度上减少人们的劳力,并且可以极大地提高效率。由于实现对电力多功能仪表的监视,功能比较单一,且市场上的组态软件也比较昂贵。在这里作者就是用 MSComm控件实现对串口的控制,实现对阴长江斯菲尔电力仪表公司的多功能电力仪表远程读取电能数据,从而达到软件的设计。MSComm控件是 Microsoft提供的扩展控件,用于支持 VB程序对串口的访问,该控件“隐藏”了大部分串口通讯的底层运行过程和许多烦琐的处理过程,同时支持查询方法和事件驱动通讯的机制。因此用其实现微机串口的数据通讯相当简单,以很少的程序代码就可以轻松串口的访问和数据通讯。
        二、MODBUS 通讯协议分析:
        由于江阴长江斯菲尔电力仪表公司 CD194E系列的多功能电力仪表是采用远程 RS-485 数字接口(差分、半双工)和使用 MODBUS-RTU通讯协议,来实现对仪表的编程、数据采集等功能,所以先介绍 MODBUS 协议:
        MODBUS 协议是一种主从式点对点的通讯协议,允许一台主机和多台从机之间进行数据通信,在 CD194E 系列的多功能电力仪表通讯系统中,主机是微机(PC、工控机、PLC),从机是 CD194E列仪表。在该通讯系统中,允许系统连接多达128 个仪表及1200米的通讯距离。通讯方式采用主机请求,从机应答。即:主机提出命令请求,从机响应接收数据后作数据分析,如果数据满足通讯规约,从机做数据响应。 主、从机间的通讯每一帧数据包含以下信息(16进制):
        从机地址、命令字、信息字、校验码
        从机地址(1个字节):从机设备号,主机利用从机地址来识别进行通讯从机设备。
        命令字(1个字节):设定主机对从机的通讯内容。
        信息字(N个字节):包括进行两机通讯中各种数据地址、数据长度、数据信息。
        校验码(2个字节):用于检测数据通讯错误,采用循环冗余码 CRC16。
        通讯参数的设置:通过仪表上的编程键盘对仪表的仪表地址(1-247)、通讯速度(4800或9600)和
        数据格式(1个起始位,8个数据位,1个停止位,可选择无校验位、奇校验位、偶校验位。)进行设置。
        网络连线如图一如示:


        在这里,作者使用的是台湾泓格科技有限公司的232/485转换模块 I-7520。由主控计算机送出的命令是通过 RS-232 串行通信端口发送出去,此信号经过 232/485 转换模块(模块编号I-7520)将信号标准电位及类型转换后,在 485 网络上传播开来。多功能电力仪表收到属于自身的命令后,会进行分析控制的操作,最后将结果送至485网络,让此信号再通过I-7520的转换后,可由计算机的 RS-232串行通信端口接收进来。整个送收过程全是以串行处理。
        三、软件的设计和开发


        注:从 CD194E 系列的多功能电力仪表传过来的电功率数据就存放在 Byte1到 Byte4 内。
        3. 通信步骤:
        ⑴加入通信控件。也就是 MSComm控件
        ⑵设置通信端口号码。即 CommPort属性,在本文使用 Com1。
        ⑶设置通讯参数。即Settings 属性。在本文设置为 9600,n,8,1。即通讯速度为 9600,数据格式为1 个起始位,8个数据位,1个停止位,无校验位。注意必须与多功能电力仪表的设置一致,不然就会通信失败。
        ⑷设置其它参数。必要时再加上其它的属性设置。
        ⑸打开通信端口。即PortOpen 属性设成 True。
        ⑹每隔500毫秒送出字符串或读入字符串。即发送命令 4(读N 个字节)来读取电功率参数,使用Input 及 Output属性。
        ⑺使用完 MSComm控件后,将通信端口关闭。
        4. 人机界面:


        5.程序代码:
        'API 函数声名
        Private Declare Function GetTickCount Lib "kernel32" () As Long
        '点击结束程序按钮
        Private Sub CmdEnd_Click()
        End
        End Sub
        '点击读取电功率按钮
        Private Sub CmdRead_Click()
        Timer1.Enabled = Not Timer1.Enabled
        If Timer1.Enabled Then
        CmdRead.Caption = "停止读数"
        Else
        CmdRead.Caption = "读取电功率"
        End If
        End Sub
        '程序初始化
        Private Sub Form_Load()
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True
        Timer1.Enabled = False
        End Sub
        Private Sub Timer1_Timer()
        Dim C4%, C5%, C6%, C7%
        Dim Tick&
        Dim Data As Double
        Dim Buf() As Byte
        Dim ByteOut(7) As Byte
        MSComm1.InputLen = 0
        Buf = MSComm1.Input
        '重新定义数据输入缓冲区, 发送命令 4
        MSComm1.InputLen = 1
        ByteOut(0) = &H1
        ByteOut(1) = &H4
        ByteOut(2) = &H0
        ByteOut(3) = &H5C
        ByteOut(4) = &H0
        ByteOut(5) = &H4
        ByteOut(6) = &H31
        ByteOut(7) = &HDB
        MSComm1.Output = ByteOut(0) & ByteOut(1) & ByteOut(2) & ByteOut(3) & ByteOut(4) & ByteOut(5) &
        ByteOut(6) & ByteOut(7)
        ' 等待多功能电力仪表响应的数据到达串口
        Tick = GetTickCount()
        Do
        If (GetTickCount() - Tick) / 1000# > 10 Then
        MsgBox "时间过久,请检查多功能电力仪表及传输状态!", vbCritical + vbOKOnly, "系统信息"
        Exit Sub
        End If
        DoEvents
        Loop Until MSComm1.InBuFFerCount >= 9
        '从输入缓冲区读数据
        Buf = MSComm1.Input
        If Buf(0) <> 1 Then
        MsgBox "地址错误!", vbCritical + vbOKOnly, "系统信息"
        Exit Sub
        End If
        Buf = MSComm1.Input
        If Buf(0) <> 4 Then
        MsgBox "长度错误!", vbCritical + vbOKOnly, "系统信息"
        Exit Sub
        End If
        Buf = MSComm1.Input
        C4 = Buf(0)
        Buf = MSComm1.Input
        C5 = Buf(0)
        Buf = MSComm1.Input
        C6 = Buf(0)
        Buf = MSComm1.Input
        C7 = Buf(0)
        Buf = MSComm1.Input
        Buf = MSComm1.Input
        Data = Power(C4, C5, C6, C7)
        TxtPower.Text = CStr(Data)
        End Sub
        ' 自定义功率换算函数
        Private Function Power(C4%, C5%, C6%, C7%)
        Dim PowerExp As String, Mantissa As String
        Dim ReadValue#
        Dim ValueSign&
        If ((C4 And &H80) / 2 ︿ 7) = True Then
        ValueSign = -1
        Else
        ValueSign = 1
        End If
        PowerExp = CStr((C4 And &H7F) * 2 + (C5 And &H80) / 2 ︿ 7)
        Mantissa = CStr((&H80 or C5) * 2 ︿ 16 + C6 * 2 ︿ 8 + C7)
        ReadValue = ValueSign * 2 ︿ (Val(PowerExp) - 126) * Val(Mantissa) / (256 * 65536)
        Power = ReadValue
        End Function
        四、结论
        本实例是作者在实验室做过多次实验,达到了预定的应用效果,目前在江西某厂取得了实际的应用。
        该控制系统的最大优点是:
        1,从硬件上看,仅仅使用一个转换模块就可以实现全厂电能远程监控和集中管理的功能。大大提高了效率,且十分经济实惠。
        2,从软件上看,直接使用串口的控制技术,而不必需要写额外的驱动程序。采用VB 开发应用软件十分方便,编程工作量小。
        【参考文献】
        1.李肇庆、韩涛。串行端口技术,国防工业出版社,2004
        2. 范逸之。Visual Basic 与 RS-232 串行通信控制,清华大学出版社,2002
        3.范逸之。Visual Basic 与分布监控系统——RS232/485 串行通信,清华大学出版社,2002
        4.江阴长江斯菲尔电力仪表有限公司使用手册
        5. 台湾泓格科技有限公司的 232/485 转换模块说明书.

标签:现场总线,MODBUS,电力仪表,远程通讯

相关文章