微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于 MODBUS 总线多功能电力仪表远程通讯的软件开发技术

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

时间:07-14 来源:互联网 点击:
一、前言
原来的电力系统中,高低压配电柜中往往要安装各种各样的仪表,(如电度表、电流表、电压表等)实现对电力系统的监视。而如果在一些大厂往往就有很多仪表,每隔一段时间就要有专人带着纸笔到厂区内的所有仪表点巡视一番,并将所有的数值记录下来,带回办公室作数据分析和处理。
随着计算机科学技术的发展,计算机在电力监控领域中得到了越来越广泛的应用。使用多功能智能电力仪表代替机械式的电力仪表是工业自动化的大势所趋。由于多功能仪表不但可以一表多用,而且一般的多功能仪表都可以通过其通讯接口来实现对仪表的编程、数据采集等功能。所以使用多功能电力仪表能够在很大程度上减少人们的劳力,并且可以极大地提高效率。由于实现对电力多功能仪表的监视,功能比较单一,且市场上的组态软件也比较昂贵。在这里作者就是用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函数声名
PrivateDeclareFunctionGetTickCountLib"kernel32"()AsLong
'点击结束程序按钮
PrivateSubCmdEnd_Click()
End
EndSub
'点击读取电功率按钮
PrivateSubCmdRead_Click()
Timer1.Enabled=NotTimer1.Enabled
IfTimer1.EnabledThen
CmdRead.Caption="停止读数"
Else
CmdRead.Caption="读取电功率"
EndIf
EndSub
'程序初始化
PrivateSubForm_Load()
MSComm1.InputMode=comInputModeBinary
MSComm1.PortOpen=True
Timer1.Enabled=False
EndSub
PrivateSubTimer1_Timer()
DimC4%,C5%,C6%,C7%
DimTick
DimDataAsDouble
DimBuf()AsByte
DimByteOut(7)AsByte
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#>10Then
MsgBox"时间过久,请检查多功能电力仪表及传输状态!",vbCritical+vbOKOnly,"系统信息"
ExitSub
EndIf
DoEvents
LoopUntilMSComm1.InBufferCount>=9
'从输入缓冲区读数据
Buf=MSComm1.Input
IfBuf(0)>1Then
MsgBox"地址错误!",vbCritical+vbOKOnly,"系统信息"
ExitSub
EndIf
Buf=MSComm1.Input
IfBuf(0)>4Then
MsgBox"长度错误!",vbCritical+vbOKOnly,"系统信息"
ExitSub
EndIf
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)
EndSub
'自定义功率换算函数
PrivateFunctionPower(C4%,C5%,C6%,C7%)
DimPowerExpAsString,MantissaAsString
DimReadValue#
DimValueSign
If((C4AndH80)/2︿7)=TrueThen
ValueSign=-1
Else
ValueSign=1
EndIf
PowerExp=CStr((C4AndH7F)*2+(C5AndH80)/2︿7)
Mantissa=CStr((H80OrC5)*2︿16+C6*2︿8+C7)
ReadValue=ValueSign*2︿(Val(PowerExp)-126)*Val(Mantissa)/(256*65536)
Power=ReadValue
EndFunction

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top