基于组态软件的驱动开发.docx
《基于组态软件的驱动开发.docx》由会员分享,可在线阅读,更多相关《基于组态软件的驱动开发.docx(7页珍藏版)》请在冰豆网上搜索。
基于组态软件的驱动开发
基于组态软件的驱动开发
摘要:
组态是指用户通过类似“搭积木”的简单方式来完成自己所需要的软件功能,而组态软件就称为“二次开发平台”。
驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作,系统不同,硬件的驱动程序也不同。
组态软件是联系客户和硬件的桥梁,本文基于易控组态软件驱动开发过程中的问题,分析并讨论了基于组态软件的驱动开发的解决办法。
关键字:
组态软件驱动开发
1组态软件
随着自动化水平的迅速提高,计算机在各领域的广泛应用,人们对自动化的要求越来越高,种类繁多的控制设备和过程监控装置在各领域的应用,使得传统的控制软件已无法满足用户的各种需求。
在开发传统的控制软件时,当被控对象一旦有变动,就必须修改其控制系统的源程序,导致其开发周期长;已开发成功的控制软件又由于每个控制项目的不同而使其重复使用率很低,导致它的价格非常昂贵;在修改控制软件的源程序时,倘若原来的编程人员因工作变动而离去时,则必须同其他人员或新手进行源程序的修改,因而更是相当困难。
通用组态软件的出现为解决上述实际问题,提供了一种崭新的方法,因为它能够很好地解决传统控制软件存在的种种问题,使用户能根据自己的控制对象和控制目的的任意组态,完成最终的自动化控制工程。
2驱动程序
驱动程序即添加到系统中的一小块代码,其中包含有关硬件设备的信息。
有了此信息,计算机就可以与设备进行通信。
驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。
操作系统不同,硬件的驱动程序也不同。
3基于组态软件的驱动开发
组态软件提供了很好的开发平台,使控制软件的开发变得简单,而且组态软件中也提供了一些常用设备的驱动程序,但是由于各种设备厂商没有统一的规范,支持的通讯协议各不相同,使得很多设备的驱动程序需要根据组态软件的不同单独开发。
下面以易控组态软件为例介绍下基于组态软件的驱动开发解决办法。
易控组态软件是一个较为成熟的平台,可用于工业控制,道路监控管理等。
该软件提供了便捷的图形化编程工具,可以很快的上手开发自己需要的控制软件界面及功能。
同时也提供了相对简单的驱动程序软件开发包。
该软件包使用MicrosoftVisualStudio2008为设备驱动程序默认开发IDE,这使得有一定编程基础的人员易于上手,开发的驱动稳定性也更高。
3.1驱动开发的概述
在开发驱动程序前,我们先来了解下设备驱动程序的作用。
设备驱动程序是上位机和设备沟通的桥梁,通过设备采集的数据经过转换后通过上位机的数据库接口存入数据库中,上位机发送的指令通过转化传达给设备执行。
这中间的过程都是由驱动程序来完成的。
根据通讯协议的不同,设备的驱动程序也有很大的区别,因此我们需要根据设备厂商提供的通讯协议和自己的功能需求开发适合自己的驱动程序。
易控组态软件提供了很多和硬件通讯的通道(如以太网、串口通道等),这使得开发驱动程序的过程简化了很多。
我们只需根据通讯协议的不同编写相应的驱动代码即可。
3.2基于易控组态软件的驱动开发过程
易控组态软件的驱动开发过程中,上位机与设备间通讯是以变量的方式实现的,即可以把设备的某一功能看做一个或者一组变量,用这些变量来实现这一功能。
开发平台为驱动开发预留了3个较为有用的接口,一个是设备数据采集接口,设备变量设置接口和读写打包接口。
下面根据这3个接口具体说明下驱动开发的过程和一些简单问题的解决办法。
在拿到设备厂商提供的通讯协议后,我们应当先分析哪些指令是我们需要的,哪些功能指令可以省略,这样可以有效地减少开发周期。
首先是设备变量采集接口。
设备数据采集过程,默认采集方式为变量包采集方式。
打包的必要性和方法在读写打包接口处详细介绍。
采集程序从boolReadPacket(SampleTagPacketpacket)方法进入,通过下图的过程将数据采集到上位机。
这里的通信参数,采集指令,数据校验,数据解析一般是通过设备厂商提供的,读写通道由组态软件提供。
我们通过对厂商提供的通讯协议的分析(包括包格式分析,指令结构,指令及回应信息长度)确定出请求指令,通过读写通道将指令发送给设备,再将设备返回的信息采集上来,通过校验和分析得到我们想要的有效数据。
一般上位机与设备通信都是采用发包等待回应的方式,判断返回的数据是否是我们需要的就要通过数据校验这一步,数据校验一般分为,数据包格式校验,长度校验,校验码校验,返回指令码校验,为确保数据的正确性一般要通过多个校验。
当获得了正确的回应数据后,我们要讲数据进行分解,设备一般返回的是一串2进制码,各个位上的2进制码表示的意义由通讯协议指出,我们需要将这串2进制码依据通信协议解析成有用的数据。
具体程序(附录1)。
接下来是设备变量设置接口,设置接口实际就是将需要的参数写入设备。
它与采集接口有很多相似的地方。
它们都需要获得通信参数,形成指令,通过读写通道发送给设备,从设备获得回应信息。
不同的是写入指令一般回应的数据都是设置成功与否,不需要做数据解析,而读指令回应的数据还包括需要解析的数据。
因此写指令的流程如下
程序从boolWriteTag(IoTagtag)方法进入:
具体程序(附录2)。
最后是数据打包接口。
为什么要将数据打包呢?
这要从上位机与设备的通信来分析。
要想获得设备的信息,或者是设定设备的某些参数,上位机就需要与设备间进行通信。
随着科技的发展,计算机的处理速度越来越快,但是一些硬件设备的处理回应能力远远低于计算机的处理能力,这样在通信过程中就需要计算机等待设备的响应,也就是我们所说的延时。
而这些延时是驱动程序耗时最多的一部分。
怎么减少这些延时是一个驱动程序提高效率的关键。
因此我们将需要的多个数据的采集指令打成一个包发给设备处理,回应的信息包含了多个我们需要的数据,我们再将这些数据分解成我们想要的,这就是打包。
这么做可以极大的提升驱动程序的效率,减少上位机与设备的通信次数。
具体程序(附录3)。
通过以上的3个接口,我们就能将大部分驱动开发完成。
整个驱动的开发过程并不复杂,我们要做的就是将设备厂商提供的通信协议翻译成适合组态软件平台的驱动程序。
4结语
驱动程序的开发与一般的应用程序开发有很大的不同。
应用程序主要是给用户使用的,而驱动程序则是与设备打交道的。
这就需要驱动程序有着更高更有效地处理能力。
另外,驱动程序的可用性相对较差,一个设备针对不同的系统,需要不同的驱动程序。
组态软件的出现,有效缓解了这个问题。
组态软件解决了与硬件的通信问题,我们只需根据组态软件预留的接口针对不同设备开发不同的驱动程序即可,而且这种驱动对用的不再是不同的系统,而是同一个组态软件,这就大大提高了程序的可用性。
用户只要使用同一组态软件驱动程序即可通用。
但这也有不足的地方,虽然现在的组态软件大多集成了很多常用的设备,但是很多设备的驱动还需要我们自己开发,而且各种组态软件为驱动程序预留的接口也不统一,这使得开发还具有一定的局限性,针对同一组态软件的通用性还不能替代真正的通用性。
但这涉及到个设备厂商的利益问题,很难出现统一的驱动标准。
所以基于不同组态软件的驱动开发还是现在相对比较统一的解决办法。
附录1:
///<summary>
///读一个变量包的数据
///</summary>
///<paramname=“packet”>读包</param>
///<returns>读包成功与否</returns>
publicoverrideboolReadPacket(SampleTagPacketpacket)
{
//根据包发送请求指令
intreceiveCount=SendAndReceive(packet.RegType);
if(receiveCount==0)
{
returnfalse;
}
//回填IOtag
returnParseIO(packet,receiveCount);
}
///<summary>
///发送请求指令接收应答数据到mReceiveBuffer
///共通函数基本不用修改
///</summary>
///<paramname=“RegType”></param>
///<returns></returns>
privateintSendAndReceive(stringRegType)
{
intsendCount=FillReadFrame(RegType);//拼请求字preturn0;
}
returnreceiveCount;
}
附录2:
///<summary>
///写变量
///</summary>
///<paramname=“tag”>要写的IO变量</param>
///<returns>写变量成功与否</returns>
publicoverrideboolWriteTag(IoTagtag)
{
intsendCount=FillWriteFrame(tag);//形成写指令
if(sendCount<=0)
{
returntrue;
}
constinttoReceiveCount=3;
intreceiveCount=WriteAndRead(sendCount,toReceiveCount);//读写通道
if(!
ValidateSetReceivedData(receiveCount,toReceiveCount))//数据校验
{
returnfalse;
}
returntrue;
}
附录3:
///<summary>
///能否把当前变量添加到包中
///</summary>
///<paramname=“packet”>要读取的包</param>
///<paramname=“tag”>IoTag</param>
///<returns>能否添加</returns>
protectedoverrideboolCanAddToPacket(SampleTagPacketpacket,IoTagtag)
{
//记录周期数据
if(tag.RegType.ToString().Substring(0,3)==“Cur”&&packet.RegType.Substring(0,3)==“Cur”)
{
returntrue;
}
//同种寄存器
if(packet.RegType==tag.RegType)
{
returntrue;
}
returnfalse;
}