《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于易控的51系列单片机通用驱动程序设计
基于易控的51系列单片机通用驱动程序设计
来源:电子技术应用2011年第11期
李建平, 郑 萍, 叶建平, 陶 平, 温百东, 朱光灿
(西华大学 电气信息学院, 四川 成都610039)
摘要: 设计了一种基于易控(INSPEC)组态软件的51单片机外部设备的通用驱动程序,以解决基于51单片机的底层设备驱动问题。该通用驱动程序通过电压监测仪表进行了应用调试,证明了该驱动程序实用易行,并为其他的设备驱动程序设计提供了设计思路和程序框架。
中图分类号: TP273
文献标识码: A
文章编号: 0258-7998(2011)11-0144-03
Design of general driver for the 51 series MCU based on the INSPEC
Li Jianping, Zheng Ping, Ye Jianping, Tao Ping, Wen Baidong, Zhu Guangcan
School of Electrical and Information Engineering, Xihua University, Chengdu 610039, China
Abstract: A general device driver was designed based on the INSPEC which extremely widespread application of 51 series MCU, in order to solve the underlying driver problems of 51 series MCU . The driver was debugged by using the infrared Remote voltage monitoring instrument. The result proved that the driver is practical and feasible, and has provided the design ideas and the program frame for the design of general device driver.
Key words : data communication; INSPEC; configuration software;MCU; driver


    目前,工业组态软件已经广泛应用于工业控制领域,易控(INSPEC)是北京九思易自动化软件有限公司(ControlEase AutomationSoftware)推出的一套通用数据采集和监控(SCADA)软件,具有最新的.NET Framework 框架平台,应用极为广泛。为了与现场设备进行交互, INSPEC提供了国内外各种常用的工控设备的驱动程序。但是由于现场设备种类繁多,支持的通信协议各不相同,因此,需要针对不同的底层设备编写相应的驱动程序,以实现同组态软件的信息交互。许多底层设备采用单片机进行设计,本文针对基于51单片机的设备进行了通用的驱动程序设计,通过此通用驱动程序,设计者只需简单的设置就可以将基于51单片机的仪表、设备接入INSPEC,无需重新开发驱动程序。而且只需将所设计的驱动程序进行少量改动,即可适应各种类型的设备,或与其他类型的单片机进行通信。
1 基于51单片机的设备与上位组态软件的连接
    对于易控组态软件,底层设备属于I/O设备。上位机通过硬件通道与硬件设备建立连接关系,按照对应的通信协议与硬件设备交换数据,并将采集到的运行数据经转换后通过数据库接口传送至数据库,同时响应数据库关联变量来改变事件,将输入数据写入硬件设备。51单片机提供了一个全双工标准接口,通过电平转换芯片MAX232及相关外围电路来实现TTL信号和RS-232电平信号之间的转换,并实现与计算机串口RS-232的硬件通信通道连接。通过设备驱动程序,完成基于51单片机的设备与上位组态软件的数据交互。其接口结构如图1所示。

2 利用开发向导生成驱动程序的框架[1-2]
    根据INSPEC组态软件I/O系统的驱动设计规范, I/O系统由服务器类(DeviceIoMgr)、通道类(Channel)、设备类(Device)、I/O变量类(IoTag)构成。INSPEC提供了设备驱动程序开发包(SDK),驱动程序的开发环境为Visual Studio 2008。采用C#为开发语言,易控提供驱动程序开发模板。
2.1 设备驱动程序的建立
    设备驱动程序的建立需运行Microsoft Visual Studio 2008,新建项目类型为“Visual C# 易控(INSPEC)”,在“我的模板”位置会出现“设备通信”模板,输入项目名称为单片机通用驱动,支持通道名称选择串口,根据向导完成新建项目的配置。然后修改项目的三个重要属性:
    (1) 程序集名称要遵从“Controlease.IoDrive.厂家名.设备名”的规则。在项目属性设置窗口中,点击“应用程序”, 将程序集名称修改为ControlEase.IoDrive.Control
Ease.单片机通用驱动。
 (2) 生成事件是生成I/O设备驱动的DLL文件。由于易控启动时从文件夹..\ControlEase\INSPEC\Devices下加载驱动,所以将生成驱动DLL的路径设置在此目录。
 (3) 引用路径是驱动项目中引用类库的路径,一般设置在..\ControlEase\INSPEC\目录下。
2.2 驱动程序的设计方法
   在易控提供的驱动程序开发模板下,为了实现I/O设备的自定义功能,主要修改设备通信模板的读、写以及特殊操作方法。本通用驱动程序的设计修改了单片机通用驱动Protocol.cs类中的ReadPacket(SampleTagPacket packet)和WriteTag(IoTag tag)方法。
 (1) 设备数据采集
   易控采用循环采集的方式来采集现场设备数据。所有具有“只读/读写”属性的I/O量,都会按照I/O变量设置的“查询周期”进行采集。每次采集过程都会进入ReadPacket方法中。
  设备数据采集过程,默认采集方式为变量包采集方式。在该设备通信程序开发包里,把所有在INSPEC软件中添加的可读IoTag都添加到了一个数据包中,采集程序从bool ReadPacket(SampleTagPacket packet)方法进入,数据采集流程图如图2所示。

    数据采集部分编程如下:
public override bool ReadPacket(SampleTagPacket packet)
{
      int  sendCount = FormReadOrder(packet);
        int  toReceiveCount = packet.Length * 4 + 5; 
        if (packet.RegType == RegTypeList.CoilStatus.ToString()
      || packet.RegType == RegTypeList.InputStatus.ToString())
{
     toReceiveCount = packet.Length % 8 == 0 ? (packet.
    Length/8+5) : (packet.Length/8+1+5);
}
        int  receiveCount=WriteAndRead(sendCount, toReceive
        Count);
        if (receiveCount < toReceiveCount) 
{        
TraceLog.TraceError(string.Format(Resources.NOT_ENOUGH_
DATA_RECEIVED, receiveCount));
    return false;
}
        if (!CheckOutReceivedData(receiveCount))
{
    return false;
}
    return ParseIO(packet, receiveCount);
}
    在这段代码中,首先调用FormReadOrde方法,组成了通信协议帧,并返回读命令长度。然后通过WriteAndRead方法,完成了串口的读写操作,即完成了上位机与设备间的一次通信。收到返回数据以后,调用CheckOutReceivedData方法,对从串口接收到的数据进行校验。最后,调用数据解析ParseI/O方法,将接收到的数据转换成I/O变量的值。
    (2) 写设备变量
    易控中所有的赋值操作,只要I/O变量具有&ldquo;只写/读写&rdquo;属性,并且I/O变量关联的数据库变量的值发生变化,都会触发写操作,并进入WriteTag方法。将参数写到设备里面,默认调用方式为写IoTag,程序从bool WriteTag(IoTag tag)方法进入,写设备变量流程图如图3所示。

    写设备变量部分编程如下:
public override bool WriteTag(IoTag tag)
{
    int  sendCount = FillWriteFrame(tag);
  if  (sendCount <= 0)
{
   return true;
}
   const int toReceiveCount = 10;
   int receiveCount = WriteAndRead(sendCount, toReceive-
        Count);
   if(!CheckOutReceivedData(receiveCount, toReceiveCount))
{
        return false;
}
    return true;
}
    在这段代码中,首先调用FormWriteOrder方法,组成了通信协议帧,并返回写命令长度,然后通过WriteAndRead方法,完成了串口的读写操作,即上位机与设备完成了一次通信。在收到返回数据以后,调用CheckOutReceivedData方法,对串口接收到的数据进行校验。
2.3  数据打包

 


    易控进行设备数据采集的最小单位是一个数据包(SampleTagPacket)。在默认设备采集过程中,所有的查询周期相同的IoTag都将会打包到同一个数据包中。这个数据包就是易控的基本采集单位变量包packet,即IoTag的集合。设备类中的CanAddToPacket方法是为读打包服务的,该方法将返回一个Bool值,用来判断是否可以打成一个包。在该方法下设计需要打包寄存器的条件,只要返回TRUE,满足条件的寄存器就会自动打成一个包。
    CanAddToPacket有两个参数,packet指的就是包,它包括多个满足打包条件的tag(tag指准备要打包的寄存器)。如果满足打包条件,tag就会被添加到packet中。具体实现方法如下:
Protected override bool CanAddToPacket(SampleTagPacket packet, IoTag tag)
    {
             if (packet.RegType != tag.RegType)
      {
             return false;
    }
if(SerialDevice1BaseInfo.IsBitRegister(packet.RegType) &&Get-
CombineLength(packet,tag)>=SerialDevice1BaseInfo.MaxCombine
Length * 16)
    {
             return false;
    }
            if(GetCombineLength(packet,tag)>=SerialDevice1BaseInfo.
            MaxCombineLength * 16)
    {
             return false;
      }
             return base.CanAddToPacket(packet, tag);
    }
2.4 驱动程序通道配置
    INSPEC在I/O通信的通道中配置复杂的串行端口参数(如波特率大小,数据位长度,停止位位数,有无奇偶校验等)、初始化和读写操作,用户可以针对不同设备的通信协议进行相关的配置,即可将51单片机仪表和设备接入INSPEC,避免了驱动程序的重复开发。
    通道配置完成后,点击&ldquo;下一步&rdquo;进行设备的选择,编写好的设备驱动&ldquo;单片机通用设备&rdquo;已经加载到了易控可选设备中,如图4所示。由于易控中提供两种数据传递类型,一种是比较常用的字节形式(ByteArrayParseInfo),另一种是在智能仪表中常用的ASCII码字符串形式(StringParseInfo)。根据协议能很方便地确认设备采用的是哪一种形式,然后根据需要定义对应的数据转换信息类,这里选择的是字符串方式。点击&ldquo;完成&rdquo;即建好通道。

3 基于51单片机的通信程序设计[3]
    该驱动程序具有较强的通用性,在INSPEC中用户只需根据底层设备的通信协议进行通道配置即能完成INSPEC与下位机之间的通信;另一方面,用户也可以先配置好INSPEC的通道,并根据通道配置在下位51单片机的通信程序里进行相关协议的编写,实现上位和下位机的通信协议的一致性。
    51单片机的串行口内部有两个物理上独立的接收、发送缓冲器SBUF,可同时发送、接收数据。用户将数据存放在SBUF寄存器里来完成与上位机INSPEC的数据交互。为了更好地体现驱动程序的通用性,在驱动程序里定义了收发数据的缓冲区大小,用户只需将底层设备的数据存储到已定义的缓冲区里就能完成数据的交互,编程如下:
    private readonly byte[] mReceiveBuffer = new byte[2048]                                  //用于保存接收到的数据
    private readonly byte[] mSendBuffer = new byte[1024]
                                              //用于保存发送的命令
  这里单片机串口工作于方式1,数据帧格式为8 bit数据位,1 bit停止位,定时/计数器1用作波特率发生器,PCON中的SMOD位为0,发送的波特率为9 600,系统初始化程序如下:
        TMOD=0x22;         //定时器T1,在方式2中断产生
                                                         //波特率
        PCON &=0x00;             //波特率不倍增,SMOD=0
        SCON=0x40;
        TH1=0xfd;                     //波特率设置为9 600
        TL1=0xfd;
4 通用驱动程序在电压监测仪表上的应用
    该应用中下位机采用STC89C52系列单片机为主控芯片的电压监测仪表,上位机监控软件为INSPEC。由于已经编写了单片机的通信协议,所以在易控中进行通道配置时应该与单片机通信协议保持一致,即8 bit数据位,1 bit停止位,波特率为9 600。通道配置完成后,在设备中选择单片机通用驱动就完成了I/O通信的配置。
    电压监测仪表中的电压传感器将采集的电压信号传给A/D模块进行数据转换,并进入单片机进行数据处理,经RS-232端口与上位机的监控软件INSPEC通信。通过数据交互,可在上位机上直接显示现场的电压值,以达到对现场电压的实时监测。
4.1 上位机监控界面的设计[4]
     INSPEC软件能够很方便地实现对自动化过程和装备的监测和控制。在INSPEC中添加实时数据库变量,其中包括了控制系统所需的数据交互信息:电压设定值、监测电压值、电压报警指示和监测电压的实时曲线图等变量,使监控窗口和数据通道的变量关联起来。
4.2 驱动程序的装载
    在Microsoft Visual Studio 2008开发环境中,驱动程序编译后在文件夹..\ControlEase\INSPEC\Devices下生成ControlEase.IoDrive.ControlEase.,单片机通用驱动.dll驱动文件。启动易控开发环境时,会自动将驱动文件加载到易控的设备选择中供用户选择。   
    针对组态软件应用中驱动程序的开发问题,本文设计了基于INSPEC的51系列单片机通用驱动程序。实现了INSPEC和单片机控制的外部设备进行通信,解决了基于51系列单片机设备驱动程序的重复设计问题。为以后开发其他设备驱动程序提供了设计思路和程序框架,对实现底层设备方便接入组态软件进行了有益的探索。
参考文献
[1] 北京九思易自动化软件有限公司.易控(INSPEC)高级开发指南[M]. 2009.
[2] ROBINSON S, CORNES O. C#高级编程[M]. 康博,译. 北京:清华大学出版社,2002.
[3] 李全利,迟荣强.单片机原理及接口技术[M].北京:高等教育出版社,2004.
[4] 北京九思易自动化软件有限公司.易控(INSPEC)培训教程[M]. 2009.

此内容为AET网站原创,未经授权禁止转载。