网站标志
导航菜单
当前日期时间
当前时间:
购物车
购物车中有 0 件商品 去结算 我的订单
商品搜索
商品搜索:
文章正文
基于VB液位控制系统上位机串行通讯的实现
作者: 来源:中国机电工程网    发布于:2019-06-07 18:48:37    文字:【】【】【
1 前言

  Visual Basic6.0(以下简称VB)以其简单易学、32位面向对象的程序设计等特点, 倍受广大计算机开发者的青睐,已广泛地应用于各个领域;在实时监测系统中串行端口通信是其一项基础功能,因此我们使用 VB6编写实时液位控制系统的上位机通讯软件。
  传统的应用程序开发过程可以分为三个明显的步骤:编码、编译和测试代码。但是Visual Basic与传统的语言不同,它使用交互式方法开发应用程序,使三个步骤之间不再有明显的界限。由于Visual Basic的交互特性,代码运行效果可以在开发时进行测试,而不必等到编译完成以后。

2 液位控制系统的工艺流程

  本装置由过程调节系统(电动执行机构、调节阀、变频器、透明水槽、储水槽、水泵等)、过程控制系统(进口智能控制器、分配器、转换器、电源等)、计算机网络及软件等组成。
  系统有两个液位水槽(罐)和一个储水槽组成。管路采用不锈钢塑料复合管,阀门、水管管件、仪表柜采用900*2100*500的全封闭形式、控制器选用PLC和智能调节器、液位变送器采用压力传感器、调节阀采用气动薄膜调节阀、变频器对水泵转速控制、为了增加流量实验采用了流量变送器。
  整个系统由网络级、监控级、控制级、现场级构成DCS过程控制系统,网络级可于Internet连接,实现远程网络操作与控制,监控级完成工艺过程可视化、模块化组态、实时的参数采集设置和控制、实时和历史趋势、数据采集与数据管理网络功能、用户综合报表、报警与报警管理、通讯与打印管理等。控制级完成控制规律与参数设定、控制算法运算、控制信号输出、实时准确的完成控制执行机构的动作;现场级执行控制信号、在线实时调节输出幅值,并将检测到的液位和流量的过程值回送到控制器。流程图如图1。


图1 工艺流程图

3 软件设计、实现

  3.1 根据实际的工艺过程分析软件功能的要求。如需要与下位机采集数据的顺序,数据的范围条件,采集数据的周期(采样周期)无效或错误数据的舍取与纠正等。操作方式(手动,自动,本地监控,远程监控等)。
  3.2 根据控制系统控制方案的要求构造软件的模块。
  3.3 根据控制要求确定的用户输入,输出设备,据此确定软件的人机交互功能表,进行程序设计。

4 功能模块划分(如图2)


图2

  根据设计的任务和要求, 上位机所要完成的功能主要包括:人机交互界面,数据通讯模块,输入输出处理三大部分。
  4.1 人机界面要实现控制量的输入(到下位机),控制过程状态变量的采集,显示和保存(时实曲线、历史曲线、数据库操作等),数据处理结果的输出打印(打印功能)。
  4.2 数据的传输主要依靠通讯协议来完成,在软件中是最重要的部分。 上位机与PLC采用RS---422/485串口通讯协议,上位机每隔50ms就要完成一次数据采集过程(主要是容器的液位值等)。允许操作者通过软件设定控制参数,改变控制状态。也就是,执行控制信号、在线实时调节输出幅值,并将检测到的液位的过程值发送到上位机。
  4.3 输入输出处理是指上位机通过通讯端口把采集到的原始数进行处理,以用户可以读懂的形势表现出来,采集到的数据先通过数据库保存,同时用图形或列表等比较直观的形势显示在用户面前。
  过程数据处理的结果就是在整个试验过程中控制量和反馈结果的集合,通过上位机保存到数据库中,我们就是通过分析这些数据的变化规律达到学习和理解过程控制的内在实质。即完成控制规律的与参数设定、控制算法运算、控制信号输出、实时准确的控制执行机构的动作。

5 串行通讯的实现

  5.1在VB中实现串口通信的控件Mscomm是最容易实现串口通讯的(在工程部件中添加Microsoft Comm Control 6.0), Mscomm控件提供了功能完善的串口数据的发送和接收功能,Mscomm控件具有两种处理方式:1事件驱动方式:由Mscomm控件的OnComm事 件捕获并处理通信错误及事件;2查询方式:通过检查CommEvent属性的 值来判断事件和错误。
  Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数 是由Comm.drv解释并传给设备驱动程序执行的,对于我们开发程序时只 需知道Mscomm控件的属性和事件的用法即可以实现串口的操作。
  以下是Mscomm控件的主要属性和方法:
  1) CommPort:设置或返回串行端口号,其取值范围为1~99,缺省 为1(表示选取的串口是Com1)。
  2) Setting设置或返回串行端口的波特率、奇偶校验位、数据位 数、停止位。如:Mscomm.Setting="9600,N,8,1"(表示串口端口的波特率是9600bps,奇偶校验位无,数据位8位,停止位1位)。
  3) PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={T RUE|FALSE}(这是当上述串口初始化完成后必须设置打开串口)。
  4) InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字 节。
  5) InBufferC ount:返回接收缓冲区内的等待读取的字节个数,可 通过设置该属性为0来清除接收缓冲区。
  6) RThresho ld:该属性为一阀值,它确定当接收缓冲区内字节个 数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件 。
  7) InputLen: 设置或返回接收缓冲区内用Input读入的个数。若 取0,则INPUT读取整个缓冲区的内容。
  8) Input: 该属性表示从接收缓冲区移走一串字符。
  9) OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
  10) OutBufferC ounter:返回发送缓冲区内等待发送的字符数,可 用来清空缓冲区。
  11) Output:向发送缓冲区传送一字符串。
  12) EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产 生OnComm事件。
  如果在通信过程中发生错误或事件,就会引发OnComm事件并且改 变属性值,由CommEv ent属性代码反映错误类型,在通信程序的设计中 可根据该属性值来执行不同的操作,以下是部分属性常数值及其含义:
  1) ComEvSend: 其值为1,发送缓冲区的内容少于SThreshold指定 的值。
  2) ComEvReceive: 其值为2,接收缓冲区内字符数达到 RThresho ld 值,该事件在缓冲区中数据被移走前将持续产生。
  3) ComEventFrame: 其值为1004,硬件检测到帧错误。
  4) ComEventRxOver: 其值为1008,接收缓冲区溢出。
  5) ComEventTxFull: 其值为1010,发送缓冲区溢出。
  6) ComEventRxParity: 其值为1009,奇偶校验。
  7) ComEvEOF: 其值为7,接收数据中出现文件结束(ASCII 码为 2 6)字符。
  5.2用Mscomm控件实现串口通信时,首先添加Mscomm控件到窗体 中,该控件一般不在通用工具窗口中,而是需通过菜单项"工程(P)→部 件(O)"进入选择窗口,在控件tab页中选取Microsoft Comm Control 6 .0 ,此时工具窗口中出现Mscomm图标,即可被使用。
  以下是事件驱动方式的接收程序主要代码部分:
  首先初始化串口程序
  Mscomm1.Commport=1 ' 选择COM1
  Mscomm1.Settings="9600,N,8,2" ' 设置通信参数
  Mscomm1.Inputlen=0 ' 读入接收缓冲区全部字符
  Mscomm1.OutbufferSize=256 ' 设置发送缓冲区大小
  Mscomm1.InbufferSize=512 ' 设置接收缓冲区大小
  Mscomm1.PortOpen=True '打开COM1
  软件与PLC进行数据采集发送命令程序编写也有规律可寻,比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:
  Dim Command, node, begin, number as string
  Dim Answerlen as integer
  node="03" '节点号
  Command="RR" '命令为读IR区
  begin="0000" '从IR000开始
  number=10 '读取长度
  Answerlen=51 '计算接收字符串长度
  接下来进行命令发送和接收应答处理:
  Dim FCS, I as integer
  Dim s ,f as string
  s="@"+node+Commad+begin+number
  FCS=0
  For i=1 to Len(s)
  FCS=FCS xor Asc(Mid$(s,i,1) ) '帧校验码FCS
  Next i
  f=Hex$(FCS)
  If Len(f)=1 Then f="0"+f
  Commfrm.MSComm1.Output=s + f + "*" + CHR$(13) '命令帧发送
  Do
  Dummy=DoEvents()
  Loop Untill Commfrm.MSComm1.InbufferC ount >= Answerlen '等待应答帧
  Do tag1= Commfrm.MSComm1.Input
  Loop Untill Commfrm.MSComm1.InbufferC ount=0 '读完应答帧
  可以通过液位系统PLC的地址表,利用以上的类似程序进行数据的收发。
  5.3在设计过程中,不同模块之间需要进行相互的通讯,就是所谓的“节点自身通讯”,节点自身的“通信”是一种形象的说法,严格说来应是VB应用程序利用DDE技术与本节点其它Windows应用程序进行数据交换。DDE(Dynamic Data Exchange)即动态数据交换,它是Windows支持的三种内部通信机制之一,是应用程序间通过共享内存进行进程间通信的一种形式。应用程序间进行数据交换称为“会话”(Conversation),申请会话端叫客户(Client),响应申请端叫服务器(Server)。一旦客户与服务器间建立起DDE所需的数据链路就可自动进行数据交换。
  在监控系统开发中,工控软件以其功能强大、使用方便等特点得到广泛应用,但在处理复杂数据时其计算功能受到一定限制,而VB可以较好地弥补这一不足,并且还能承担数据采集、报表打印等功能。这就需要在VB应用程序与组态软件应用程序间进行动态数据交换。
  VB中只有TextBox、PictureBox、Label和Form可以与其它应用程序进行动态数据交换,控件用于DDE的属性项有LinkTopic(连接主题)、LinkItem(连接项)、LinkMode(连接模式)和LinkTimeout(连接等待时间)。
  以下为当遇到事件处理时的通用程序,flag为一静态变量记录读取次数,以便改 变接收数据的长度,可根据实际需要添加其它处理内容:
  Private Sub MSComm1_OnComm()
  S elect Case MSComm1.CommEvent
  Case comEvReceive
  If flag > 246 Then
  MSComm1.InputLen = 0: MSComm1.RThreshold = 32
  End If
  buffer = MSComm1.Input
  temp = buffer
  Print #hfile, temp
  c ounter = Timer + 10
  Do While Timer > c ounter
  Do Events
  Loop
  flag = flag + 1
  Case comEvEOF
  Case comFrame
  ERMsg$ = "帧出错!!!"
  Case comRxParity
  ERMsg$ = "奇偶错!!!"
  End S elect
  If Len(EVMsg$) Then
  Text1.Text = "Status: " & EVMsg$
  ElseIf Len(ERMsg$) Then
  Text1.Text = "Status: " & ERMsg$
  Beep
  Ret = MsgBox(ERMsg$, 1, "Click Cancel to
  quit, OK to ignore.")
  MSComm1.PortOpen = False
  End If
  End Sub
  5.4在程序设计过程中,无法直接将数据存入数据库,同样也无法直接将数据库中的数值发送到PLC或调用到图形显示中去,相应的解决办法是构造数组函数,把数据暂时放到构造的函数中,再利用VB中的OADB数据操作存入库中。在涉及Microsoft Jet数据库管理方面,数据的结构,它们之间的关系,读写的权限等要做到非常的熟悉是很困难的,因此要经常性的进行数据和程序代码的有效性检查和调试,以避免有错误的隐患。

6 调试运行

  当程序编译调试结束后,就要对软件进行模拟实验环境下的调试和修改。目的就是要测试软件与PLC通讯是否正常,采样周期时间是否合理,数据库记录的添加、读取、修改是否正确,用户交互报表有无异常,记录查询是否合乎条件等等。
  当程序在仿真环境下测试成功后,就需要到现场环境下进行最后的测试。经过多次反复的测试和调整,软件工作情况良好。
浏览 (60) | 评论 (0) | 评分(0) | 支持(0) | 反对(0) | 发布人: 来源:中国机电工程网
将本文加入收藏夹
新闻详情
脚注栏目
|
脚注信息
机电工程网(C) 2015-2020 All Rights Reserved.    联系我们