您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Windows下PCI-5565反射内存网程序设计
Windows下PCI-5565反射内存网程序设计摘要:针对反射内存网,讨论了在Windows系统下,利用PCI-5565PIORC反射内存卡组成反射内存网的组网方式和数据通信的程序设计方法,并用VC2005编写了程序实例,实现了查询和中断两种方式的网络通信。关键词:反射内存卡;反射内存网;环型结构;星型结构;中断;查询1引言反射内存网(RMN,ReflectiveMemoryNetwork)是一种高速的实时网络,它允许使用不同总线结构和不同操作系统的计算机以确定的速率分享实时的数据。反射内存网不仅具有严格的传输确定性和可预测性,而且具有高速、主机负载轻、软硬件兼容性强、易于使用、可靠的传输纠错能力、支持中断信号传输等特点。反射内存网主要是由反射内存卡通过光纤等传输介质连接而成。反射内存网上的每台计算机插入一个反射内存卡形成各个节点,每个节点的反射内存卡上的存储器中都有反射内存网上其它节点的共享数据拷贝。每个反射内存卡都占有一段内存地址,反射内存网上的任何计算机向本地反射内存卡写数据时,该数据被传播到网上所有其它反射内存卡并存储在相同的位置。因此在计算机将数据写入本地反射内存卡后的极短时间内,反射内存网上的所有计算机都可以访问这个新数据。反射内存卡使用简单的读写方式,软件上只需要几行代码就可以完成对反射内存卡的读写操作,反射内存网上的数据传输是纯硬件操作,不需要考虑网络的通信协议。因此它与以太网等其它传统网络相比具有更低的数据传输延迟、更快的数据传输速率、更简单灵活的操作使用,可以满足实时系统快速反应周期的要求。在下文中将结合一个具体的反射内存网讨论在Windows系统下反射内存网程序设计方法。硬件环境为:一个八口VMIACC-5595光纤Hub、若干PCI-5565PIORC反射内存卡、若干光纤连接线、若干计算机。软件环境为:PCI-5565PIORC驱动程序、VS2005SP1、WindowsXPSP3。2反射内存网络结构反射内存网的物理拓扑结构主要有两种:环型结构和星型结构。环型结构组网简单,这里以三个节点为例说明其组网方法。三个节点需要3个PCI-5565反射内存卡和3根单股光纤。首先将这3个PCI-5565反射内存卡进行统一编号,分别为0、1、2,并将其插入到计算机中,形成节点0、节点1、节点2。然后将节点0反射内存卡的TX端与节点1反射内存卡的RX端连接,节点1反射内存卡的TX端与节点2反射内存卡的RX端连接,节点2反射内存卡的TX端与节点0反射内存卡的RX端连接,如图1所示。当某个节点有数据写入本地反射内存卡时,高速逻辑同步将其传输至环型网络的下一个节点,每个后续节点将这个新数据写入本地反射内存卡,然后将其发送至环网的下一个节点。当信息回到初始节点时便会被从网络中移除。根据特定硬件和节点数目,网络上的所有计算机在几个微妙之内便会在同一地址拥有相同数据。图1环型拓扑结构的反射内存网星型结构是由一个光纤Hub和若干反射内存卡组成。安装了反射内存卡的计算机通过光纤连接到Hub上,仍以三个节点为例说明其组网方法,如图2所示。Hub提供了一个共享内存空间,每个节点在本地反射内存卡上都有一个该共享内存空间的映射。当任意一个节点在本地反射内存卡的内存空间中操作时,Hub上的共享内存空间的数据就会被更新,同时其它节点上的共享内存映射空间的对应数据也会被立即更新。图2星型拓扑结构的反射内存网环型结构的优点是不需要光纤Hub、光纤使用量少、节省经费;缺点是每个节点有延时,网络中某一个节点设备故障或掉电将影响整个网络的正常工作。星型结构的优点是需要一个专门的光纤Hub、消除了单点失效、实现了故障隔离,与环型结构相比具有更小的延时;缺点是网络中的Hub一旦发生故障,整个网络将会瘫痪,另外光纤使用量多,所需经费较多。3PCI-5565PIORC反射内存卡PCI-5565PIORC是PCI总线接口的反射内存卡,属于GE公司的反射内存光纤网络产品家族成员,其外形结构如图3所示,技术指标如下:(1)传输速率:43MByte/s到170MByte/s;(2)传输距离:多模光纤300m,单模光纤10km;(3)存储容量:128/256MBSDRAM;(4)可扩展性:单个Hub支持8个节点,通过级联Hub最多支持256个节点。每个PCI-5565反射内存卡通过卡上跳线S2设置其在网络上的唯一ID号。跳线S2是一排8个小开关,8个小开关全部关闭(OFF)时,对应的反射内存卡ID为0,仅第1个打开(ON)时,对应的反射内存卡ID为1,仅第二个打开时,对应的反射内存卡ID为2,依此类推,按照二进制编码方式排列,依次为1,2,4,8,16,32,64,128。图3PCI-5565PIORC反射内存卡下面列出PCI-5565反射内存卡开发库中常用的RFM2gAPI函数。(1)RFM2gOpen()语法:STDRFM2GCALLRFM2gOpen(char*DevicePath,RFM2GHANDLE*rh);功能:打开设备参数:DevicePathRFM2g设备名,如\\\\.\\rfm2g1rh指向RFM2g设备句柄的指针(2)RFM2gClose()语法:STDRFM2GCALLRFM2gClose(RFM2GHANDLE*rh);功能:关闭设备参数:rh指向RFM2g设备句柄的指针(3)RFM2gRead()语法:STDRFM2GCALLRFM2gRead(RFM2GHANDLErh,RFM2G_UINT32Offset,void*Buffer,RFM2G_UINT32Length);功能:直接读取反射内存卡板载内存中的数据参数:rhRFM2g设备句柄Offset指定要读取的板载内存起始地址64MB卡的有效值范围为(0x0,0x3FFFFFF)128MB卡的有效值范围为(0x0,0x7FFFFFF)256MB卡的有效值范围为(0x0,0xFFFFFFF)Buffer读取缓冲区,用来保存从反射内存读取的数据Length指定要读取数据的长度,按字节计算(4)RFM2gWrite()语法:STDRFM2GCALLRFM2gWrite(RFM2GHANDLErh,RFM2G_UINT32Offset,void*Buffer,RFM2G_UINT32Length);功能:直接将数据写入反射内存卡的板载内存参数:rhRFM2g设备句柄Offset指定要写入的板载内存起始地址64MB卡的有效值范围为(0x0,0x3FFFFFF)128MB卡的有效值范围为(0x0,0x7FFFFFF)256MB卡的有效值范围为(0x0,0xFFFFFFF)Buffer写入缓冲区,用来存储要写入反射内存的数据Length指定要写入数据的长度,按字节计算(5)RFM2gEnableEvent()语法:STDRFM2GCALLRFM2gEnableEvent(RFM2GHANDLErh,RFM2GEVENTTYPEEventType);功能:使网络中断可用,默认情况下,反射内存网的中断是不可用的参数:rhRFM2g设备句柄EventType指定哪个网络中断可用(6)RFM2gSendEvent()语法:RFM2G_STATUSRFM2gSendEvent(RFM2GHANDLErh,RFM2G_NODEToNode,RFM2GEVENTTYPEEventType,RFM2G_UINT32ExtendedData);功能:发送网络中断参数:rhRFM2g设备句柄ToNode接收网络中断的节点ID,节点不能给自己发送中断EventType指定要发送哪个网络中断ExtendedData用户定义的数据(7)RFM2gClearEvent()语法:STDRFM2GCALLRFM2gClearEvent(RFM2GHANDLErh,RFM2GEVENTTYPEEventType);功能:清除网络中断参数:rhRFM2g设备句柄EventType指定要清除哪个网络中断(8)RFM2gGetEventCount()语法:STDRFM2GCALLRFM2gGetEventCount(RFM2GHANDLErh,RFM2GEVENTTYPEEventType),RFM2G_UINT32*Count);功能:获取指定网络中断的中断计数参数:rhRFM2g设备句柄EventType指定要获取哪个网络中断的中断计数Count用来保存中断计数的变量指针(9)RFM2gClearEventCount()语法:STDRFM2GCALLRFM2gClearEventCount(RFM2GHANDLErh,RFM2GEVENTTYPEEventType);功能:清除指定网络中断的中断计数参数:rhRFM2g设备句柄EventType指定要清除哪个网络中断的中断计数下面是反射内存网的通信流程,图4是中断方式的通信流程,图5是查询方式的通信流程。图4中断方式通信流程图5查询方式通信流程4代码实现下面通过编写一个基于MFC对话框的程序讨论反射内存网程序设计的基本方法,并给出相关的实现代码。(1)创建项目,启动VS2005,新建一个基于MFC对话框程序的项目,项目名称设为“rfm”,不勾选“使用Unicode库”,其它设置默认,单击“完成”按钮完成项目创建。(2)设置项目的属性,在“附加包含目录”中添加反射内存卡开发库的头文件路径:C:\ProgramFiles\GEFanucIntelligentPlatforms\RFM2g\Inc,在“附加库目录”中添加反射内存卡开发库的库文件路径:C:\ProgramFiles\GEFanucIntelligentPlatforms\RFM2g\Lib。这里的路径会因驱动安装位置的不同而有所不同。(3)添加头文件,在实现文件rfmDlg.cpp中加入反射内存卡开发库的头文件:#includerfm2g_windows.h//屏蔽在VS2005中编译时的警告及冲突#includerfm2g_api.h//rfm2gAPI(4)添加全局变量,在实现文件rfmDlg.cpp中加入反射内存卡变量定义:#defineRFM_OFFSET0x1000//读写数据起始位置(4k)#defineDEVICE_PREFIX\\\\.\\rfm2g//windows系统PCI设备名前缀#pragmacomment(lib,rfm2gdll_stdc)//导入库chardevice[50];//完整的设备名,由前缀和设备编号组成RFM2G_STATUSresult;//RFM2gAPI调用的返回值,成功为RFM2G_SUCCESSRFM2GHANDLErh;//RFM2g设备句柄,由RFM2gOpen返回(5)添加中断服务程序,在实现文件rfmDlg.cpp中加入反射内存中断服务程序://反射内存中断服务程序(事件回调函数)voidMyISR1(RFM2GHANDLErh,RFM2GEVENTINFO*pINFO);voidMyISR2(RFM2GHANDLErh,RFM2GEVENTINFO*pINFO);voidMyISR3(RFM2GHANDLErh,RFM2GEVENTINFO*pINFO);//中断1服务程序voidMyISR1(RFM2GHANDLErh,RFM2GEVENTINFO*pINFO){charbuf[301];//读数据result=RFM2gRead(rh,RFM_OFFSET,(void*)buf,300);strcat(buf,-中断1);dlg-m_EditReadint.SetWindowText(buf);}//中断2服务程序voidMyISR2(RFM2GHANDLErh,RFM2GEVENTINFO*pINFO){charbuf[301];//读数据result=RFM2gRead(rh,RFM_OFFSET,(void*)buf,300);strcat(buf,-中断2);dlg-m_EditReadint.SetWindowText(buf);
本文标题:Windows下PCI-5565反射内存网程序设计
链接地址:https://www.777doc.com/doc-5684967 .html