HostLink&Fins驱动使用详解

HostLink&Fins驱动使用详解
HostLink&Fins驱动使用详解

PLC

欧姆龙_HostLink&Fins驱动

使用详解

北京昆仑通态

2009-8-18

目录

1 欧姆龙PLC通讯方式说明 (1)

1.1 驱动设备简介 (3)

1.2 PLC的接线 (3)

1.3 通讯参数的设置 (3)

1.4 驱动对各系列PLC的支持 (6)

1.5 FINS驱动简要介绍及与Host Link驱动对比 (6)

2 驱动的基本使用 (6)

2.1 欧姆龙驱动通讯协议和通讯方式 (6)

2.2 欧姆龙驱动通讯连接方式 (6)

2.3 欧姆龙构件驱动的添加 (6)

2.4 欧姆龙构件采集通道 (6)

2.5 欧姆龙构件内部属性设置 (8)

2.6 欧姆龙驱动设备命令 (11)

3 驱动通讯的典型应用方案 (15)

4 常见问题及解决方案 (16)

4.1 根据通讯状态返回值判断的问题 (16)

4.2 通讯连接不上问题 (17)

4.3 新旧型号PLC寄存器说明 (17)

4.4 欧姆龙PLC数据读取速度慢问题 (17)

前言

欧姆龙C、CV、CS/CJ、CP系列部分型号的PLC是日本欧姆龙株式会社出品的具有较高的性能/价格比产品。

北京昆仑通态的嵌入式McgsTpc触摸屏支持与欧姆龙C、CV、CS/CJ、CP系列PLC通讯。而本文档的编写目的,是为了使用户更好了解McgsTpc触摸屏与C、CV、CS/CJ、CP 系列的通讯及相关设置,以及典型的通讯应用方案,并解决用户在与C、CV、CS/CJ、CP系列通讯过程中出现的问题。

现对各章节内容简要概况说明如下:

第一章介绍欧姆龙PLC介绍,及欧姆龙PLC的硬件通讯接线及对应参数设置。

第二章讲解欧姆龙HostLink驱动构件的基本使用,包括驱动的添加,通道的设置及设备命令的介绍。

第三章讲解MCGS嵌入版欧姆龙HostLink驱动构件的基本使用,包括构件的添加,基本属性参数设置、内部属性及通道的添加,以及与编程软件寄存器类型的对应关系、设备命令的使用。

第四章列举McgsTpc触摸屏+欧姆龙PLC的典型应用方案,以及其中的注意事项。

第五章讲解MCGS与欧姆龙PLC通讯时,常见问题的解决方法。

第六章列举MCGS现有驱动历史版本及相关问题的处理方法。

1欧姆龙PLC通讯方式说明

1.1驱动设备简介

本驱动构件用于MCGS软件通过HostLink串口读写欧姆龙PLC设备的各种寄存器的数据。

本驱动构件支持欧姆龙C、CV、CS/CJ、CP系列部分型号的PLC。具体见第3节 驱动类型串口子设备,须挂接在“通用串口父设备”下才能工作

通讯协议采用欧姆龙HostLink(C-Mode)协议

通讯方式一主一从、一主多从方式。驱动构件为主,设备为从。

1.2PLC的接线

通讯连接方式:

<1>采用欧姆龙串口编程电缆与PLC的HostLink串口或RS232扩展串口通讯。通讯电缆

接线请参见 图1

<2>采用RS422方式与PLC的RS422扩展通讯板通讯, 通讯电缆接线请参见相应硬件连

接手册。

HostLink串口或RS232扩展口接线图:

图1

注:

1.通讯扩展板及部分型号的PLC引脚定义与此有所不同,具体请查看相应手册确认接线

方式,并参照其说明进行接线。

2.如果是自制电缆请注意,PLC RS232端并非标准RS232,4和5是短接的。

1.3通讯参数的设置

“通用串口父设备”通讯参数设置如下:

设置项参数项

通讯波特率4800 、9600(默认值) 、19200、38400、57600、115200

数据位位数7(默认值) 、8

停止位位数1、2(默认值)

奇偶校验位无校验、奇校验、偶校验(默认值)

父设备通讯参数设置应与设备的通讯参数相同,默认为:9600, 7, 2, E(偶校验),不同型号PLC有所不同,用户可根据需要进行设置,建议在通讯速度要求较高时设置为38400,7,2,E或PLC所支持的更高波特率进行通讯。

注意:父设备的参数必须和PLC的参数设置一直才能通讯成功,不同的PLC参数不同。如果用户不清楚该如何设备参数,可以启用PLC的自动在线功能查询该设备参数。具体操作如下:

以CP1H-X40DR-A为例,针对主串口(PORT1):PLC断电后,打开PLC的DIP 开关设置,选择开关4【PORT1】(9针串口)置为ON(如果您使用的是20针扩展串口请选择开关5【PORT2】),把开关拨到ON的位置,然后上电,打开欧姆龙的编程软件CX-Programmer,打开菜单项的PLC,选择自动在线,选择串口连接并且选择您的PC串口,如图2:

图2

单击连接后出现如图4的询问,选择“是”,等进入运行模式,查看工程里的设置选项如图3

PLC设备地址0--31 PLC9针串口

模式选择HostLink

固定

波特率19200

数据位8位,停止

位1位,校验方式

是E(偶校验)

图5

根据此设置参数设置驱动父设备参数即可。(校验方式说明:E 表示偶校验,0表示无校验,N表示奇校验)

如果您想修改PLC的通讯参数(注意!修改PLC通讯参数会造成PLC停止运行,请确保停止PLC不会对您造成任何影响的前提下进行操作),可以自动在线以后,确保DIP开关1处于OFF状态,选择工程下面的设置,如图6

在定制里设置你想要的通讯参数,然后选择PLC->传送->到PLC,如图7:

进入下载选项如图8对话框:

只勾选设置,点确定,出现图9对话框,选择是,出现图10对话框:选择是,出现图10的界面后表示通讯参数修改成功。

1.4驱动对各系列PLC的支持

本驱动构件支持欧姆龙C、CV、CS/CJ、CP系列部分型号的PLC参考2.5通道数据类型表

1.5 FINS驱动简要介绍及与Host Link驱动对比

FINS驱动构件支持欧姆龙CS/CJ(含CP)、CV系列部分型号的PLC,同时支持支持WR 寄存器。HostLink协议为欧姆龙公司旧有协议, 协议本身不支持新型号PLC的的W等寄存器的读写。如果使用新型号PLC并需要对相关寄存器进行操作,请使用MCGS新的FINS 串口驱动。另外,HostLink协议只支持4位地址,无法读取大于9999地址的寄存器区,在使用时,可将寄存器高地址区内容移到低地址区进行读写操作,新型号PLC也可直接换用新的FINS串口驱动。

FINS驱动用户可通过内部属性,添加PLC的通道,支持新的型号的寄存器W等。

HostLink驱动支持的寄存器类型IR、LR、HR、AR、TC、PV、DM。

FINS驱动支持的寄存器类型CIO、WR、DM、HR、AR、TK、TS、CS、TIM、CNT、IR、DR。

2驱动的基本使用

2.1欧姆龙驱动通讯协议和通讯方式

参考1.1驱动设备简介

2.2欧姆龙驱动通讯连接方式

参考1.2PLC接线

2.3欧姆龙构件驱动的添加

首先确保PLC与编程软件通讯正常,添加步骤如下:

①在设备窗口添加“通用串口父设备”

②在“通用串口父设备”下,添加扩展OmronHostLink驱动构件,设置“通用串

口父设备”的通讯参数:

串口端口号:PLC与PC机连接的物理串口号,可在设备管理中查看

波特率:与PLC波特率参数一致(4800 、9600(默认值) 、19200、

38400、57600、115200);不支持187500

数据位位数:7-8位

停止位位数:1-2位

数据校验方式:无校验,奇校验,偶校验

③其他说明参考1.3通讯参数的设置

④设置子设备参数设置如下:

?内部属性:单击“查看设备内部属性”,点击按钮进入内部属性,具体设

置请参看2.5欧姆龙构件内部属性设置。

?设备地址:PLC设备地址,可设定范围0-31,默认值为0。

?通讯等待时间:通讯数据接收等待时间,默认设置为200ms,当采集数据

量较大时,设置值可适当增大。

?快速采集次数:对选择了快速采集的通道进行快采的频率(不使用,为与

老驱动兼容,故保留,无需设置)。

● 2.4欧姆龙构件采集通道:

a、通讯状态:

通讯状态值代表意义

0 表示当前通讯正常

1 表示采集初始化错误

2 表示采集无数据返回错误

3 表示采集数据校验错误

4 表示设备命令读写操作失败错误

5 表示设备命令格式或参数错误

6 表示设备命令数据变量取值或赋值错误

b、数据通道信息:

本构件数据通道可通过内部属性添加,具体设置请参看2.5欧姆龙构件内部属性设置。

●2.5 欧姆龙构件内部属性设置

2.5.1通道类型

用户可通过内部属性,添加PLC的通道,本驱动构件可增加通道类型如下:

寄存器 数据类型 操作方式 IR/SR内部继电器区 BT、WUB、WB、WD

读写

DUB、DB、DD、DF

读写 LR链接继电器区 BT、WUB、WB、WD

DUB、DB、DD、DF

HR保持继电器区 BT、WUB、WB、WD 读写

DUB、DB、DD、DF

AR辅助继电器区 BT、WUB、WB、WD

读写

DUB、DB、DD、DF

TC状态 BT 读写

读写 PV定时/计数器 WUB、WB、WD

DUB、DB、DD、DF

读写 DM数据寄存器 BT、WUB、WB、WD

DUB、DB、DD、DF

通道数据类型参见下表

数据类型说明

BT dd位(dd范围:00-15)

BUB 8位无符号二进制

BB 8位有符号二进制

BD 8位2位BCD

WUB 16位无符号二进制

WB 16位有符号二进制

WD 16位4位BCD

DUB 32位无符号二进制

DB 32位有符号二进制

DD 32位8位BCD

DF 32位浮点数

●位序号:BT00,BT01---BT15.

●数值类型:BB,BUB,BD,WB,WUB,WD,DB,DUB,DD,DF

1)第一个字母表示数据的长度,B表示是字节数据,W表示是字数据,D表示是双字数据;

2)最后一个或两个字母表示数据类型,B表示二进制数,D表示BCD码,F表示浮点数;

3)字符中二进制数中带U表示无符号数,不带U的表示有符号数。

2.5.2通道地址 通道地址范围参见下表

寄存器 注释 系列

PLC 型号

CIO*

LR HR AR TC PV DM C200系列 HS/HE/HG/HX

0-255

0-63

0-99

0-27

0-511

0-511

0-6655, 7000 -9999

C500 0-63 0-31 0-31 --- 0-127 0-127 0-511

C1000H 0-4095 C2000H/CQ1M 0-6655 CQ1MH 0-255

0-63

0-99

0-27

0-511

0-511

0-6655 CPM1/CPM1A

0-19, 200 -255

0-15

0-127

0-127

0-1023, 6144 -6655

C 系列

CPM2A/CPM2C

0-49, 200 -255

0-15

0-19

0-23

0-255

0-255

0-2047, 6144 -6655 CV500 CVM1-CPU01-V □ 0-2555

---

---

0-511

0-511

0-511

0-8191

CV 系列*

CV1000 CV2000 CVM1-CPU11-V □

CVM1-CPU21-V □

0-2555

--- ---

0-511 0-1023 0-1023

0-9999

CS1G/H 0-6143 --- 0-511 0-959 0-1023 0-1023 0-9999 CS/CJ/C P 系列*

CJ1G/H CJ1M

0-6143

---

0-511

0-959

0-1023

0-1023

0-9999

CP1H/L 0-614

3 --- 0-153

5

0-95

9

0-409

5

0-409

5

0-9999

注:

1. CIO寄存器为新型号PLC名称,与旧型号PLC的IR/SR寄存器相对应,具体地

址请参考用户手册。

2. CV系列中HR寄存器包含在CIO寄存器中,使用时请参考用户手册。

3. 由于HostLink协议的限制,本驱动不支持CS/CJ/CP系列的WR和EM寄存器,

故在上表中未列出。

4. 上表为部分PLC地址范围,仅供参考,其他型号的地址范围请参考用户手册。

2.5.3内部属性注意事项:

1. HostLink协议为欧姆龙公司旧有协议, 协议本身不支持新型号PLC的的W等寄

存器的读写。如果使用新型号PLC并需要对相关寄存器进行操作,请使用MCGS新的FINS串口驱动。另外,HostLink协议只支持4位地址,无法读取大于9999地址的寄存器区,在使用时,可将寄存器高地址区内容移到低地址区进行读写操作,新型号PLC 也可直接换用新的FINS串口驱动。

2. 驱动中根据HostLink协议特点,增加了复合登录读取机制,可以有效提高对离

散数据的读取速度,但协议规定此功能只能同时有一组登录数据,所以使用驱动时,请避免多个驱动通过同一通讯口操作一个PLC设备(即: 1个串口父设备下挂多个地址相同的子设备)的情况,否则会出现每个驱动都反复登录数据帧,导致速度大大降低。

3. 添加TC状态和和PV定时/计数器通道添加时请注意:

由于HostLink协议中定时/计数器(T/C)的状态和PV值使用相同的指令,并使用不同地址做区分。其中:地址0-2047为定时器区,2048-4095为计数器区,而定时器的2048-4095和计数器0-2047不能使用。所以在添加TC状态和和PV定时/计数器通道时,计数器地址需要加2048偏移。

例如:要读取计数器15的PV值,添加时地址为15+2048=2063。

4. 部分型号PLC的TC状态值无法写入,这由PLC所决定的,使用时请查看相应

手册。

2.6欧姆龙驱动设备命令

本设备构件提供设备命令,用于对欧姆龙PLC进行相应的读写操作,设备命令的格式

如下: 设备命令 命令格式 命令举例

例1.1: !SetDevice(设备0, 6, "Read(IR,0,BT01=Data00;LR,1,BT01=Data01)") 读取IR0.1和LR1.1寄存器的值,放入MCGS 变量Data00,Data01中。

读取命令 Read

Read(寄存器名称, 寄存器地址, 数据类型=返回值)

例1.2: !SetDevice(设备0, 6, "Read(DM,10,WUB=Data00;DM,40,DF=Data01)") 读取DM 寄存器中地址10的16位无符号值,DM 寄存器中地址40的浮点数值,放入MCGS 变量Data00,Data01中。

写入命令 Write

Write(寄存器名称, 寄存器地址, 数据类型=写入值)

例1.3: !SetDevice(设备0, 6, "Write(DM,10,WUB=Data00;DM,40,DF=Data01)") 将Data00,Data01的值分别以16位无符号和浮点数格式写入寄存器DM10,DM40中。 32位读命令 Read32

Read32(寄存器名称, 寄存器地址, 数据类型=字符返回值)

例2.1: !SetDevice(设备0, 6, "Read32(DM,10,DUB=strData)")

读取DM 寄存器中地址0的32位无符号值,放入字符变量strData 中。 32位写命令 Write32

Write32(寄存器名称, 寄存器地址, 数据类型=字符写入值)

例2.2: !SetDevice(设备0, 6, "Write32(DM,10,DUB=strData)")

将字符变量strData 的值,以32位无符号格式写入寄存器DM00中。 批量读取A: ReadP

ReadP(寄存器名称, 起始地址, 数据类型,数据个数n, 数据1, …..数据n [,返回状态])

例3.1: !SetDevice(设备0, 6, "ReadP(DM,10,WUB,2,Data00,Data01,nReturn)") 表示读取DM 寄存器从地址10开始的2个16位无符号数值,放入MCGS 变量Data00,Data01中,执行结果存入变量nReturn 中。

批量读取B: ReadPV ReadPV(寄存器

名称, 起始地

址, 数据类型,

数据个数n, 数

据 1 [,返回状

态])

例3.2: !SetDevice(设备0, 6, "ReadPV(DM,10,WUB,5,Data00,返回值)")

表示读取DM寄存器从地址10开始的5个16位无符号数值,放入MCGS变

量Data00为起始,连续5个变量(即: Data00,Data01,Data02,Data03,Data04) 中,

结果存入变量“返回值”中。

批量读取C: ReadBlock ReadBlock (寄

存器名称, 起

始地址, [数据

类型1][数据类

型…],读取数量

n, 字符数据[,

返回状态])

说明: 读取数量是指读取N个数据类型中指定的数据段到字符变量中,数据

类型可以有多个,之间用中括号分隔。

实际连续读取个数= 读取数量n *(数据类型1+数据类型n)

返回数据“字符数据”格式为:123,456,xxx的csv方式,每次读取时以回

车换行结尾。

例3.3: !SetDevice(设备0, 6, "ReadBlock(DM,10,[WUB][DF],3,strData)")

表示读取DM寄存器从地址10开始,按WBU,DF格式连续读取3组数据(即:

数据格式为WUB,DF,WUB,DF,WUB,DF),并以相应格式解析并以逗号间隔的

CSV格式存入字符变量StrData中。

批量写入A: WriteP WriteP(寄存器

名称, 起始地

址, 数据类型,

数据个数n, 数

据1, …..数据n

[,返回状态])

例4.1: !SetDevice(设备0, 6, "WriteP(DM,10,WUB,2,Data00,Data01,nReturn)")

表示将MCGS变量Data00,Data01的值,以16位无符号形式写入DM寄存器

从地址10起始的两个寄存器中,执行结果存入变量nReturn中。

批量写入B: WritePV WriteP(寄存器

名称, 起始地

址, 数据类型,

数据个数n, 数

据 1 [,返回状

态])

例4.2: !SetDevice(设备0, 6, "WritePV(DM,10,WUB,5,Data00,nReturn)")

表示将以MCGS变量Data01为起始,连续5个变量的值(即:

Data00,Data01,Data02, Data03, Data04),以16位无符号形式写入DM寄存器

从地址10起始的两个寄存器中,执行结果存入变量nReturn中。

批量写入C: WriteBlock WriteBlock (寄

存器名称, 起

说明: 写入的数据在指定的字符数据对象中,格式为:xxx,xxx,xxx的csv

方式,每次读取时换行以回车换行结尾。其他具体格式参见ReadBlock。

始地址, [数据类型1][数据类型…],读取数量n, 字符数据 [,返回状态])

例4.3: !SetDevice(设备0, 6, "WriteBlock(DM,10,[WUB][DF],3,strData)")

表示将strData 字符变量中的CSV 格式的数据,按指定格式,写入DM 寄存器从地址10开始的连续地址中。

开启通讯日志: !SetDevice(设备0, 6, "SetHiddenPro(1, 1)") 开启错误日志: !SetDevice(设备0, 6, "SetHiddenPro(1, 2)") 通讯日志

SetHiddenPro(1,属性值)

关闭通讯日志: !SetDevice(设备0, 6, "SetHiddenPro(1, 0)")

读取通讯日志状态:!SetDevice(设备0, 6, "G etHiddenPro(1, Data01)") Data01为1时,表示通讯日志开启;为0时,表示通讯日志关闭。 读取PLC 延时:!SetDevice(设备0, 6, "G etHiddenPro(2, Data01)") 读取PLC 实际的响应延迟时间,存入变量Data01中。

属性获取

GetHiddenPro(1,属性值)

读取最小采集耗时:!SetDevice(设备0, 6, "G etHiddenPro(3, Data01)") 读取采集最小数据(1字长数据)所用耗时,存入变量Data01中。

参数说明:

寄存器名称:字符型变量,表示当前操作的寄存器,值等于IR 、LR 、HR 、AR 、TC 、PV 、DM 。

寄存器地址:数值型或开关型变量,表示当前操作的寄存器地址,查阅相关手册确定。 数据类型: 字符型变量,表示当前操作的寄存器数据类型,具体请参见2.5.1通道类型。

数据: 为数值型或开关型变量,包括返回数据值及写入值等,是用来存储设备命令数据的MCGS 变量。(32位写命令中数据为字符型变量)

返回状态:返回批量读写设备命令的执行状态(当设备命令格式错误时无效),具体返回值意义请参见通讯状态说明,返回状态为可选参数(以[]标记),用户也可通过通讯状态通道判断返回结果。

批量读写说明:

1.批量读写操作(包括:ReadP 、ReadPV 、WriteP 、WritePV ),为对同类寄存器连

续地址的一次性读写操作。使用时要注意变量对应寄存器地址的连续性。

2.批量读写操作(包括:ReadP 、ReadPV 、WriteP 、WritePV ),数据个数最大为512

个。建议一次批量操作数据量不要过大,否则会影响正常采集效果。

3.批量读写ReadPV 和WritePV 为对连续变量的操作,使用时要注意保证变量命名的索引累加的连续性。具体可参看相应“命令举例”部分。

4.批量读写ReadBlock和WriteBlock为对连续地址的读写操作,其字符变量格式

为特定的CSV格式,在写入及读取解析时一定要注意符合格式要求。

通讯日志功能说明:

设备命令中提供的通讯日志功能是为了方便用户现场调试,默认为不开启状态。正常时无需开启,否则影响速度。当现场有疑难无法正常通讯时,可开启通讯日志功能,记录日志

信息,将通讯过程记录以供技术人员分析。对于通讯跳变等不稳定状态,可以开启通讯错误

日志记录(即:当通讯不正常时,记录通讯错误的日志,而正常通讯时不记录日志)。通讯日志

默认保存为C:\HostLink.log (TPC下为\HardDisk\HostLink.log)。当文件大于6M时自动清空。

通讯日志格式举例说明如下:

地址行号操作时间发/收重试次数字节长度耗时发送或接收内容Address: 1 Line001 (2007-10-24

Send/Recv 0 [17 Byte] [ 100ms] @00RG0000004051*\R 14:21:51)

属性获取功能说明:

使用设备命令中提供的属性获取功能,可以获得通讯日志状态、PLC延时、最小采集耗时等数据。

其中:通讯日志状态:读回值为1时,表示通讯日志开启;读回值为2时,表示开启错误日志;读回值为0时,表示通讯日志关闭。

PLC延时:为PLC实际的响应延迟时间,即:驱动读写指令帧发出后到PLC响应并开

始返回数据帧所用的时间。

最小采集耗时:为采集最少数据 (1字长数据)所耗费的时间,最小采集耗时=发指令帧

耗时+ PLC延时+接收数据帧耗时。

用户在调试时,可根据PLC延时、最小采集耗时判断PLC的实际响应时间,并结合驱

动通讯日志判断采集速度是否正常。

如数据值过大,说明PLC可能因程序过大而导致响应时间过长,影响采集速度。解决方法

为优化PLC程序,提高PLC响应时间。

3驱动通讯的典型应用方案

3.1一个触摸屏或者PC 连接多个PLC

① 所用PLC 型号是否一致;

② 所有PLC 的通讯参数设置是否一致

③ 修改所有PLC 的通讯参数中的地址参数,使每个PLC 地址唯一并且范围0—32; ④ MCGS 中“通用串口父设备”下添加对应个数的扩展OmronHostLink 构件驱

动,并分别进入构件,设置设备地址和所用通道;设置“通用串口父设备”的通讯参数,应与PLC 一致;

⑤ 可以按照PLC 波特率分类,添加相应的“通用串口父设备”对应相应的波特

率。 3.2多个触摸屏或者PC 连接一个PLC

3.3多个触摸屏或者PC 连接多个PLC

4

常见问题及解决方案

4.1根据通讯状态返回值判断的问题

故障现象 分析

处理建议

1、检查串口父设备参数设置是否正确

2、检查串口是否被其他程序占用

3、检查通讯电缆是否正确连接

4、检测设备,并使用厂家测试程序确保通讯正常。 并确认设备设置项与帮助中要求相同。

5、检查“设备地址”与PLC 设置是否一致

6、适当延长“通讯等待时间” 通讯状态为 1或 2

采集初始化错误 或采集无数据返回

(通讯硬件连接、参数设置问题)

7、读取数据地址超范围

1、检查父设备串口校验位设置是否正确

2、适当延长“通讯等待时间”

3、设备断电,重新上电,使初始化设备

4、通讯电缆太长,做短距离测试

5、现场干扰太大,避免周围环境干扰 通讯状态为3

采集数据校验错误

(包括应答数据不完整或校验错误两种情况)

6、通讯信号变弱,使用有源RS232/485模块

通讯状态在0

通讯不稳定或读取地

1、同通讯状态为3的处理

与非0之间跳变

址超范围 2、读取数据地址超范围

(典型情况为,添加某通道后,导致通讯状态变非0) 1、新建工程测试驱动 2、检测通道是否连接变量 通讯状态为0,数据不正确

组态工程错误 3、检测工程是否对数据进行处理

1、将“采集优化”属性设置为“1-优化”

2、减小父设备及子设备的最小采集周期 (最小可设置为20ms)

3、使用设备命令,减少实时采集的数据

通讯数据量过大或采集周期设置过长

4、通过设备命令获取PLC 延时,判断是否因PLC 响应时间过长而影响采集速度。

5、将数据放到连续的地址块中,提高块读效率

通讯速度太慢 通讯次数过多 6、将不同寄存器的数据放到同一寄存器连续的地址块中,减少采集块数,提高采集效率

● 4.2通讯连接不上问题

1) 查看接线是否正确参考1.2PLC 的接线

2) 检查PC 或TPC 串口是否选择正确,PC 串口可以查看设备管理器中查看物理串口号,

TPC 串口号在屏后面接线处有标识。

3) 如果是自制电缆请参考参考1.2PLC 的接线

4) 查看DIP 开关设置是否正确,是否处于自动在线状态等

5) 查看当前串口是否被占用或损坏,例如:PC 程序处于调试状态,需关闭串口后重试,

如果串口损坏请更换串口。

6) 检查设备参数设置是否正确参考2.3欧姆龙构件驱动的添加 ● 4.3新旧型号PLC 寄存器说明

1) 新型PLC 中CIO 寄存器与旧型号PLC 的IR/SR 寄存器相对应

2) 此驱动不支持新型PLC 中的WR 寄存器,如果需要操作相关寄存器请使用最新FINS 串

口驱动 3) 此驱动无法读取大于9999地址的寄存器区,在使用时,可将寄存器高地址区内容移到

低地址区进行读写操作,新型号PLC 也可直接换用新的FINS 串口驱动 4) 由于HostLink 协议中定时/计数器(T/C)的状态和PV 值使用相同的指令,并使用不同地

址做区分。其中:地址0-2047为定时器区,2048-4095为计数器区,而定时器的2048-4095和计数器0-2047不能使用。 所以在添加TC 状态和和PV 定时/计数器通道时,计数器地址需要加2048偏移

虚拟声卡驱动程序VirtualAudioCable使用方法

一:安装软件 点击 选择是(Y) 选择I accept 选择Install 安装成功,点击“确定”按钮即完成安装。 二、软件的设置 点击桌面开始按钮所有程序---Virtual Audio Cable —Control panel 进入软件初始化 设置。 在Cables 中选择1(即首次设置一个虚拟通道),点击旁边的Set 按钮生成通道Cable1. 在参数设置区将Line 、Mic (可选可不选)、S/PDIF (可选可不选)三个选项后面的方框打钩,选中之后点击参数设置区内的设置按钮Set ,即完成了,对虚拟声卡通道1 的设置。 鼠标右键点击桌面右下角的喇叭------ 调整音频属性---- < 或者点击开始—控制面板--- 声音、 语音和音频设备--- 声音和音频设备>弹出: 选择语音 此时语音部分的设置为原系统默认的设备,保持不变。 选择音频: 改变声音播放、录音的选项内容:

如上图将声音播放、录音的默认设备全部改为Virtual Cable 1 。点击应用--- 确定即可。 三、打开录音机录音--- 录制电脑里播放出来的音频(不包含麦克风 里的声音) - 即“内录” 开始--- 所有程序—附件--- 娱乐--- 录音机 点击确定即可开始录音(注:此时可在电脑中打开相应的音频文件,开始录音) 此时音频波段显示有声音输入,但是电脑的耳机听不到正在播放的音频文件(属正常现象)。若想同时听到音频文件的内容点击桌面开始按钮所有程序---Virtual Audio Cable —Audio Repeater 。 修改为 点击Start 即可听到正在录制的音频文件。此时的录音即是通过虚拟声卡通道录制电脑里的声音的。 四、同时录电脑里播放的声音和麦克风收集的外部声音----- 即混录 <通过这种方法解决现有笔记本无“立体声混音”或“波形音”选项的问题> 在《三打开录音机录音--- 录制电脑里播放出来的音频(不包含麦克风里的声音)------------ 即“内录”》的同时,在打开一个irtual Audio Cable —Audio Repeater 窗口将其设置为: 即将外部麦克风收集的声音转移到虚拟声卡通道Cable1 中,同电脑里播放的声音一起被录音软件收录为音频文件。

虚拟设备驱动程序的设计与实现

虚拟设备驱动程序的设计与实现 由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得 更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属 于系统级的虚拟设备驱动程序。Win 98与Win 95设备驱动程序的机理不尽相同,Win 98不仅支持与Windows NT 5.0兼容的WDM(Win32 Driver Mode)模式驱动程序 ,而且还支持与Win 95兼容的虚拟设备驱动程序VxD(Virtual Device Driver)。下面介绍了基于Windows 9x平台的虚拟环境、虚拟设备驱动程序VxD的基本原理和 设计方法,并结合开发工具VToolsD给出了一个为可视电话音频卡配套的虚拟设备 驱动程序VxD的设计实例。 1.Windows 9x的虚拟环境 Windows 9x作为一个完整的32位多任务操作系统,它不像Window 3.x那样依 赖于MS-DOS,但为了保证软件的兼容性,Windows 9x除了支持Win16应用程序和 Win32应用程序之外,还得支持MS-DOS应用程序的运行。Windows 9x是通过虚拟机 VM(Virtual Machine)环境来确保其兼容和多任务特性的。 所谓Windows虚拟机(通常简称为Windows VM)就是指执行应用程序的虚拟环 境,它包括MS-DOS VM和System VM两种虚拟机环境。在每一个MS-DOS VM中都只运 行一个MS-DOS进程,而System VM能为所有的Windows应用程序和动态链接库DLL(Dynamic Link Libraries)提供运行环境。每个虚拟机都有独立的地址空间、寄存器状态、堆栈、局部描述符表、中断表状态和执行优先权。虽然Win16、Win32应用程序都运行在System VM环境下,但Win16应用程序共享同一地址空间, 而Win32应用程序却有自己独立的地址空间。 在编写应用程序时,编程人员经常忽略虚拟环境和实环境之间的差异,一般认为虚拟环境也就是实环境。但是,在编写虚拟设备驱动程序VxD时却不能这样做 ,因为VxD的工作是向应用程序代码提供一个与硬件接口的环境,为每一个客户虚 拟机管理虚设备的状态,透明地仲裁多个应用程序,同时对底层硬件进行访问。这就是所谓虚拟化的概念。 VxD在虚拟机管理器VMM(Virtual Machine Manager)的监控下运行,而VMM 实 际上是一个特殊的VxD。VMM执行与系统资源有关的工作,提供虚拟机环境(能产

编译hello设备驱动程序详细过程

编译hello world设备驱动程序详细过程 1、安装与你的开发板相同的内核版本的虚拟机,我的板子内核是2.6.8.1,虚拟机是2.6.9, 一般是虚拟机的内核只能比板子内核新,不能旧 #uanme –a [1](在任何目录下,输入此命令,查看虚拟机的内核版本,我的内核版本是2.6.9) 2、在虚拟机上设置共享目录,我的共享目录在linux下的/mnt/hgfs/share [2]share是自己命名的,我的物理机上,即Windows下的目录是G:/share, 3、在Windows下,把开发板的的交叉开发工具链[3],内核源码包[4],复制到物理机的共享目录下[5] 即Windows下的目录是G:/share, 4、#cp /mnt/hgfs/share/cross-3.3.2.tar.bz2 /usr/local/arm [6] 在Linux下,把交叉工具链,复制到/usr/local/arm目录下 5、#cd /usr/local/arm 6、#tar jxvf cross-3.3.2.tar.bz2 [7] 并在当前目录/usr/local/arm下解压它cross-2.95.3.tar.bz2和gec2410-linux-2.6.8.tar.bz2也是用同样的命令去解压 7、#export PATH=/usr/local/arm/3.3.2/bin:$PATH [8] 安装交叉工具链,在需要使用交叉编译时,只要在终端输入如下命令 #export PATH=/usr/local/arm/版本/bin:$PATH 即可,在需要更改不同版本的工具链时,重新启动一个终端,然后再一次输入上面的命令即可,使用哪个版本的交叉工具链,视你要编译的内核版本决定,编译2.4版本的内核,则用2.95.3版本的交叉工具链,而2.6版本内核的,则要用3.3.2版本的交叉工具链。 8、#cp gec2410-linux-2.6.8.tar.bz2 /root [9]把内核拷贝到/root目录下, 9、#cd /root 10、#tar gec2410-linux-2.6.8.tar.bz2 [10] 在/root解压开发板的内核源码压缩包gec2410-linux-2.6.8.tar.bz2,得到gec2410-linux-2.6.8.1文件夹 11、#cd /root/ gec2410-linux-2.6.8.1 12、#cp gec2410.cfg .config [11] gec2410.cfg文件是广嵌开发板提供的默认内核配置文件,在这里首先把内核配置成默认配置,然后在此基础上用make menuconfig进一步配置,但在这里,不进行进一步的配置,对于内核配置,还需要看更多的知识,在这里先存疑。 13、#make [12]在内核源代码的根目录gec2410-linux-2.6.8.1下用make命令编译内核,注意,先安装交叉工具链,再编译内核,因为这里编译的hello.ko驱动模块最终是下载到开发板上运行的,而不是在虚拟机的Linux系统运行的,如果是为了在虚拟机的Linux系统运行的,则不用安装交叉编译工具链arm-linux-gcc,而直接用gcc,用命令#arm-linux-gcc –v 可以查看当前已经安装的交叉编译工具链的版本。这里编译内核不是为了得到内核的映象文件zImage(虽然会得到内核的映象文件zImage),而是为了得到编译hello.o模块需要相关联,相依赖(depends on)的模块。 14、#cd /root 12、#mkdir hello [13]在/root目录下建立hello文件夹, 13、#cd hel 14 、#vi hello.c [12]编辑hello.c文件,内容是《Linux设备驱动程序》第三版22页的hello world程序。 15、#vi Makefile [13]在hello文件夹下编辑Makefile文件, 16、obj-m := module.o [14] 这是Makefile的内容,为obj-m := module.omodule.o视你编辑的.c文件而定,这里则要写成hello.o,写完后,保存退出。 17、cd /root/hello

虚拟设备驱动程序设计中的两个关键问题

虚拟设备驱动程序设计中的两个关键问题 在虚拟设备驱动程序(VxD)的设计中,两个尤为关键,且又令人困扰的问题是VxD 的虚拟化和VxD与应用程序间的通信机制。下面,对这两个问题作一详细的探讨。 一、VxD的虚拟化 由于Windows允许同时运行多个任务,所以出现多个进程试图同时访问同一物 理设备的情况时,如果多个应用程序通过同一个DLL驱动程序(注意和虚拟设备驱 动程序VxD的区别)访问设备,不需要对该设备虚拟化,驱动程序使之顺序访问;如果是多个Windows应用程序对相同设备同时访问,由于都运行于System VM(系统虚拟机),所以也不需要虚拟化,它们的访问将由一个驱动程序(Windows driver DLL)进行检测并使之串行化,而不是依靠VxD;如果多个VM试图访问同一 设备,由于DOS应用程序能够直接操纵硬件,所以必须对该设备进行虚拟化,一个 虚拟化设备的VxD负责可靠地检测多个VM试图访问同一设备的情况,并采取仲裁的 策略来解决这种冲突。这里可能有以下几种解决方案: 1、允许一个VM访问物理设备,同时忽略其它的VM。这是最简单的虚拟化 形式 。如VPD(Virtual Printer Device)。 2、允许一个VM访问物理设备,同时为其它的VM虚拟化设备。如VKD(Virtual Keyboard Device)分配给一个VM,并使之获得物理键盘的访问权(包括键盘中 断 在内),对其它的VM而言,VKD只向它们提供一个空的键盘缓冲区。 3、允许多个VM共享同一物理设备。尽管存在假象,但从VM的观点来看,这种 方法与独享访问一样。如VDD(Virtual Display Device),使每一个Windows环境 下的DOS VM认为是直接写入显存,其实只是被VDD映射到了一个窗口的缓冲区。 4、VxD独立访问物理设备的同时,允许一个VM访问虚拟设备,这是最复杂的 虚拟化形式。如VCD(Virtual Com Device),VCD缓冲区接收串行数据并通过映射中 断透明地传给相应的一个VM,VM在中断处理过程中读取串口数据寄存器,这些数 据的实质是VCD缓冲区已经接收的数据。 与物理设备一样,硬件中断很多时候也必须虚拟化,这种情况更为复杂。虚拟化中断实质上就是将硬件产生的中断映射到需要它的每一个VM(不管该VM是否 正在运行),替代VxD进行服务。在这里我们给出一个虚拟化中断的VxD实例的几 个重要回调过程,并采用最简单的仲裁策略来解决访问冲突(见程序1)。 typedef struct

基于单片机的智能风扇控制系统设计说明

基于单片机的智能风扇控制系统设计 摘要:介绍了一种基于单片机的智能风扇控制系统的设计,目的在于解决电扇在实际生活中不合理的使用的现状和在已有电扇上的一些小创新,在设计过程过硬件电路的实际焊接,基本实现了想要实现的功能,通过对该系统的设计,证明该系统的实际可行性,有助于在以后可以开发出此类产品,提髙人们生活质量,节约能源。 关键词:单片机;DS18B20;直流电机;风扇;人体红外;LCD 1602 基金项目:师学院教学研究项目资金。 引言:在我国大学校园里,教室里面安装电扇很普及, 电扇相比较空调而言,节约成本,便于安装,但是通过在大学里的观察和研究发现,电扇的使用存在很多不合理的现象, 经常会出现人走了电扇还开着,或者电扇档位无法根据气温自动调节的现象,电扇在我国的使用围十分广泛,除了大学校园,很多地方都用到了电扇。单片机便宜,功耗低,便于控制,基于此在现有电扇的基础上开发了智能风扇系统,并制作出了硬件,实现了预期的效果,证实了该系统的实际可行性,如果可以得到大量使用,对于目前电扇存在的不合理问题是一个很好的解决方法。

一、系统整体设计 基于单片机的智能风扇控制系统包含温度感应和显示、外部按键设置功能、人体红外感应模块、直流电机PWM调速、蜂鸣器报警、LCD风速等级显示模块,首先在显示功能上使用了数码管和LCD1602分别显示出当前温度和风速等级,显示功能的目的在于增加产品的直观性和合理操作性,便于人们在使用时有可以调节的依据。外部按键实现了设置温度上下限、复位、加减温度的功能,使电扇在没有人为操作的情况下可以按照温度上下限和外部实际温度做出合理的响应,蜂鸣器的作用是为了提醒使用者当前温度髙于温度上限或者低于温度下限,直流电机PWM调速实现了风速级别的调节,通过温度传感器得到的温度,对电机的速度分级调节,以最合理的方式调节电扇的使用,从而达到智能、合理、高效的目的。这些功能使用到的存储、中断、显示、调速都可以用单片机实现,因此选用51单片机作为控制芯片。 二、硬件电路设计 1、最小系统 在设计硬件的时候使用11. 0592MHZ的晶振作复位电路,这样便于在做后面的定时器功能时可以精确定时,12MHZ的晶振在长时间工作下由于初始值不是精确值容易累积误差,产生错误的结果。单片机最小系统的搭建是做硬件的第一步, 时钟电路、复位电路和电源,复位电路在设计时需要满足t二RC〉2us,

基于研华数据采集卡的labview程序设计.doc

第10章基于研华数据采集卡的 L a b V I E W程序设计 本章利用研华公司的PCI-1710HG数据采集卡编写LabVIEW程序,包括:模拟量输入、模拟量输出、开关量输入以及开关量输出等。 10.1 模拟量输入(AI) 10.1.1 基于研华数据采集卡的LabVIEW程序硬件线路 在图10-1中,通过电位器产生一个模拟变化电压(范围是0V~5V),送入板卡模拟量输入0通道(管脚68),同时在电位器电压输出端接一信号指示灯,用来显示电压变化情况。 图10-1 计算机模拟电压输入线路 本设计用到的硬件为:PCI-1710HG数据采集卡、PCL-10168数据线缆、ADAM-3968接线端子(使用模拟量输入AI0通道)、电位器(10K)、指示灯(DC5V)、直流电源(输出:DC5V)等。 10.1.2 基于研华数据采集卡的LabVIEW程序设计任务 利用LabVIEW编写应用程序实现PCI-1710HG数据采集卡模拟量输入。 任务要求: (1)以连续方式读取电压测量值,并以数值或曲线形式显示电压测量变化值;

第10章基于研华数据采集卡的LabVIEW程序设计(2)当测量电压小于或大于设定下限或上限值时,程序画面中相应指示灯变换颜色。 –209 –

LabVIEW 虚拟仪器数据采集与串口通信测控应用实战 – 210 – 10.1.3 基于研华数据采集卡的LabVIEW 程序任务实现 1.建立新VI 程序 启动NI LabVIEW 程序,选择新建(New )选项中的VI 项,建立一个新VI 程序。 在进行LabVIEW 编程之前,必须首先安装研华设备管理程序Device Manager 、32bit DLL 驱动程序以及研华板卡LabVIEW 驱动程序。 2.设计程序前面板 在前面板设计区空白处单击鼠标右键,显示控件选板(Controls )。 (1)添加一个实时图形显示控件:控件(Controls )→新式(Modern )→图形(Graph ) →波形图形(Waveform Chart ),标签改为“实时电压曲线”,将Y 轴标尺范围改为0.0-5.0。 (2)添加一个数字显示控件:控件(Controls )→新式(Modern )→数值(Numeric )→ 数值显示控件(Numeric Indicator ),标签改为“当前电压值:”。 (3)添加两个指示灯控件:控件(Controls )→新式(Modern )→布尔(Boolean )→圆形指示灯(Round LED ),将标签分别改为“上限指示灯:”、“下限指示灯:”。 (4)添加一个停止按钮控件:控件(Controls )→新式(Modern )→布尔(Boolean )→停止按钮(Stop Button )。 设计的程序前面板如图10-2所示。 图10-2 程序前面板 3.框图程序设计——添加函数 进入框图程序设计界面,在设计区空白 处单击鼠标右键,显示函数选板(Functions )。 在函数选板(Functions )下添加需要的函数。 (1)添加选择设备函数:用户库→ Advantech DA&C (研华公司的LabVIEW 函数库)→ EASYIO → SelectPOP → SelectDevicePop.vi ,如 图10-3 SelectPop 函数库

简单的虚拟字符设备驱动的实现

简单的虚拟字符设备驱动的实现 Linux業已成为嵌入式系统的主流,而各种Linux驱动程序的类型中,字符设备无疑是应用最广泛的。本文实现了一个简单的虚拟字符设备的驱动程序,用以演示Linux字符设备驱动的基本原理。在嵌入式Linux的教学中具有重要的作用。 标签:Linux 驱动程序字符设备虚拟嵌入式 Linux作为一种开放源代码的操作系统,在嵌入式系统领域业已成为主流,而为嵌入式Linux系统开发设备驱动程序,也成为一项重要的工作。Linux系统中的驱动程序主要分为三种:字符设备驱动程序、块设备驱动程序和网络驱动程序。其中字符设备是一类只能顺序读写,没有缓存的驱动程序,其实现方法相对简单,而应用则最为广泛。在嵌入式Linux的教学中,字符设备驱动程序也是一项重要内容。为了让学生能够理解字符设备驱动程序的原理,需要一个简单的字符设备驱动的例子,用以进行演示。 一、基本原理 把设备当作文件处理,是Linux系统的重要思想,即“一切皆文件”。在用户空间中,应用程序对字符设备的操作跟读写普通文件没有什么区别,也是通过open()、close()、read()、write()等函数实现的。操作系统将这些用户空间中的函数分别映射到内核空间中由驱动程序提供的对应接口。因此,内核空间中的驱动程序就需要通过对对应接口函数的实现来实现对用户空间中应用程序的支持。 file_opreations是字符设备驱动中最重要的结构,它包含了字符设备各种可能的接口函数。通常在嵌入式编程中,我们不需要全部实现,只需要实现我们实际用到的接口就可以了,这样可以有效降低程序的大小。该结构被定义在头文件“linux/fs.h”中,使用时只需声明该结构的一个变量并进行填充即可。 二、环境准备 为了进行嵌入式Linux的开发,必须首先安装Linux系统。这里采用最常用的Windows系统+VMWare虚拟机的形式,系统版本为RedHat Enterprise Linux 6.4,其自带的内核版本为2.6.32-358.el6.i686。该版本比之前沿用的RedHat9更新,同时也是一个被验证过的非常稳定的系统。 交叉编译器采用网上下载的Arm-Linux-gcc 4.5.1版本,同样兼顾到版本更新和稳定性之间的平衡关系。 各软件的安装过程本文不再赘述。

LabVIEW虚拟仪器程序设计从入门到精通

人民邮电出版社 1局部变量:1.层叠式顺序结构中,对于不同帧之间传递数据利用数据局部变量;2当一个控件既作为输入控件,又作为输出控件的时候利用局部变量;3在不同循环体之间的数据传递。 2全局变量:在不同的VI之间传递数据,但是对于内存资源的占用很大; 3共享变量:在不同的计算机或者网络之间共享。 4顺序结构强制破坏了LabView从左到右的数据流编程习惯,在平铺式结构中可以做到从右到左。顺序结构破坏了LabView的优点之一:并行运行机制,因此一般不太提倡。 5那么程序中需要利用顺序执行程序的时候我们一般认为控制数据依存关系,此时,是通过数据的到达而不是数据的值来触发新结构对象的执行,数据的接收对象不一定需要该数据的值。 事件结构 事件结构是一个非常强大的功能,为事件驱动,可用于编写等待事件发生的高效代码,代替循环检测事件是否发生的低效代码。对比条件结构和事件结构,在条件结构中,系统采用轮询的方式来检测“单击”按钮是否发生,但是在事件结构的技术过程中,只有单击按钮被按下以后触发,才执行一次循环。 因此,事件结构在执行前面板UI接口事件具有很强大的优越性。 事件结构的建议: ●避免在循环外使用事件结构; ●在“值”改变事件分支中读取触发布尔控件的接线端; ●条件结构用于处理触发布尔操作的撤销操作; ●不要使用不同的事件数据将一个分支配置为处理多个过滤事件; ●避免一个事件分支中同时使用对话框和“鼠标按下?”过滤事件; ●避免在一个循环中放置两个事件结构。 利用公式节点可以有效简化数值中的公式的繁琐结构。 禁用结构一般用于系统调试,避免程序在编辑中不停的删除、复制和修改中产生不必要的错误。

Windows 95下的虚拟设备驱动程序

Windows 95下的虚拟设备驱动程序 虚拟设备驱动程序(VxDs)在很大程度上支持了Windows 3.x和Windows 95。通 常,我们从两个级别的意义上来认识VxDs:从低级意义上来说,它们直接存取系统 的硬件;而从高级意义上来看,它们在最高优先级别上运行。 在Windows 95中,VxDs显得更加重要,Microsoft正是靠VxDs扩展了操作系统内 核的处理能力。Win 95中的VxDs可以处理涉及从文件系统到声卡以至网络系统的 各种事务。 可能您还未认识到:尽管VxDs本身是32位的,但它却诞生于16位的非线程、非 抢占性的操作系统。而现在人们期待甚至要求VxDs能运作于具有线程化、可抢占 性的操作系统,简单的变形是不能解决此问题的。 虚拟机假想 一台虚拟机(VM)只不过是人们的一个假想。而特别的,这个假想认为一个给定 的进程可对一台计算机的所有硬件设备进行独占性的存取,这些设备包括了内 存 、I/O口、中断和其它进程想要占用的部件。VxDs就是为了此假想产生的。 Windows 3.1中有两种虚拟机(VMs):DOS壳和Windows VM本身(后者称为" 系统 虚拟机"———所有的Windows应用程序运行于其中)。而虚拟机管理器(VMM),尽 管它本身不是一VM,但却充当着激活VMs和VxDs的主要管理员。例如,VMM要处理在 运行VMs时的抢占时间片工作。 另外,任何用来虚拟管理I/O设备的VxD都必须在VMM中登记。因此,如果一VxD 要占用一些特殊的I/O端口,就必须请求VMM挂起这个端口。这样,无论何时当一 Windows应用程序试图对此口进行存取操作时,VMM将把这个存取请求传给特定的 VxD。

基于虚拟仪器的CAN卡驱动实现

第4期(总第155期) 2009年8月机械工程与自动化 M ECHA N ICAL EN GI NEER IN G & AU T O M A T IO N N o.4A ug. 文章编号:1672-6413(2009)04-0065-02 基于虚拟仪器的CAN 卡驱动实现 王欣欣,袁丽娟 (华北水利水电学院,河南 郑州 450011) 摘要:为了利用CAN 总线进行数据采集,实现数据实时显示,特选用虚拟仪器软件开发平台L abV IEW 实现CA N 接口卡的驱动,进而设计合理的人机交互界面,进行数据显示、故障分析。关键词:L abV IEW ;CA N 接口卡;CA N 总线;界面设计中图分类号:T P 391.9 文献标识码:A 收稿日期:2008-11-24;修回日期:2009-02-25 作者简介:王欣欣(1980-),女,河南濮阳人,助教,硕士,研究领域为测控技术与仪器。 0 引言 虚拟仪器就是在个人计算机的环境中,利用良好的虚拟仪器软件平台,充分发挥微机的图形处理功能,在屏幕上虚拟出智能仪器的显示面板,用户可通过面板上的各处虚拟的按键、开关、旋钮去使用仪器的各种功能,控制仪器的运行,并从面板上的虚拟显示屏、数码显示器和指示灯了解仪器的状态,从而完成对被测试量的采集、分析、判断、显示、数据存储等[1]。其中数据采集系统的实现,可通过某种传输总线将采集模块连接至计算机。以特定的温度监控系统为例,采集的温度数据通过CAN 总线传送至上位计算机,上位机采用LabV IEW 设计的界面完成数据的显示。本文主要研究利用LabVIEW 驱动CAN 卡的实现。1 LabVIEW 程序结构 LabVIEW 程序称为虚拟仪表(Vir tual Instrum ent)程序,简称VI 。VI 包括3部分:程序前面板、框图程序和图标/连接端口。程序前面板都对应一段使用图形编程语言编写的框图程序,类似于一台仪器的内部电路,可看成源程序代码。2 C AN 接口卡 选用广州周立功单片机有限公司的PCI -51XX 智能CAN 接口卡(类型为PCI-5110),它具有PCI 接口的高性能CAN 总线通讯适配卡,使PC 机方便地连接到CAN 总线上实现CAN 2.0B 协议的数据通讯;采用PCI 接口实现与主机PC 的高速数据交换;该卡集成1个或2个电气独立的CAN 接口通道,每个通道光电隔离,增强系统在恶劣环境下使用的可靠性[2]。PCI -5110接口卡含有SJA 1000独立CAN 控制器,其通讯波特率由寄存器BT R 0(定时器0)和BT R 1(定时器1)决定,范围为5kb /s ~1000kb /s 。 3 C AN 卡驱动程序设计 (1)调用CAN 接口卡库函数,使用LabVIEW 中的调用动态链接库。LabVIEW 提供了4种调用外部程序代码的途径,其中动态链接库机制是LabVIEW 调用标准共享库和用户自定义库函数的通用方法。具体实现时,使用LabVIEW 功能模块中“Advanced ”子模块里的“调用库函数节点(Call Libr ar y Function Node)”,见图1。 图1 L abVI EW 中的调用库函数节点 双击该节点,可在弹出的对话框中(见图2)对此节点进行配置(以复位CA N 为例): 在“Library Name or Path ”选项中,点击“Brow se …”按钮,打开文件对话框,找到PCI 接口卡的库函数,找到Contr olCAN .dll 文件,或直接输入此节点所要链接的 DLL 路径名; 在“Function Name ” 下拉列表框中找到VCI _ResetCAN ,或直接输入函数名; 在“Call Conventions ”下拉列表框中选择“C ” ,表明所调用的库为使用C 语言自己创建的库,若调用的函数为Window s 标准共享库函数,则选择stdcall(W INAPI)选项;!在“Bro w se …”按钮下方的下拉表框中选择“Run in U I T hread ”,表明该调用过程运行在用户接口线程中;?完成函数输入输出参数和类型的配置(见表1),单击Add Par am eter A fter 按钮,定义函数的第一个参数,按照库函数要求完成Par am eter 框、Ty pe 框、Data T ype 框等,依次设置其他参数,设置

虚拟块设备驱动程序设计与分析

如果只是为了应付考试,这个文档就太啰嗦了,不用看,不过还是可以帮助记忆,考试只会考其中加粗字体的几个函数中的一个,至于是哪个我不能断定,因此要记的还是比较多的,要是能理解就更好了,结合课本和下面的解释应该能大体上弄明白这个虚拟块设备驱动的 实现过程,毕竟设备驱动是内核的一部分,光看下面的解释也是还是很头晕的,不过坚持看下去还是有收获的,我也差不多花了半天时间,不过,要是打算……的话就可以直接跳过了。 #define MAJOR_NR 70 //我们创造的虚拟块设备的主设备号 #define DEVICE_NAME “bdemo”//我们创造的虚拟块设备的名字,当设备加载成功后可用lsmod命令查看到该设备模块名 #define blkdemo_devs 2 //虚拟块设备的个数 #define blkdemo_rahead 2 //读取块设备时预读的扇区个数 #define blkdemo_size 4 //每个虚拟块设备的大小,单位为KB #define blkdemo_blksize 1024 //设备每个数据块的大小,即block,单位为字节 #define blkdemo_hardsect 512 //设备每个扇区的大小,单位为字节 struct blkdemo_device { // 这里定义了我们将要创造的虚拟块设备的数据结构 int size; // 用来记录真实块设备的容量,即下面data指针所指向数据存储区的大小 int use_cnt; // 用来记录正在使用该块设备的程序的个数 int hardsect; // 用来保存该块设备每个扇区的大小,单位为字节,即设备的使用计数 u8 *data; // 该指针所指向的内存区域就是该块设备真正用来存储数据的区域,在该设备还未被加载函数初始化时,该指针为// 空,即系统还没有为该设备分配内存区域。 }; static int blkdemo_sizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备的大小,单位为KB static int blkdemo_blksizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备中每个数据块的大小,单位为字节static int blkdemo_hardsects[blkdemo_devs];//用来保存我们创建的所有虚拟块设备中每个扇区的大小,单位为字节 //上面的这三个数组将会在我们加载这些设备时被注册到内核的数据结构中(即让内核中与之相关的一些指针指向它们,让内核能够读取我们所创建的设备的一些重要信息 //对于一个新的设备,内核肯定不知道他为何物,要想让内核识别我们自己创造的设备,则必须将该设备的一些信息、使用这个设备的方//法等告诉内核,由于内核早已编译成型,至于如何去告诉内核就早已模式化。内核中有几个指针数组(书本page81)专门用来完成上面的部分任务: // blk_size[]; // blksize_size[]; // hardsect_size[]; // read_ahead[]; //这几个数组都为每一个主设备号留有一个位置,对于2.4的内核,主设备号和次设备号均用8位二进制来表示(即短整型的高八位和//低八位),因此这几个数组都包含有256个元素,每个元素都是与主设备号对应的一个指针,如果主设备号所对应的设备不存在,则该//指针置为空(NULL),其实其中很多指针都为空,因为一般电脑上都没有那么多不同类型的块设备,当然,对于我们所创造的这个块设//备而言,它与系统中所存在的其他块设备的类型都不同,要为其确定一个主设备号,这个没什么硬性的规定,只要找一个没被使用的主//设备号就可以了,这个程序中使用的是70(前面的MOJOR_NR宏)。上面我们定义了保存有虚拟块设备信息的数组,现在只要将他们的//首地址赋给这几个数组中下标70(主设备号)所对应的指针元素即可。这一过程是在后面的加载函数中完成的。 static int blksize = blkdemo_blksize; struct blkdemo_device blkdemo_dev[blkdemo_devs];//这里才真正创建了我们虚拟块设备对应的结构体变量(一个全局数组),//每个元素为对应一个虚拟块设备 虚拟块设备的打开函数(open()): int blkdemo_open(struct inode *inode, strcut file *filp) { //设备文件对应的节点(inode)结构中包含有对应的设备号 int num; num = DEVICE_NR(inode->i_rdev);//用DEVICE_NR宏可求出该节点所对应设备的次设备号,所以num即为次设备号if (!blkdemo_dev[num].use_cnt) { //如果该设备的使用计数为0,则说该设备没有被任何程序使用,当虚拟块设备没有被//任何程序使用时,内核先前为该设备所分配的存储区很可能已经被释放掉了,甚至对于可移动设备而言,有可能该设备都被拔掉了(当//然,我们的虚拟块设备是不可能的),因此,在打开该设备时要进行严格的检查,不然会导致设备打开出错而造成系统崩溃。 check_disk_change(inode->i_rdev);//首先检查该块设备是否发生了变化,比如已经被移除了(该设备不可能,所以//此处没有用if来判断,只是形式的调用了一下该函数。 if (!blkdemo_dev[num].data)//然后判断该设备的数据存储区域是否已经被释放掉了 return –ENOMEM; //如果是,则返回,告知系统该设备无法打开,-ENOMEM是一个内核中定义的宏,它代表的意思是//“error,no memory”。 }//如果上述情况均未发生,一切正常,则打开设备,对于这个虚拟的块设备,其实没有什么好打开的,不过还是意思一下:blkdemo_dev[num].use_cnt++; //将设备的使用计数加1,表示又多了个程序使用该设备。 MOD_INC_USE_COUNT; //并且将内核所管理的模块使用计数也加1,好让内核也知道多了一个程序使用该虚拟设备模块。模块使//用计数是内核管理模块时要用的,只有当一个设备的模块使用计数为0时才能卸载该模块,这个值也可以通过lsmod命令查看到return(0);//返回0,表示设备已成功打开 } 虚拟块设备的释放函数(release()): int blkdemo_release(struct inode *inode, struct file *filp) {//释放并不代表将此设备从内核中移除了,他是对调用它的程序而言的,只表示这个程序不再使用该设备了int num;

风扇驱动系统

派克的 风扇驱动系统
Hydraulics Group (Europe) 1
用于冷却的风扇驱动
热的 流体
冷空气
冷的 流体
暖空气
当需要时, 当需要时, 风扇以最大效率驱动空气流动
驱动风扇的功率与冷却器散热功率的比率约为1:20。 该比率取决于驱动系统的效率, 该比率取决于驱动系统的效率,散热器的效率, 散热器的效率,散热器前后的空气压降和环境温度。 散热器前后的空气压降和环境温度。 散热器前后气体压降与风扇的效率和转速及进出散热器气体的设计流体通道有关。 散热器前后气体压降与风扇的效率和转速及进出散热器气体的设计流体通道有关。
Hydraulics Group (Europe) 2
1

风扇驱动系统… 哪些行走机械使用风冷? 哪些行走机械使用风冷?
非公路车辆(推土机, 推土机,两头忙, 两头忙,矿用自卸车, 矿用自卸车,等) 农业机械 火车(发电机及变速箱冷却和空调系统) 发电机及变速箱冷却和空调系统) 军用车辆 公路车辆(巴士, 巴士,卡车, 卡车,等)
Hydraulics Group (Europe) 3
热量的产生 执行机构, 执行机构,转向 及风扇驱动液压系统 80 至 50 C 占冷却能力的20%
O
空调 至 21 C 占冷却能力的5%
35
O
发电机冷却水 100 至 90 C 占冷却能力的45%
O
变速箱及 减速器 105 至 85 C 占冷却能力的30%
O
冷热气调节器 160 至 50 C 占冷却能力的25%
O
Hydraulics Group (Europe)
4
2

《虚拟仪器与LabVIEW程序设计》章节思考与练习题含答案(大学期末复习资料)

第1章虚拟仪器概述 1.测试测量仪器发展至今经过了那些阶段? 答:经历了4个阶段,即:第一代模拟式仪器(或指针式仪器)、第二代数字式仪器、第三代智能仪器、第四代虚拟仪器。 2.什么是虚拟仪器,它有哪些特点? 答:虚拟仪器是指在以计算机为核心的硬件平台上,其功能由用户设计和定义,具有虚拟仪器面板,其测试功能由测试软件实现的一种计算机仪器系统。 特点:虚拟含义主要有两点:1、仪器面板是虚拟的,通过调用控件选板中的控件实现 3.简述虚拟仪器的系统组成? 答:虚拟仪器系统由硬件平台和软件平台两大部分完成: 硬件平台:计算机、I/O接口设备;软件平台: 4.简述虚拟仪器的软件层次结构? 答:测试管理层:用户及仪器设备等管理。 应用程序开发层:用户根据仪器功能需求开发设计的虚拟仪器程序。 仪器驱动层:完成对特定仪器的控制和通信的程序集合。 I/O总线驱动层:完成对仪器寄存器进行直接存储数据操作,并为仪器设备与仪器驱动程序提供信息传递的底层软件。 第2章一个简单VI的设计 1.输入两个数,求两个数的和差运算,并显示结果。

2.程序运行中,用旋钮控件改变图形曲线的颜色。建立波形图表的属性节点,改为可写,并指定为曲线Plot的颜色Color属性。 第3章几种常用的程序结构 1.创建一个VI产生100个随机数,求其最小值和平均值。

2.创建一个VI,每秒显示一个0到1之间的随机数。同时,计算并显示产生的最后四个随机数的平均值。只有产生4个数以后才显示平均值,否则显示0。每次随机数大于0.5时,使用Beep.vi产生蜂鸣声。 3.求X的立方和(使用For和While循环)。 4.编程求1000内的“完数”。“完数”指一个数恰好等于它本身的因子之和。例如28=14+7+4+2+1。

虚拟字符驱动设备程序

虚拟字符驱动设备 一、内容提要: 编写一个完整的字符设备驱动程序。由于这类驱动程序适合于大多数简单的硬件设备,我们首先实现一个字符设备驱动程序。Linux 下的设备驱动程序被组织为一组完成不同任务的函数的集合,在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作,如open()、close()、read()、write()等。 然后Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。 由于驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作.并调用 register_chrdev()函数注册字符设备: static int__init gobalvar_init(void){ if(register_chrdev(MAJOR_NUM,"gobalvar",&gobalvar_fops) ) { //…注册失败 }else { //…注册成功 } } 其中,register_chrdev函数中的参数MAJOR_NUM为主设备号,"gobalvar"为设备名,gobalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当gobalvar模块被加载时,gobalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。 与模块初始化函数对应的就是模块卸载函数,需要调用

LabVIEW和声卡控制系统程序设计

LabVIEW和声卡控制系统程序设计 1 引言 目前,控制系统的编程软件非常多,各类编程语言也数不胜数,具有代表性的有C语言、C++及汇编语言等,相比LabVIEW软件来讲,由于他们具有严格的语言逻辑以及语言规则,所有在设计、实践中往往比较复杂,而LabVIEW作为一种G语言,以图形,线条,结点的形式进行编程,简单易学。而且图形所表示的功能已经用完善的代码集成过,拿来就用,也节省了大量的工作任务。声卡作为一种普遍而且常用的材料,能够在LabVIEW自带的声卡VI中得到更好的运用和体现,二者结合是作为平面控制系统最实用的,最方便的,而且成本较低的体现。 2 LabVIEW软件介绍 LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是它与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G 编写程序,产生的程序是框图的形式。用图标代替文本行创建应用程序的图形化编程语言,LabVIEW采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。VI指虚拟仪器,是LabVIEW的程序模块。虚拟仪器

具备很好的数据采集、仿真、数字信号处理的功能。LabVIEW 拥有专门用于控制领域的模块――LabVIEWDSC以及 NI-Motion。除此之外,工业控制领域常用的设备、数据线等通常也都带有相应的LabVIEW驱动程序。使用LabVIEW可以非常方便的编制各种控制程序。 3 声卡介绍 3.1 PCI声卡 PCI声卡就是指采用PCI接口的独立声卡,PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。从结构上看,PCI是在CPU 的供应商和原来的系统总线之间插入的一级总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。 3.2 USB声卡 USB声卡在原理上和结构上与普通的板载声卡很相似,但是由于USB具有其外置特点,他就没有了电路体积的限制,所以他能够通过复杂的模拟电路并采用更好的屏蔽设计从 而提高音质。脱离机箱,拥有不错的音质使他在性能上,实用性上得到了很大的提升,价格也相对较低,因此我们采用的是USB声卡作为平面控制系统的输出部分。 4 LabVIEW程序设计

《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》 大作业 WDM驱动程序的开发流程和要点班级:计算机科学与技术1004

摘要 DWDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。它源于 Windows NT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、电源管理( PM ,Power Management )、Windows管理诊断( WMI ,Windows Management Instrumentation )和 NT 事件。它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM将成为主流的驱动模式。WDM是Windows98和Windows2000使用的新的驱动程序设计规范。使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。 关键词: WDM、驱动程序、操作系统

1 概述 WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。相对于以前的KDM、VXD来说,它的性能更高、系统之间移植更加方便。随着Microsoft的操作系统的不断升级,WDM已逐步取代了KDM、VXD,成为了Microsoft系统下驱动程序开发的主流。 WDM是通过一个128位的全局唯一标识符(GUID)实现驱动程序的识别。应用程序与WDM 驱动程序通信时,应用程序将每个用户请求形成I/O请求包(IRP)发送到驱动程序。驱动程序识别出IRP请求后指挥硬件执行相应操作。 2 WDM驱动模型 WDM模型为存在于Windows 98和Windows 2000操作系统中的设备驱动程序提供了一个参考框架。尽管对于最终用户来说这两个操作系统非常相似,但它们的内部工作却有很大不同。 Windows 2000概述 图1是以我的视点所看到的Windows 2000操作系统,该图着重了驱动程序开发者所关心的特征。软件要么执行在用户模式中,要么执行在内核模式中。当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile 函数。然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。

相关文档
最新文档