基于VC供Labview调用的CAN卡驱动设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创 新
图 1 分布式控制系统结构简图
孟 诏: 硕士研究生 基金项目: 北京市科委 2005 年度科技重大项目 ( DO305001040621) 和北京市先进制造技术 重点实验室开放基金( kp0100200201)
《P LC 技术应用 200 例》
图(a)
图(b)
图 2 API 调用函数顺序流程图
您的论文得到两院院士关注 文章编号:1008- 0570(2008)09- 1- 0177- 03
驱动与传动
基于 VC 供 La b vie w 调用的 CAN 卡驱动设计
De s ig n o f CAN- La b vie w co m p a tib le d rive r b a s e d o n VC
extern char* Receive(UINT port); extern"C"_declspec(dllexport) char* dll_Receive(UINT port) { char* r; r=Receive(port); return r; } 其中 port 为 所打 开 的 CAN 卡的 端 口 号, CAN_MSG 为 定 义 的 结 构 体 , 用 于 存 储 报 文 , 包 括 报 文 ID,远 程 标 志 位 rtr,数 据 长 度以及具体的数据内容, 其定义如下: typedef struct { unsigned int ID; unsigned char LEN; unsigned char dummy32bit; unsigned char BUF[8]; } CAN_MSG; 最后 , 当 程序 完 成 生成 dll 文 件 的时 候 , 往 往会 出 现 这样 的 问题, 程序源文件编译成功但是在进行链接的时候会出现这样 一 个 错 误 , error LNK2001:unresolved external symbol_CanRead-
传输, 在 Labview 中又将其还原。最后程序以字符串的形式返回 所接收到的报文并将字符串存储到字符串变量 String 中。
技 术 创 新
图 3 接收程序( Receive.dll) 设计流程图 基于以上框图, Receive.dll 的 VC 源程序如下: CAN_MSG_T msg; DWORD cbReturned; char* Receive(UINT port) { char* string=new char; CANEnableEvent(port,true); CANEnableRxInt(port); CANReadFile(port,1,&msg,&cbReturned); if(cbReturned) { …… for(unsigned char i=0;i<msg.Len;i++) string[i]= Msg.data[i]; } Return string; }
( 2) 报 文 发 送 模 块 : 报 文 发 送 模 块 以 远 程 标 志 位 rtr ,报 文 ID ,数 据 字 节 长 度 dlen 以 及 8 位 数 据 作 为 输 入 参 量 , 首 先 判 断 通 讯 格式 为 Can2.0A 还 是 Can2.0B, 根 据 具 体的 规 范 来 确 定 参 数 , 在 给 远 程 标 志 位 , 报 文 ID 赋 值 之 后 , 需 要 将 8 个 数 据 字 节 整 合 成 一 维 数 组 的 形 式 作 为 发 送 模 块 的 一 个 参 数 。发 送 模 块 需 要调用 Send.dll, 其 Labview 的后框图如图 4 所示。
File, 这是因为 canbus2.0.h 里面仅有对函数的声明 , 而 所创 建 的 工程 并 不 知道 CanReadFile 函 数 的具 体 代 码在 哪 里 , 所以 导 致 了链接错误, 要解决这个问题, 需要导入库文件, 先将库文件拷 入当前文件夹里, 然后添加到工程里就可以了。
3 CAN 通 讯 卡 Labview 驱 动 程 序 接 口设计
中的 Msg.data[i]。一位做为标识位, 以此来判断该数据位是否为
0。另外, 在 CanBus2.0A 中规定 ID 为 11 位, 但是字符串中的每
一个字符仅有 8 位, 因此应该将 ID 分为两个字符来存储, 分别
邮局订阅号: 82-946 360 元 / 年 - 177 -
驱动与传动
中 文 核 心 期 刊 《 微 计 算 机 信 息 》( 测 控 自 动 化 )2008 年 第 24 卷 第 9-1 期
中图分类号: TP273
文献标识码: A
Abstr act: CAN card PCI- 1680 doesn’t provide Labview compatible driver, so it’s inconvenient to integrate CAN bus into Labview product. In this paper ,PCI- 1680 original driver is capsulated into Labview compatible driver by using VC which make it possible to built distributed control system based on Labview and CAN- BUS. Key wor ds: Labview; PCI- 1680; CAN- Bus; Dr iver
can总线是目前比较流行的一种总线它是工业过程控制系统由集散型控制系统向全数字的现场总线控制系统发展的产物广泛的应用于汽车工业过程控制纺织工业机器人数控设备医疗器械智能建筑等领域因此实现labview与can接口卡的连接并通过can总线实现对现场设备的实时监控能够更好的发挥二者的优势从而提高工业现场控制系统的实时性和准确性
4 程序调试
( 1) 调பைடு நூலகம்环境
- 178 - 360元 / 年 邮局订阅号: 82-946
《现场总线技术应用 200 例》
您的论文得到两院院士关注
驱动与传动
基 于 CAN 总 线 与 Labview 的 测 控 系 统 调 试 平 台 如 图 6 所 示, 工控机作为监控机是整个系统的核心部分, 运 行 Labview 程 序 监 控 从 站 节 点 的 状 态 。PC- CAN 适 配 卡 ( PCI- 1680) 完 成 由 CAN 总 线 到 监 控 机 的 数 据 协 议 转 换 , 智 能 节 点 由 微 处 理 器 ( P87C591) ,CAN 总 线 收 发 器 ( PCA82C250) , 接 口 电 路 以 及 外 围 设 备组 成 , 本 文在 PC 机 中 运行 WAVE 软 件 对 智 能 节 点 进 行 实 时调试, 向 CAN 总线 发 送 报文 , 同 时 观察 接 收 到的 来 自 CAN 总线的数据。
完整报文后, 该位自动置 1。需要注意的是在数据传输过程中,
当所传输的 8 位数据字节 data0- data7 中有一个值为 0 时, 其后
面的 数 值都 无 法 显示 , 这 是 由于 VC 与 Labview 对 字符 串 表 示
方式的不同所造成的, 为了解决这个问题, 每一个数据用字符
串里的两个位来表示, 一个用于存储原始数据, 也就是流程图
便 。 本 文 应 用 VC 将 PCI- 1680 的 原 始 驱 动 程 序 封 装 成 Labview 兼 容 的 驱 动 程 序 , 并 在 Labview 中 实 现 对 它 的 调 用 , 建 立 了 基
于 虚 拟 仪 器 与 CAN 总 线 的 分 布 式 监 控 系 统 。
关键词: Labview; PCI- 1680; CAN 总线; 驱动程序
图 4 Labview 调用 Send.dll 程序框图
图 5 Labview 调用 receive.dll 程序框图 ( 3) 接收模块: 接收模块则以所选择的 接 收端 口 作 为输 入 参 量, 在 接 收 缓 冲 区 接 收 到 完 整 报 文 之 后 , 接 收 模 块 调 用 re- ceive.dll, 并 将 报 文 以 字 符 串 的 形 式 返 回 , 因 此 需 要 对 字 符 串 进 行 处 理 以 确 定 接 收 到 的 ID、rtr 以 及 8 位 数 据 字 节 等 , 其 Lab- view 的后框图如图 5 所示。 ( 4) 关 闭 端 口 模 块 : 关 闭 模 块 调 用 close.dll, 进 行 关 闭 端 口 的操作, 如果关闭端口失败, 将会影响下一次程序的运行。
(北京工业大学) 孟 诏 杨 建 武 孙 树 文
MENG Zhao YANG J ian-wu S UN S hu-wen
摘要: CAN 通 信 接 口 卡 PCI- 1680 没 有 提 供 Labview 可 直 接 调 用 的 驱 动 程 序 , 这 给 虚 拟 仪 器 与 现 场 总 线 的 结 合 开 发 带 来 了 不
技
1 引言
2 PCI- 1680 通讯卡驱 动程序的 封装 术
LabView 是虚拟仪器概念的首创 者, 是美 国 National Instu- ments 公 司推 出 的 一个 图 形 化软 件 开 发环 境,近 几年 来 , Labview 以其在测控领域的独特优势而被广泛应用, 但是由于很多设备 并 没 有 提供 相 应 Labview 驱动 程 序 , 因此 许 多 单 位 只 能 购 买 NI 公司所生产硬件设备, 由于成本的因素限制了 Labview 的 推 广 。 CAN 总线是目前比较流行的一种总线 , 它 是 工业 过 程 控制 系 统 由集散型控制系统向全数字的现场总线控制系统发展的产物, 广 泛 的 应 用 于 汽 车 工 业 、过 程 控 制 、纺 织 工 业 , 机 器 人 、数 控 设 备、医疗器械、智能建筑等领域, 因此 实现 Labview 与 CAN 接 口 卡 的 连 接并 通 过 CAN 总线 实 现 对现 场 设 备 的 实 时 监 控 , 能 够 更好的发挥二者的优势, 从而提高工业现场控制系统的实时性 和 准 确 性 。 基 于 上 述 原 因 本 文 主 要 应 用 VC 开 发 出 供 Labview 调用的动态链接库文件 , 以驱 动 CAN 卡 PCI- 1680, 从而 实 现 了 PC 机与 CAN 总线之间的数据传输, 然后通过 CAN 总线连接上 位机和下位机从站, 实现了 Labview 对来自下位机 的 数 据的 接 收 与处 理 并 以此 为 基 础建 立 了 基于 虚 拟 仪 器 与 CAN 总 线 的 分 布式监控系统, 整体结构如图 1 所示。
驱 动 程 序 编 译 成 功 后 , 生 成 dll 文 件 , 就 可 以 利 用 Labview 中 自 带 的 子 程 序 call library function Node.vi 进 行 调 用, 其 中 对 CAN 卡的调用以及随后的数据通讯主要分为以下四个步骤:
( 1) CAN 卡初 始 化模 块 : 这 一模 块 主 要是 对 CAN 卡 硬 件 进 行 初 始 化 , 设 置 通 讯 参 数 , 然 后 打 开 所 选 择 的 端 口 。 将 Port、 DeviceNum、BTR0、BTR1 做 为 输 入 参 数 , 其 中 , Port 是 所 打 开 CAN 卡 的 端 口 号 , DeviceNum 是 所 选 设 备 编 号 , PCI- 1680 的 波 特率是由 BTR0 和 BTR1 两 个参 数 确 定的 。打 开 端口 需 要 调用 编制好的动态链接库文件 open.dll。
下面以数据接收程序的封装为例, 介绍一下动态链接库文
件 Receive.dll 的编写步骤, 具体程序流程图 3 所示, 其中 Ca-
nEnableEvent、CanEnableRxint、CanReadFile 均 为 所 调 用 的 PCI-
1680 原 始 函 数 , cbreturned 为 CanReadFile 中 的 标 志 位 , 当 收 到
动 态 链 接 库 (Dynamic Link Library, DLL)技 术 是 基 于 Win- dows 程序设计的一个非常重要的组成部分。动态链接库( DLL) 封装 了 共享 资 源 和代 码 , 在 开发 以 Windows 为 平台 的 应 用程 序 时 , 使 用 DLL 技 术 可 大 大 节 约 内 存 。 动 态 链 接 库 技 术 在 实 现 LabVIEW 与 CAN 接 口 卡 PCI- 1680 通 信 的 过 程 中 发 挥 了 重 要 作 用 。 PCI - 1680 驱 动 程 序 中 的 所 用 到 的 主 要 函 数 大 多 在 CANbus2.0.h 里 进行 了 声 明, 在 原 驱 动程 序 中 API 调 用 函 数 顺 序如图 2 所示( 以 CAN2.0A 为例) , 其中图( a) 为数 据 发 送流 程 , 图 2(b)为数据接收流程。