1、摘要I摘要机械手是近几十年发展起来的一种高科技自动化生产设备,由于其具有高度的灵活性和高效性,很多领域得到了广泛的应用。目前工业上对于机械手运动的控制方式主要采用 PLC,采用 PLC 控制步进电机实现机械手的升降、前后等运动,但存在灵活性差等缺点。通过设计发现,以 PC 作为上位机,8051 单片机为下位机组成的控制系统具有高效、控制可靠、灵活性高等优点。PC 将各种控制要求在基于 VC+开发的程序下转换成相应的控制指令,通过 RS232 接口与每个分机进行通讯,对每台分机发布操作数据和控制指令,可实现对各路步进电机的单独控制,实现高效的控制。关键词 机械手 控制系统 串行通信 VC+程序加
2、 153893706ABSTRACTIIABSTRACTManipulator was developed in recent decades, as a high-tech automated production equipment, due to its high degree of flexibility and efficiency. It have been widely applied in many fields , currently used PLC technology for motion , Programmable Logic Controller PLC-cont
3、rolled manipulator control system for materials up and down movement is simple ,The control system includes PC and MCU is a high efficiency solution . Procedure based on VC+ converted to the corresponding control command, used the RS485 interface to communicate with each extension, for each extensio
4、n to the publishing operations data and control commands, so to control all stepper motors individually and efficiently.Keywords Manipulator Control system Serial communication VC+目录III目录摘要 .IABSTRACT1目录 .11 绪 论 .21.1 设计背景 21.2 设计要求 22 硬件设计 .22.1 总体控制方案 .22.1.1 系统工作原理 22.1.2 下位机控制部分 22.2 各部分设备及芯片 22
5、.2.1 步进电机 .22.2.2 单片机的介绍及其选择 .22.2.3 驱动芯片 ULN2003 的介绍 22.2.4 MAX232 芯片的介绍 23 上位机设计 .23.1 上位机软件任务 23.2 上位机软件的实现 .23.2.1 上位机软件工程的建立 23.2.2 上位机软件图形用户界面的构建 23.2.3 上位机软件的函数实现 23.3 上位机软件的调试与运行 .24 下位机设计 .24.1 下位机的串口通讯 .24.1.1 串行通信和并行通信 24.1.2 数据通信方式 24.1.3 串行口工作方式 24.3 串行口控制系统设计 .24.3.1 上位机设计 2目录IV4.3.2 下
6、位机设计 24.4 8051 单片机程序设计 .24.4.1 数据通信的程序设计 24.4.2 电机脉冲的程序设计 .24.4.3 恒速运动的程序设计 .24.4.4 变速运动的程序设计 .24.4.4 电机运动的总程序设计 .2总结 .2致谢 .2参考文献 .2附录 A.2附录 A.1 MFC Programming and C + + related technologies 2附录 A.2 MFC 编程与 C+相关技术 2附录 B COMDDlg.cpp 2附录 C COMDDlg.h 2绪论11 绪 论1.1 设计背景机械手是在自动化生产过程中使用的一种具有抓取和移动工件功能的自动化装
7、置,它是在机械化、自动化生产过程中发展起来的一种新型装置。近年来,随着电子技术特别足电子计算机的广泛应用,机器人的研制和生产已成为高技术领域内迅速发 展起来的一门新兴技术,它更加促进了机械手的发展,使得机械手能更好地实现与机 械化和自动化的有机结合。机械手越来越广泛的得到了应用,在机械行业中它可用于零部件搬运、装卸、组装、焊接和喷涂。机械手机构紧凑、适应性强,将械手应用在大小企业的生产中可以节省生产成本,大大提高生产效率,更好地适应市场竞争的需要。而目前我国的工业机器人技术及其工程应用的水平和国外比还有一定的距离,应用规模和产业化水平低,机械手的研究和开发 直接影响到我国向动化生产水平的提高,
8、从经济上、技术上考虑都是十分必耍的。因 此,进行机械手的研究设计具有非常重要的意义。1.2 设计要求机械手的运动控制靠步进电机驱动,步进电机是一种执行机构,它能将电脉冲转化为角位移。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。用步进电机驱动机械手具有控制可靠、简单方便等特点。单片机控制系统在功能、可靠性、实时性、控制算法等方面得到了快速发展,具有性能可靠、稳定。凭借其体积小、功能强、功耗低、高性价比等优势,所以迅速地在工业控制
9、、工业仪表和民用产品中得到了广泛的应用。PC 机具有强大的监控和管理功能, PC 机(上位机)和多台 8051 单片机(下位机)构成的小型分布系统,能实现分级分布式控制,在 Windows 平台下利用 VC+提供的串行通信类 SerialPort 类能来实现 PC 机 8051 单片机之间的数据通讯。用一台 PC 机接收来自各下位机的信息和数据,经处理后在微机界面上显示,并向下位机下达命令,通过下位机对现场实施控制。本文将描述 PC 机与多台 8051 单片机的串行通信原理及相关的软、硬件设计,实现 PC 机与多台 8051 单片机的通信,以便与进行数据采集、交换、控制、综合管理等,具有简单实
10、用的特点。广东石油化工学院本科毕业设计:机械手控制系统设计22 硬件设计2.1 总体控制方案本设计构建了一个步进电机控制系统,系统的硬件组成主要有:计算机,MAX232,51 系列单片机、驱动器,步进电机。上位机采用的软件是基于 VC+平台的Robot 软件。该系统在分析目前步进电机特点基础上,确定步进电机功能要求。针对步进电机的功能要求,提出了控制系统的详细方案。系统方案流程如下图 2.1:图 2.1 机械手系统控制图本设计采用分布式控制方案,该方案具有操作管理方便,可靠性高的显著特点,是实际可行的方案。具体介绍如下:2 硬件设计32.1.1 系统工作原理图 2.1 中,上位机为工控机或人机
11、界面,下位机为各自独立的步进电机控制子系统,上位机通过 RS232 接口与每个下位机进行通讯,对每台下位机发布操作数据和控制指令,每台下位机接收根据接收的数据进行独立的控制。控制数据及指令可以根据需要在上位机上预先设置。2.1.2 下位机控制部分下位机控制部分主要由电机、驱动器、控制器及传感器构成,控制器通过内部的 RS232 接口接收上位机发出的数据和指令,并通过驱动器控制步进电机按照控制参数运行。控制器除了接收上位机发出的数据和指令。在运行过程中,控制器检测位置传感器的信号,作为确认起始位置、位置定位等位置控制的依据。2.2 各部分设备及芯片2.2.1 步进电机2.2.1.1 步进电机概述
12、步进电机是一种将电脉冲信号变成相应的角位移或直线位移的电机执行元件。每当输入一个电脉冲时,它便转过一个固定的角度,这个角度称为步距角,脉冲一个一个地输入,电动机因此而得名。步进电动机的位移量与输入脉冲数严格成比例,这就不会引起脉冲误差的积累,而其转速与脉冲频率和步距角有关。控制输入脉冲数量、频率及电动机各相绕组的接通次序,可以得到各种需要的运行特性,如:脉冲数增加,直线或角位移就随之增加;脉冲频率高,则电动机旋转速度就高,反之则慢;分配脉冲的相序改变后,电动机便逆转。步进电机转子运动的速度主要取决于脉冲信号的频率,总位移取决于总的脉冲信号书,故它应用于控制系统中,往往可以使系统简化、工作可靠,
13、而且不需要位移传感器就可以达到较精确地定位,获得较高的控制精度。2.2.1.2 步进电机控制原理步进电机 2 个相邻磁极之间的夹角为 60。线圈绕过相对的 2 个磁极,构成一相(A-A,B-B,C-C)。磁极上有 5 个均匀分布的矩形小齿,转子上没有绕组,而有 40个小齿均匀分布在其圆周上,且相邻 2 个齿之间的夹角为 9当某组绕组通电时,相应的2 个磁极就分别形成 N-S 极,产生磁场,并与转子形成磁路。如果这时定子的小齿与转子没有对齐,则在磁场的作用下转子将转动一定的角度,使转子齿与定子齿对齐,从而使步进电机向前“走”一步。如果通过单片机按顺序给绕组施加有序的脉冲电流,就可以控制电机的转动
14、,从而广东石油化工学院本科毕业设计:机械手控制系统设计4实现数字角度的转换。转动的角度大小与施加的脉冲数成正比,转动的速度与脉冲频率成正比,而转动方向则与脉冲的顺序有关。以三相步进电机为例,电流脉冲的施加共有 3 种方式。 (1)单相三拍方式(按单相绕组施加电流脉冲):ABC正转;ACB反转。 (2)双相三拍方式(按双相绕组施加电流脉冲):ABBCCA正转;ACCBAB反转。 (3)三相六拍方式(单相绕组和双相绕组交替施加电流脉冲):AABBBCCCA正转;AACCCBBBA反转。单相三拍方式的每一拍步进角为 3,三相六拍的步进角则为 1.5,因此,在三相六拍下,步进电机的运行反转平稳柔和,但
15、在同样的运行角度与速度下,三相六拍驱动脉冲的频率需提高 1 倍,对驱动开关管的开关特性要求较高。2.2.1.3 步进电机特性及优缺点:(1)一般步进电机的精度为步进角的 3-5%,且不累积。 (2)步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步 (3)步进电机的力矩会随转速的升高而下降。当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。 (4)步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。步进电机有一个技术参数:空载启动频率,即步进电机在空载
16、情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。 (5)优点1.电机旋转的角度正比于脉冲数; 2.电机停转的时候具有最大的转矩(当绕组激磁时); 3.由于每步的精度在百分之三到百分之五,而且不会将一步的误差积累到下一步因而有较好的位置精度和运动的重复性; 4.优秀的起停和反转响应; 5.由于没有电刷,可靠性较高,因此电机的寿命仅仅取决于轴承的寿命; 6.电机的响应仅由数字输入脉冲确定,因而可以采
17、用开环控制,这使得电机的结构可以比较简单而且控制成本 7.仅仅将负载直接连接到电机的转轴上也可以极低速的同步旋转。 8.由于速度正比于脉冲频率,因而有比较宽的转速范围。 2 硬件设计5(6)缺点1.如果控制不当容易产生共振; 2.难以运转到较高的转速。 3.难以获得较大的转矩 2.2.2 单片机的介绍及其选择2.2.2.1 8051 单片机的简介 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器 CPU 随机存储器 RAM、只读存储器 ROM、多种 I/O 口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器
18、等电路)集成到一块硅片上构成的一个小而完善的计算机系统。80 年代以来,单片机发展迅速,各类新产品不断涌现,出现了许多高性能新型机种,现已逐渐成为工厂自动化和各控制领域的支柱产业之一。8051 单片机内部包含了作为微型计算机所必需的基本功能部件,各功能部件相互独立地集成在同一块芯片上。(1)CPU 结构: 8051 内部 CPU 是一个字长为二进制 8 位的中央处理单元,也就是他对数据的处理是按字节为单位进行的。8051 内部 CPU 也是由运算器、控制器和专用寄存器组三部分电路组成。(2)IO 端口:IO 端口又称为 IO 接口,也叫做 IO 通道或者 IO 通路。有串行和并行之分,串行 I
19、O 端口每次只能传送一位二进制信息,并行 IO 端口一次可以传送一组二进制信息。 8051 有四个并行 IO 端口,分别命名为 P0、P1、P2、P3,在这个并行 IO 端口中,每个端口都有双向 IO 功能。 2.2.2.2 8051 单片机的引脚及其功能介绍图 2.2 8051 单片机引脚图广东石油化工学院本科毕业设计:机械手控制系统设计6图 2.3 8051 控制流程图如图 2.2,8051 有 40 条引脚,共分为端口线、电源线和控制线三类。1. 端口线(48) 1P0.0P0.7 P0 口位双向口线(在引脚的 3932 号端子)。 2P1.0P1.7 P1 口 8 位双向口线(在引脚的
20、 18 号端子)。 3P2.0P2.7 P2 口 8 位双向口线(在引脚的 2128 号端子)。 4P3.0P3.7 P3 口 8 位双向口线(在引脚的 1017 号端子)。这 4 个 I/O 口具有不完全相同的功能 P0 口有三个功能 1、外部扩展存储器时,当做数据总线(D0D7 为数据总线接口) 2、外部扩展存储器时,当作地址总线(A0A7 为地址总线接口)3、不扩展时,可做一般的 I/O 使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。 P1 口只做 I/O 口使用,其内部有上拉电阻。 P2 口有两个功能:扩展外部存储器时,当作地址总线使用 2、做一般 I/O 口使用,其内部
21、有上拉电阻; P3口有两个功能 除了作为 I/O 使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置, 上拉电阻当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果 P0 口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 4、电源: VCC - 芯片电源,接+5V;VSS 为接地线。 5、控制线:控制线共有 4 根, 1 ALE/PROG:地址锁存允许/片内 EPROM 编程脉冲2 ALE 功能:用来锁存 P0 口送出的低 8 位地址 3 PROG 功能:片内有 EPROM 的芯片,在 EPROM 编程期间,此引脚输入编程脉冲。2 硬件设计7
22、4 PSEN:外 ROM 读选通信号。 5 RST/VPD:复位/备用电源。 RST(Reset)功能:复位信号输入端。VPD 功能:在 Vcc 掉电情况下,接备用电源。6 EA/Vpp:内外 ROM 选择/片内 EPROM 编程电源。 EA 功能:内外 ROM 选择端。Vpp 功能:片内有 EPROM 的芯片,在 EPROM 编程期间,施加编程电源 Vpp 将一台 PC 机和若干台 8051 单片机构成小型的控制系统,8051 系列单片机的全双工串行 I/O 接口支持 4 种串行通信工作方式。其中方式 2和方式 3 是专为 MCS-51 单片机的多级通信而设置的。在方式 2 和方式 3 中,
23、通过使用多机通信控制位 SM2,可以方便地实现上位机下位机的一对一通信。8051 可发送 11 位数据帧,这 11 位数据帧由一位起始位,8 位数据位,1 位奇偶位和 1 位停止位组成,其格式如下:通过软件的方法编程 8051 的奇偶校验位,使得在发送地址时为“1”,发送数据时为“0”,则 88051 的奇偶校验位就模拟了单片机多机通信的 TB8 位。PC 机内置的异步通信适配器,使该机有能力与其他具有 RS-232C 串行通信接口的计算机或设备进行通信。8051 系列单片机本身具有一个全双工的串行口,因此只需配备一些驱动、隔离电路就可组成一个简单可行的通信接口。2.2.3 驱动芯片 ULN2
24、003 的介绍2.2.3.1 概况:ULN2003 是高耐压、大电流达林顿陈列,由七个硅 NPN 达林顿管组成。2.2.3.2 特点:ULN2003 的每一对达林顿都串联一个 2.7K 的基极电阻,在 5V 的工作电压下它能与 TTL 和 CMOS 电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。 ULN2003 工作电压高,工作电流大,灌电流可达 500mA,并且能够在关态时承受 50V 的电压,输出还可以在高负载电流并行运行。 2.2.3.3 作用:ULN2003 是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入 5
25、VTTL 电平,输出可达500mA/50V。 ULN2003 是高耐压、大电流达林顿陈列,由七个硅 NPN 达林顿管组成。 该电路的特点如下: ULN2003 的每一对达林顿都串联一个 2.7K 的基极电阻,在 5V 的工作电压下它能与 TTL 和 CMOS 电路 直接相连,可以直接处理原先需要标准逻辑缓冲器。 ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。广东石油化工学院本科毕业设计:机械手控制系统设计82.2.3.4 引脚介绍及功能引脚 1:CPU 脉冲输入端,端口对应一个信号输出端。
26、引脚 2:CPU 脉冲输入端。 引脚 3:CPU 脉冲输入端。 引脚 4:CPU 脉冲输入端。 引脚 5:CPU 脉冲输入端。 引脚 6:CPU 脉冲输入端。 引脚 7:CPU 脉冲输入端。 引脚 8:接地。 引脚 9:该脚是内部 7 个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。 引脚 10:脉冲信号输出端,对应 7 脚信号输入端。引脚 11:脉冲信号输出端,对应 6 脚信号输入端。 引脚 12:脉冲信号输出端,对应 5 脚信号输入端。 引脚 13:脉冲信号输出端,对应 4
27、 脚信号输入端。 引脚 14:脉冲信号输出端,对应 3 脚信号输入端。 引脚 15:脉冲信号输出端,对应 2 脚信号输入端。引脚 16:脉冲信号输出端,对应 1 脚信号输入端。2.2.4 MAX232 芯片的介绍MAX232 芯片是美信公司专门为电脑的 RS-232 标准串口设计的单电源电平转换芯片,使用+5v 单电源供电。2.2.4.1 引脚介绍图 2.4 MAX232 芯片引脚图2 硬件设计9如图 2.4,第一部分是电荷泵电路。由 1、2、3、4、5、6 脚和 4 只电容构成。功能是产生+12v 和-12v 两个电源,提供给 RS-232 串口电平的需要。 第二部分是数据转换通道。由 7、
28、8、9、10、11、12、13、14 脚构成两个数据通道。 其中 13 脚(R1IN)、12 脚(R1OUT)、11 脚(T1IN)、14 脚(T1OUT)为第一数据通道。 8 脚(R2IN)、9 脚(R2OUT)、10 脚(T2IN)、7 脚(T2OUT)为第二数据通道。 TTL/CMOS 数据从 T1IN、T2IN 输入转换成 RS-232 数据从 T1OUT、T2OUT 送到电脑 DB9 插头;DB9 插头的 RS-232 数据从 R1IN、R2IN 输入转换成 TTL/CMOS 数据后从R1OUT、R2OUT 输出。 第三部分是供电。15 脚 GND、16 脚 VCC(+5v)。2.2
29、.4.2 主要特点1.符合所有的 RS-232C 技术标准 2.只需要单一 +5V 电源供电 3.片载电荷泵具有升压、电压极性反转能力,能够产生+10V 和-10V 电压 V+、V- 4.功耗低,典型供电电流 5mA 5.内部集成 2 个 RS-232C 驱动器 6.内部集成两个 RS-232C 接收器广东石油化工学院本科毕业设计:机械手控制系统设计103 上位机设计3.1 上位机软件任务上位机软件的主要任务就是实现对下位机的可靠、高效控制。在 VC 平台上,建立一个基于对话框的工程,解决上位机与下位机的通讯问题,通过加载 SerialPort 类实现串口通讯。通过 MFC 微软基础类库构建上
30、位机软件的可视化界面。利用 MFC 中按钮、组框、组合框、静态文本框和编辑框构建图形用户界面。通过类向导创建控件映射函数,实现软件的数据处理、数据输入输出、数据存储等功能。3.2 上位机软件的实现3.2.1 上位机软件工程的建立1 建立程序框架工程 1、在 VC6.0 开发环境中,新建基于对话框的 MFC 应用程序名为 COMD,如图图 3.1 新建工程3 上位机设计11在步骤 1 中选择基于对话框,接着点下一步。图 3.2 MFC 应用程序向导步骤 1第二步按照默认设置,点击第三步,在第三步中点选做为静态的 DLL,用于Release 版本。图 3.3 MFC 应用程序向导步骤 2广东石油化
31、工学院本科毕业设计:机械手控制系统设计12图 3.4 MFC 应用程序向导步骤 3在第三步完成后点击完成,完成 MFC 对话框程序的创建,此时会提示所创建程序的版本等信息,点击确定即可。图 3.5 MFC 工程新建3 上位机设计133.2.2 上位机软件图形用户界面的构建图 3.6 MFC 初始工作界面在对话框的右边有一个控件快捷栏,点击相应的控件,拖动放在对话框中的相应位置,修改相应的 ID 号跟标题,添加相对应的变量跟函数。完成后对话框如图所示:图 3.7 Robot 上位机软件广东石油化工学院本科毕业设计:机械手控制系统设计14点击菜单栏上的工程添加到工程,在“插入文件到工程”对话框中,
32、将SerialPort.cpp 和 SerialPort.h 添加到当前工程中。图 3.8 添加文件3.2.3 上位机软件的函数实现接下来进行串口设置,添加组框、静态文本框、组合框。例如串口,添加静态文本框,ID 号采用默认方式,标题改为“串口:”,添加组合框,设置 ID 号为IDC_COMLIST。按照此种方法依次添加。在 OnInitDialog()函数中对串口、 波特率、校验位、数据位与停止位进行相应的初始化,程序清单如下:/扫描串口列表ScanPort();/波特率(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(0,“110“);(
33、CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(1,“300“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(2,“600“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(3,“1200“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(4,“2400“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(5,“4800“
34、);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(6,“9600“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(7,“19200“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(8,“38400“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(9,“56000“);3 上位机设计15(CComboBox *)GetDlgItem(IDC_BAUDRATE)-Inse
35、rtString(10,“57600“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-InsertString(11,“115200“);(CComboBox *)GetDlgItem(IDC_BAUDRATE)-SetCurSel(6);/校验位(CComboBox *)GetDlgItem(IDC_CHECKBIT)-InsertString(0,“NONE 无“);(CComboBox *)GetDlgItem(IDC_CHECKBIT)-InsertString(1,“ODD 奇校验“);(CComboBox *)GetDlgItem(IDC_CHECK
36、BIT)-InsertString(2,“EVEN 偶校验“);(CComboBox *)GetDlgItem(IDC_CHECKBIT)-InsertString(3,“MARK 标记“);(CComboBox *)GetDlgItem(IDC_CHECKBIT)-InsertString(4,“SPACE 空格“);(CComboBox *)GetDlgItem(IDC_CHECKBIT)-SetCurSel(0);/数据位(CComboBox *)GetDlgItem(IDC_DATABIT)-InsertString(0,“5“);(CComboBox *)GetDlgItem(IDC
37、_DATABIT)-InsertString(1,“6“);(CComboBox *)GetDlgItem(IDC_DATABIT)-InsertString(2,“7“);(CComboBox *)GetDlgItem(IDC_DATABIT)-InsertString(3,“8“);(CComboBox *)GetDlgItem(IDC_DATABIT)-SetCurSel(3);/停止位(CComboBox *)GetDlgItem(IDC_STOPBIT)-InsertString(0,“1“);(CComboBox *)GetDlgItem(IDC_STOPBIT)-InsertSt
38、ring(1,“1.5“);(CComboBox *)GetDlgItem(IDC_STOPBIT)-InsertString(2,“2“);(CComboBox *)GetDlgItem(IDC_STOPBIT)-SetCurSel(0);添加打开串口串口按钮,右击,在属性对话框样式中勾选自动、推式。双击按钮,添加控件函数,改函数名为 OnStart(),按确定进行相应函数的程序编程,程序如下:void CCOMDDlg:OnStart() /打开串口/ TODO: Add your control notification handler code hereif(m_start.GetCh
39、eck()GetConfig(cfg);if(!m_com.IsOpen() /如果没有打开if(!m_com.Open(cfg.port_num,cfg.baud,cfg.parity,cfg.databits,cfg.stopbits)广东石油化工学院本科毕业设计:机械手控制系统设计16TCHAR szBuf1024;wsprintf(szBuf, _T(“打开 COM%d 失败, 代码:%d“), cfg.port_num, GetLastError();MSG(szBuf);elseAfxGetMainWnd()-SendMessage(ON_COM_OPEN, (WPARAM)m_c
40、om.GetPort();MSG(“串口打开成功,正在监听 .“);elsem_com.Close();AfxGetMainWnd()-SendMessage(ON_COM_CLOSE, (WPARAM)iInstance);GetDlgItem(IDC_COMLIST)-EnableWindow(FALSE);GetDlgItem(IDC_BAUDRATE)-EnableWindow(FALSE);GetDlgItem(IDC_CHECKBIT)-EnableWindow(FALSE);GetDlgItem(IDC_DATABIT)-EnableWindow(FALSE);GetDlgIte
41、m(IDC_STOPBIT)-EnableWindow(FALSE);m_start.SetIcon(IDI_RED);m_start.SetWindowText(“关闭串口(/m_port.InitPort(this,)elsem_start.SetCheck(0);m_com.Close();3 上位机设计17MSG(“串口已关闭! “);GetDlgItem(IDC_COMLIST)-EnableWindow(TRUE);GetDlgItem(IDC_BAUDRATE)-EnableWindow(TRUE);GetDlgItem(IDC_CHECKBIT)-EnableWindow(TR
42、UE);GetDlgItem(IDC_DATABIT)-EnableWindow(TRUE);GetDlgItem(IDC_STOPBIT)-EnableWindow(TRUE);m_start.SetIcon(IDI_GREEN);m_start.SetWindowText(“打开串口(接下来设置“ 电机参数设置 ”部分,按照上面所述方法,添加组框、静态文本框、按钮、编辑框、组合框和单选按钮。在对话框的设置界面中,右击鼠标,弹出快捷菜单,单击“建立类向导 ”,在类向导对话框中的 “Message Maps”选显卡中添加相应按钮的函数。在“Member Variables”中添加相应控件的变量
43、。图 3.9 添加函数广东石油化工学院本科毕业设计:机械手控制系统设计18图 3.10 添加控件在类列表中添加全局变量:CButtonST m_start;CButtonST m_clear;COM_OBJ cfg;CString m_disp;CString m_sTx;CString m_a;CString m_t;CString m_v0;CString m_v;CString m_s;CString m_motorstr;CString m_program;图 3.11 添加全局变量3 上位机设计19在对话框中添加“计算”按钮,右击改标题为“计算”,双击添加函数 void CCOMDD
44、lg:OnCal() / TODO: Add your control notification handler code hereUpdateData(TRUE);m_v0l=atof(m_v0);m_al=atof(m_a);m_tl=atof(m_t);m_vl=atof(m_v);m_sl=atof(m_s);if(m_sl=0)if(m_al=0)m_al=(m_vl-m_v0l)/m_tl;m_sl=(m_vl*m_vl-m_v0l*m_v0l)/(2*m_al);elseif(m_tl=0)m_sl=(m_vl*m_vl-m_v0l*m_v0l)/(2*m_al);m_tl=(m
45、_vl-m_v0l)/m_al;else if(m_vl=0)m_vl=m_v0l+m_al*m_tl;m_sl=(m_vl*m_vl-m_v0l*m_v0l)/(2*m_al);elsem_v0l=m_vl-m_al*m_tl;m_sl=(m_vl*m_vl-m_v0l*m_v0l)/(2*m_al);elseif(m_al=0)if(m_tl=0)m_al=(m_vl*m_vl-m_v0l*m_v0l)/(2*m_sl);m_tl=(m_vl-m_v0l)/m_al;else if(m_vl=0)m_al=2*(m_sl-m_v0l*m_tl)/(m_tl*m_tl);m_vl=m_v0l
46、+m_al*m_tl;elsem_v0l=2*m_sl/m_tl-m_vl;广东石油化工学院本科毕业设计:机械手控制系统设计20m_al=(m_vl-m_v0l)/m_tl;elseif(m_tl=0)if(m_vl=0)m_tl=sqrt(2*m_al*m_sl+m_v0l*m_v0l);m_vl=m_v0l+m_al*m_tl;elsem_tl=sqrt(m_vl*m_vl-2*m_al*m_sl);m_v0l=m_vl-m_al*m_tl;elsem_v0l=(m_sl-0.5*m_al*m_tl*m_tl)/m_tl;m_vl=m_v0l+m_al*m_tl;m_v0.Format(_
47、T(“%8.2lf“),m_v0l);m_a.Format(_T(“%8.2lf“),m_al);m_t.Format(_T(“%8.2lf“),m_tl);m_v.Format(_T(“%8.2lf“),m_vl);m_s.Format(_T(“%8.2lf“),m_sl);UpdateData(FALSE);;该函数实现对输入参数的计算,将 CString 型数据转换为 double 型参与计算,并将结果输入到编辑框中显示。添加“确定”按钮及其函数 void CCOMDDlg:OnOk() / TODO: Add your control notification handler code
48、 here/读取电机号GetDlgItemText(IDC_MOTOR_SELETE,m_motorstr);CString m_motorstring;m_motorstring=m_motorstr.Right(m_motorstr.Find(“MOTOR“)+2);/读取运动方式int m_movstyledouble;if(m_movstylebool) m_movstyledouble=0;/单机单步3 上位机设计21else m_movstyledouble=1;/多机多步/读取步号if(m=0)if(m=0)if(m_movstylebool) +stepi;/单机单步/这一下步
49、骤很重要,在与下位机进行通讯时,根据具体情况进行修改,可增添更多控制信号movedatam0=stepi;movedatam1=atoi(m_motorstring);movedatam2=m_turn;movedatam3=int(100*atof(m_v0);movedatam4=int(100*atof(m_a);movedatam5=int(1000*atof(m_t);movedatam6=int(100*atof(m_v);movedatam7=int(100*atof(m_s);m+;m_program.Format(“%s %3.1d %3s %3.1d %4s %4s %4s %4s %4s “,m_program,stepi,m_motor