找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 基于易控的51系列单片机通用驱动程序设计

[复制链接]
admin 发表于 2013-3-23 11:22:02 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
摘  要:  设计了一种基于易控(INSPEC)组态软件的51单片机外部设备的通用驱动程序,以解决基于51单片机的底层设备驱动问题。该通用驱动程序通过电压监测仪表进行了应用调试,证明了该驱动程序实用易行,并为其他的设备驱动程序设计提供了设计思路和程序框架。
关键词: 数据通信; 易控; 组态软件; 单片机; 驱动程序
       目前,工业组态软件已经广泛应用于工业控制领域,易控(INSPEC)是北京九思易自动化软件有限公司(ControlEase AutomationSoftware)推出的一套通用数据采集和监控(SCADA)软件,具有最新的.NET Framework 框架平台,应用极为广泛。为了与现场设备进行交互, INSPEC提供了国内外各种常用的工控设备的驱动程序。但是由于现场设备种类繁多,支持的通信协议各不相同,因此,需要针对不同的底层设备编写相应的驱动程序,以实现同组态软件的信息交互。许多底层设备采用单片机进行设计,本文针对基于51单片机的设备进行了通用的驱动程序设计,通过此通用驱动程序,设计者只需简单的设置就可以将基于51单片机的仪表、设备接入INSPEC,无需重新开发驱动程序。而且只需将所设计的驱动程序进行少量改动,即可适应各种类型的设备,或与其他类型的单片机进行通信。
1 基于51单片机的设备与上位组态软件的连接
     对于易控组态软件,底层设备属于I/O设备。上位机通过硬件通道与硬件设备建立连接关系,按照对应的通信协议与硬件设备交换数据,并将采集到的运行数据经转换后通过数据库接口传送至数据库,同时响应数据库关联变量来改变事件,将输入数据写入硬件设备。51单片机提供了一个全双工标准接口,通过电平转换芯片MAX232及相关外围电路来实现TTL信号和RS-232电平信号之间的转换,并实现与计算机串口RS-232的硬件通信通道连接。通过设备驱动程序,完成基于51单片机的设备与上位组态软件的数据交互。其接口结构如图1所示。
    20121107051417899721999.gif
   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所示。
    20121107051417915352000.gif
       数据采集部分编程如下:
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变量具有“只写/读写”属性,并且I/O变量关联的数据库变量的值发生变化,都会触发写操作,并进入WriteTag方法。将参数写到设备里面,默认调用方式为写IoTag,程序从bool WriteTag(IoTag tag)方法进入,写设备变量流程图如图3所示。
    20121107051417930972001.gif
       写设备变量部分编程如下:
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  数据打包
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-24 10:12 , Processed in 0.055442 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表