iCAN主站函数库及其使用.docx
《iCAN主站函数库及其使用.docx》由会员分享,可在线阅读,更多相关《iCAN主站函数库及其使用.docx(39页珍藏版)》请在冰豆网上搜索。
iCAN主站函数库及其使用
第4章iCAN主站函数库及其使用
4.1主站卡类型
可作为iCAN网络主站卡的ZLGCAN系列接口卡类型如下:
设备名称
设备类型号
PCI5121
1
PCI9810
2
USBCAN1
3
USBCAN2
4
PCI9820
5
PCI5110
7
CANlite(CANmini)
8
ISA9620
9
ISA5420
10
PC104-CAN
11
DNP9810
13
PCI9840
14
PC104-CAN2
15
4.2函数调用错误码
名称
值
描述
ICANOK
0x00000000
操作正确
ICANERR_FUNCNOTEXIST
0x00000001
功能码不存在
ICANERR_SRCNOTEXIST
0x00000002
资源不存在
ICANERR_CMDNOTSUPPORT
0x00000003
命令不支持
ICANERR_CMDILLEGAL
0x0000004
参数非法
ICANERR_CONNECTNOTEXIST
0x00000005
连接不存在
ICANERR
0x000000f1
不确定的错误
ICANERR_USING
0x000000f3
资源被占用
ICANERR_SETCAN
0x000000f4
打开设备失败或初始化CAN失败
ICANERR_SRVSTARTED
0x000000f5
服务已启动,无法进行此项操作
ICANERR_TIMEOUT
0x000000f6
操作超时
ICANERR_ITEMEXIST
0x000000f7
目标已经存在
4.3数据结构说明
4.3.1ROUTECFG
此数据结构用来设置初始化iCAN网络所需要的一些必要参数,声明如下:
typedefstruct_tagRouteCfg
{
intiCardType;//CAN接口卡类型
intiCardInd;//CAN接口卡序号
intiCANInd;//CAN路数
WORDwCANBaud;//0x311c-10K,0x041c-100K,0x001c-500K
WORDwMasterID;//iCAN网络主站ID
intiMasterCycle;//iCAN网络主站定时循环参数,范围1到255,单位为10ms
}ROUTECFG;
4.4iCAN网络控制函数说明
4.4.1Mgr_AddRoute
描述
调用此函数添加一个新的iCAN网络到iCAN系统中。
DWORD__stdcallMgr_AddRoute(ROUTECFGcfg,HANDLE*phRoute);
参数
cfg
所要添加的iCAN网络初始化参数。
phRoute
新iCAN网络句柄指针,用以存储返回的新iCAN网络句柄。
返回值
正确为ICANOK,否则为错误码。
4.4.2Mgr_DelRoute
描述
调用此函数从iCAN系统中删除一个iCAN网络。
DWORD__stdcallMgr_DelRoute(HANDLEhRoute);
参数
hRoute
所要删除的iCAN网络句柄。
返回值
正确为ICANOK,否则为错误码。
4.4.3Mgr_DelAllRoute
描述
调用此函数删除iCAN系统中所有iCAN网络。
DWORD__stdcallMgr_DelAllRoute();
参数无。
返回值
正确为ICANOK,否则为错误码。
4.4.4Mgr_StartSys
描述
调用此函数启动iCAN系统。
DWORD__stdcallMgr_StartSys();
参数
无。
返回值
正确为ICANOK,否则为错误码。
4.4.5Mgr_StopSys
描述
调用此函数停止iCAN系统。
DWORD__stdcallMgr_StopSys();
参数无。
返回值
正确为ICANOK,否则为错误码。
4.4.6Mgr_IsStarted
描述
调用此函数判断iCAN系统是否已经启动。
DWORD__stdcallMgr_StopSys();
参数无。
返回值已经启动为1,否则为0。
4.5iCAN网络函数说明
4.5.1Route_AddSlave
描述
调用此函数往指定iCAN网络中添加一个从站。
DWORD__stdcallRoute_AddSlave(HANDLEhRoute,DWORDSlaveID,HANDLE*phSlave);
参数
hRoute
指定要添加从站的iCAN网络句柄。
SlaveID
要添加的从站ID。
phSlave
新从站句柄指针,用以存储返回的新从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.5.2Route_DelSlave
描述
调用此函数从指定iCAN网络中删除一个从站。
DWORD__stdcallRoute_DelSlave(HANDLEhRoute,HANDLEhSlave);
参数
hRoute
指定要删除从站的iCAN网络句柄。
phSlave
要删除的从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.5.3Route_DelAllSlave
描述
调用此函数从指定iCAN网络中删除所有从站。
DWORD__stdcallRoute_DelAllSlave(HANDLEhRoute);
参数
hRoute
指定要删除从站的iCAN网络句柄。
返回值
正确为ICANOK,否则为错误码。
4.5.4Route_SetConfig
描述
调用此函数设置指定iCAN网络配置参数。
DWORD__stdcallRoute_SetConfig(HANDLEhRoute,ROUTECFGcfg);
参数
hRoute
指定iCAN网络句柄。
cfg
配置参数。
返回值
正确为ICANOK,否则为错误码。
4.5.5Route_GetConfig
描述
调用此函数获取指定iCAN网络配置参数。
DWORD__stdcallRoute_GetConfig(HANDLEhRoute,ROUTECFG*pcfg);
参数
hRoute
指定iCAN网络句柄。
pcfg
配置参数指针,存储返回的配置参数。
返回值
正确为ICANOK,否则为错误码。
4.5.6Route_GetSlavebyID
描述
调用此函数获取指定iCAN网络从站句柄。
DWORD__stdcallRoute_GetSlavebyID(HANDLEhRoute,DWORDSlaveID,HANDLE*phSlave);
参数
hRoute
指定iCAN网络句柄。
SlaveID
指定从站ID。
phSlave
从站句柄指针,存储返回的从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.5.7Route_ConnectAllSlaveAsync
描述
调用此函数连接所有已添加从站,此操作为异步操作,调用此函数后可调用
Slave_IsConnected函数来查询从站是否已连接。
DWORD__stdcallRoute_ConnectAllSlaveAsync(HANDLEhRoute);
参数
hRoute
指定iCAN网络句柄。
返回值
正确为ICANOK,否则为错误码。
4.6iCAN网络控制从站函数说明
4.6.1Slave_Connect
描述
调用此函数连接指定从站。
DWORD__stdcallSlave_Connect(HANDLEhSlave);
参数
hSlave
指定从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.6.2Slave_Disconnect
描述
调用此函数断开指定从站。
DWORD__stdcallSlave_Disconnect(HANDLEhSlave);
参数
hSlave
指定从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.6.3Slave_IsConnected
描述
调用此函数判断指定从站是否已经连接。
DWORD__stdcallSlave_IsConnected(HANDLEhSlave);
参数
hSlave
指定从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.6.4Slave_GetID
描述
调用此函数获取指定从站ID。
DWORD__stdcallSlave_GetID(HANDLEhSlave);
参数
hSlave
指定从站句柄。
返回值
正确为ICANOK,否则为错误码。
4.6.5Slave_GetIODataLen
描述
调用此函数获取指定从站IO数据长度。
DWORD__stdcallSlave_GetIODataLen(HANDLEhSlave,DWORD*pDI,DWORD*pDO,DWORD*
pAI,DWORD*pAO);
参数
hSlave指定从站句柄。
pDI
存储DI数据长度。
pDO
存储DO数据长度。
pAI
存储AI数据长度。
pAO
存储AO数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.6Slave_GetAIData
描述
调用此函数获取指定从站AI数据。
DWORD__stdcallSlave_GetAIData(HANDLEhSlave,BYTE*pRecbuf,DWORD*pReclen);
参数
hSlave指定从站句柄。
pRecbuf
接收数据缓冲区指针,接收缓冲区大小必须大于或等于AI数据字节长度。
pReclen
输入为接收缓冲区长度,输出为接收到的数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.7Slave_GetDIData
描述
调用此函数获取指定从站DI数据。
DWORD__stdcallSlave_GetDIData(HANDLEhSlave,BYTE*pRecbuf,DWORD*pReclen);
参数
hSlave指定从站句柄。
pRecbuf
接收数据缓冲区指针,接收缓冲区大小必须大于或等于DI数据字节长度。
pReclen
输入为接收缓冲区长度,输出为接收到的数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.8Slave_GetData
描述
调用此函数从指定从站接收数据。
DWORD__stdcallSlave_GetData(HANDLEhSlave,DWORDSourceID,BYTE*pRecbuf,DWORD
*pReclen);
参数
hSlave
指定从站句柄。
SourceID
资源ID。
DI最大长度为32字节,资源ID范围0x00到0x1f;AI最大长度为32字节,资源ID范围0x40到0x5f。
pRecbuf接收数据缓冲区指针。
pReclen
输入为接收缓冲区长度,输出为接收到的数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.9Slave_SendData
描述
调用此函数向指定从站发送数据。
DWORD__stdcallSlave_SendData(HANDLEhSlave,DWORDSourceID,BYTE*pSendbuf,DWORD
Sendlen);参数hSlave
指定从站句柄。
SourceID
资源ID。
DO最大长度为32字节,资源ID范围0x20到0x3f;AO最大长度为32字节,资源ID范围0x60到0x7f。
pSendbuf发送数据缓冲区。
Sendlen发送数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.10Slave_SetConfig
描述
调用此函数对从站进行配置操作。
此函数在当前版本中可不用。
DWORDstdcallSlave_SetConfig(HANDLEhSlave,DWORDSourceID,DWORD*pSubsourceID,BYTE*pSendbuf,DWORDSendlen);
参数
hSlave指定从站句柄。
SourceID
资源ID。
pSubsourceID
资源ID子索引号指针,为NULL时表示没有子索引号。
pSendbuf
发送数据缓冲区。
Sendlen
发送数据长度。
返回值
正确为ICANOK,否则为错误码。
注:
配置资源ID列表,RO表示只读,R/W表示可读写
SourceID
Bytes
Function
Attrib
Description
SubsourceID
0xE0~0xE1
2
VendorID
RO
厂商代码,固定值
-
0xE2~0xE3
2
ProductType
RO
产品类型,固定值
-
0xE4~0xE5
2
ProductCode
RO
产品型号,固定值
-
0xE6~0xE7
2
HardwareVersion
RO
产品硬件版本
-
0xE8~0xE9
2
FirmwareVersin
RO
产品固件版本
-
0xEA~0xED
4
SerialNumber
RO
4字节产品SN号码
-
0xEE
1
MACID
R/W
本机节点的ID编号
0xF5
1
CyclicMaster
R/W
主站通讯定时参数
时间单位为:
10ms
-
0xF7
1
MasterMACID
R/W
主站MACID
-
0xFA~0xFF
6
Reserve
-
-
-
4.6.11Slave_GetConfig
描述调用此函数获取从站配置。
DWORDstdcallSlave_GetConfig(HANDLEhSlave,DWORDSourceID,DWORD*pSubsourceID,BYTE*pRecbuf,DWORDReclen);
参数
hSlave指定从站句柄。
SourceID资源ID。
pSubsourceID资源ID子索引号。
pRecbuf接收数据缓冲区。
Reclen接收数据长度。
返回值
正确为ICANOK,否则为错误码。
4.6.12Slave_SetCycle
描述
设置从站的定时循环周期,默认为ROUTECFG.iMasterCycle。
DWORD__stdcallSlave_SetCycle(HANDLEhSlave,DWORDdwCycle);
参数
hSlave指定从站句柄。
dwCycle
定时循环周期,范围1到255,单位10ms。
返回值
正确为ICANOK,否则为错误码。
4.6.13Slave_GetCycle
描述
获取从站的定时循环周期。
DWORD__stdcallSlave_GetCycle(HANDLEhSlave);
参数hSlave指定从站句柄。
返回值返回从站的定时循环周期。
4.7系统操作流程
如图4.1所示:
图4.1系统操作流程
第5章iCAN综合教学实验平台软件设计
5.1建立单文档工程并添加模块z
5.1.1建立单文档工程
首先,启动VC,选择菜单“File”->“New…”菜单项,此时弹出新建工程对话框,如图5.1所示:
图5.1创建工程
选择MFCAppWizard(exe),设置好工程名称以及路径,然后点击“OK”按钮,在弹出页面中选择“Singledocument”,接下来一直点击弹出页面中的“Next”按钮到最后一个页面点击“Finish”按钮,成功创建工程,如图5.2所示:
图5.2创建工程
编译运行如图5.3所示:
图5.3编译
5.1.2添加2404模块
依次点击ResourceView->Dialog,在其上点右键InsertDialog,结果如图5.4图5.5所示:
图5.4添加模块图5.5添加模块
我们修改下2404对话框的属性和界面,如图5.6所示:
图5.6修改界面
好了,这样我们就把2404模块的界面设计好了,下面先介绍怎么调用这个对话框,
在2404对话框上点击右键,点ClassWizard来注册这个类,依次按图5.7,图5.8,图5.9,图5.10设置
图5.7注册
图5.8注册
图5.9注册
图5.10注册
在图5.10上点OK,注册完成。
5.1.3添加菜单并响应消息
下面在主窗口中添加一个选项,依次点击ResourceView->Menu->IDR_MAINFRAME如图5.11所示:
图5.11添加菜单
接着点击编辑在下拉列表中添加一个选项,如图5.12所示
图5.12添加菜单
为了让它能响应消息,我们在其上点右键ClassWizard,在弹出的对话框中选择MessagesCommandAddFuction,在弹出的对话框中点OK,然后EditCode,进入函数编辑。
依次如下图5.13图5.14图5.15图5.16图5.17所示:
图5.13编辑
图5.14编辑
图5.15编辑
图5.16编辑
图5.17编辑
下面我们来添加消息响应函数,首先在MainFrm.cpp中包涵iCAN2404.h头文件
#include"stdafx.h"
#include"Dialog1.h"
#include"MainFrm.h"
#include"iCAN2404.h"
然后在函数On2404添加如下代码:
voidCMainFrame:
:
On2404()
{iCAN2404*pDlg2404=newiCAN2404;
pDlg2404->Create(IDD_iCAN2404,this);
pDlg2404->ShowWindow(SW_SHOW);
}
好了,编译并运行,效果如图5.18,图5.19所示:
图5.18运行
图5.19运行
5.1.42404模块基本功能的实现
以上运行后2404模块只有一个框架,没有实现功能,下面我们就一步步添加。
首先添加iCAN主站函数库到工程,接下来要把iCAN主站函数库添加到工程中,先把文件icandllheader.h,icandll.lib,icandll.dll,controlcan.dll和文件夹kerneldlls一起拷贝到工程目录中,如图5.20所示:
图5.20添加文件
然后在VC中把工作视图切换到“FileView”,导入头文件,如图5.21图5.22:
图5.21导入文件图5.22导入文件
重复以上操作弹出添加文件对话框,文件类型选择“LibraryFiles(.lib)”,添加文件。
在视图“FileView”中,双击类文件名称iCAN2404.cpp和MainFrm.cpp在文件头部添加如下:
#include"icandllheader.h"
并在iCAN2404.cpp中添加:
#include"MainFrm.h"
转到ResourceView视图,如同添加2404选项一样在Menu中添加“启动系统”选项,并注册和增加函数,点确定,如图5.23:
图5.23编辑函数
为CMainFrame增加如下公共变量,
HANDLEm_hSlave;//存储从站句柄
BYTEm_bStarted;//标志是否已经启动系统
HANDLEm_hRoute;//存储iCAN网络句柄
在OnCreate中初始化:
m_bStarted=0;bt搜索
m_hRoute=INVALID_HANDLE_VALUE;
m_hSlave=INVALID_HANDLE_VALUE;
编辑函数OnStartSys如下:
voidCMainFrame:
:
OnStartSys()
{
if(m_bStarted)
{
Mgr_StopSys();
Mgr_DelAllRoute();
m_hRoute=INVALID_HANDLE_VALUE;
m_hSlave=INVALID_HANDLE_VALUE;
m_bStarted=0;
}
else
{
ROUTECFGcfg;
cfg.iCANInd=0;
cfg.iCardInd=0;
cfg.iCardType=VCI_USBCAN2;
cfg.iMasterCycle=10;
cfg.wCANBaud=0x001c;
cfg.wMasterID=0;
Mgr_AddRoute(cfg,&m_hRoute);
if(Mgr_StartSys()!
=ICANOK)
{
MessageBox("系统启动失败!
\n请检查硬件连接!
");
}
else
{
m_bStarted=1;
}
}
}
在iCAN2404.h中添加如下公共变量:
BYTEm_Started;
HANDLEm_Slave;
HANDLEm_Route;
初始化变量:
m_Slave=((CMainFrame*)AfxGetMainWnd())->m_hSlave;
m_Started=((CMainFrame*)AfxGetMainWnd())->m_bStarted;
转到ResourceView视图,选择2404对话框,双击对话框界面上的“上线”按钮,弹出添加点击函数提示框,如图5.23所示设置:
图5.23添加函数
点“OK”按钮,确认添加,此时“iCAN2404.cpp”文件会自动打开并定位到刚才添加的函数位置
voidiCAN2404:
:
OnLine()
{
if(Slave_Connect(m_Slave)!
=ICANOK)
{
MessageBox("连接失败","错误");
}
}
5.1.5效果演示
这样就实现了系统的启动和2404的上线功能,运行效果如图5.24图5.25,当然由于没连接硬件,所以启动失败。
图5.24运行
图5.25运行
其他模块和其他功