kaiyun官方注册
您所在的位置: 首页> 其他> 业界动态> VB环境下对双端口RAM物理读写的实现

VB环境下对双端口RAM物理读写的实现

2009-03-20
作者:孙成秀 陶振权 张宪震

摘 要:介绍应用双端口RAM芯片设计的智能型高速并行通讯卡。针对VB语言环境下,用DLL函数链接方式,对采用内存直接映象技术的双端口RAM进行读写,实现主、分机之间数据高速并行传输。本技术已经成功应用在汽车综合检测系统中,对在其它集散型控制系统中进行高速数据传输同样有益。

关键词:双端口RAM 内存直接映象 高速并行传输 DLL动态链接

  在集散型控制系统中,一般将计算机或工控机用于终端图文显示,数据采集处理以及人机对话接口等方面。计算机或工控机与外部设备需要建立数据传输的通讯联系。但大量数据传输,靠通常的串行通讯方式进行,必然占用CPU大量的时间进行通讯。一些控制系统往往因为传输速率慢而无法实现实时控制,不能满足系统采集和控制需要。上述问题在我们设计的汽车综合检测系统中,得到了较好的解决。系统中采用双端口RAM技术设计了一块PC总线接口的智能型高速并行通讯卡(以下简称通讯卡),实现外部数据同计算机高速并行通讯。由卡上的MCU负责分机的数据采样,将需要传输的数据按系统协议在双端口RAM内任意存取,读写速度快、可靠性高、接口简单,满足了系统设计需要。并且实现了在VB语言环境下对采用内存直接映象技术的双端口RAM的读写操作,将多主CPU采用的总线仲裁方式简化为仅仅对内存操作,在应用计算机总线扩展技术方面具有借鉴意义。

1 系统描述

  在汽车综合检测系统中,需要对汽车的底盘、发动机以及综合电路等方面的信号进行采样和判断,其中包含大量的运算处理和汽车标准资料的对比、分析、判断等环节。整个系统信号采样点多,信号的形式各不相同,系统采用MCU控制方式的分机对各测量点进行数据采集和模拟控制。由于MCU没有高效的运算功能,没有大量的指令和数据存贮空间,更不能直观显示各种汽车标准数据和测量结果,若进行大量的运算、判断、显示,其硬件、软件处理是一个比较棘手的问题。因此本系统采用MCU负责采集各种信号,统一由计算机负责相应的运算处理、分析、判断,并管理汽车标准数据库、人机对话接口、显示测量结果和标准图形等等,用一块管理分机的通讯卡实现分机与主机之间数据传输。

  通讯卡包含了数字滤波、数据收集、传输等功能,对系统内的并、串行通讯实现分时操作。卡上由一片MCU负责管理各个分机,通过串行通讯方式将分机采集的各种数据,收集到通讯卡内,经过判断、筛选,将有效数据存贮到双端口RAM的规定区域内;计算机从双端口RAM内将数据读入,进行运算处理,与标准数据进行比较判断,将结果或控制命令写入双端口RAM内,实现整个系统统一协调运行。本文主要针对通讯卡的软、硬件设计和在VB环境下的软件实现,作重点的分析。

2 硬件设计

  通讯卡的基本硬件设计简图如图1所示。

  利用计算机总线做扩展卡的技术已经广为应用,但很多都是利用计算机提供固定的I/O端口地址进行读写操作,“瓶颈效应”十分明显。在对实时性要求很高、数据传输量很大的场合,数据阻塞明显,无法满足系统的大量数据高速传输的需要。本系统利用计算机内存直接映象技术,对内存物理地址直接操作,实时性和速度明显改善,完全满足本系统的速度要求。

2.1 MCU和双端口RAM的选择

  此卡是实现计算机与数据采集的分机之间大量、快速的数据交换的中间环节。采用的MCU要求具有较强的运行速度和数据管理能力,既有双端口RAM的接口总线,又具备同分机双工串行通讯能力,同时考虑到系统硬件加密的必要,选择此MCU是系统的关键。美国ATMEL公司出品的89C51是本系统的首选。另一方面根据本系统的需要,数据传输的信息量在一个令牌下,2KB的吞吐量已经满足,因此我们采用美国IDT公司出品的双端口RAM IDT7132,容量为2K×8bits。IDT7132带有两套独立控制总线,可从两侧任意读写存储器中的所有单元,片内硬件端口仲裁电路适合当两侧同时访问同一单元时不允许处于等待状态的89C51的操作,允许不经过外部仲裁,能经受冲突的系统进行双机同步读写存储器中的同一单元,确保了数据的准确性,简化了通讯卡的硬件电路设计,同时为软件设计免除了使用信号灯进行判断操作的繁琐过程。

2.2 双端口RAM的地址范围的选择

  计算机内部高端地址中有一段保留给I/O适配卡的128KB地址空间,这段地址空间为0C0000H~0DFFFFH。利用这128KB中的一段2KB空间即可满足IDT7132的使用,按PC总线的协议经过地址译码和其它控制总线选通,实现内存直接映象方式。地址范围为:0D0000H~0D07FFH之间。另一侧,MCU与IDT7132的接法只将IDT7132其中一侧总线接入MCU的总线上,其接法同普通RAM没有区别,设置地址范围在8000H~87FFH之间。

  按工业控制标准实行全地址线译码方式,确保全地址空间的每一个存储单元的地址在总线上唯一。

2.3 对双端口RAM访问的特殊情况处理

  IDT7132两侧的BUSY线分别接到MCU的INT0中断上和PC总线的A10脚(IO-CH-RDY)上,作为MCU和计算机同时读写IDT7132的同一个地址单元时的“忙闲”状态线。当两侧访问不同的地址单元时,BUSY线无效,两侧操作互不影响。当两侧“几乎同时”访问同一个单元时,按IDT7132的总线仲裁逻辑,对两侧的片选信号和地址信号之一到达时间间隔只要大于5ns,就能对先到达的一侧提供读写通道,保证数据读写的真实性。同时将另一侧的BUSY线置低,为MCU或计算机提供中断或等待信号。众所周知,89C51不具备插入等待周期延时操作的能力。当MCU一侧先行操作时,计算机一侧的BUSY线有效,PC总线上的IO-CH-RDY状态线被拉低,命令计算机CPU插入等待周期,延时等待MCU一侧完成读写操作后,再进行读写操作。当计算机一侧占据IDT7132的一个地址单元时,MCU一侧再操作该单元,MCU 读写的数据无效。我们采用了判断标志位的方式解决此问题。当对应的BUSY线变低INT0中断有效时,MCU完成该条读写指令后立即进入中断,置标志位,中断返回后,即执行查询标志位的指令,判断此次操作是否有效。未成功,重复操作,直致读写成功。

3 软件设计

  整个系统的全部软件共三部分,每一部分的设计侧重点不同。计算机方面软件实现的功能包括:用户人机对话接口、汽车技术资料库的管理和扩充、底层全部数据传输、运算处理、零点校正设定、实时监控操作、各分机的模拟信号线性化处理、大量图片资料的处理与调用等等。通讯卡的软件设计包括:对各个分机的管理、数据收集分类整理、筛选判断、与计算机进行有效数据传输等等。分机的软件包括数据采集和模拟控制等部分。要求数据采集准确、一致。实际应用中采用数据滤波、指令冗余、自诊断以及现场断点返回等抗干扰技术。

  全部软件涉及的编程语言共三种。分机和通讯卡的软件设计采用汇编语言,计算机方面采用Visual Basic 6.0、Visual C++ 6.0两种语言,把Visual Basic 6.0作为系统设计的主要语言。分机方面的软件这里不作介绍,本文主要针对在通讯卡上以及在Visual Basic 6.0环境下对双端口RAM的操作软件设计作详细介绍。

Visual Basic 6.0不具备对计算机底层地址操作的功能,不如Visual C++ 6.0、Delphi等。特别在本系统中采用的高速并行通信方式,对内存物理地址读写操作的频率很高,按常规应改用其它语言。但系统其它方面的工作,不是其它语言所能替代的,所以必须将VB语言环境下不能对底层地址读写操作的问题加以解决。经过实验,通过如下方法实现。

  笔者采用的方法是调用动态链接库DLL。用Visual C++ 6.0编写对内存物理地址进行读写操作的DLL动态链接库函数,进行数据采集和发送;用Visual Basic 6.0调用DLL实现数据通信,从而弥补VB对底层数据操作的缺陷,使VB环境下开发数据通信系统软件更为方便。

  (1)首先使用Visual C++ 6.0创建一个MFC Appwizard dll项目,这样就可以在DLL中编写程序。因为我们要对直接映象在高端内存范围内的地址进行操作,所以在编写程序时,要使用如下方法:

—asm{ mov A B

mov ......

..........

mov i A}

  return i;

—asm{ }是嵌入式汇编函数,在Visual C++ 6.0中只有使用此方法才可以访问高端内存地址。还要在DLL中编写两个函数:

一个从内存地址读数函数

  一个对内存地址写数函数。

  这样才能完成对高端内存地址读写的操作,实现底层的数据传输。

  (2) 使用Visual Basic 6.0调用DLL动态链接库函数。

  第一步:运行VB6.0时,新建一个工程项目,在项目中添加模块,在模块中声明两个API函数:

  Declare Function write% lib“C:***.dll”

(ByVal localport%, ByVal value%)

  Declare Function read% lib “C:***.dll”

(ByVal localport%)

  其中:write( )函数是向高端内存地址写数据

read( )函数是从高端内存地址读数据

  第二步:在窗体中放入三个文本框(Text1,Text2,Text3),一个命令按扭(Command1),就可以在代码窗口中编写代码:

Option Explicit

  Dim Port1 ‘内存地址 如: 0D0000H

  Dim Port2 ‘16进制数 如:12H

  Private Sub Command1__click()

Dim Gg As Integer ‘声明一个返回整数

Dim Salp As Integer ‘声明一个返回整数

Port1=Val(Text1.Text) ‘把Text1赋给port1

Port2=Val(Text2.Text)  ‘把Text2赋给port2

Gg=write(port1,port2) ‘往Port1地址中写port2

Salp=read(port1) ‘从Port1地址中读数

Text3.Text=Salp ‘在Text3中显示

salp

End Sub

  两个函数的调用过程如上所述,可根据编程的意图放在任何位置。特别注意,函数地址不能与其它硬件的地址或系统内存地址冲突,否则会造成计算机死机。

  本文采用双端口RAM器件设计的智能型高速并行通讯卡,在监控软件、硬件,以及在VB环境下对直接映象方式的高端内存进行读写操作的实现,具有通用性。尤其在自动控制领域设计A/D、D/A转换、实现闭环控制,以及设计虚拟仪器、视频信号数字化处理、语音处理、各种系统动态仿真等需要高速数据传输的场合,都具有借鉴意义。总之,智能化板卡在PC总线工业控制的应用,是今后发展的主流。

参考文献

1 邓 力.同步多通道数据输出和输入智能接口电路.电子技术应用,1999;25(6)

2 尤一鸣.单片机总线扩展技术.北京:北京航空航天大学出版社,1993

3 刘京祖.实用接口技术.北京:北京工业大学出版社,1999

4 凌澄主编.PC总线工业控制系统精粹.北京:清华大学出版社(美)Peter Norton,Haroid,Phyllis Davis.Visual Basic

编程指导.北京:清华大学出版社,1998
本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map