实验一CAN总线技术与iCAN模块实验实验报告学院:自动化学院专业:自动化专业班级:2010211410姓名:高娃姚雷阳学号:2011211975 2011211977指导老师:杨军一.实验名称:实验一CAN总线技术与iCAN模块实验二.实验设备:计算机、CAN总线系列实验箱、测控设备箱、万用表。
三.实验过程、实验内容、实验记录:(1)驱动程序安装USBCAN-2A接口卡的驱动程序需要自己手动进行安装,驱动程序已经存放于实验准备内容中。
找到驱动程序,直接点击进行安装即可。
安装完成后,在“管理->设备管理器->通用串行总线控制器”中查看驱动是否安装成功。
注意:安装驱动程序过程中PC机不能连接USB电缆。
(2)iCANTEST安装与运行iCANTEST安装与运行后,利用iCANTest软件对iCAN系列各模块进行验证性测试,可以测试各模块是否可以通过USBCAN-2A接口卡与PC机正常连接与通信以及进行简单的测控操作。
(3)各种iCAN模块的测试1. 打开iCANTest软件(老师,我们当时觉得安装这些过程太简单了,没意识到截图,所以引用了一些PPT上的图像,但后面测试部分的都是自己的截图,希望老师谅解。
)在工具栏中点击“系统配置”,在弹出的对话框中设置通信信息。
如下图:图12. 点击“搜索”,则CAN总线中连接的所有模块应该被搜索出来,列表显示。
包括模块设置的MACID。
图 23.图示为搜索完成后的显示状态,在从站列表中将所有模块予以显示。
点击某个模块,则弹出该模块的操作窗口。
图 34. 点击“启动”,再点击“全部上线”。
在从站列表中所有上线的模块标志变成绿色的三角,表示该模块上线成功。
图 45.试验各个模块的基本输入输出功能。
※点击继电器模块2404的4个输出,听到继电器动作声音。
图 5※连接4210D/A模块的通道0到4017A/D模块的通道5,输入0x8000对应得到5V的电压输出。
图 6图7※使用4055—8入/8出模块连接按钮作为I/O输入,连接指示灯和继电器作为I/O 输出。
首先,连接好24V直流电源。
图8图9然后,选择1个指示灯、1个继电器连接4055模块的DOUT0、DOUT1,选择1个按钮连接4055模块的DIN0。
图10最后,用鼠标点击4055窗口上的DO输出灯(对应DOUT0、DOUT1),可控制指示灯的亮灭及继电器的动作。
当目标箱上的按钮按下时,DI的指示灯会变化(对应DI0)。
图11※将温湿度传感器连接至4017A/D模块。
图12图13通过4017A/D模块的操作窗口,观察通道0和通道1的电压值,通过温湿度传感器的参数说明,换算出温度和湿度值。
图14通道0和通道1的电压值分别为:5.596V,4.740V;因为如下接线图所示,可知通道0和通道1的电压值分别表示温度和湿度。
图15实际温度:{(5.596V÷500ῼ)÷(20mA-4mA)}×50℃=34.975℃实际湿度:{(4.740V÷500ῼ)÷(20mA-4mA)}×100%RH=59.25%RH(4)有关iCAN4055功能模块的简单功能实现的整体代码1.在生成的类头文件Sample4055dlg.h中的类CSample4055中添加申明变量:public:unsigned char buf[1];//发送数据的数据缓存区unsigned char recbuf[1];//接受数据的数据缓存区unsigned long len;int outvalue;int count;CString str;2.在Sample4055.cpp文件中编写控制代码对变量的定义:ROUTECFG cfg;HANDLE hRoute=0; //新的ICAN网络HANDLE hSlave4055=0;//数字量输入输出模块4055,MACID=1 CSample4055::CSample4055(CWnd* pParent /*=NULL*/) : CDialog(CSample4055::IDD, pParent){buf[0]=0;recbuf[0]=0;count=0;len=0;str="";}3.添加每个控件消息响应函数的代码:※启动按钮消息响应函数void CSample4055::OnStartsysButton1(){// TODO: Add your control notification handler code herecfg.iCardType=4;//使用usbcan2接线口cfg.iCardInd=0;//卡序号cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期cfg.wMasterID=0; //主站IDMgr_AddRoute(cfg,&hRoute);//添加iCAN网络if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK{MessageBox("系统启动失败");}else{MessageBox("CAN网络已启动");}}※链接按钮消息响应函数void CSample4055::OnLink4055Button2(){if(Mgr_IsStarted()!=1){MessageBox("系统未启动或启动失败,请先启动CAN网络");}else{// TODO: Add your control notification handler code hereRoute_AddSlave(hRoute,1,&hSlave4055);//添加从站4055,MACID=1if(Slave_Connect(hSlave4055)!=ICANOK)//判断从站4055是否连接成功{MessageBox("4055连接失败");}else{MessageBox("4055连接成功");}SetTimer(1,1000,NULL);//设定开启定时循环,1代表消息事件id,1000表示1000ms即1s}}※定时器消息响应函数void CSample4055::OnTimer(UINT nIDEvent) //Timer事件函数{// TODO: Add your message handler code here and/or call defaultif(nIDEvent==1){len=1;Slave_GetDIData(hSlave4055,recbuf,&len); //读取4055数字量输入端口数据str.Format("0x%02x",recbuf[0]);m_getDI.SetWindowText(str);count=count+1;CDialog::OnTimer(nIDEvent);}}※设置按钮消息响应函数,设置4055DO通道控制状态值void CSample4055::OnButtonSetvalue() //设定4055数字量输出端口值{// TODO: Add your control notification handler code hereif((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4055)==1)){UpdateData(true);outvalue=strtol(m_invalue,NULL,16);//按十六进制进行读取if(outvalue >= 0 && outvalue <= 255){buf[0]=(unsigned short)strtol(m_invalue,NULL,16);Slave_SendData(hSlave4055,0x20,buf,1);//发送数据}else{MessageBox("请输入00~FF之间的十六进制数");}}else{MessageBox("系统未启动或从站未连接,请查看后再进行操作");}}(5)iCAN4055模块自编程序运行结果与界面截图图16图17(6)2路模拟量输出模块iCAN4210的编程使用1. 在Sample4210.cpp文件中编写控制代码对变量的定义:ROUTECFG cfg;HANDLE hRoute=0; //新的ICAN网络HANDLE hSlave4210=0;//MACID=22.添加每个控件消息响应函数的代码:※启动按钮消息响应函数void CSample4210::OnBUTTONStartCANSys(){// TODO: Add your control notification handler code herecfg.iCardType=4;//使用usbcan2接线口cfg.iCardInd=0;//卡序号cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期cfg.wMasterID=0; //主站IDMgr_AddRoute(cfg,&hRoute);//添加iCAN网络if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK{MessageBox("系统启动失败");}else{MessageBox("CAN网络已启动");}}※链接按钮消息响应函数void CSample4210::OnButtonLink4210(){// TODO: Add your control notification handler code hereif(Mgr_IsStarted()!=1){MessageBox("系统未启动或启动失败,请先启动CAN网络");}else{// TODO: Add your control notification handler code hereRoute_AddSlave(hRoute,2,&hSlave4210);//添加从站4210;MACID=2if(Slave_Connect(hSlave4210)!=ICANOK)//判断从站4210是否链接成功{MessageBox("4210连接失败");}else{MessageBox("4210连接成功");}}}※确定按钮消息响应函数void CSample4210::OnButtonCanok(){if((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4210)==1))//如果系统启动成功且从站4210链接成功{unsigned char buf[32]={0};UpdateData(true);//更新数据if(m_setch0>=0.0&&m_setch0<=10.0)//如果通道0的数据在0~10之间{buf[1]=(unsigned short)(m_setch0/10)*65535;buf[0]=(unsigned short)((m_setch0/10)*65535)>>8;}else{MessageBox("提示:请输入0~10V电压");}if(m_setch1>=0.0&&m_setch1<=10.0)//如果通道1的数据在0~10之间{buf[3]=(unsigned short)(m_setch1/10)*65535;buf[2]=(unsigned short)((m_setch1/10)*65535)>>8;//将buf[3]向右移8位}else{MessageBox("提示:请输入0~10V电压");}Slave_SendData(hSlave4210,0x60,buf,4);}else{MessageBox("系统未启动或从站未连接,请查看后再进行操作");}}(7)iCAN4210模块自编程序运行结果与界面截图图18(8)8路模拟量输入模块iCAN4017编程使用1. 在生成的.h头文件中添加使用到的变量的申明:public:unsigned char recbuf[16];unsigned long len;int count;2. 在.cpp文件中首先添加iCAN网络定义和申明以及变量的初始化操作。