《PROFIBUSDP主站通信程序设计.docx》由会员分享,可在线阅读,更多相关《PROFIBUSDP主站通信程序设计.docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PROFIBUS-DP 主站通信程序设计通信程序 主要函数假设已经设计好了能完成某种功能的从站,就可以编写主站测试程序来测试从站的性能。下面承受 CP5611 网络接口卡,以 FBPRO-8DI 八路数字量输入智能节点为例介绍 PROFIBUS-DP 主站通信程序设计,编程环境使用VC+6.0。本程序能够完成应用程序的初始化、数据读入、数据输出和应用程序的复位等根本操作。PROFIBUS-DP 主站通信程序设计步骤为: 在 VC+6.0 下创立一个应用程序; 将 CP5611 网络接口卡供给的 DPN_USER.H 和 DPLIB.LIB 两个文件拷贝到刚刚建的工程根名目下,并且添加到应用程序
2、中; 在 VC+6.0 环境下编写通信程序。6.4.1 通信程序中主要函数介绍1. 定义变量dpn_interface dpn_ptr; /使用前必需首先定义dpn_interface 的构造:struct dpn_interfacestruct REFERENCE reference; /子构造体unsigned char stat_nr; /站地址unsigned char length; /返回数据长度unsigned short int error_code; /错误代码unsigned char slv_state; /DP 从站状态unsigned char sys_state;
3、/DP 主站状态unsigned char sys_event; /大事信息unsigned char user_data MAX_DATA_LEN;/数据区;struct REFERENCEunsigned char board_select; /CP 板卡选择设置unsigned char access; /系统访问设置;2. 初始化函数 dpn_init(&dpn _ptr)编写上位机程序时,在对 CP5611/5613 进展访问操作之前必需调用初始化函数。使用初始化函数之前,必需对该函数做一些初始化操作,其他函数使用 前也必需首先对变量初始化:dpn_ptr.reference.boa
4、rd_select=1;/选择 CP5611/5613 的板卡号,假设系统中只有一块板卡,则板卡号默认为 1dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE NTRAL);/系统中不设置高级任务和高级恳求/以上两项一般固定dpn _ptr.length=126; /lengthprofibus 网络中最大的从站地址int j=0;for( j=0;j126;j+) /设置设备读写属性if(“网络中存在该地址”)dpn_ptr.user_dataj=DPN_SLV_WRITE_REA D;/假设网络中存在本地址,则将属
5、性设置为DPN_SLV_WRITE_READ,否则为 0elsedpn_ptr.user_dataj=0;/例如 FBPRO-8DI 地址为 2,应当设置/dpn_ptr.user_data2=DPN_SLV_WRITE_READ; dpn_init(&dpn _ptr); /调用初始化函数假设有错误,可以参考初始化函数的返回值来解决。int error=dpn_ptr.error_code;有以下几种:错误代码解释如下:DPN_NO_ERROR:无错误。返回值是有效的,并且必需进展推断。DPN_ACCESS_ERROR:调用的 DP 应用程序无权写该函数或从站。DPN_APPL_LIMIT_
6、ERROR:超出多用户操作中 DP 应用程序的最大允许数目。DPN_BOARD_ERROR:CP 固件错误例如,第 2 层无法正常启动。DPN_CENTRAL_ERROR:函数必需且仅能由中心 DP 应用程序调用。DPN_CLOSE_ ERROR:关闭 DP 应用程序出错。DPN_GLB_CTRL_ERROR:调用 dpn_global_crtl函数时掌握命令的数值范围非法。DPN_LENGTH_ERROR:dpn_interface、dpn_interface_s 和dpn_interface_s_ext 构造体的元素“length”超出允许数值范围,或者dpn_out_slv、dpn_ou
7、t_slv_m 和 dpn_out_slv_m_ext 的数据长度与配置值不匹配。DPN_MEM_BOARD_ERROR:CP 上没有足够的空闲内存。DPN_MEM_HOST_ERROR:主站上没有足够的空闲内存。DPN_MODE_ERROR:当前无法执行函数调用。调用dpn_set_mode函数时发生该错误,可能是由于在转变操作方式时试图跳过一个状态。DPN_NO_DBASE_ERROR:DP 数据库无入口或入口错误。DPN_OPEN_ERROR:DP 应用程序注册错误例如未下载驱动、未插入CP等。DPN_RECEIVE_ERROR:CP 对接口驱动确实认错误。DPN_REFERENCE_D
8、IFF_ERROR:多用户方式错误。调用 dpn_init函数时, reference 构造体元素的入口与统一 CP 上注册的其他 DP 应用程序的dpn_init函数不匹配。DPN_REFERENCE_ERROR:dpn_interface、dpn_interface_m 和dpn_ifc_m_ext 构造体的元素 reference 无效。DPN_SEND_ERROR:接口驱动对 CP 的调用错误。DPN_SLV_STATE_ERROR:dpn_interface 构造体的 slv_state 元素无效。DPN_STAT_NR_ERROR:dpn_interface、dpn_interfa
9、ce_s 和dpn_interface_s_ext 构造体的元素 stat_nr 无效,或者数据库中不存在从站。DPN_SYS_STATE_ERROR:dpn_interface 构造体的 sys_state 元素无效。DPN_USER_DATA_ERROR:dpn_interface 构造体的一个或多个 user_data 数组无效。DPN_WD_EXPIRED_ERROR:DP 应用程序的运行监控信号检测到超时从而导致任务无法执行。DPN_WRONG_BOARD_ERROR:dpn_interface 构造体的 reference.board 元素无效。输入有效值1 到 4以匹配安装的 C
10、PCP_L2_1 对应 1,CP_L2_2 对应 2。DPN_LOAD_L2_VXD_ERROR:无法装载 SOFTNET CP 需要的其次层驱动。可能是由于驱动被无意从文件夹 system(Windows95 系统)或System32Driver(Windows NT 系统)中删除而造成。DPN_OPEN_L2_VXD_ERROR:无法翻开 SOFTNET CP 需要的其次层驱动。该错误在其次层驱动启动时显示。可能的缘由:总线短路,软入口已经使用, 内部 AMPRO2 错误,信息效劳器SIM9SYNC未运行。只有当时始化正确后,才能进一步进展以下操作。假设消灭错误,可能缘由有以下几种: 已经
11、调用了初始化函数,并且已经成功,但没有调用复位函数,又一次调用了初始化函数。 对 dpn_ptr.user_dataj的值超出了以下三种状态设置: DPN_SLV_WRITE_READ、DPN_SLV_READ 或 DPN_SLV_NO_ACCESS 设置了 DPN_SLV_WRITE_READ 或 DPN_SLV_READ 属性的模块没有在配置软件中进展正确配置。 dpn_ptr.reference.board_select 和 dpn_ptr.reference.access 属性设置不正确。 Set PG/PC 设置不正确,也不能初始化成功,关于它的设置见6.5.5。 没有正确安装 CP
12、5611 网络接口卡的驱动程序。 在初始化前没有将配置好的参数文件正确下载到系统中。3. 数据输出函数 dpn_out_slv(&ptr_ptr)数据输出函数将有效数据传送到 DP 从站。通过该函数可以将上位机的掌握命令发到指定的 DP 从站,完成对从站的掌握操作。例如下面程序段向地址为m_ptradd 的 DP 从站发送了八字节的有效数据。dpn_ptr.reference.board_select=1; dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CENTRAL);ptr_ptr.stat_nr=m_ptradd
13、; /从站地址ptr_ptr.length=8; /与从站的参数化数据必需全都,本例中8字节输出,8 字节输入ptr_ptr.user_data0=0;/以下是上位机 PC 到从站的 8 个字节的输出数据ptr_ptr.user_data1=0;/8 字节数据可自定义ptr_ptr.user_data2=0; ptr_ptr.user_data3=0; ptr_ptr.user_data4=0; ptr_ptr.user_data5=0; ptr_ptr.user_data6=0; ptr_ptr.user_data7=0; dpn_out_slv(&ptr_ptr);4. 数据读入 dpn_
14、in_slv(&dpn_ptr)数据输入函数读入 DP 从站的有效数据。通过该函数可以将DP 从站的数据读入到上位机,完成对从站的监控操作。例如下面程序段即读入地址为m_ptradd 的 DP 从站八字节的有效数据。dpn_ptr.reference.board_select=1; dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CENTRAL);dpn_ptr.stat_nr=m_ptradd;/从站地址dpn_ptr.length=255;/此处必需设置 255 dpn_in_slv(&dpn_ptr);/返回值a1
15、=ptr_ptr.user_data0;/以下是从站到 PC 的 8 个字节的输入数据a2=ptr_ptr.user_data1;a3=ptr_ptr.user_data2; a4=ptr_ptr.user_data3; a5=ptr_ptr.user_data4; a6=ptr_ptr.user_data5; a7=ptr_ptr.user_data6; a8=ptr_ptr.user_data7;int len=dpn_ptr.length; /返回实际数据长度int error=dpn_ptr.error_code;/返回错误代码,没有错误返回0int slvstate=dpn_ptr.
16、slv_state;/返回从站状态,有以下取值返回从站状态类型代码解释如下:DPN_SLV_STAT_OFFLINE:DP 从站不在数据传输段CP 启动 DPN_SLV_STAT_NOT_ACTIVE:从站在本地数据库中未激活DPN_SLV_STAT_READY:DP 从站处于数据传输段DPN_SLV_STAT_READY_DIAG:DP 从站处于数据传输段并且有诊断数据存在DPN_SLV_STAT_NOT_READY:DP 从站不在数据传输段DPN_SLV_STAT_NOT_READY_DIAG:DP 从站不在数据传输段并且有诊断数据存在int sysstate=dpn_ptr.sys_st
17、ate;/返回系统状态,有以下取值返回系统状态代码解释如下:DPN_SYS_OFFLINEOffline 模式:停顿与全部主站和 DP 从站的通信, FDL 从令牌环中退出。用户接口等待一个启动信号。DPN_SYS_STOPSTOP 模式:总线参数集装入 FDL,FDL 为活动状态,能处理与 2 类主站的通信。不能轮询 DP 从站。DPN_SYS_CLEARCLEAR 模式:对从站设置参数,检查通信接口配置并读取这些 DP 从站用户的数据。输出数据将被无视。DPN_SYS_OPERATEOPERATE 模式:1 类主站与指定的 DP 从站进展用户数据交换。来自 DP 从站的输入数据传送给用户,
18、用户的输出数据传送给DP 从站。用户接口退出 OPERATE 模式时,主站将通过功能 Global_Control 去除全部 DP 从站的输出。初始化函数的返回值没有错误后,可以进展其他函数的操作,但有时并不能到达我们期望的结果,比方数据不能读取到上位机,或者上位机的数据不能正确下载到从站中。初始化正确但是不能正常通信的可能缘由有以下几种: 从站没有工作。 从站电源指示灯亮,但是电源电压低,微处理器没有工作。 通信电缆没有连接好。 通信电缆太长或通信速度太快。 没有正确设置终端电阻。 地址设置不全都。5. 读取总线参数 dpn_read_bus_par(&dpn_ptr) dpn_ptr.re
19、ference.board_select=1;dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE NTRAL);dpn_ptr.length=255; /此处长度 255 固定dpn_read_bus_par(&dpn_ptr);返回值,user_data 为总线参数,总线参数的构造如下所示:6. 复位函数 dpn_reset(&dpn_ptr)退出时程序要复位dpn_ptr.reference.board_select=1; dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)
20、|(DPN_ROLE_NOT_CENT RAL);dpn_reset(&dpn_ptr);程序正确复位后 error_code0;6.4.2 主站通信程序开发实例在生疏了主要的通信函数后,下面给出FBPRO-8DI 即 8 通道隔离型数字量输入智能节点的上位机开发程序实例,例程中省略了对话框的局部初始化程序,着重给出了 PROFIBUS-DP 通信程序局部。期望能在读者进展上位机通信开发过程中,起到抛砖引玉的作用。void CMy8DIDlg:initpro /初始化dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE
21、NTRAL);dpn_ptr.reference.board_select=1;/以上两行一般固定不变dpn_reset(&dpn_ptr); /复位for(int j=0;j126;j+) /设置设备读写属性elseif(devFlagj) /网络中存在该地址dpn_ptr.user_dataj=DPN_SLV_WRITE_READ;dpn_ptr.user_dataj=0;dpn_ptr.length=126; dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE NTRAL);dpn_ptr.reference.b
22、oard_select=1;/以上两行一般固定不变dpn_init(&dpn_ptr); /调用初始化函数/初始化出错处理,错误类型参考上一节代码解释dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE NTRAL);dpn_ptr.reference.board_select=1;/以上两行一般固定不变dpn_ptr.stat_nr=addr; /八通道输入数字量数据dpn_ptr.user_data0=2; /从站地址dpn_ptr.user_data1=2; /读取从站数据命令码dpn_ptr.user_data2
23、=0; dpn_ptr.user_data3=0; dpn_ptr.user_data4=0; dpn_ptr.user_data5=0; dpn_ptr.user_data6=0; dpn_ptr.user_data7=0;dpn_ptr.length=8; /长度可设置,但必需与从站定义全都dpn_out_slv(&dpn_ptr); /调用数据输出函数,发命令给从站dpn_ptr.reference.access=(DPN_SYS_NOT_CENTRAL)|(DPN_ROLE_NOT_CE NTRAL);dpn_ptr.reference.board_select=1;dpn_ptr.stat_nr=addr; dpn_ptr.length=255;/长度值 255 固定dpn_in_slv(&dpn_ptr);/调用数据读入函数,读入从站的输入数据int len=dpn_ptr.length;int error=dpn_ptr.error_code;/返回错误代码,无错误返回 0 int slvstate=dpn_ptr.slv_state; /返回从站状态,类型参考上一节返回类型介绍
限制150内