http://www.51c51.net/article/2008/0719/article_5226.html
摘要:WINCE是一个高效率的实时操作系统,拥有多线程、多任务、确定的实时性和完全抢占式优先级的环境。本文以WINDOWS CE为基础,提出了基于嵌入式系统的CAN的核心原理和概念, 完成并优化符合工业现场标准的CAN系统设计和实现,并在基于WINDOWS CE的工控机上应用。
关键字:WINDOWS CE,嵌入式系统,CAN, MCGS
1 引言
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。例如,当使用Philips P82C250作为CAN收发器时,同一网络中允许挂接110个节点。CAN 可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检查特性也增强了CAN的抗电磁干扰能力。
CAN具有十分优越的特点,使人们乐于选择。这些特性包括:
(1)低成本,极高的总线利用率。
(2)很远的数据传输距离(长达10Km),高速的数据传输速率(高达1Mbit/s)。
(3)可靠的错误处理和检错机制;发送的信息遭到破坏后,可自动重发。
(4)节点在错误严重的情况下具有自动退出总线的功能。
因此,实现符合工业标准的嵌入式CAN总线驱动具有非常重大的现实意义和研究价值。
2 CAN总线协议
CAN总线协议栈,按下图分层为:
1、CAN卡内已经实现了CAN协议层。对于具体的某个智能模块设备,虽然通讯协议层都采用CAN协议层,但应用层还不一致,所以还需要对具体的设备进行特定的驱动开发。
2、CAN协议层并不能保证数据可靠的传输,所以对具体的设备进行驱动开发时要注意对协议数据进行检查。
3、MCGS应用CAN总线,对应也分为3层,对应关系如上图所示。子设备协议完成应用层协议,父设备完成CAN协议层。
4、从上图可以看出,父设备完成CAN协议层,封装了CAN控制器(MCP2515、SJA1000),并提供上层子设备协议层接口。
3 应用模式
第一种,主从模式:
在此模式中,只有1个主机(TPC)会轮询采集数据,或发送设备命令;其它设备(CAN设备)不会主动发送数据,只是被动响应。此模式应用比较多,但对子设备有要求:子设备(CAN设备)不会主动发送数据。
第二种,分布模式:上面的主从模式对子设备造成了限制,网络如果更复杂限制就会更多。本来CAN总线网就是分布实时控制网络,所以就应该设计成分布模式。该方式对子设备没有要求,但对子设备(CAN设备)开发驱动有所要求,要求子设备按自己的协议做,不能假设任何情况。这要求开发驱动的人员深入了解CAN总线协议的数据帧和远程帧。
4 接口设计
4.1软硬件环境
CAN驱动的开发依托于北京昆仑通态公司现有的软硬件平台进行项目设计,具体平台环境描述如下:
① 硬件软件平台:北京昆仑通态公司的nTouch HMI TB33H和TD33H;嵌入式组态软件:Mcgsce.exe。
② CAN控制器:SJA1000。 SJA1000是PHILIPS公司早期CAN控制器PCA82C200的替代品,功能更强。
③ 实时操作系统:WINCE。WINCE是一个高效率的实时操作系统,拥有多线程、多任务、确定的实时性和完全抢占式优先级的环境,专门面向只有有限的资源的硬件系统。
4.2 接口设计
下面列举了主要的用户接口和外部接口,外部接口提供给父设备调用,完成CAN控制功能:
(1)SvrGetCanID( )得到当前设置的Can ID,成功返回0,失败返回-1。
(2)SvrClearCanInBuff( )读Can卡数据并清空Can卡输入缓冲区,成功返回0,失败返回-1。
(3)SvrWriteAndRead( )写并且读Can卡操作,发送一个消息包,然后接收指定长度数据。成功返回接收到的字节数,失败返回-1。
(4)SvrRegisterID( ),注册用户ID。只有注册了ID的用户,父设备才会收到接收缓冲中。在子设备开发时,必须先注册,才能做接收数据的操作。
(5)SvrUnregisterID( )注销用户ID。
用户只需要学会使用上面的五个接口,就可以开发驱动了。
SvrGetCanID接口可以得到父设备的地址ID。象串口操作一样,发送前需要清空Can卡缓冲区,需要调用SvrClearCanInBuff接 口。发送子设备数据需要调用SvrWriteAndRead接口。先把目的子站ID放入dwID变量中,要发送的数据放入缓冲区buf中,通过dwLen 设置需要读数据长度,通过dwDelayTime设置延时时间(单位为毫秒)。
第一步:组态初始化设置,在MCGS_DLL_FUNC 的SvrGetDevInfo( )函数中,定义Can卡子设备驱动:devType = DEV_CHILD定义为子设备;devStyle = DEV_CAN定义为父设备。
第二步:得到接口的指针。
第三步:清空Can卡缓冲区:调用SvrClearCanInBuff( )。
第四步:发送子设备数据(发子设备数据可能需要父设备地址:调用SvrGetCanID),并得到它的返回:调用SvrWriteAndRead( )。
第五步:解析上面的返回数据,按照子设备协议继续进行处理。
4.3 工作方式
驱动程序由三部分组成:在Windows内核中工作的windows设备驱动程序、MCGS中的CAN父设备、MCGS中的CAN子设备。
windows设备驱动程序:由于使用多主通讯,通讯的发生时间是不可预知的,而且sja1000的通讯缓冲区有限(64字节),因此最好在中断中处理通 讯事务。建议将大部分工作在windows设备驱动程序中完成。可以建立一块内存如:unsigned char can_data[60][2][64][4]。将所有收到的I/O模块的寄存器数据解包后保存到该内存中,数组下标依次是模块地址(实际应减4)、过程 或参数、寄存器编号、寄存器数据字节序号。MCGS可以通过windows设备驱动程序直接用读文件操作函数读出寄存器值,用写文件操作函数将可写的参数寄存器值写入windows设备驱动程序,windows设备驱动程序将其打包为命令数据帧发出。windows设备驱动程序还要完成对设备状态的监视, 可使用一个60个元素的char数组来标识I/O设备(最大60个设备)的状态,值0为正常,其它为异常。当6秒内未收到模块的节拍帧时,应将模块对应的 状态置成1。MCGS应能通过windows设备驱动程序读出设备状态。
MCGS中的CAN父设备:建议在MCGS中的CAN父设备中做改变通讯速率的工作。父设备通过windows设备驱动程序的ioctl函数来改变通讯速率。
MCGS中的CAN子设备:建议为了简化组态工作,为每一种不同类型的I/O模块定制不同的CAN子设备。Can子设备包含了模块名称、生产厂家、版本等信息,其中最重要的是模块的过程和参数寄存器的数量和数据类型。
5 运行设计
5.1 运行控制
1、 整个父设备连同子设备在同一个线程下工作。注意不要阻塞了线程。
2、 通过MCGS_DATA& data可以得到接口指针,方法如下(MCGS_DATA是MCGS组态软件中封装了重要的用户数据的结构体):
MCGS_DATA* pData;
pData = (MCGS_DATA*)data.m_pParentData;
if (pData)
{
g_pDevCanProxy = (CDevCanProxy*)pData->m_pParentData;
if (g_pDevCanProxy)
{ //下面就可以对Can卡进行读写操作了
g_pDevCanProxy->SvrWriteAndRead(dwAimCanId, SendBuf);
}
}
5.2 运行时间
由于父设备连同子设备在同一个线程下工作,根据WINCE的消息响应机制,每个子设备论询采集消息,CPU执行消息队列如下所示:
在运行环境中,WINCE的消息响应的最小时隙为2毫秒,每个子设备的采集又有一个采集周期,设备命令是没有时间周期概念的,按照Windows消息队列来处理。
第一种,如果按照主从模式来开发子设备就先假设了子设备(CAN设备)不会主动发送数据,并且不会收到上个设备的干扰数据,在一般情况中这是不可能的。但 可以这样处理,在向设备发送数据时,先等待一个周期,保证没有上个设备的干扰数据,再把它清空,最后才进行正常的设备采集工作。
第二种,如果按照分布式实时控制模式进行开发,主要流程包括按照协议组合数据包,发送帧信息,接收帧信息和解析数据包。
5.3 系统出错处理设计
设计原则:能从硬件上屏蔽数据的尽量从硬件上屏蔽(初始化设置控制器,验收寄存器和屏蔽寄存器),再从软件上屏蔽数据。如果不能达到设备地址解析一致性,就认为设计上是有缺陷的。当驱动不能通讯时,重启运行环境或进行复位操作就可以了。
6 结论
在本文中,首先介绍了CAN的基本原理以及在工业中的应用。然后以CAN在嵌入式系统的使用为例,提出了解决了CAN在实际中的系统设计,优化方案以及代码实现,并给出了在基于WINDOWS CE下的工控机上的具体实现。
在北京中联克龙科技发展有限公司,天地科技股份有限公司常州自动化分公司等公司,该系统解决方案都达到了令人满意的效果,满足了用户远程高速通讯的要求,能长期稳定的运行。这些项目的经济效益到达了五百万元。
本文作者创新点:提出了CAN在实际中的系统设计,优化方案以及代码实现,设计并实现了基于WINCE的满足工业现场要求的CAN驱动。
参 考 文 献
[1]WINDOWS CE 内核定制及应用开发 作者:周毓林。
[2]吴振纲,陈虎.PLC的人机接口与编程[J].微计算机信息,2005,8-1:21-23。
[3]WINDOWS CE 权威指南 作者:(美)Chris Muench。
[4]Windows VxD与设备驱动程序权威指南(第二版) 作者:孙喜明译。