利用VB实现上位机与DX中波发射机通讯

2012年11月02日 13:49    发布者:1770309616
前言
  dx系列中波发射机是由美国harris公司制造的全固态数字调幅发射机,由于其运行稳定、各项指标好、整机效率高等优点,在全国各台站得以广泛应用。我台自1999年起开始使用dx-400发射机,在10年左右的使用与维护工作中我们曾对dx-400发射机进行了两次自动化改造。第一次改造是用omron c200h plc加外围电路来实现对发射机和附属设备进行采样和控制的,但在实际的使用过程中我们发现这样的控制系统有其致命的局限性。因为系统是plc加外围电路实现的控制系统就决定了系统无法显示机器内部数据的实时状态,无法与发射机内部实现直接通信。因此只有实现了工控机与发射机的控制核心——plc(可编程控制器)直接通信才能克服这一局限性,真正实现实时掌握机器内部数据状态和对发射机的直接控制。dx-400发射机控制单元使用的是a-b plc,这种plc是rockwell automation的专利产品,使得第三方的软件不能很好地与a-b plc进行连接。在实际改造工作中我们找到了一种采用dde(动态数据交换技术)技术与a-b plc进行数据交换的方法,能够更好的解决这一瓶颈问题。
dde技术的工作机制
  dde是动态数据交换技术的缩写,是为在同一台计算机或不同计算机上运行的程序提供动态数据交换的一种新技术,最早由microsoft公司提出的。动态数据交换(dde)技术由于其具有实时性好、网络通信连接实现方便等特点,在控制软件与信息网络集成中得到了广泛应用。
  动态数据交换基于widnows消息机制,各应用程序间通过传递消息进行对话交换信息。windows dde消息传递采用client/server模式,客户(client)是数据的请求和接受者,而服务器(server)是数据的提供者,两者之间通过请求、应答、传输三个步骤来完成数据的传送。dde协议使用服务(service)、主题(topic)和数据项(item)三级命名来标识dde所传递的数据单元。一般情况下,服务(service)就是应用程序的文件名,主题是对服务器有意义的信息单元。每次dde客户与服务程序之间的对话都是先由客户启动的,所以在每次客户启动之前,dde服务器应当首先投入运行。
  当客户程序需要向服务器程序请求数据时,客户程序发送一条wm-dde-initeate消息给当前运行的所有widnows应用程序,这条消息不但包含了它所需要的服务器名(service)和主题名(topic),而且指明了它所希望的数据类型,收到wm-dde-initeate消息的应用程序通过判别服务器名和会话主题决定是否应答,一旦dde服务器响应了这条被传播的消息,dde会话就开始了。
  dde的工作方式有冷连接(cool link)、温连接(warm link)和热连接(hot link)等3种。在冷连接方式下,当server中的数据发生变化后不主动通知client,但client可以随时从server读写数据;在温连接方式下,当server中的数据发生变化后马上通知client,client得到通知后将数据取回;在热连接方式下,当server中的数据发生变化后马上通知上位机(工client,同时将变化的数据直接送给client。
硬件连接与系统配置
  控机)与a-b plc的连接方式有两种:一种是利用厂家提供的dh+485数据线将上位机通讯卡与a-b plc cpu模块的dh+接口直接连接;一种是通过自制的r232数据线将上位机com口与a-b plc cpu模块的rs232接口直接连接。
通讯卡连接方式
  将allen bradley公司出品的1784-pktx通讯卡安装到上位机上。安装方法如下:
  请确认已将其中一块通讯卡上的地址跳线帽(jp3)拔掉。参见图1。
  (1)打开工控机机箱,将1784-pktx通讯卡插入pci插槽内,固定螺丝,盖好盖板;
  (2)启动工控机,系统检测到硬件。如果用户已经安装rslogix500软件,则系统将自动检测到驱动。如果用户尚未安装rslogix500软件,可先安装该软件,软件安装完毕后,系统将自动为通讯卡安装驱动程序;
  (3)用dh+485数据线将上位机(工控机)与plc连接;
  (4)使用rslinx连接a-b plc的通讯网络,运行rslinx
  classic软件。点击菜单中“通信”选项,在下拉列表中选择“配置驱动程序”:(参见图2)。
  点击该选项后,弹出如图3所示页面,在下拉列表中选择1784-kt/ktx(d)/pktx(d)/pcmk for dh+/dh485
  devices后,单击【新增…】按钮:
  此时弹出确认框,如图4所示。
  点击“确定”后,弹出如下页面,如图5所示,在“值”下拉列表中选择pktx(d)选项:
  点击“确定”后,rslinx配置完成。
r232连接方式
  (1)按照标准电缆1747
  cp3的内部接线图(如图6)自制com口通信电缆也是能够实现上位机与plc的通信的,此种电缆的优点:造价低廉、使用方便;缺点:不能通过这种数据线组成plc网络,实现多plc资源共享。
  (2)使用rslinx连接a-b plc的通讯网络
  配置方式与前相同只是在进入config dirvier菜单后弹出如图7所示页面。
  在下拉列表中选择rs-232 df1 devices选项,然后点击“新增”按钮会出现如下对话框,如图8所示。
  点击“确定”,出现如下对话框,如图9所示。
  点击“自动配置”按钮,系统开始对plc进行自动配置。以上配置完成后点击“确定”按钮并关闭对话框(此时程序回最小化并没有关闭)。
  进行dde服务的配置
  在菜单栏中打开“dde/opc”菜单并选择“主题组态”对话框,如图10所示。
  从图左侧我们发现了要找的plc并在右侧显示了“主题列表”中看到程序名。点开“数据采集”栏在“处理器类型”下拉菜单中选择“slc-503+”项,这一步很重要只有通过它才能正确的加载驱动程序,为通信打下基础,如图11所示。
  点开“高级通信”栏在“通信驱动程序”中选择“ab df1-1 dh485 工作站”项,如图12所示。
  这样在rslinx软件中对a-b plc的通信配置就完成了,建立与plc数据联结既可以完成与plc的数据交换。
利用vb开发dde客户端
  vb作为microsoft 公司软件产品的重要一员,理所当然的对windows操作系统下的dde技术给予支持。vb为一些控件提供了用于dde动态数据交换的linktopic、linkitem、linktimeout、linkmode等属性,以及linkrequest、linkpoke、linkexecute、linksend等方法。其中,linktopic、linkitem两项属性分别对应于dde通讯架构中的主题名和数据项名,linktimeout、linkmode分别表示dde 客户端与dde服务器的尝试连接时间和连接模式(数据交换方式),linkmode有manual、notify、automatic三种方式,而automatic方式最为常用,它主要用于和dde server建立“热连接(hot link)”,即在dde服务器数据发生变化时主动发送数据给客户端。linkrequest、linkpoke分别用于dde客户端对dde服务器数据的读写操作。
在vb中实现与a-b plc的“热连接”
  在visual basi建立一个新工程,添加几个label控件,并建立和rslinx的dde通讯连接,使其随上一步所设置好的连接的a-b plc数据“b01主系统”数值的变化而变化。
  其代码如下:
  private sub form_load()
  label1.linktopic = “rslinx|” & “b01主系统”
  label1.linkitem = “s:42”
  label1.linkmode = 1
  label1.linkrequest
  label3.linktopic = “rslinx|” & “b01主系统”
  label3.linkitem = “s:41”
  label3.linkmode = 1
  label3.linkrequest
  label5.linktopic = “rslinx|” & “b01主系统”
  label5.linkitem = “s:40”
  label5.linkmode = 1
  label5.linkrequest
  label10.linktopic = “rslinx|” & “b01主系统”
  label10.linkitem = “n60:11”
  label10.linkmode = 1
  label10.linkrequest
  label12.linktopic = “rslinx|” & “b01主系统”
  label12.linkitem = “n60:130”
  label12.linkmode = 1
  label12.linkrequest
  label14.linktopic = “rslinx|” & “b01主系统”
  label14.linkitem = “n60:131”
  label14.linkmode = 1
  label14.linkrequest
  end sub
  其中,代码中的“rslinx”和“b01主系统”分别表示应用程序名和主题名,“linkmode”值为1表示连接方式为automatic(即“热连接”)方式。这样当该应用代码被执行时,label的值便随a-b plc内存值的变化而变化。具体执行如图13所示。
  在excel中实现通过dde方式访问a-b plc 首先必须先安装rs linx创建dde topic. 比如我们定义一个topic名叫“b01主系统”,打开excel,创建宏命令,编写vba脚本如何读取和写入数据,从而完成与plc的数据交换。
  sub start()
  dim lngrow as long
  dim varcycle as variant
  dim varlogging as variant
  dim varresults as variant
  on error goto error
  rsichan = ddeinitiate(“rslinx”, “ b01主系统”)
  varlogging = dderequest(rsichan, “n60/163”)
  varcycle = dderequest(rsichan, “n60/161”)
  l/?
  if varcycle(1) = “1” and varlogging(1) = “1” then
  lngrow = 3
  if range(“indata!a3”).value 》 3 then
  lngrow = range(“indata!a3”).value
  end if
  for lngrow = lngrow to 65500
  if cells(lngrow, 1) = “” then exit for
  range(“indata!a3”).value=lngrow + 1
  next
  rsichan = ddeinitiate(“rslinx”, “n1”)
  f810data = dderequest(rsichan, “f8:10”)
  f811data = dderequest(rsichan, “f8:11”)
  f812data = dderequest(rsichan, “f8:12”)
  f816data = dderequest(rsichan, “f8:16”)
  f818data = dderequest(rsichan, “f8:18”)
  f817data = dderequest(rsichan, “f8:17”)
  f820data = dderequest(rsichan, “f8:20”)
  f821data = dderequest(rsichan, “f8:21”)
  f822data = dderequest(rsichan, “f8:22”)
  f823data = dderequest(rsichan, “f8:23”)
  f824data = dderequest(rsichan, “f8:24”)
  varresults = dderequest(rsichan, “f8:25”)
  ddeterminate (rsichan)
  cells(lngrow, 1).value = f810data
  cells(lngrow, 2).value = f811data
  cells(lngrow, 3).value = f812data
  cells(lngrow, 4).value = f816data
  cells(lngrow, 5).value = f818data
  cells(lngrow, 6).value = f817data
  cells(lngrow, 7).value = f820data
  cells(lngrow, 8).value = f821data
  cells(lngrow, 9).value = f822data
  cells(lngrow, 10).value = f823data
  cells(lngrow, 11).value = f824data
  cells(lngrow, 13).value = now()
  end if
  end sub
在vb中实现调用excel后台数据库
  因为前期已经实现了vb与plc的通讯可以实时看到数据的状态了,随后又实现了excel与plc的通讯也可以实时看到数据的状态,但这两种方法都有其局限性:前者可看、可控但因无数据库无法实现数据的存储,后者可看、可查但因无可执行程序无法实现可控。只有二者结合在一起才能扬长避短充分发挥功效。于是在vb中实现调用excel后台数据库这种方式就应运而生了,这种方式即充分发挥了vb可控的一面又实现了excel对数据的强大处理能力可以说上位机真正实现了对plc可看、可查、可控的功能。vb与excel的连接方法如下:
  (1)在工程中引用microsoft excel类型库:从“工程”菜单中选择“引用”栏;选择microsoft excel 9.0
  object library(excel2000),然后选择“确定”。表示在工程中要引用excel类型库。
  (2)在通用对象的声明过程中定义excel对象:
  dim xlapp as excel.application
  dim xlbook as excel.workbook
  dim xlsheet as excel.worksheet
  (3)在程序中操作excel表常用命令:
  set xlapp = createobject(“excel.application”) `创建excel对象
  set xlbook = xlapp.workbooks.open(“文件名”) `打开已经存在的excel工件簿文件
  xlapp.visible = true `设置excel对象可见(或不可见)
  set xlsheet = xlbook.worksheets(“表名”) `设置活动工作表
  xlsheet.cells(row, col) =值 `给单元格(row,col)赋值
  xlsheet.printout `打印工作表
  xlbook.close (true) `关闭工作簿
  xlapp.quit `结束excel对象
  set xlapp = nothing `释放xlapp对象
  xlbook.runautomacros (xlautoopen) `运行excel启动宏
  xlbook.runautomacros (xlautoclose) `运行excel关闭宏
  利用以上命令可以很轻松的实现vb与excel的连接功能在此不再赘述。
结束语
  vb因其功能强大、操作简洁近几年在诸多领域得到了广泛的应用,尤其因其对dde技术的完美支持更凸显出在自动控制方面的优势。通过它我们能很方便的实现上位机与plc的数据通讯,更能与数据库进行完美对接,真正实现了上控机对dx发射机可看、可查、可控。希望通过此文对广大一线工作人员有所帮助。