微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 利用VB实现上位机与DX中波发射机通讯

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

时间:11-02 来源:互联网 点击:



  从图左侧我们发现了要找的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

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

网站地图

Top