VC++(MFC)编程(doli等控制器使用)高精度双油缸同步控制设计 - 图文

更新时间:2023-10-04 04:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

重庆大学本科学生毕业设计(论文) 摘要

摘 要

本论文设计是基于VisualC++6.0软件下实现双油缸同步控制系统的编程,探索同步控制的控制策略,并且完成高精度双油缸同步控制实验。该系统控制界面不仅简洁实用,而且具有良好的人机交流功能。

上位机控制系统所实现的功能有双油缸的通讯、UP、暂停、DOWN、停机、位移显示、曲线显示等,在完成同步控制程序后探究反馈控制策略并编写程序,实现双油缸同步控制。在接口程序编程部分,本文采用EDC220控制器提供的接口函数实现PC机与控制器通讯,数据的发送与接收采用统一通讯协议,这种方法不仅简单,而且实用。本文采用控制器作为下位机来验证上位机控制功能,控制器作为下位机主要负责两个油缸的各种参数数据的采集,然后通过端口把数据发送给上位机,PC机作为上位机主要负责数据的分析处理和显示。本文最后完成高精度双油缸同步控制实验,验证同步控制精度。

关键词:双油缸,VC++,EDC220控制器,反馈,同步控制

重庆大学本科学生毕业设计(论文) ABSTRACT

ABSTRACT

This design's core is under the software of Visual C++6.0, realizes the double hydraulic cylinder synchronous control system programming, explores control strategy of EDC220 controller, and completes experiment for high-precision double hydraulic cylinder synchronous control. This control interface has not only succinct practical, but also has the good man-machine exchange part.

The superior machine system realizes the function has the double hydraulic cylinder's Communication, Up, Pause, Down, Stop, Displacement demonstration, Curve demonstration and so on. After completing synchronous control program, exploreing the feedback control strategy and programming, and Achieve double hydraulic cylinder synchronization control. Interface programming part, EDC220 provides the use of interface functions to achieve PC-controller communication, the data transmission and the receive uses the unified communication protocol, this method is not only simple, but practical. In this article uses the EDC220 controller to confirm the superior machine control function as the lower position machine realization, the EDC220 controller as lower position machine primary cognizance double hydraulic cylinder 's each kind of parameter data gathering. Then through the port the data transmission for the superior machine, PC machine takes the superior machine primary cognizance data the analysis processing and the demonstration. Finally, completed high-precision the double hydraulic cylinder synchronous control experiment, to verify the accuracy of synchronization control.

Key words: Double hydraulic cylinder, VC++; EDC220 controller, feedback, synchronous control

II

重庆大学本科学生毕业设计(论文) 目录

目 录

摘 要 ................................................................................................................................................................... I ABSTRACT .......................................................................................................................................................... II 绪 论 .................................................................................................................................................................. 3 1 同步控制策略 ............................................................................................................................................... 5

1.1 EDC220控制器 ................................................................................................................................ 5

1.1.1 同步化模块 ......................................................................................................................... 6 1.1.2 同步系统命令 ..................................................................................................................... 7 1.1.3 同步数据处理 ..................................................................................................................... 8 1.2 MFC类库 ............................................................................................................................................ 9 1.3反馈控制 .......................................................................................................................................... 10 2 GUI设计 ........................................................................................................................................................12

2.1 主界面 .............................................................................................................................................. 12 2.2 绘图窗口 ......................................................................................................................................... 13 2.3 界面优化 ......................................................................................................................................... 17 3 接口通讯 ......................................................................................................................................................19

3.1 PC机与下位机通信方式 ............................................................................................................ 19 3.2 VC实现接口通讯方法 ................................................................................................................. 19 4 控制系统程序编写 ...................................................................................................................................22

4.1 主要接口程序 ................................................................................................................................ 22

4.1.1 接口编程 ............................................................................................................................ 22 4.1.2 通讯连接 ............................................................................................................................ 23 4.1.3 同步控制 ............................................................................................................................ 24 4.1.4 数据采集 ............................................................................................................................ 25 4.2 定时器模块 .................................................................................................................................... 26 4.3 定点状态显示 ................................................................................................................................ 27 4.4 反馈控制 ......................................................................................................................................... 28 4.5 数据处理 ......................................................................................................................................... 30

4.5.1 实时曲线绘制 ................................................................................................................... 30 4.5.2 数据显示与保存 .............................................................................................................. 31

5 验证实验 ......................................................................................................................................................33

5.1 实验设备 ......................................................................................................................................... 33

1

重庆大学本科学生毕业设计(论文) 目录

5.2 实验过程 ......................................................................................................................................... 33

5.2.1 接口程序数据传输实验 ................................................................................................ 34 5.2.2 连接设备进行通讯实验 ................................................................................................ 34 5.2.3 单个油缸运动控制实验 ................................................................................................ 34 5.2.4 两个油缸同步控制实验 ................................................................................................ 36 5.3 实验结论 ......................................................................................................................................... 36 结 论 ................................................................................................................................................................39 参考文献 ...........................................................................................................................................................40 附录A:程序 ......................................................................................................................................................42 致 谢 ................................................................................................................................................................71

2

重庆大学本科学生毕业设计(论文) 绪论

绪 论

高精度双油缸同步控制可应用于很多工业与科研领域,它也是力学真三轴试验的基础。而械及航天与航空驱动装置等对高精度的液压同步驱动技术的需要迫切。而影响同且油缸同步控制一直以来都是液压行业的一个重要课题,在绝大数的场合下设备俯仰机构采用的是双油缸驱动,但由于两个油缸在运动时活塞杆所行走的位移量不同直接导致被支撑结构出现被扭曲或受扭转载荷使得设备无法正常运行。

随着现代实验力学在航天航空技术和机械部件加工业等的发展,金属加工设备、冶金机械、工程机步精度的因素很多,比如液压缸摩擦、制造精度、外负载、泄漏、阻力、油液中气泡及结构弹性变形等,都会使得油缸运行不同步,这就突现了高精度双油缸同步控制方法研究的重要性。国内外的在同步控制及液压油缸同步控制的研究分析可知:

(1)通常传统双液压缸同步控制主要以机械刚性机械传动同步、在回路中使用节流阀、回路中使用分流阀与集流阀或调速阀、使用独立的定量泵供油、回路中采用同步马达、同步油缸等实现,它们都有一个共同点具有非线性、时变的特点,没有实现所需要的高精度同步。

(2)20世纪80年代由Robert.D.Lorenz教授和Y.Koren教授提出并发起的经典同步控制理论[1],主要分为同等方式(SMCA)、主从方式(MSA)和交叉耦合控制(CCC)。在当今工业领域仍被广泛采用。这三种经典同步控制方法适用于不同的场合,有着各自的优点。SMCA在轧机控制中有着很高的控制精度和响应速度;MSA主要应用于双缸液压系统、机器人等场合;CCC可以有效的改善被控子系统间的相互运动同步,极大提高了跟踪精度。近年来,同步控制得到了很大的发展和完善,已经形成了各种解决各类协调问题的系统化设计方法,并在各类工程领域得到了广泛的应用。随着航空航天、高级数控机床等领域中对高速高精度运动要求的提高,从经典同步控制演变出了偏差耦合控制和环形耦合控制,效果不佳而且主要用于电机同步。

(3)随着计算机技术和控制理论的发展,国内外的一些研究多数研究者将模糊控制、自适应控制、神经网络控制、计算机智能控制[2]、计算机网络控制[3]等应用到同步控制技术中,并取得了大量的研究成果,但这些研究大多还处在仿真研究的阶段离实际应用还存在一定的差距。

随着微电子技术的发展,应用上位机实现现场的采集与控制越来越被大家所重视,上位机提供良好的人机界面,使现场监控更直接、简洁可靠和稳定。应用上位机实现现场监控,主要是通过上位机本身配置的串行口,通过串行通讯技术,控制

3

重庆大学本科学生毕业设计(论文) 绪论

和管理下位机。由于上位机界面的应用给现场监控提供的极大的方便,所以上位机控制界面的设计也成为工业控制的重点内容。在Visual C++6.0界面下完成上位机的编程具有自己独特的优势,当VB成功推出后,microsoft又将C++包装成为了面向windows的visual C++(以下简称VC)。从VC1.0到VC6.0,每一个版本的推出都凸显各自优势。VC借助传统的C/C++加上microsoft强大优势,使广大的程序员和专业编程人员纷纷投靠在VC的大旗下[4]。

在遇到一些高载荷、大功率、长行程的系统是,传统的双油缸同步控制已经不能达到目的,在冶金、建筑和水利等领域中,液压同步系统已经实现了轧机同步、大型屋架整体提升及多闸门同步放落提升等技术应用,如钻机桅杆油缸的同步控制

[5]、液压工作平台升降的同步控制[6]、提升系统液压提升器同步控制等等。它们可

以完成的运动控制精度高、行程远、远非传统同步控制所能达到。基于VC的双油缸同步控制不仅能完成伸缩控制、速度控制,而且能依靠多套伺服系统的配合,完成高载荷、大功率、长行程等控制和复杂的空间曲线运动的控制。所以本文主要介绍基于VC的接口编程和控制器组成的双油缸同步控制。

在工业控制领域,往往需要组成上位机—下位机系统,上位机一般为PC机,下位机一般为下位机系统[7],或者控制器系统。上位机主要完成数据的发送、采集、显示、以及控制命令传输等,控制器做为下位机本主要负责双油缸的各种参数数据的采集和、模数转换和精度控制。

利用VC++编程上位机控制界面可以解决很多工业控制中出现的难题,传统的上位机控制界面参数给定更改比较麻烦,需要浪费大量时间从新更改程序。而VC++的上位机控制界面就很容易实现,只需对程序中设置的参数、相关按钮及控制函数程序更换即可,以达到为了不同的目的可以实时更新功能。特别是上位机一般都是计算机,随着计算机技术的发展,计算机的功能也越来越强大,很多复杂算法很容易实现,也为工业的中出现的复杂算法提供方便。在更变复杂算法时,由VC++编程上位机控制界面也十分方便。

所以利用什么方法,使用什么控制策略,如何能达到两个油缸同步高精度,提高生产效率,是油缸同步控制系统首先要解决的问题。经过实验测试,本文的控制方法的控制精度高,稳定性好,并且具有同步协调加载能力。

本文利用理论力学、实验力学、计算机测控技术、VC++面向对象的程序设计等所学知识和德国doli控制器EDC220使用说明书,完成双油缸同步控制策略、同步控制GUI设计、串口通讯、程序编制、验证实验进行阐述,利用编制程序进行双油缸同步控制实验,有效验证了控制精度。整个过程可以加强自主学习能力,提高实际操作能力,提升探索控制策略的创新精神。

4

重庆大学本科学生毕业设计(论文) 同步控制策略

1 同步控制策略

同步控制是一种常用的工控技术。同步就是要按照一定比率来协调控制主部件和从部件之间的位置、转速、位移、扭矩等量,同步控制器一般有两类:一类是和张力系统连同一起来使用,比如张力控制器也是一种同步控制器件,这类型的同步是以转速和扭矩等量的同步来实现的;另一类是空间定位控制器,就是位置同步,一般应用于数控机床,机器人,飞剪等系统轴间联动使用,是一种轴间的位置跟踪定位。目前同步控制器有一些嵌入式设定参数的,也有一些事直接可编程类的,随着信息技术的发展,可编程类的应用慢慢超过前者,代表了同步技术的发展方向,它可通过现场总线等通讯技术与其他设备进行连接,并进一步操作。

本文双油缸同步是指两个油缸行程实时同步。双油缸同步控制是指用可编程的VC程序发出一个指令,通过EDC220控制器协调控制,由于EDC220控制器利用非线性校正技术,可以对传感器采用非线性校正技术,同时EDC220含有同步控制模块,有效地提高整个系统的测量精度,再加上反馈控制功能,两个油缸可以达到实时高精度同步的一种控制方法。而且VC具有可扩展性、通用性、易维护性、可移植性等特点,便于根据需要实时修改程序。现对EDC220控制器、VC面向对象的程序设计和反馈控制三个方面对本次设计作介绍和分析。

1.1 EDC220控制器

DOLI控制器是德国DOLI公司的代表产品[18]。集闭环控制和数据采集为一体,作为测量通道和基本实验仪器,而且具备一个输出通道来控制设备。DOLI控制器的电液伺服控制系统应用非常广泛,例如在动态试验机中的应用。并且得到了很大的认可,但绝大多数情况下,该控制器是在单通道电液伺服系统中使用。主板上具备分辨率达到±180000码的负荷放大器,用来驱动功率放大器的输出信号在±10V之前,具有SSI、LVDT、IO、力、应变、阀控制、增量传感器、安全防护装置等接口。该控制器可以实现位置同步、力值同步、变形同步等功能,功能强大且稳定。经过多年发展,该控制器已经日趋完善,它广泛应用于高精度、复杂工业控制和大吨位加载设备中。

除了这些,EDC220控制器还利用非线性校正技术,可以对力传感器和变形传感器采用非线性校正技术,有效地提高整个系统的测量精度。该控制器经过不断改进和升级,完善了动态试验系统功能,而且还可以很有效利用在双通道甚至多通道系统中,在本次控制系统设计中该控制器的优点更加明显,方便之处在于该控制器的设置方式和多通道协调加载等功能。对于多通道系统而言,协调加载至关重要。

5

重庆大学本科学生毕业设计(论文) 同步控制策略

控制器通过以太网或者USB与PC机连接,可以有效完成多通道控制,而且稳定性、安全性和速度不受外界影响[12]。

1.1.1 同步化模块

控制器同步化模块用于对多套EDC220系统的数据采集及控制实行同步化。所有必要的控制信号和通讯都通过RS485总线传输。主控EDC220只需在X11插头处插上一个总线端,而且其余EDC220控制器均需要用RS485相连,最后一台EDC220控制器在接头X12处插上总线端。主控控制器系统生成系统时钟,即系统时间,位移控制时间基点和其他所需信号。为了达到最佳效果即实现高精度同步控制,需要将所有需要同步化的控制器系统设置相同的系统时间和位移控制基点。PC机与控制器连接如图1所示。

图1 PC机与控制器连接构图

EDC220控制器同步包括同步控制和同步采集[13]。对同步控制而言,系统中所有的控制器在某一时间点必须统一内部时钟(TIME), 然后一起执行命令,才可以达到同步功能。在用VC编写控制EDC220执行同步命令时, 有两点需要注意:

(1)每台EDC220控制器需要执行的命令可以完全一样, 也可以不一样, 但执行时间的起点必须一致。

(2)每台EDC220控制器需要执行的命令是执行之前收到的命令,所以只要上位机向主控制器(Master)发送执行命令的开始信号便可以激活同步命令的执行。

图2 同步控制通讯连接示意图

6

重庆大学本科学生毕业设计(论文) 同步控制策略

在控制系统中,两台EDC220控制器之间要连接同步时钟线,来确定时钟始终完全一致。DOLI控制器需要选择好一个主控制器,另一个设置为从控制器。在EDC220控制器的初始设置文件中,General data项设置主控制器为Master,从EDC220控制器为Slave(Synch State: 0 = Master,1 = Slave),并且主控制器的FunctionID项参数设置为1,从控制器设置为2。同步控制过程中需要保证主控制器和从控制器的位移控制频率(PosT)、速度控制频率(SpeedT)和数据采样频率(DaRate)相同。同步控制通讯连接示意图如图2所示。

在两台EDC220执行同步命令时,PC机需要调用同步控制函数指令功能,再向EDC220控制器发送所需要执行的命令,但是此时接收到的命令并不立即执行。需要等一切准备就绪后,PC机向EDC220控制器发送启动同步命令信号,各个EDC220控制器调整各内部时钟,然后控制器同步执行控制任务。

计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯两种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。EDC220控制器通过以太网、USB、串口通讯与上位机进行通讯,并且Doli公司提供了丰富的控制函数。如此一来,用VC很方便就能控制EDC220控制器的所有操作。

为了实现双油缸同步控制,计算机需要通过以太网接口与一台集线器进行连接,然后集线器连接两台EDC220控制器。同步并不是意味着多个内部时钟一起调整为零,也可以按照实验需要在不同控制器之间有固定的相位差,即各个控制器保持固定的时间差来执行各自的命令,这也是一种同步的概念。本文是实时同步控制,即内部时钟一起调整为零。

双油缸同步控制系统中主要的部分就是EDC220控制器同步,只有保证EDC220控制器同步的前提下才能有效保证两个油缸同步,即两个EDC220控制器在接收到PC机的启动同步命令信号后,EDC220控制器调整好内部时钟,两个EDC220控制器同步执行控制油缸同步运行。由于控制器的控制精度非常高、稳定性好,所以该控制器的使用完全可以应用到高精度双油缸同步控制系统中。

1.1.2 同步系统命令

有两种命令(DoPESynchronizeSystemMode, DoPESynchronizeSystemStart)来控制两种或两种以上的EDC220控制系统[14],如果设置了同步选项,并且确定两个及两个以上EDC220控制系统连接正确,那么这两种命令也是唯一有用的命令。

(1)同步系统Mode(DoPESynchronizeSystemMode)。如果模式是SSM_SYNC MOVE,下一个移动指令IKEDoPE Pos、DoPECosine或任何其他移动命令将被推迟,直到同步条件为真。该系统将用DoPESynchronize SystemStart命令进行同步。对

7

重庆大学本科学生毕业设计(论文) 同步控制策略

声明函函数extern unsigned DLLAPI DoPESynchronizeSystemMode(DoPE_HANDLE DoPEHdl , unsigned short Mode, double Time, WORD *lpusTAN)进行说明:

①DoPEHdl:该函数返还一个Error常量(DoPERR_xxxx),然后DoPE连接句柄; ②Mode:SSM_SYNCMOVE模式,如果Time为零,则发送同步命令信息后开始执行;如果Time不为零,则发送同步命令Time时间过后才开始执行;

SSM_YSTEMTIME模式,需要设置EDC220系统时间为Time;SSM_DISCARD模式,去除前一个DoPESynchronizeSystemMode命令;

③Time:延迟或系统时间设置在下一个DoPESynchronizeSystemStart命令; ④*lpusTAN:指针参数。

(2)同步系统Start(DoPESynchronizeSystemStart)。此功能只能在主EDC220控制器里面进行,数字同步信号将被激活,并且将由DoPESynchronizeSystemMode设置下一个系统时钟和所有涉及EDC220控制器启动前需要定义的操作。对声明函函数extern unsigned DLLAPI DoPESynchronize SystemStart(DoPE_HANDLE DoPEHdl , WORD *lpusTAN)进行说明:

①DoPEHdl:该函数返还一个Error常量(DoPERR_xxxx),然后DoPE连接主EDC220控制器的句柄;

②*lpusTAN:指针参数。

同步系统Mode、Start命令与同步状态的关系如图3所示。

图3 同步系统Mode、Start命令与同步状态的关系

1.1.3 同步数据处理

(1)同步数据Data(DoPESynchronizeData)。通过DoPE句柄启动采样同步,传递一个空链表(第一项为NULL)停止采样同步。也可以初始化、选择设置或关闭一个甚至多个环节停止采样同步。声明函数extern unsigned DLLAPI

DoPESynchronizeData(DoPE_HANDLE DoPEHdl[],DoPE_HANDLE,*pMaster)进行说明:

8

重庆大学本科学生毕业设计(论文) 同步控制策略

①DoPEHdl[]:该函数返还一个Error常量(DoPERR_xxxx),且DoPE连接句柄数组DoPEHdl[]。

②*pMaster:指针存储,为了让主EDC220控制器DoPE连接句柄。

(2)同步数据处理程序(DoPESetOnSynchronizeDataHdlr)。对声明函数extern unsigned DLLAPI DoPESetOnSynchronizeDataHdlr (DoPEOn SynchronizeDataHdlr Hdlr, LPVOID lpParameter)进行说明: 每一个接收到的同步采样都要调用该函数,lpParameter为用户特定指针。用于同步数据事件的用户函数有:

①unsigned CALLBACK OnSynchronizeData(DoPE_HANDLE DoPEHdl, DoPEOn SynchronizeData *Data, LPVOID lpParameter): 对于该函数,DoPE可以连接句柄,指针接收数据,携带有DoPESetOn SystemMsgHdlr特定用户指针;

②typedef struct{unsigned DoPError, unsigned nData, DoPELinkData *Sample, double Occupied} DoPEOnSynchronize Data: 对于该函数,DoPERR_NOERROR事件是确定的,nData是测量数据的数目,*Sample是测量数据的数组,Occupied表示数据缓冲区占用百分比;

③typedef struct{ DoPE_HANDLE DP , DoPEData Data}DoPELink Data:对于该函数,DoPE可以连接句柄,Data表示记录测量数据。

1.2 MFC类库

Visual C++6.0简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。VisualC++是一个功能强大的可视化软件开发工具。是目前综合性最高、最强大,也是最为复杂的Windows应用程序开发软件。VisualC++6.0是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。

Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境[8]。

VC++是微软公司开发的C++语言开发环境,VC的特点是微软公司做了一个自己独有的类库MFC,里面封装了绝大多数的API函数,使得WINDOWS程序的开发变的高效和易于理解,如果用API直接开发WINDOWS程序的话,将会是一件非常烦琐的工作,WINDOWS对资源的管理是非常严格的这与DOS可直接用中断处理程序和I/O指令操作硬件端口是截然相反的;所以这个MFC就是VC和其他

9

重庆大学本科学生毕业设计(论文) 同步控制策略

公司出产的编译器的最大区别了,当然了其他公司也有自己封装API的类库比如DELPHI等,所以他们的编译器与其他公司的相比有其独到的优势。

使用MFC类库,程序结构采用模块化设计,因此具有可扩展性、通用性、易维护性、可移植性等特点。在程序编写过程中,利用面向对象的程序设计语言,串口采用同步方式进行控制,使得程序各模块之间、PC以及控制器之间能相互安全、准确地传输数据[9]。

1.3 反馈控制

反馈控制最早运用于1788年英国科学家James Watt为内燃机设计的飞锤调带器,随后1946年Evens由根轨迹分析技术提出了线性反馈系统,而1981年美国学者Zames得到基于Hardy控件范数最小化方法的一种鲁棒最优控制理论[19]。同开环控制系统相比,闭环控制具有一系列优点。但反馈回路的引入增加了系统的复杂性,而且增益选择不当时会引起系统的不稳定。为提高控制精度,在扰动变量可以测量时,也常同时采用按扰动的控制(即前馈控制)作为反馈控制的补充而构成复合控制系统。

本文用反馈控制是为了减少在doli控制器同步控制部分产生的不可避免误差。上位机把同步命令发送给EDC220控制器,并且确定好同步时钟,EDC220控制器开始准备执行,当收到上位机传输的同步任务后,EDC220开始执行同步任务,两个油缸开始运动。反馈控制是将两个油缸位移行程相比较,程序自适应判断位移行程差并改变控制变量系数,以防止偏差发展或继续存在,达到两个油缸行程高精度同步。当上位机接收数据后,程序判断两个油缸的行程是否在一定的精度范围内,如果达到,则EDC220控制器继续执行同步任务;如果没有达到一定精度范围,则程序选择性调用控制参数,EDC220控制器再次执行同步任务,直到接收到的数据误差在一定范围内。

EDC220控制器自身包含同步控制模块,有着良好的稳定性和高精度特性,而且反馈控制有程序判断是否已达到精度要求,所以在设备误差允许的情况下,本次双油缸同步控制可以达到较高的同步精度。本设计的反馈控制流程如图4所示。

10

重庆大学本科学生毕业设计(论文) 同步控制策略

图4 反馈控制流程图

11

重庆大学本科学生毕业设计(论文) GUI设计

2 GUI设计

2.1 主界面

上位机是指可以直接发出操作控制命令的计算机,一般是PC/host computer/ master computer/upper computer,屏幕上显示各种信号变化,例如液压,水位,温度,速度,位移等。上位机是控制者和提供服务者,可实现上位机界面设计的软件有VC++、Labview、Visual Studio、CAI、Delphi、VB。该操作界面操作简单,具有条件读取、主界面绘图窗口定点显示、极限设置、曲线显示及协调加载等功能。本文采用VisualC++6.0来完成上位机操作界面设计,如图5所示。

图5 双油缸同步控制主界面

主界面控件参数设置是较为重要一步。首先打开VC++6.0集成开发环境对主界面控件参数设置,选择菜单File/New,在出现的对话框中选中Projects标签中的MFCAppWizard(exe),然后在Project Name框中填入WSJ_SYG(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。主界面的各对话框的控制按钮或对话框都按照缺省设置,如此一来即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。在对话框中添加相应应用的控件,再对参数进行属性设置,如设置ID。

12

重庆大学本科学生毕业设计(论文) GUI设计

2.2 绘图窗口

在基VC的系统曲线显示设计中,以图形化的方式显示数值结果同样有助于直观地查看控制数据、分析效果、探究控制策略,以便解决控制过程中可能出现的问题。曲线的实时动态显示方法有开发具有便捷绘图功能的ActiveX控件[10]和充分利用VC的画笔绘图。控件以组件方式无缝嵌入控制程序,界面美观、简洁,支持发布和封装。画笔可以自定义,程序运行不受PC机改变而改变。在双油缸同步控制过程中,需要采集油缸的实际位移,并实时显示到控制界面上,这样可以轻松的观察的速度曲线的实时变化。

目前,VC中用于绘图的控件主要有IDL、TeeChart、MSChart等,它们功能较强。TeeChart是优秀的ActiveX图形控件,它使得实时数据的统计图表更加直观和易于理解,以达到有效解决图形显示问题的目的,具有许多优良的特性[11]。但是该控件收到运行环境影响,需要在VC中注册控件,所以不具备通用性。本文采用自定义画笔绘图方法,结合一个实际的油缸精度检测项目,给出运用自定义画笔设计程序代码,实现双油缸同步控制系统中数据实时显示的功能。

VC自定义绘图工具由MFC的CgdiObject类及其派生类描述。基本绘图工具包括画笔、画刷、字体、位图、调色板等。这些工具都有对应的MFC类来描述,画图之前可以创建满足上位机所需功能的绘图工具,然后选择画图的环境即可完成。结合本次设计所需,自定义绘图初始化需要完成的工作有绘图窗口网格划分、坐标定义、坐标轴设计、刻度定义、字体设置、添加标题等工作。由此可以得到VC程序自定义绘图窗口,如图6所示。

13

重庆大学本科学生毕业设计(论文) GUI设计

图6 VC程序自定义绘图窗口

本次自定义绘图的初始化函数代码示例如下: int nOriginX = 62;//X轴坐标原点 int nOriginY = 601;//Y轴坐标原点 int nXLength = 720;//X轴长度 int nYLength = 470;//Y轴长度

int nStepLength = 30;//每两个刻度之间的点数 int m_nPage=1;

int m_dRate=2;//每一长度单位代表5cm CDC* pDC = GetDC();

CPen NewPen1,//用来画坐标网格 NewPen2,//用来画坐标轴 NewPen3,//用来画刻度

*pOldPen;

pDC->SetBkColor(RGB(255, 255, 255)); pDC->SetBkMode(TRANSPARENT); //画网格线,每格刻度位40像素

NewPen1.CreatePen(PS_DOT, 1, RGB(25, 200, 200)); pOldPen = pDC->SelectObject( &NewPen1 );

for(int i = nOriginY; i >= (nOriginY - nYLength); i -= nStepLength) {

pDC->MoveTo(nOriginX, i);

pDC->LineTo((nOriginX + nXLength), i);

}

for(i = nOriginX; i <= (nOriginX + nXLength); i += nStepLength) {

pDC->MoveTo(i, (nOriginY - nYLength)); pDC->LineTo(i, nOriginY); }

//画坐标轴

NewPen2.CreatePen(PS_SOLID,3,RGB(25, 25, 25)); pOldPen=pDC->SelectObject(&NewPen2);

pDC->MoveTo(nOriginX, (nOriginY - nYLength - 20)); pDC->LineTo(nOriginX, nOriginY);

14

//水平 //垂直

重庆大学本科学生毕业设计(论文) GUI设计

pDC->MoveTo(nOriginX, nOriginY);

pDC->LineTo((nOriginX + nXLength + 20), nOriginY); //画垂直箭头

pDC->MoveTo((nOriginX - 5), (nOriginY - nYLength - 20 + 10)); pDC->LineTo(nOriginX, (nOriginY - nYLength - 20));

pDC->LineTo((nOriginX + 5), (nOriginY - nYLength - 20 + 10)); //画水平箭头

pDC->MoveTo((nOriginX + nXLength + 20 - 10), nOriginY - 5); pDC->LineTo((nOriginX + nXLength + 20), nOriginY); pDC->LineTo((nOriginX + nXLength + 20 - 10), nOriginY + 5); //画刻度

NewPen3.CreatePen(PS_SOLID,1,RGB(88, 160, 168)); pOldPen=pDC->SelectObject(&NewPen3);

for(i = nOriginY; i >= (nOriginY - nYLength); i -= nStepLength / 2) {

pDC->MoveTo(nOriginX, i); pDC->LineTo((nOriginX + 10), i); }

for(i = nOriginX; i <= (nOriginX + nXLength); i += nStepLength / 2) {

pDC->MoveTo(i, nOriginY - 10); pDC->LineTo(i, nOriginY); }

pDC->SelectObject(pOldPen); //创建字体

CFont NewFont4,*pOldFont; int nWidth = 8; int nHeight = 20; CString strDigits; nWidth = 6; nHeight = 15;

NewFont4.CreateFont(nHeight,nWidth,0,0,

FW_BOLD,0,0,0,ANSI_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,NULL);

15

重庆大学本科学生毕业设计(论文) GUI设计

pOldFont = pDC->SelectObject(&NewFont4);

for(i = 0; i <= (nYLength / nStepLength); i++)//写垂直坐标值 {

strDigits.Format(\ m_dRate); {

pDC->TextOut((nOriginX - 25), ((nOriginY - 8) - i * nStepLength), strDigits); } }

switch(key_id) { case 0:

for(i = 0; i <= (nXLength / nStepLength); i += 2)//写水平坐标值 {

strDigits.Format(\ength*i / (nXLength / nStepLength)); {

pDC->TextOut((nOriginX - 5) + i * nStepLength, nOriginY + 10, strDigits); } }

pDC->SelectObject(pOldFont);

pDC->TextOut(nOriginX+nXLength+5,nOriginY-25,\pDC->TextOut(nOriginX-40,nOriginY-nYLength-35,\break; case 1:

for(i = 0; i <= (nXLength / nStepLength); i += 2)//写水平坐标值 {strDigits.Format(\ength*i / (nXLength / nStepLength)); {pDC->TextOut((nOriginX - 5) + i * nStepLength, nOriginY + 10, strDigits);}} pDC->SelectObject(pOldFont);

pDC->TextOut(nOriginX+nXLength+5,nOriginY-25,\pDC->TextOut(nOriginX-40,nOriginY-nYLength-35,\break;

default:AfxMessageBox(\请选择输出图形方式\}

ReleasEDC220(pDC);

16

重庆大学本科学生毕业设计(论文) GUI设计

2.3 界面优化

界面优化包括按钮图标实现、图像编辑控件、窗口背景加载、按钮图片加载、定义静态文本颜色和字体等。按钮图标添加可以通过CButtonST类实现, CbuttonST 是目前最强大功能最全的CButton派生类,CButtonST类主要包括BtnST.h、BtnST. cpp、BCMenu.h和BCMenu. cpp四个文件,在VC++中导入以上的四个文件之后,然后在SdtAfx.h文件中添加合适的include语句,如#include \.h\。还可以用图像编辑控件KoDak,但是它不能单独使用,必须和其他几个控件(特别是Imgcmn. dll)一同使用,而且该方法主要运用于动态图片加载。本文需要添加窗口背景图片和按钮背景图片,所以可以采用picture控件和Bitmap背景图,但是考虑到picture控件加载后会覆盖其他控件,对于窗口背景加载不合适,所以可以采用Bitmap实现。

利用Bitmap实现美化,需要做bmp格式加载图片准备工作,需要设计的bmp格式图片,所需要设计的图片包含窗口图、文本框图、各按钮图。设计程序代码(选取主要部分代码)方法如下:

(1)按钮图标图片加载。在DOPE.h头文件里面定义CbitmapButton

m_BitButton。然后在IDB_BITMAP属性里面添加图片地址链接,最后在OnInitDialo g()函数里面添加m_BitButton.LoadBitmaps(IDB_BITMAP)。

(2)窗口背景图片加载。在背景加载函数DrawBg()里面添加如下代码: CPaintDC dc(this); CRect rect;

GetClientRect(&rect); CDC dcMem;

dcMem.CreateCompatiblEDC220(&dc); CBitmap bmpBackground;

bmpBackground.LoadBitmap(IDB_BITMAP_BG); BITMAP bitMap;

bmpBackground.GetBitmap(&bitMap);

CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);

dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);

(3)定义静态文本颜色和字体大小。这里需要在OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor) 函数里面添加如下代码: HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

17

重庆大学本科学生毕业设计(论文) GUI设计

if(pWnd->GetDlgCtrlID()==IDC_STATIC_Time) {

pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&NewFont); pDC->SetTextColor(RGB(0,0,255)); return m_myBrush; }

if(pWnd->GetDlgCtrlID()==IDC_STATIC_Posi) {

pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&NewFont); pDC->SetTextColor(RGB(0,0,255)); return m_myBrush; }

return hbr;

18

重庆大学本科学生毕业设计(论文) 接口通讯

3 接口通讯

3.1 PC机与下位机通信方式

PC机与下位机通讯通常采用两种方式:并行通信和串行通信。并行通信是指代发送的数据各位同时传送,串行通信则是数据一位一位的按顺序传送。并行通信虽然传输效率高,由于所需硬件设计复杂,不适于长距离通信,所以一般只适用于要求实时性强。传送速率较高的测控系统中,实用面较窄;相比之下,串行通信简单易实现,传输距离较长,所以已被广泛应用于各种工控系统中。

串行通行分为同步通行和异步通信两种方式。同步通信是指通过在每个数据块开始时的同步字符来实现收/发双方同步的一种数据传送方法,常用于信息量大,速度要求高的场合;异步通信则规定了标准的字符数据传输格式,即每一帧信息由起始位、数据位、奇偶校验位和停止位组成。由于有冗余位,所以传送效率不高,常用于信息量不大,速度较低的场合。在计算机测控系统中,由于串行接口的标准化,一般采用异步串行通信方式,以提高其通用性。

PC机与下位机通讯采用标准通讯端口RS-232。目前RS-232是PC机与通信工业中应用最广泛的一种串行接口,而对于下位机与PC机的串行通信,可以进一步简化接法,只需要三根线:RxD (接收)、TxD(发送)、GND(信号地,收发双方信号共地,即信号地线接在一起),这种接法俗称‘零Modem接法”。RS—232传送的是单端信号,即取RxD及TxD对GND的电压值为信号电平,电压+5V—+15V表示逻辑0,电压-15V—-5V表示逻辑1,称之为EIA电平。

RS—232C是美国电子工业协会(EIA)于1962年制定并于1968年最后一次修改而成的一种串行通信标准,它既是一个物理接口标准,也是一个电气标准。RS—232C接口采用25根线,实际使用时,除去接到设备外壳的一根安全地线以外,真正用于异步串行通信的只有9根线(其余空着没定义),也正是因为如此,PC机一般都具有一个或几个针RS—232C串行接口,分别称为 COM1和 COM2。

3.2 VC实现接口通讯方法

(1)基于Windows API通信函数。与通信有关的Windows API函数共有26

个,但主要有关的有CreateFile()用 “comn”(n为串口号)作为文件名就可以打开串口;ReadFile()读串口;WriteFile()写串口;CloseHandle()关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。

19

重庆大学本科学生毕业设计(论文) 接口通讯

(2)利用端口函数直接操作。这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:int _inp(unsigned shot port);该函数从端口读取一个字节,端口号为0—65535;写端口的函数原型为:int

_outp(unsigned shot port, int databyte) 该函数向指定端口写入一个字节。不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,一般涉及具体的硬件电路讨论比较复杂。

(3)基于MSComm控件。MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序,MSCOMM控件提供了两种处理通信的方式[16]。

事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。

查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的\确定\响应[17]。

MSComm控件有很多重要的属性, 其中常用的是如下几个:

①CommPort:设置并返回通信口号, 缺省值为COM1, 可设置1~ 16 个。 ②SetStrings:设置并返回波特率、奇偶校验、数据位、停止位的字符串。其中波特率的范围为300~ 19 200 b/s。

③PortOpen:设置并返回通信口的状态, 同时用来打开和关闭通信口。 ④InputLen:决定每次Input 读入的字符个数,缺省为0, 表示读取接收缓冲区的全部内容。

⑤Input:读入并清除接收缓冲区的字符。

⑥InBufferCount:返回接收缓冲区已接收的字符数, 通过置0可清除接收缓冲区。

⑦Output:将发送的字符串或数组写到发送缓冲区。

⑧InputMode:定义Input 属性获得数据的方式: 0 为文本; 1 为二进制[15] (4)基于CSerial类。Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。串行通信类Cserial 成员函数简介:

①CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

20

重庆大学本科学生毕业设计(论文) 接口通讯

②CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

③CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用调用这个函数。

④CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

⑤CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

⑥CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

(5)EDC220控制器提供的USB、LAN等接口方式,EDC220控制器提供了完整的数据连接和控制函数,只需调用即可。

五种实现方式的分析。第一种Windows API的通信函数使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种通信函数 _ jnp、_ outp需要了解硬件电路结构原理;第三种方法使用的MSComm通信控件提供了标准的事件处理方式,并通过属性的方法提供了COM口参数的设置,较为容易地解决了串口;第四种方法需使用第三方提供的CSerial类,使用受限制,应用范围不广;第五中可以很直接调用数据采集函数。

21

重庆大学本科学生毕业设计(论文) 验证试验

4 控制系统程序编写

4.1 主要接口程序

4.1.1 接口编程

选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control, version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏 上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。

此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。

可以使用两种方法对控件的属性进行设置:

(1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。

(2)对话框类的OnInitDialog()函数中;下面是以上设置的函数实现: m_comm.SetCommPort(1); //选择串口号1

m_comm.SetInBufferSize(1024);//设置输入缓冲区大小 m_comm.SetOutBufferSize(512);//设置输出缓冲区大小

if(! m_comm.GetPortOpen())//判断串口是否已经打开,如果打开可以节省人机界面进一步设置!

{

m_comm.SetCommPort(1); //选择串口号1 m_comm.SetPortOpen(TRUE); //打开串口

m_comm.SetRThreshold(1); //收到多余一个字节引发OnComm事件 m_comm.SetInputMode(0);//1为二进制输入方式, 0代表文本方式

22

重庆大学本科学生毕业设计(论文) 验证试验

m_comm.SetSettings(\设置串口参数,波特率57600,无奇偶校验,1位停止位,8位数据位

MessageBox(\串口初始化完毕!\\r\\n \\r\\n \\r\\n 你不用到人机界面设置参数,可以继续使用\提示\提示串口成功初始化

}

else MessageBox(\如果已经打开串口,消息框提醒 m_dakaichuankou.SetWindowText(\关闭串口\按钮显示状态改变 }

通过设置命令可以实现对串口参数的设置操作,包括串口的通讯端口的选择、波特率、波特率、校验位、停止位的选择等,通过对这些参数的设置可以改变通讯的方式。在执行参数设置响应函数前首先进行初始化程序,初始化程序如下:

if(m_comm.GetPortOpen()) {

m_ comm.SetPortOpen(FALSE);

m_ comm.SetSettings(\波特率9600,无校验,8个数据位,1个停止位m_ comm.SetInputMode(1);//1:表示以二进制方式检取数据 m_ comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ comm.SetInputLen(0);//设置当前接收区数据长度为0 m_ comm.GetInput();//先预读缓冲区以清除残留数据 }

在初始化完毕后,在串口通讯界面上会看到初始后的结果,串口通讯的波特率是9600、校验位none、数据位8、停止位1。

4.1.2 通讯连接

EDC220控制器有着功能强大、性价比高等特点,有着数据采集和闭环控制功能。可以串行通信口,而且通过以太网或USB通讯,用于控制通信和调试。EDC220控制器提供了完整的链接函数,只需调用即可,所以使用USB/LAN连接PC机和EDC220控制器较为方便。如果返还DoPESetNotification failed,则表示连接失败,需要检查连接错误。使用USB/LAN联机的程序编写如下:

先定义端口编号m_duankouhao、波特率m_botelv 等变量,然后编写联机程序。

m_duankouhao=DoPEPORT_USB;//也可以用LAN联机 m_botelv=0;

23

重庆大学本科学生毕业设计(论文) 验证试验

m_DoPEErr=DoPEOpenLink(m_duankouhao/*Port 0=COM1*/, _botelv/* Baudrate*/,10/*RcvBuffers*/, 60/*XmitBuffers*/, 1000/*DataBuffers*/, DoPEAPIVERSION, NULL, &m_DoPEHdl);

if(m_DoPEErr!=DoPERR_NOERROR)

AfxMessageBox( \打开设备出错,请检查USB是否连接!\ else {

m_DoPEErr=DoPESetNotification (m_DoPEHdl, DoPEEVT_ALL, NULL, 0, 0); if(m_DoPEErr!=DoPERR_NOERROR)

AfxMessageBox( \ed\ else {

m_DoPEErr=DoPESelSetup ( m_DoPEHdl, 1, NULL, NULL, NULL ); if(m_DoPEErr!=DoPERR_NOERROR)

AfxMessageBox( \ } }

另一部分程序主要的区别在于端口号、句柄。&m_DoPEHdl2、m_duankouhao2。 Port表示端口号。Baudrate表示波特率。RcvBuffers表示存储消息的缓冲区大小,此处的缓冲区的消息可以存储直到应用程序进行读取。XmitBuffers表示用于储存发送给EDC220控制器消息的缓冲区大小,此处缓冲区的消息可以存储,直到EDC220控制器读取。DataBuffers表示数据缓冲区的大小。可以将采集的数据存储在该缓冲区,假如长时间该数据没有被读取,那么旧的数据将被新的数据覆盖。DoPEAPI VERSION表示使用者所应有的DoPE API版本。

4.1.3 同步控制

对于同步控制模块,需要对上位机与下位机进行匹配说明,即可以进行编写函数DoPEOpenFunctionID联机,该函数通过FunctionID号来建立所编写的上位机与EDC220控制器通讯连接。以达到建立连接后的DoPEHdl可以识别EDC220控制器的句柄。所编写的上位机程序可以通过DoPEHdl来控制多台EDC220控制器。

用DoPESynchronizeSystemMode函数来设置同步功能。如果该函数的Time参数为零,则表示同步信号启动后就会立即执行,没有延时。如果Time不为零,则表示同步信号开始后将在Time参数值延时后再开始执行控制动作。针对几个参数做如下分析说明:

24

重庆大学本科学生毕业设计(论文) 验证试验

SSMSYSTEMTIME参数表示延时时间;SSMDISCARD参数表示是否释放前面的同步任务;DoPESynchronizeSystemStart表示用来激活同步命令执行;lpusTAN参数指针指向主控制器即可。

下面对两个油缸协调同步控制程序编写示例:

两台EDC220控制器的FunctionID参数分别设置为1和2,第一台EDC220控制器设置为主控制器Master,第二台EDC220控制器设置为从控制器Slave。程序利用函数DoPEOpenFunctionID函数与两台控制器建立连接。建立连接后DoPEHdl_1是主控制器 (即master EDC220)句柄,DoPEHdl_2是从控制器(即slave EDC220)句柄。发送同步命令代码示例如下:

//先把两台EDC220控制器时间同步。

m_DoPEErr=DoPESynchronizeSystemMode(m_DoPEHdl,SSM_SYSTEMTIME,0,&lpusTAN);

m_DoPEErr=DoPESynchronizeSystemMode(m_DoPEHdl2,SSM_SYSTEMTIME,0,&lpusTAN2);

//向两台EDC220控制器发送同步执行的任务。

m_DoPEErr=DoPESynchronizeSystemMode(m_DoPEHdl,SSM_SYNCMOVE,0,&lpusTAN);

m_DoPEErr=DoPEPos(m_DoPEHdl,ctrm,ctrs,ctre,&lpusTAN);

m_DoPEErr=DoPESynchronizeSystemMode(m_DoPEHdl2,SSM_SYNCMOVE,0,&lpusTAN2);

m_DoPEErr=DoPEPos(m_DoPEHdl2,ctrm,ctrs2,ctre,&lpusTAN2); //向主控制器EDC220发送激活执行同步任务命令。

m_DoPEErr=DoPESynchronizeSystemStart(m_DoPEHdl,&lpusTAN); // lpusTAN参数指针指向主控制器即可。

4.1.4 数据采集

数据采集部分主要利用DoPECurrentData函数。从缓冲区接收样本数据,DoPE在一个可调节的时间范围内接收测量数据。数据记录是被存储在DoPE的一个内部缓冲区内,可以利用DoPECurrentData函数读取最新的数据。关键部分程序代码如下:

m_DoPEErr=DoPECurrentData(m_DoPEHdl, &Sample); m_dDataPosi[m_dDataCount]=Sample.Position*100-cPosi; m_DoPEErr=DoPECurrentData(m_DoPEHdl2, &Sample2); m_dDataPosi2[m_dDataCount]=Sample2.Position*100-cPosi;

25

重庆大学本科学生毕业设计(论文) 验证试验

4.2 定时器模块

定时器模块主要包含一些需要实时调用或者控制的函数,这些函数会随着定时器时间变化重复执行或者调用。定时器模块由消息响应函数WM_TIMER产生,即可得void CWSJ_SYGDlg::OnTimer(UINT nIDEvent),设置时间最好与真实时间同步(即m_nTimerEvent = SetTimer(1, 1000, NULL);)。此外,该函数包含调用画图窗口函数DrawScale()、设备读取数据模块、调用曲线绘制函数DrawLine()、安全控制模块、状态显示模块等,其中画图窗口和曲线绘制函数都需要单独编写主函数。

(1)设备读取数据模块主要代码示例。从设备读取数据 EDC220控制器输出采用国际单位制,力:N、位移:m 、时间:s,显示时需转换成KN、cm、s。

WORD lpus_TAN;

if(DoPERR_NOERROR==m_DoPEErr) {

m_DoPEErr=DoPECurrentData(m_DoPEHdl, &Sample); m_dDataLoad[m_dDataCount]=Sample.Load*0.001-cLoad; m_dDataPosi[m_dDataCount]=Sample.Position*100-cPosi; m_dDataTime[m_dDataCount]=Sample.Time-cTime; }

对应的位移也需要再加两个变量位移m_dDataPosi2和样本数据&Sample2。 (2)安全控制模块主要代码示例。为了做到安全控制,需要给出最大位移、最大载荷等限制条件。

if (m_dDataPosi[m_dDataCount]>Max) {

DeviceClose();

KillTimer(m_nTimerEvent);

AfxMessageBox(\超过试验机最大载荷,已强制停机!\Stop(); }

(3)状态显示模块主要代码示例。状态显示窗口颜色、位置、字体都可以自定义。

CDC* pDC=GetDC(); CString openD;

openD.Format(\伺服阀:开\pDC->SetTextColor(RGB(0,0,255)); pDC->SetBkColor(RGB(0,158,234));

26

重庆大学本科学生毕业设计(论文) 验证试验

pDC->TextOut(870,110,openD); ReleasEDC220(pDC);

(4)曲线绘制函数DrawLine()代码编写示例。为了直观验证双油缸的同步精度,可以实时监测实验曲线,显示时间、位移曲线。由于是双油缸,所以需要两条曲线用来查看试验中的式样变化情况。现在定义画笔是实线、洋红,红色表示是一号油缸曲线,黑色表示是二号油缸曲线。

void CWSJ_SYGDlg::DrawLine() {

CDC* pDC=GetDC(); CPen NewPen,*pOldPen;

pDC->SetBkColor(RGB(41, 146, 231));

NewPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); pOldPen = pDC->SelectObject( &NewPen );

pDC->MoveTo(nOriginX,(int)(nOriginY - m_dDataPosi[0] / m_dRate)); for (n=0;n

pDC->LineTo(m_dDataTime[n]*(nXLength/key_length)+ nOriginX,nOriginY - m_dDataPosi[n]*nStepLength /m_dRate);

} }

以上部分只是其中一条曲线,另一条曲线绘制需要在颜色、曲线数据做出修改。

4.3 定点状态显示

为了得到画图窗口程序在状态窗口自主显示以外的其他信息,这里利用到光标定点捕捉坐标信息,方便有效观察曲线状态。添加主函数为OnMouseMove(UINT nFlags, CPoint point)。主函数程序代码示例如下:

void CWSJ_SYGDlg::OnMouseMove(UINT nFlags, CPoint point) {

int m_MouseX = point.x; int m_MouseY = point.y;

if (m_MouseX>=nOriginX && m_MouseX<=(nXLength+nOriginX) && m_MouseY>=(nOriginY-nYLength) && m_MouseY<=nOriginY)

{

CString str1,str2;

27

重庆大学本科学生毕业设计(论文) 验证试验

str1.Format(\位移:%4.2f cm\oat( nOriginY-m_MouseY )*m_dRate /nStepLength));

str2.Format(\时间:%4.2f s\oat(m_MouseX-nOriginX) / (nXLength/ key_length))); CDC* pDC=GetDC();

pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkColor(RGB(0,158,234)); pDC->TextOut(850,280,str1); pDC->TextOut(850,250,str2); ReleasEDC220(pDC); }

CDialog::OnMouseMove(nFlags, point); }

4.4 反馈控制

所谓反馈原理,就是根据系统输出变化的信息来进行控制,即通过比较系统行为(输出)与期望行为之间的偏差,并消除偏差以获得预期的系统性能。在反馈控制系统中,既存在由输入到输出的信号前向通路,也包含从输出端到输入端的信号反馈通路,两者组成一个闭合的回路。因此,反馈控制系统又称为闭环控制系统。反馈控制是自动控制的主要形式。自动控制系统多数是反馈控制系统。在工程上常把在运行中使输出量和期望值保持一致的反馈控制系统称为自动调节系统,而把用来精确地跟随或实现某种过程的反馈控制系统称为伺服系统或随动系统。

在反馈控制系统中,不管出于什么原因(外部扰动或系统内部变化),只要被控制量偏离规定值,就会产生相应的控制作用去消除偏差。因此,它具有抑制干扰的能力,对元件特性变化不敏感,并能改善系统的响应特性。但反馈回路的引入增加了系统的复杂性,而且控制参数选择不当时会引起系统的不稳定。

本文利用采集到的位移数据计算同步误差,以主设备为参考模型,用主设备位移减去从动设备位移,然后以主设备相除得到实际误差,再针对不同范围或不同值误差设定不同的控制参数,利用控制参数反馈控制从动设备,最终达到本文所需要的高精度同步控制。

(1)可以用得到的实际误差与假定的误差作对比,再利用从动设备速度参数反馈控制从动设备,以达到高精度为目标进行反馈控制,所以反馈控制部分需要增

28

重庆大学本科学生毕业设计(论文) 验证试验

设控制参数。可以设置误差范围和从动设备速度参数,误差设置如表1所示,控制参数配置如表2所示。

双油缸位移误差值分配表

表1

误差参数

t0

t1 0.01

t2 0.05

反馈控制控制参数配置表

表2

误差范围 t0=0.0 0.0t5

可以利用从动设备误差范围及控制参数配置编写程序如下(主要代码): int a;

for(a=0;a

t0=(m_dDataPosi[a]-m_dDataPosi2[a])/m_dDataPosi[a]; if (t0>0.0 && t0<=t1) {

DeviceLoad(ctr_method,ctr_speed,ctr_speed2*1.1,ctr_end); return; } if (t0>t5) {

AfxMessageBox(\误差已经超过25%,请停机检查设备或重新探究控制策略!\

DeviceClose();

29

t3 0.1

t4 0.2

t5 0.25

假定误差 实测误差

控制参数

1 1.1 1.2 1.3 1.4 1.8 停机检查

误差范围 0.0>t0>= -t1 -t1>t0>= -t2 -t2>t0>= -t3 -t3>t0>= -t4 -t4>t0>= -t5 0t< -t5

控制参数 0.9 0.8 0.7 0.6 0.3 停机检查

重庆大学本科学生毕业设计(论文) 验证试验

KillTimer(m_nTimerEvent); Stop(); } }

(2)可以充分利用两个油缸的位移误差百分比乘上一个控制参数(S×T0),T0表示主动缸位移-从动缸位移,可以用一个公式表示从动油缸速度,即从动缸速度=主动缸速度+(主动缸位移-从动缸位移)*S。编程实例如下:

t0=m_dDataPosi[m_dDataCount-1]-m_dDataPosi2[m_dDataCount-1]; DeviceLoad(ctr_method,ctr_speed, ctr_speed-ctr_speed2*(s*t0),ctr_end); (3)可以充分利用两个油缸的位移误差乘上一个控制参数(S×T0),T0表示主动缸位移-从动缸位移,可以用一个公式表示从动油缸位移,即从动缸位移=主动缸位移+(前一刻主动缸位移-前一刻从动缸位移)*S。这样既可以很有效控制精度,也可以简易编程。其中S的范围可以由高精度双油缸同步控制实验确定。编程示例如下:

Kkk为0表示上升,为1表示下降。 if(kkk==1) { }

if(kkk==0) { }

第一种案,设置参数复杂而且编程繁琐,而且在一个精度范围内控制参数单一,考虑不周全;第二种方案,是速度控制,但是doli控制器本身含有速度平滑处理,反馈得到的速度会被doli控制器平滑处理,不容易达到实验需要的速度;第三种方案,利用位移控制,利用前一刻的位移差反馈控制下一刻两个油缸的位移目标,最后控制效果良好。

30

speed2=ctr_speed+800; ctr_end2=ctr_end+90.0*t0;

DeviceLoad(ctr_method,ctr_speed,speed2,ctr_end,ctr_end2);

speed2=ctr_speed+800; ctr_end2=ctr_end+100.0*t0;

DeviceLoad(ctr_method,ctr_speed,speed2,ctr_end,ctr_end2);

重庆大学本科学生毕业设计(论文) 验证试验

4.5 数据处理

4.5.1 实时曲线绘制

(1)实时曲线绘制。在双油缸同步控制过程中,需要采集两个设备的位移数据,并实时显示到控制界面上,这样可以轻松的观察的位移曲线的实时变化。实现的方 法为在工程中添加曲线资源。在曲线主函数里面编写如下代码(主要代码):

CDC* pDC=GetDC(); CPen NewPen, *pOldPen;

pDC->SetBkColor(RGB(41, 146, 231));

NewPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); pOldPen = pDC->SelectObject( &NewPen );

pDC->MoveTo(nOriginX,(int)(nOriginY - m_dDataPosi[0] / m_dRate)); for (n=0;n

pDC->LineTo(m_dDataTime[n]*(nXLength/key_length)+ nOriginX,nOriginY - m_dDataPosi[n]*nStepLength /m_dRate);

}

pDC->SelectObject(pOldPen); ReleasEDC220(pDC);

由于是在一个窗口绘制两条曲线,所以还需添加另外一条曲线资源,即把以上代码中曲线颜色RGB(255, 0, 0)修改为RGB(0, 0, 0)、位移变量m_dDataPosi[0]修改为m_dDataPosi2[0]、指针pDC修改为pDC2、画笔NewPen,*pOldPen修改为NewPen2,*pOldPen2。

(2)曲线范围控制,即曲线压缩。为了不让实时曲线超出初始化绘图窗口,可以以曲线的X/Y轴作为参考,设定变量,当达到某个值时,坐标数据自动增加,曲线缩小,整个绘图窗口内坐标轴、曲线呈现压缩趋势。主要编程实例如下:

int j=1,i=1;

if (m_dDataTime[m_dDataCount] >= key_length) { j+=1;

key_length=key_length*j; RedrawWindow(); }

if (m_dDataPosi[m_dDataCount] >= m_dRate*nYLength/nStepLength ) {

31

重庆大学本科学生毕业设计(论文) 验证试验

i+=1;

m_dRate=m_dRate*i; RedrawWindow(); }

另一条曲线的边界控制需要把位移变量m_dDataPosi修改为m_dDataPosi2。

4.5.2 数据显示与保存

(1)数据显示。Edit Box窗口是用来接收数据常用的一个控件。EDIT BOX控件便于观察接收到的数据和利于保存数据。自动换行设置的时候,要在该控件的属性中选中"multiline\的属性和Auto_HScroll、Vertical scroll;另外一种方法就是可以在字符格式里面定义换行。主要代码编写如下:

for(i=0;i

CString tmp =\

tmp.Format(\【1#位移】%.2fcm;\\r\\n\m_edit+=tmp; }

UpdateData(false);

(2)数据保存。数据保存是数据在同步控制过程中产生的位移数据存储在某种格式的文件里,数据保存要命名。这里可以直接将editbox控件显示的数据全部保存在txt文档里。这要程序代码如下:

CString strText(_T(\

GetDlgItemText(IDC_EDIT,strText);//获取editbox中的数据 try {

CStdioFile file;

file.Open(_T(\

CFile::modeCreate|CFile::modeWrite|CFile::typeText);//打开某某盘的txt文件,这里可以根据实验修改保存路径

file.WriteString(strText);//写入editbox中的数据file.Close();} catch(CFileException*e) {

e->ReportError(); e->Delete(); }

32

重庆大学本科学生毕业设计(论文) 验证试验

5 验证实验

5.1 实验设备

本次实验的设备主要是WAW系列微机控制电液伺服万能试验机。主机为油缸下置式、四个立柱结构。试验机采用DOLI EDC220控制器、压差式伺服技术、计算机技术相结合,实现了试验力、变形、位移闭环控制,可以自动控制和切换试验过程中的匀应力速率、匀应变速率、匀试验速度,也可以进行全试验过程的匀应变速率控制。本次实验需要用到一台计算机、两台万能试验机主机、两个油源、两台EDC220控制器、USB数据连接线两条等。高精度双油缸同步控制实验设备配置如图7所示。

图7 高精度双油缸同步控制实验设备

5.2 实验过程

高精度双油缸同步控制实验分四个阶段,第一阶段是接口程序数据传输(此时不需要用到电液伺服万能试验机),确定数据传输正常;第二阶段是程序与设备进行通讯,探索各个控制按钮的有效性;第三阶段是单个油缸同步控制,确定基本控制、数据接收、数据存储;第四阶段探索高精度双油缸同步控制,完成本次设计的最终实验。

33

重庆大学本科学生毕业设计(论文) 结论

结 论

本文在Windows平台下利用Visual C++6.0这个软件来实现PC机与EDC220控制器的数据通讯,从而实现双油缸同步控制。在双油缸同步控制过程中本文采用调用EDC220控制器同步控制函数和反馈控制方法,主要完成上位机编程和验证实验,同时也对EDC220控制器的同步控制原理、数据处理、控制方案等做了详细介绍。在完成接口通讯编程时本文选择EDC220控制器接口DoPEOpenLink函数,它实现起来比较简单。对于接口通讯,还可以用MSComm控件;Windows API的通信函数;VC的标准通信函数 _ jnp、_ outp或第三方编程的通信类。

上位机机界面编程还有很多软件可以实现,如Delphi、VB、CAI、Labview。EDC220控制器做为下位机,主要负责油缸的各种参数数据的采集处理,然后通过端口把数据发送给上位机,PC机做为上位机主要负责发送指令、分析处理数据和显示,本设计主要完成上位机的设计。最后完成高精度双油缸同步控制验证实验,研究反馈控制在双油缸同步控制的实验效果。

39

重庆大学本科学生毕业设计(论文) 参考文献

参 考 文 献

[1]高恒路,桑勇,邵龙潭.同步控制策略及其典型应用的研究[J].液压气动与密

封,2012,05:1-7.

[2]杨丽曼,李运华.控制网络的综合调度及其在双缸同步控制中的应用[J].电子设计工

程,2010,01:74-77.

[3]Yang Liman~*LiYunhua School of Auto mation Science and Electric Engineering,

Beijing University of Aeronautics and Astronautics,Beijing,100083,China.A Scheduling Method of ontrol Network with Application to Dual-Cylinder Synchronous Control System[A]. Fluid Power Transmission and ControlInstitution(FPTCI,CMES)、Yanshan University. Proceedings of the Fifth International Symposiumon FluidPower Transmission and Control[C].FluidPower Transmission and ControlInstitution (FPTCI,CMES)、Yanshan University:,2007:7.

[4]姜晓铭.VisualC++6.0程序设计应用短期培训教程[M].北京工业大学出版社,2000. [5]娄磊,马宏远,陈君辉.模糊控制在旋挖钻机桅杆油缸同步控制上的应用[J].液压与气

动,2013,06:81-83.

[6]张轲,金鑫,涂宝新,吴毅雄,石忠贤.250t船尾液压工作平台升降的同步控制方法[J].船舶

工程,2008,03:37-40.

[7]秦建敏,马福昌,林卫虹,乔斌.PC机与下位机串行通信的多种实现方法[J],微计算机技

术,2000,16(3):20—23

[8]王丰,高光金.Visual C++6.0程序设计与实训[M],北京大学出版社,2005

[9]黄兴,马杭,程昌钧.基于DOLI系统的数字控制及J_(IC)测试软件的研发[J].上海大学学报

(自然科学版),2006,02:141-145.

[10]岳玉芳,张玉双,安建祝.示波器控件的制作及应用[J].计算机工程与应

用,2009,10:80-82.

[11]梁增欣,李维嘉.TeeChart控件介绍及在实时监控系统中的应用[J].工业控制计算

机,2010,12:9-10.

[12]董天,孙健,张再林,周凯.基于DOLI控制器的双通道试验系统及软件程序设计[J].工程与

试验,2013,02:67-70.

[13]王永明,王瑛,王伟,苗晓婷,陈彦平,吴艳丽.EDC220控制器同步控制功能的实现方法[J].

工程与试验,2009,04:61-63.

[14]EDC220220/222/580 Installa tion Manual[Z].Germany:DOLI Elektr onik GmbH,2008

40

重庆大学本科学生毕业设计(论文) 参考文献

[15]赵莉,赵波.徐华英基于VC++6.0的PC机与下位机串行行通信设计[J],计算机应

用,2003,110—113.

[16]张海林,杜忠友,姜玉波.Visual C++ 简明教程[M],北京:电子工业出版社,2007 [17]张筠莉,刘书智,高守传.Visual C++实践与提高—串口通讯与工程应用篇[M],北京:中国

铁道出版社,2006

[18]EDC220220/222/580 Installation Manual[Z].Gemany:DOLI Elektronik GmbH,2008. [19]刘亚秋,赵化启.反馈控制理论的研究[J].哈尔滨商业大学学报(自然科学版),2004,02:

167-172+179.

41

重庆大学本科学生毕业设计(论文) 附录:主程序

附录A:程序

(1) 程序public CDialog定义: class CWSJ_SYGDlg : public CDialog { public:

void Stop(); void DrawChange(); CBrush m_myBrush; void DrawBg();

void DeviceLoad(int ctrm,double ctrs,double ctrs2,double ctre); void DeviceClose(); void DeviceOn(); void FeedbackControl(); void OnSave(); void editbox(); void OnEdit2();

CBitmap m_bmp;

//void OnLButtonUp(UINT nFlags, CPoint point); UINT m_nTimerEvent; //下位机读取数据 double m_dEample[17]; double m_dEample2[17];

double m_dDataPosi[20000];//位移值 double m_dDataTime[20000];//时间值 double m_dDataPosi2[20000];//位移值 double m_dDataTime2[20000];//时间值 long m_dDataCount;

int ctr_method;//控制方式 0 位移 1 力 double ctr_speed,ctr_speed2;//控制速度 double ctr_end;//目标值 unsigned short MoveCtrl; double Speed;

42

重庆大学本科学生毕业设计(论文) 附录:主程序

double Destination; WORD *lpusTA;

int m_biaozhi_tongxun;

DoPE_PORTINFO LanPortInfo1[32]; //DoPE_PORTINFO PortInfo; MAC NicMac1;

unsigned m_DoPEErr; // error code for error handling unsigned m_DoPEErr2;

DoPE_HANDLE m_DoPEHdl; // handle that represents the link to the EDC DoPE_HANDLE m_DoPEHdl2; DoPEData Sample; DoPEData Sample2; int m_botelv; int m_botelv2; int m_duankouhao; int m_duankouhao2;

CBitmapButton m_BitButton1; CBitmapButton m_BitButton2; CBitmapButton m_BitButton3; CBitmapButton m_BitButton4; CBitmapButton m_BitButton5; CBitmapButton m_BitButton6; CBitmapButton m_BitButton7; CBitmapButton m_BitButton8; CBitmapButton m_BitButton9; CBitmapButton m_BitButton10; CBitmapButton m_BitButton11; CBitmapButton m_BitButton12; CBitmapButton m_BitButton13;

CBitmap m_bkBitmap;

CBrush m_bkBrush;

void OpenDevice();

void DrawLine(); void DrawScale();

43

本文来源:https://www.bwwdw.com/article/r5bd.html

Top