VB中用DDE实现工业控制

Author: 杨军 Date: 2001年 29期

?牐牨嗾甙矗篋DE(Dynamic Data Exchange)动态数据交换是OLE方式的前身,当前主流的开发工具(VB、VC、PB等)大都支持此功能,我们使用它可以很方便地实现工业控制。下面,我们就以北京首都国际机场污水处理厂的语音报警系统为例,介绍它的实现方法。
  ?牐牨本┦锥脊驶∥鬯?理厂设备运行控制采用基于AB公司SLC500(AB公司的可编程控制器型号)的计算机控制系统。全厂设备采用远程控制,由工作人员在中央控制室发布命令控制设备运转(如:根据集水井液位控制水泵启停等),大大减轻了工作人员的劳动强度。但是同时由于设备出现故障时只显示故障信息而没有声音报警,给工作人员及时发现问题带来很大不便。我对系统进行分析后,利用VB编程通过DDE与工控系统通讯,实现了语音报警功能。下面就向大家做个介绍。
  #1?牐?1.通讯系统分析
  ?牐牳孟低澄ひ礑H+网,系统硬件环境由两台安装1784-KTx通讯卡的工控PC机和五台SLC500(AB公司的可编程控制器型号)组成,其结构如图(^29020504a^)1所示:
  ?牐燩C机上的通讯软件和工业组态软件分别为RSLINX和RSVIEW。它们之间的通讯采用DDE技术。所以我只要知道提供DDE服务的Application、Topic、Item就可以在VB开发环境下利用的相关控件与RSLINX及RSVIEW进行通讯了。
  #1?牐?2.语音提示报警功能的实现
  ?牐犛镆舨シ趴梢灾С諻AV或MP3格式的声音文件,由于MP3文件体积小所以我选用这种格式。从网站下载一个Activex控件用于播放语音,此控件为MP3Play.OCX,很容易找到。下一步是录制语音,先用Windows中的录音机将所需的提示语音录成WAV格式,再用MP3转换器将其转成MP3格式。
  #1?牐?3.程序总体结构图(图(^29020504b^)2)
  ?牐燗部分主要说明:DDE的建立以及出现报警后将报警信息插入到报警队列最后。报警队列是等候报警的信息的排队。因为计算机在广播报警信息时一次只能广播一条,建立报警队列后同时发生的报警将等候上一条播完后再广播。
  ?牐燘部分主要说明:定时在报警队列中检查及有报警信息后的播放过程。
  #1?牐?4.程序设计
  ?牐犗旅婢僖桓鍪道得鞒绦虻氖迪帧N蘼酆沃衷颍苯梅抗收贤;保琍C机报警“进水泵故障!”。
  ?牐犑紫冉?立好“进水泵故障!”的语音文件存为alarm.mp3,随后建立一个标准VB程序,在Form1上添加一个Timer控件用于控制程序循环,一个Mp3Play控件用于播放报警文件,一个Label控件用于建立DDE通讯,一个Listbox控件用于建立报警队列。Name属性均为默认,listbox 的visible属性设为False。
  ?牐犜贔orm1_load事件中加入如下代码:
  ?牐燩rivate Sub Form1_load() ?煟?
  ?牐燣abel1.LinkTopic=“rtdata|airportauto”  '设立DDE连接通道
  ?牐燣abel1.LinkItem=“plc1\f101”
  ?牐牐?设定连接项目为进水泵故障,此项根据连接项目的不同而不同,如果你使用的是RSVIEW则在TAG EDITER中可以找到与PLC数据点相对应的LinkItem
  ?牐燣abel1.LinkMode=1  '自动连接
  ?牐燭imer1.interval=1000  '设定循环周期为1秒
  ?牐燭imer1.enable=true  '打开定时器
  ?牐燛nd sub
  ?牐犜贚abel1的Label1_Change()中加入如下代码:
  ?牐燣abel1_Change()?煟?
  ?牐燿im i as integer
  ?牐爄f label.caption=1 then '如果变为报警状态则
  ?牐燜or i=0 to listbox1.listcount-1 '检查队列,有此信息则不插入信息
  ?牐營f “alarm”=listbox1.list(i)then Exit sub
  ?牐燦ext i
  ?牐燣istbox.AddItem(“alarm”)'插入新报警信息到队列最后
  ?牐燛nd sub
  ?牐犜赥imer1的On_Timer事件中加入如下代码:
  ?牐燩rivate Sub Timer1_Timer()?煟?
  ?牐燚im retcode As Integer
  ?牐燚im temstring As String
  ?牐營f LISTBOX1.ListCount = 0 Then Exit Sub  '检查队列是否为空
  ?牐爎emstring = LISTBOX1.List(0)'取出第一条报警信息
  ?牐燣ISTBOX1.RemoveItem(0) '将该条移出报警信息队列
  ?牐燨n Error GoTo error_handle
  ?牐爎etcode = Mp3Play.Open(App.Path+remstring +“.mp3”,“”)??
  ?牐爎etcode = Mp3Play.Play '播放语音报警
  ?牐燛xit Sub
  ?牐爀rror_handle:'错误处理
  ?牐爎etcode = Error
  ?牐爏oundable = True
  ?牐燫esume Next
  ?牐燛nd Sub
  ?牐牶昧耍∪砑瓿桑赗SLINX和RSVIEW运行之后启动该程序,就可以实现进水泵故障的语音报警了。上面只是个例子,在功能上及用户界面上都很不完善,但是利用同一方法可以实现在线设备的监视及信号采集等工作,如果你有兴趣可以深入了解一下。