广 告
信息技术应用 >>  源代码>> 自动抄表系统中定时自动读数功能的实现
热 

自动抄表系统中定时自动读数功能的实现
作者:赵芳,胡晓岚,赵逸峰    转贴自:(上海大学自动化系,上海200072)    点击数:3979    文章录入: zhaizl


  摘 要:介绍如何在自动抄表系统中实现定时自动读数功能 ,如何实现多用户读数、协调串口等。文中使用VB中的MSComm控件控制串口,给出了实现该 功能的 程序流程图,并结合程序给出了相关程序代码。
  关键词:自动抄表系统;定时;串口;VB;Mscomm


Perform the Function of the Timing Reading of the Automat ic Mete r Reading System

ZHAO Fang, HU Xiaolan, ZHAO Yifeng

(Dept. of Automatic, Shanghai University, Shanghai 200072, China)


  Abstract: How to perform the function of the timing reading of t
he automatic meter reading system is introduced in this paper. The ac tive control called MSComm of VB is introduced. The flow chat to complete the ta sk is proposed with some correlative program codes.
  Keywords: reading the meters automatically; timing; serial port ; VB; MSComm


  在本项目研制的三表自动抄表系统中,上位机采用Visual Basic编程工具,通过VB中的
MSComm控件实现串口数据的发送和接收,通过RS232总线实现和下位通讯控制器的通讯;通 讯控制器和具有水、煤气、电三通道的抄表装置连接。
  程序编制中的难点在于:1.计算机与下位通讯控制器的通信只能 通过一个串口进行,存在串口的协调问题(必须避免串口冲突);2.计 算机读数只能一户一户地读,而定时自动抄的是所有用户的读数,也就是程序要实现多用户 自动抄表;3.如果有一户用户的数据抄表不成功,不能影响下一户的抄表。总之,考虑的因 素很多。

1MSComm控件简介
  VB通过MSComm控件控制串行口,为应用程序实现串行通信功能。
  MSComm控件产生的唯一事件是OnComm事件。每当有通讯错误或某事件发生时,MSComm控件就
会产生此事件。MSComm控件的如下属性对实现功能具有关键作用:
  
Commport设置并返回通信端口号。
  Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
  PortOpen设置并返回通讯端口的状态,也可以打开和关闭端口。
  Input从接收缓冲区读入字符。
  Output向传输缓冲区写一个字符串。
  Inputlen设置并返回从接收缓冲区每次读取的字符数。
  Rthreshold设置或返回输入缓冲区中存放接收字符的最小数。当其属性值为1时,则
缓冲区每接收到一个字符就引发一次OnComm事件,以便及时从缓冲区中取走数据;当设为0 时,则不引发OnComm事件;当设为其他值时,如Rthreshold属性值为5时,则缓冲区每接收 5 个字符引发一次OnComm事件。
  
CommEvent在MSComm控件采用事件驱动方式进行串口通信的时候,CommEvent属性返回 最近的通信事件或错误的数字代码。只要有通信错误或事件发生,均产生OnComm事件。当Co mmEvent属性值为常数ComEvReceive=2时,收到Rthreshold个字符,就会触发OnComm事件, 直到用Input属性从接收缓冲区中取出数据。

2实现过程
  
该系统中,form7是主界面,系统一启动,就运行定时自动读数功能,故将MSComm控件放置 主界面中;form7界面中的Data2控件与记录有用户基本信息的数据表相连。
  
form10是控制定时自动抄表是否启动的界面,如图1所示,界面中的Data1控件连接读数目志 表,DBGrid控件绑定Data1控件,显示定时读数日志;form10中用户输入的数据时间间隔记 录到另一个数据表中,Data2控件与之相连。在这里,设置一个全局变量将是否要启动定时 读数功能标志ff记录下来。如果定时功能启动则ff=1,关闭其他窗口的串口控件,以免串口 冲突;如果不启动定时读数功能,则ff=0,form7窗体的串口控件关闭,不影响其他窗口的 命令发送。定时的时间间隔设定也来自form10窗体,用一个全局变量将读数时间间隔记录到 一个数据表中。程序中用 到定时器控件timer1,用来判断系统时间,定义每分钟判一次,判 断是否到达定时时间。


  定时时间一到,执行下列程序:
 
  例如,假使当前主界面启动时间为“00:00:00”,用户定义每隔一个小时自动读取一 次数据,即timeinterval=60,则从主界面启动开始一个小时时间到达之后,timesystem=“ 01:00:00”。VB中对时间的计算以天为单位,所以,timesystem-time为 一个小时,即1/24天,条件timesystem-time>=60/(24*60)满足,可以开始抄表。将该时刻 抄表的时间“01:00:00”赋给时间变量time,成为下一分钟判时定时器判断时间的初始值 ,只有到了“02:00:00”时刻,判断条件才再次满足。
  该程序设计流程图如图2所示。其中,多用户自动抄表功能模块的流程如图3所示。
  对某一用户的抄表,上位机根据通讯规程,编制一条指令发送至通讯控制器(这条指令以帧 的格式编制)。在该模块中,将数据封装成帧的格式,然后对MSComm控件进行编程。抄表命 令发送的格式如下:
 

  这里用到的定时器控件timer2(定时0.1秒),是避免因为一户用户读不出来,而 延误 下面用户的读数。如果0.1秒之后还没读上来,则继续发送下一户用户的读数命令, 并在“读数状态”字段标志读数失败。

  如果传送上来的数据没有错误,即数据帧符合通讯规程所规定的格式,那么,标志ret=1, 收上来的数据可以写入读数日志表:
 
  在其他情况下,数据有错误,或者没有传送上来,那么,“读数状态”字段分别标志“数据 读入有误”或“数据传输失败”。

3小结
  
该定时自动读数功能程序经过实际运行得到了良好的运用。程序中大量用到标准模块中定义 的函数、变量,及用户自定义数据类型,这样使整个程序的内部引用变得十分方便,也大大 简化了编程量。


参考文献

1]仵浩,齐燕杰,宋文超,等.Visual Basic串口通信工程开发实力导航[M]. 人民邮电出版社,2003.
2]孙选,艾长胜,李国平.基于VB的远程雨量自动监测处理系统[J].济南大学 学报(自然科学版),2002,16(2).
3]张玉强,白少民.串口通信编程分析及其VB编程实例[J].延安大学学报(自 然科学版),2003,22(3).

  • 上一篇文章: Winsock编程原理

  • 下一篇文章: Request.ServerVariables
  •   最新5篇热点文章
      最新5篇推荐文章
      相关文章
    ·给ueditor编辑器赋值[304]
    ·破解遗骨之谜:"埃及艳后"曾残忍…[617]
    ·奇特太阳系外行星6小时内升温70…[617]
    ·人对物体运动方向感知研究[617]
    ·《自然—方法学》:美科学家开…[617]
    ·C# Request.ServerVariables2[697]
    ·Request.ServerVariables[700]
    ·浅析C# List实现原理[702]
    ·浅析C# List实现原理[702]
    ·龙芯3a7000最新进展[702]
     
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)