运动控制卡C程序示例

合集下载

运动会管理系统c语言程序设计

运动会管理系统c语言程序设计

运动会管理系统C语言程序设计
简介
运动会管理系统是一个用C语言编写的程序,用于管理学校或机构举办的各类
运动会活动。

该系统能够帮助组织者有效地安排赛程、记录成绩以及生成相关报表,提高管理效率和赛事质量。

功能模块
1. 用户登录
•提供管理员和裁判员两类用户登录选项
•管理者可以对比赛项目、队伍信息进行管理
•裁判员可以录入比赛成绩
2. 赛事管理
•管理者可以添加、编辑、删除赛事项目
•每个赛事项目包括项目名称、参赛队伍、赛程安排等信息
3. 队伍管理
•管理者可以添加、编辑、删除参赛队伍
•每个参赛队伍包括队名、队员信息等
4. 成绩录入
•裁判员可以录入每个队伍在各个项目中的成绩
•系统可以自动计算并显示队伍的总成绩
5. 报表生成
•系统可以根据录入的成绩数据生成成绩报表
•报表可以按照项目、队伍等不同维度展示成绩数据
技术实现
该系统基于C语言编写,采用了结构体、文件读写、数据处理等基本功能和技术。

通过数据结构的设计和文件操作,实现了用户登录、赛事管理、队伍管理、成绩录入、报表生成等功能。

系统优势
•界面简洁明了,操作便捷高效
•数据处理准确可靠,确保成绩数据的准确性
•面向对象的设计,方便扩展和维护
结语
运动会管理系统C语言程序设计为学校或机构举办运动会提供了一种高效的管理方式,使赛事组织更加顺畅和专业化。

通过不断的优化和改进,该系统能够更好地满足不同运动会的管理需求,为相关活动的顺利进行提供有力支持。

工控:C#如何控制运动卡

工控:C#如何控制运动卡

工控:C#如何控制运动卡现在越来越多的非标设备使用的是运动控制卡,那什么是运动控制卡?运动控制卡是一种基于PC机及工业PC机、用于各种运动控制场合(包括位移、速度、加速度等)的上位控制单元。

所以运动控制卡的编程就需要用到高级语言,常用的有C++,,Labview,C#这几种下面高级语言以C#为例,运动控制卡以固高GT-400-G-PCI(4轴控制卡)为例常见的系统架构一控制卡组成1.控制卡控制卡需要插在PC的PCI插槽内,露出的接口CN17需要用排线和外部端子板连接运动控制卡2.端子板端子板一般装在配电盘上,用于接线,下图中左边的四个AXIS就是轴系的脉冲接口右边为IO和限位接线端子最上门的CN17需要用排线连接到PC内的运动控制卡端子板二.配置运动控制卡(固高官网下载地址:/pro_view-3.html)1.首先装好驱动程序,驱动包可以找供应商拿2.配置卡的参数安装好驱动后,打开固高配置软件,主要配置为伺服的脉冲模式,正负极限的设置,急停的设置当中细节太多这边不一一讲3.用demo控制轴运动配置好参数后,用配置软件动一下轴确定轴参数都对后才能用上位机控制轴一的配置界面轴控制三.用C#编程1.新建一个winform窗体程序,把固高的动态链接库拷贝进去(正常和供应商索取驱动还有相关资料)动态链接库还有文件2.程序内引用gts文件右击项目➡添加➡现有项➡选择刚才拷贝的文件添加完效果3.开始编程卡操作流程:初始化➡读取参数配置(就是用DEMO软件配置好的参数)➡按逻辑控制每个轴归零➡程序控制轴进行位移运动我们在新建一个GtsCard类,把gts类中提供的方法重新整理下,方便以后复用//固高运动控制卡 public class GtsCard { /// <summary> /// 初始化,加载配置,清除轴系报错/// </summary> /// <param name='cardNum'></param> /// <param name='filePath'></param> /// <param name='axis'></param> /// <returns></returns> public bool Initial(gtsCardID gtsCard, Axis[] axis) { short result; bool isOk = false; try { //channel : 打开运动控制器的方式。

基于C#语言的GTS控制卡入门手册(1)

基于C#语言的GTS控制卡入门手册(1)
图 5 4 轴运动控制器与 4 轴端子板连接示意图 2)端子板电源连接 端子板的 CN16 接用户提供的外部电源,板上标有“+24V”的端子接外部 电源+24V(DC+),标有“OGND”的端子接外部电源负(DC—),标有“SGND” 用于特殊情况下的信号地连接,如图 6 所示。
图 6 端子板电源连接图 3)端子板与驱动器连接 一般情况下,伺服驱动器的 C1 接口用屏蔽电缆连接到轴通道 CN1~CN8。
(a)包装盒标签
(b)板卡上的标签
(c)端子板标签 图 1 运动控制器的型号 请戴上配备的防静电手套从产品包装箱取出运动控制卡,然后插入到计算机 机箱中 PCI 插槽,在这之前请确认计算机关闭电源。插好之后,用螺丝将 GTS 卡 转接板固定在机箱上。
1.2 安装运动控制器驱动程序
1)GTS 卡安装好之后,启动计算机,点击“我的电脑”—“属性”—“设
图 4 驱动安装成功提示
1.3 硬件之间的连接
1)运动控制器与段子板的连接
关闭计算机电源,取出产品附带的屏蔽电缆(4 轴卡 1 条,8 轴卡 2 条)。以 4 轴卡为例,屏蔽电缆一端连接控制卡,一端连接端子板(注意:运动控制卡接 口、屏蔽电缆线和端子板都带有标识“CN17”,需要更换时要避免带电插拔), 如图 5 所示连接。
第 1 章 控制卡和端子板型号识别以及硬件连接 1.1 认识运动控制卡和硬件安装
运动控制器包含两个部件:运动控制卡和端子板。从包装盒侧面标签处可以 知道 GTS 卡和端子板的型号,还可以通过 GTS 卡和端子板上的标签得知型号。 如 图 1 所 示VB-LASER ; 端 子 板 型 号 为 GT2-400-ACC2-VB-G-A。
图 29
在 private void button5_click(object sender,EventArgs e) { } 中输入以下代码,如图 30

运动控制卡C程序示例

运动控制卡C程序示例

2. VC编程示例2.1 准备工作(1)新建一个项目,保存为“VCExample.dsw”;(2)根据前面讲述的方法,将静态库“8840.lib”加载到项目中;2.2 运动控制模块(1) 在项目中添加一个新类,头文件保存为“CtrlCard.h”,源文件保存为“CtrlCard.cpp”;(2) 在运动控制模块中首先自定义运动控制卡初始化函数,对需要封装到初始化函数中的库函数进行初始化;(3)继续自定义相关的运动控制函数,如:速度设定函数,单轴运动函数,差补运动函数等;(4)头文件“CtrlCard.h”代码如下:# ifndef __ADT8840__CARD__# define __ADT8840__CARD__/*********************** 运动控制模块********************为了简单、方便、快捷地开发出通用性好、可扩展性强、维护方便的应用系统,我们在控制卡函数库的基础上将所有库函数进行了分类封装。

下面的示例使用一块运动控制卡********************************************************/#define MAXAXIS 4 //最大轴数class CCtrlCard{public:int Setup_HardStop(int value, int logic);int Setup_Stop1Mode(int axis, int value, int logic);(设置stop1信号方式)int Setup_Stop0Mode(int axis, int value, int logic);(设置stop0信号方式)int Setup_LimitMode(int axis, int value1, int value2, int logic);(设置限位信号方式)int Setup_PulseMode(int axis, int value); (设置脉冲输出方式)int Setup_Pos(int axis, long pos, int mode); (设置位置计数器)int Write_Output(int number, int value);(输出单点函数)int Read_Input(int number, int &value);(读入点)int Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed); (获取运动信息)int Get_Status(int axis, int &value, int mode); (获取轴的驱动状态)int StopRun(int axis, int mode); (停止轴驱动)int Interp_Move4(long value1, long value2, long value3, long value4);(四轴差补函数)int Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3);(三轴差补函数)int Interp_Move2(int axis1, int axis2, long value1, long value2);(双轴差补函数)int Axis_Pmove(int axis ,long value);(单轴驱动函数)int Axis_Cmove(int axis ,long value);(单轴连续驱动函数)int Setup_Speed(int axis ,long startv ,long speed ,long add );(设置速度模块)int Init_Board(int dec_num);(函数初始化)(设置速度模块)CCtrlCard(); (定义了一个同名的无参数的构造函数)int Result; //返回值};#endif(5) 源文件“CtrlCard.cpp”代码如下:#include "stdafx.h"#include "DEMO.h"#include "CtrlCard.h"#include "adt8840.h"int devnum=-1;CCtrlCard::CCtrlCard()(构造函数,为什么是空的?){}/*******************初始化函数************************该函数中包含了控制卡初始化常用的库函数,这是调用其他函数的基础,所以必须在示例程序中最先调用返回值<=0表示初始化失败,返回值>0表示初始化成功*****************************************************/int CCtrlCard::Init_Board(int devnum){/***********************************************************/int mode =0;//应答模式为1时,响应串口接收有效,0时无效if(devnum==0)(devnum:设备号){for (int i = 1; i<=MAXAXIS(最大轴数); i++){Result=adt8840a_set_command_pos(devnum, mode,i,0);(设定逻辑计数器)adt8840a_set_actual_pos(devnum, mode,i,0);(设定实位计数器)adt8840a_set_startv(devnum, mode,i,0);(设定初始速度)adt8840a_set_speed(devnum, mode,i,0);(设定驱动速度)adt8840a_set_acc(devnum, mode,i,0);(设定加速度)}if(Result==0 )return 1;elsereturn Result;}elsereturn -1;}/**********************设置速度模块***********************依据参数的值,判断是匀速还是加减速设置轴的初始速度、驱动速度和加速度参数:axis -轴号startv - 初始速度speed -驱动速度add -加速度返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Speed(int axis(轴号), long startv(初始速度), long speed(驱动速度), long add (加速度)) {if (startv - speed >= 0) //匀速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, startv);(设定驱动速度)}else //加减速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, speed); (设定驱动速度)adt8840a_set_acc (devnum,axis, add); (设定加速度)}return Result;}/*********************单轴驱动函数*********************该函数用于驱动单个运动轴运动参数:axis-轴号,value-输出脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Axis_Pmove(int axis, long value){Result = adt8840a_pmove(devnum,axis, value(脉冲数));return Result;}/*******************任意两轴插补函数********************该函数用于驱动任意两轴进行插补运动参数:axis1,axis2-轴号、value1,value2-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move2(int axis1, int axis2, long value1, long value2){Result = adt8840a_inp_move2(devnum,axis1, axis2, value1, value2);return Result;}/*******************任意三轴插补函数********************该函数用于驱动任意三轴进行插补运动参数:axis1,axis2,axis3-轴号、value1,value2,value3-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3) {Result = adt8840a_inp_move3(devnum,axis1, axis2, axis3, value1, value2, value3);return Result;}/*******************四轴插补函数****************************该函数用于驱动XYZW四轴进行插补运动参数:value1,value2,value3,value4-输出脉冲数返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Interp_Move4(long value1, long value2, long value3, long value4){Result = adt8840a_inp_move4(devnum,value1, value2, value3, value4);return Result;}/************************停止轴驱动***********************该函数用于立即或减速停止轴的驱动参数:axis-轴号、mode-减速方式(0-立即停止, 1-减速停止)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::StopRun(int axis, int mode){if(mode == 0) //立即停止{Result = adt8840a_sudden_stop(devnum, axis);}else //减速停止{Result = adt8840a_dec_stop(devnum, axis);}return Result;}/*****************获取轴的驱动状态************************** 该函数用于获取单轴的驱动状态或插补驱动状态参数:axis-轴号,value-状态指针(0-驱动结束,非0-正在驱动)mode(0-获取单轴驱动状态,1-获取插补驱动状态)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_Status(int axis, int &value, int mode){if (mode==0) //获取单轴驱动状态Result=adt8840a_get_status(devnum,axis,&value);else //获取插补驱动状态Result=adt8840a_get_inp_status(devnum,&value);return Result;}/*****************获取运动信息****************************** 该函数用于反馈轴当前的逻辑位置,实际位置和运行速度参数:axis-轴号,LogPos-逻辑位置,ActPos-实际位置,Speed-运行速度返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed ) {Result = adt8840a_get_command_pos(devnum,axis, &LogPos);(获取逻辑位置)adt8840a_get_actual_pos (devnum, axis, &ActPos); (获取实际位置)adt8840a_get_speed (devnum, axis, &Speed);(获取驱动速度)return Result;}/***********************读取输入点******************************* 该函数用于读取单个输入点参数:number-输入点(0 ~ 39)返回值:0 -低电平,1 -高电平,-1 -错误****************************************************************/int CCtrlCard::Read_Input(int number,int &value){Result = adt8840a_read_bit(devnum, number, &value);return Result;}/*********************输出单点函数****************************** 该函数用于输出单点信号参数:number-输出点(0 ~ 15),value 0-低电平、1-高电平返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Write_Output(int number, int value){Result = adt8840a_write_bit(devnum, number, value);return Result;}/*******************设置位置计数器******************************* 该函数用于设置逻辑位置和实际位置参数:axis-轴号,pos-设置的位置值mode 0-设置逻辑位置,非0-设置实际位置返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Setup_Pos(int axis, long pos, int mode){if(mode==0){Result = adt8840a_set_command_pos(devnum,axis, pos);(设置逻辑计数器)}else{Result = adt8840a_set_actual_pos(devnum, axis, pos);(设置实位计数器)}return Result;}/********************设置脉冲输出方式**********************该函数用于设置脉冲的工作方式参数:axis-轴号, value-脉冲方式0-脉冲+脉冲方式1-脉冲+方向方式返回值=0正确,返回值=1错误默认脉冲方式为脉冲+方向方式本程序采用默认的正逻辑脉冲和方向输出信号正逻辑*********************************************************/int CCtrlCard::Setup_PulseMode(int axis, int value){Result = adt8840a_set_pulse_mode(devnum,axis, value, 0, 0);(设置脉冲模式)return Result;}/********************设置限位信号方式********************** 该函数用于设定正/负方向限位输入nLMT信号的模式参数:axis-轴号value1 0-正限位有效1-正限位无效value2 0-负限位有效1-负限位无效logic 0-低电平有效1-高电平有效默认模式为:正限位有效、负限位有效、低电平有效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_LimitMode(int axis, int value1, int value2, int logic) {Result = adt8840a_set_limit_mode(devnum,axis, value1, value2, logic);return Result;}/********************设置stop0信号方式********************** 该函数用于设定stop0信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop0Mode(int axis, int value, int logic){Result = adt8840a_set_stop0_mode(devnum,axis, value ,logic);return Result;}/********************设置stop1信号方式********************** 该函数用于设定stop1信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop1Mode(int axis, int value, int logic){Result = adt8840a_set_stop1_mode(devnum,axis, value, logic);return Result;}/************************单轴连续驱动函数*********************** 该函数用于驱动单个运动轴运动参数:axis-轴号,value-脉冲方向返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Axis_Cmove(int axis, long value){Result = adt8840a_continue_move(devnum,axis, value);return Result;}2.3 功能实现模块2.3.1 界面设计说明:(1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。

C语言实现校运动会项目管理系统

C语言实现校运动会项目管理系统

C语⾔实现校运动会项⽬管理系统本⽂实例为⼤家分享了C语⾔实现校运动会项⽬管理系统的具体代码,供⼤家参考,具体内容如下源码#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 3 //参与运动会的学院数⽬//定义⼀个结构体typedef struct project{char xiangmu[40]; //⽐赛项⽬名称char name[N][40]; //学院名称float score[N]; //单项成绩int no[N]; //单项名次struct project *next; //指向下⼀节点的指针} Proj;typedef struct sumno{char name[40];float sum;} SumNo;//函数声明放在这⾥void ListCreate(Proj *L, int n); //创建链表节点void ListSearch(Proj *L); //查找某个运动会项⽬信息void ListModify(Proj *L); //修改某个运动会项⽬信息void ListDelete(Proj *L); //删除某个运动会项⽬信息void Input(Proj *p, int i); //输⼊运动会项⽬信息void Output(Proj *L); //输出每个运动会项⽬的学院成绩排名信息void PerRank(Proj *L); //计算每个运动会项⽬的学院成绩排名并输出void SumRank(Proj *L); //所有项⽬每个学院的总成绩和排名void Menu(); //校运动会项⽬管理系统的菜单//校运动会项⽬管理系统的主函数⼊⼝int main(){int item, n; //item⽤于接收输⼊的命令,n⽤于接收输⼊的项⽬数Proj *L = NULL; //初始化⼀个头节点L = (Proj *)malloc(sizeof(Proj)); //为头节点开辟内存空间L->next = NULL; //将头节点的指针域置空do{Menu(); //菜单printf("请输⼊相应的数字,进⾏相应的操作:\n");scanf("%d", &item);system("cls");switch (item){case 1:printf("请输⼊您要录⼊的项⽬数⽬:");scanf("%d", &n);ListCreate(L, n); //创建项⽬链表节点getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 2:ListSearch(L); //查找项⽬的相关信息getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 3:ListModify(L); //修改项⽬信息getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 4:ListDelete(L); //删除项⽬的信息getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 5:PerRank(L); //计算每个运动会项⽬的学院成绩排名Output(L); //输出每个运动会项⽬的学院成绩排名信息getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 6:SumRank(L); //所有项⽬每个学院的总成绩和排名getchar();printf("\n请按任意键返回主菜单\n");getchar();system("cls");break;case 0:printf("即将退出校运动会项⽬管理系统....."); //退出校运动会项⽬管理系统 exit(0);default:printf("您输⼊的指令不正确,请重新输⼊");}printf("\n\n");} while (item);return 0;}//创建链表,将新⽣成的节点插⼊到链表的表头void ListCreate(Proj *L, int n){int i;for (i = 0; i < n; i++){Proj *p;//将新⽣成的节点插⼊到链表中p = NULL;p = (Proj *)malloc(sizeof(Proj));Input(p, i);p->next = L->next;L->next = p;}}//查找项⽬信息void ListSearch(Proj *L){int k;char n[40];Proj *p = L->next;if (p == NULL)printf("数据为空,⽆法查找!");else{printf("请输⼊您要查找的项⽬名称:");scanf("%s", n);while (strcmp(p->xiangmu, n) != 0){p = p->next;if (p == NULL){printf("没有找到相关信息\n");return;}}PerRank(L);printf("该项⽬的相关信息如下:\n");printf("学院名称\t单项成绩\t单项名次\n\n");for (k = 0; k < N; k++){printf("%s\t\t", *((p->name) + k));printf("%.2f\t\t", *((p->score) + k));printf("%d\t\n", *((p->no) + k));}printf("\n\n");}}//修改项⽬的相关信息void ListModify(Proj *L){int item, k, a;char n[40], m[40];Proj *p = L->next;if (p == NULL)printf("数据为空,⽆法修改!");else{printf("请输⼊您要修改的项⽬名称:");scanf("%s", n);while (strcmp(p->xiangmu, n) != 0){p = p->next;if (p == NULL){printf("没有找到相关信息\n");return;}}printf("您是否需要修改项⽬名称(是输⼊1,不是输⼊0):"); scanf("%d", &a);if (a == 1){printf("请输⼊您修改后的项⽬名称:");scanf("%s", m);strcpy(p->xiangmu, m);printf("修改成功!");}else if (a == 0){printf("请输⼊您要修改的学院:");scanf("%s", n);for (k = 0; k < N; k++){if (strcmp(*((p->name) + k), n) == 0)break;}printf("请输⼊你要修改的项⽬信息类型:\n");printf("1、学院名称\n2、该学院该项⽬的成绩\n");scanf("%d", &item);switch (item){case 1:printf("请输⼊修改后的学院名称:");scanf("%s", m);strcpy(*((p->name) + k), m);printf("修改成功");break;case 2:printf("请输⼊您修改后的该学院该项⽬的成绩:"); scanf("%f", (p->score) + k);printf("修改成功");break;default:printf("您输⼊的指令错误!");break;}}elseprintf("您输⼊错误!");}}//删除项⽬的相关信息void ListDelete(Proj *L){char n[40];Proj *p = L->next, *pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点 if (p == NULL)printf("数据为空,⽆法删除!");else{printf("请输⼊您要删除的项⽬名称:");scanf("%s", n);while (strcmp(p->xiangmu, n) != 0){pre = p;p = pre->next;if (p == NULL){printf("没有找到相关信息,⽆法删除\n");return;}}pre->next = p->next;free(p);printf("删除成功");}}//计算每个运动会项⽬的学院成绩排名void PerRank(Proj *L){int i, j, k;float t;char na[40] = {' '};Proj *p = L->next;if (p == NULL)printf("数据为空,⽆法排序!");else{while (p != NULL){for (i = 0; i < N; i++){for (j = 0; j < N - i - 1; j++){if (*((p->score) + j) < *((p->score) + j + 1)){t = *((p->score) + j);*((p->score) + j) = *((p->score) + j + 1);*((p->score) + j + 1) = t;strcpy(na, *((p->name) + j));strcpy(*((p->name) + j), *((p->name) + j + 1));strcpy(*((p->name) + j + 1), na);}}}for (k = 0; k < N; k++)*((p->no) + k) = k + 1;p = p->next;}}}//所有项⽬每个学院的总成绩和排名;void SumRank(Proj *L){int i, j, k;float t;SumNo s[N],s0;Proj *p = L->next;for (i = 0; i < N; i++){strcpy(s[i].name, *((p->name) + N - i - 1));s[i].sum = 0;}if (p == NULL)printf("数据为空!");else{while (p != NULL){for(i=0;i<N;i++)s[i].sum += *((p->score) + i);p = p->next;}for (j = 0; j < N; j++){for (k = 0; k < N - j - 1; k++){if(s[k].sum>s[k+1].sum){s0 = s[k];s[k] = s[k + 1];s[k + 1]= s0;}}}p = L->next;printf("学院名称\t总成绩\t\t总排名\n");for (i = N - 1; i >= 0; i--){printf("%s\t\t", s[i].name);printf("%.2f\t\t", s[i].sum);printf("%d\t\t", N - i);printf("\n");}}}//输⼊项⽬的相关信息void Input(Proj *p, int i){int j;printf("请输⼊第%d个⽐赛项⽬名称:", i + 1);scanf("%s", p->xiangmu);for (j = 0; j < N; j++){printf("请输⼊第%d个学院的名称:", j + 1);scanf("%s", (p->name) + j);printf("请输⼊该学院的该项⽬的成绩:");scanf("%f", (p->score) + j);}}//输出全部项⽬信息void Output(Proj *L){int k;Proj *p = L->next;while (p != NULL){printf("\t\t项⽬:%s\n\n", p->xiangmu);printf("学院名称\t单项成绩\t单项名次\n\n");for (k = 0; k < N; k++){printf("%s\t\t", *((p->name) + k));printf("%.2f\t\t", *((p->score) + k));printf("%d\t\n", *((p->no) + k));}printf("\n\n");p = p->next;}}//校运动会项⽬管理系统的菜单void Menu(){printf("\n\n");printf("\t\t\t===================校运动会项⽬管理系统==================\n"); printf("\t\t\t* 作者:XXX 班级:⼈⼯智能XXXX 学号:XXXXXXXXX *\n");printf("\t\t\t* *\n");printf("\t\t\t* 1>. 录⼊运动会项⽬信息 *\n");printf("\t\t\t* 2>. 查找某个运动会项⽬信息 *\n");printf("\t\t\t* 3>. 修改某个运动会项⽬信息 *\n");printf("\t\t\t* 4>. 删除某个运动会醒⽬信息 *\n");printf("\t\t\t* 5>. 每个运动会项⽬的学院成绩排名 *\n");printf("\t\t\t* 6>. 所有项⽬每个学院的总成绩和排名 *\n");printf("\t\t\t* 0>. 退出管理系统 *\n");printf("\t\t\t* 欢迎使⽤本系统!*\n");printf("\t\t\t=========================================================\n"); printf("\t\t\t输⼊选项,按回车进⼊选项: \n");}主菜单截图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

经典6轴运动控制卡C#.NET代码

经典6轴运动控制卡C#.NET代码

经典6轴运动控制卡C#.NET代码using System;using System.Collections.Generic;using /doc/d3*******.htmlponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using csDmc5480;namespace Demo{public partial class Form1 : Form{const Int32 XCH = 0;const Int32 YCH = 1;const Int32 ZCH = 2;const Int32 UCH = 3;UInt16 m_UseAxis;public Form1(){InitializeComponent();Int32 nCard = 0;nCard = Dmc5480.d5480_board_init(); //控制卡的初始化操作,调⽤后必须使⽤d2410_board_close关闭卡。

中间不可再次调⽤该初始化函数。

if ((nCard <= 0) || (nCard >8))//正常的卡数在1- 8之间MessageBox.Show("初始化DMC5480卡失败!", "出错");m_UseAxis = 0; //默认选择X轴Dmc5480.d5480_set_pulse_outmode(m_UseAxis, 0); //设定脉冲输出模式Dmc5480.d5480_set_position(XCH, 0); //设置X轴的脉冲位置为0Dmc5480.d5480_set_position(YCH, 0); //设置Y轴的脉冲位置为0Dmc5480.d5480_set_position(ZCH, 0); //设置Z轴的脉冲位置为0Dmc5480.d5480_set_position(UCH, 0); //设置U轴的脉冲位置为0timer1.Enabled = true;}private void Form1_FormClosed(){timer1.Enabled = false;Dmc5480.d5480_board_close();}private void timer1_Tick(object sender, EventArgs e){long pos;string str_DisplayPos;pos = Dmc5480.d5480_get_position(0);//读取指定轴的当前位置str_DisplayPos = "X=" + Convert.ToString(pos);pos = Dmc5480.d5480_get_position(1);str_DisplayPos = str_DisplayPos + " Y=" + Convert.ToString(pos);pos = Dmc5480.d5480_get_position(2);str_DisplayPos = str_DisplayPos + " Z=" + Convert.ToString(pos);pos = Dmc5480.d5480_get_position(3);str_DisplayPos = str_DisplayPos + " U=" + Convert.ToString(pos);Label_POSITION.Text = str_DisplayPos;//显⽰位置信息}private void BUTTON_MOVE_Click(object sender, EventArgs e){double m_nStart;double m_nSpeed;double fAcc;Int32 dist;//提取输⼊信息m_nStart = Convert.ToDouble(Text_STRSPD.Text);m_nSpeed = Convert.ToDouble(Text_RUNSPD.Text);fAcc = Convert.ToDouble(Text_Tacc.Text);dist = Convert.ToInt32(Text_Dist.Text);Dmc5480.d5480_set_profile(m_UseAxis, m_nStart, m_nSpeed, fAcc, fAcc); //设置速度、加速度Dmc5480.d5480_pmove(m_UseAxis, dist, 0); //作相对t型运动}privatevoid OptionMoveAxis1_CheckedChanged(object sender, EventArgs e){m_UseAxis = XCH;}private void OptionMoveAxis2_CheckedChanged(object sender, EventArgs e){m_UseAxis = YCH;}private void OptionMoveAxis3_CheckedChanged(object sender, EventArgs e){m_UseAxis = ZCH;}private void OptionMoveAxis4_CheckedChanged(object sender, EventArgs e){m_UseAxis = UCH;}private void Button_CLEAN_Click(object sender, EventArgs e){Dmc5480.d5480_set_position(m_UseAxis, 0);//设定指定轴的当前位置}private void Button_DelStop_Click(object sender, EventArgs e){Dmc5480.d5480_decel_stop(m_UseAxis, Convert.ToDouble(Text_Tacc.Text));//减速停⽌}private void Button_EmgStop_Click(object sender, EventArgs e){Dmc5480.d5480_emg_stop();//紧急停⽌所有轴}private void Button_Close_Click(object sender, EventArgs e){this.Close(); }}}。

基于VC 的运动控制卡软件系统设计

基于VC  的运动控制卡软件系统设计

基于VC++的运动控制卡软件系统设计在自动控制领域,基于PC和运动控制卡的伺服系统正演绎着一场工业自动化的革命。

目前,常用的多轴控制系统主要分为3大块:基于PLC的多轴定位控制系统,基于PC_based的多轴控制系统和基于总线的多轴控制系统。

由于PC 机在各种工业现场的广泛运动,先进控制理论和DSP技术实现手段的并行发展,各种工业设备的研制和改造中急需一个运动控制模块的硬件平台,以及为了满足新型数控系统的标准化、柔性化、开放性等要求,使得基于PC和运动控制卡的伺服系统备受青睐。

本文主要是利用VC++6.0提供的MFC应用程序开发平台探索研究平面2-DOF四分之过驱动并联机构的运动控制系统的软件开发。

平面2-DOF四分之过驱动并联机构的控制系统组成并联机构的本体如图1,该机构由4个分支链组成,每条支链的一段与驱动电动机相连,而另一端相交于同一点。

该并联机构的操作末端有2个自由度(即X 方向和Y方向的平动),驱动输入数目为4,从而组成过驱动并联机构。

For personal use only in study and research; not for commercial use控制系统的硬件主要有4部分组成:PC机,四轴运动控制卡,伺服驱动器和直流电动机。

系统选用的是普通PC机,固高公司的GT-400-SV-PCI运动控制卡,瑞士Maxon公司的四象限直流伺服驱动器及直流永磁电动机。

伺服驱动器型号为4-Q-DCADS50/5,与驱动器适配直流电动机型号为Maxon RE-35。

运动控制系统的构成如图2所示。

上位控制单元由PC机和运动控制卡一起组成,板卡插在PC机主板上的PCI插槽内。

PC机主要负责信息流和数据流的管理,以及从运动控制卡读取位置数据,并经过计算后将控制指令发给运动控制卡。

驱动器控制模式采用编码器速度控制,驱动器接受到运动控制卡发出的模拟电压,通过内部的PWM电路控制直流电动机RE-35的运转,并接受直流电动机RE-35上的编码器反馈信号调整对电动机的控制,如此构成一个半闭环的直流伺服控制系统。

运动控制卡回原点示意图及其代码

运动控制卡回原点示意图及其代码

int Check_OriginSignal(int cardno,int axis,int mode) {if (mode==0){if(!STOP0_High[axis-1]){int bit[]={2,8,14,20};//stop0return read_bit(cardno,bit[axis-1])==0?1:0;}else{int bit[]={2,8,14,20};//stop0return read_bit(cardno,bit[axis-1])==1?1:0;}}else{if(!STOP1_High[axis-1]){int bit[]={3,9,15,21};//stop1return read_bit(cardno,bit[axis-1])==0?1:0;}else{int bit[]={3,9,15,21};//stop1return read_bit(cardno,bit[axis-1])==1?1:0;}}}int Check_LimitSignal(int cardno,int axis,int mode){if(!LMTLevel_High[axis-1]){//低电平有效if (mode){int bit[]={0,6,12,18};//LMT-return read_bit(cardno,bit[axis-1])==0?1:0;}else{int bit[]={1,7,13,19};//LMT+return read_bit(cardno,bit[axis-1])==0?1:0;}}else{//高电平有效if (mode){int bit[]={0,6,12,18};//LMT-return read_bit(cardno,bit[axis-1])==1?1:0;}else{int bit[]={1,7,13,19};//LMT+return read_bit(cardno,bit[axis-1])==1?1:0;}}}/**************************单轴回原点********************** 功能:执行单轴回原点运动参数:cardno 卡号axis 轴号(1-4)backDir 回原点方向0:正向1:负向logical0 回原点stop0设置0:低电平有效1:高电平有效logical1 回原点stop1设置0:低电平有效1:高电平有效-1:无效(不搜索Z相)homeStartV 回原点启始速度,取值范围:0-2MhomeSpeed 回原点驱动速度,取值范围:0-2MhomeAcc 回原点加速度,取值范围:0-64000searchRange 原点范围(不宜过大)searchSpeed stop0搜索速度(不宜过高)phaseSpeed Z相搜索速度(不宜过高)pulseUnit 每转脉冲返回值0:回原点成功; -1:参数错误; -2:回原点失败,(碰到限位或原点范围过小);1:回原点被中止说明:(1) 回原点分为四大步:第一步:快速接近stop0(logical0原点设置),找到stop0;第二步:慢速反向离开stop0,反向移动指定原点范围脉冲数;第三步:再次慢速接近stop0;第四步:慢速接近stop1(logical1编码器Z相).(2) 第四步可以选择是否执行,通过logical1来选择.(3) 若需多轴回原点,必须等待上一轴回原点结束后,才能执行下一轴的回原点动作.******************************************************************/int_stdcall home1(int cardno,int axis,int backDir,int logical0 ,int logical1 ,long homeStartV,long homeSpeed,long homeAcc,long searchRange,long searchSpeed,long phaseSpeed ,long pulseUnit){static MSG msg;static int nCount =0;int workstep=0,status=-1,value=-1; //步骤;驱动状态int StopSignal=0; //停止信号long longPulse =2147483647; //长脉冲,4字节上限Stop_Flag[axis-1]=0; //标记该轴开始运动if (cardno<0 || cardno >=max_card_number )return -1;//卡号判断if(axis<0||axis>4) return -1; //轴号判断if(backDir<0||backDir>1) return -1; //方向判断if(logical0 !=0 && logical0 !=1 ) return -1; //STOP0方式判断if(logical1 !=0 && logical1 !=1 && logical1 !=-1) return -1; //STOP1方式判断//搜索范围,搜索速度,每转脉冲判断if(searchRange<0||searchSpeed<0||pulseUnit<0)return -1;//设定启动,驱动,加速度if (homeStartV>=homeSpeed){homeStartV=homeSpeed;set_startv(cardno,axis,homeStartV);set_speed(cardno,axis,homeSpeed);}else{set_startv(cardno,axis,homeStartV);set_speed(cardno,axis,homeSpeed);set_acc(cardno,axis,homeAcc);}set_stop0_mode(cardno,axis,1,logical0);//设定stop0有效电平Start_Run(axis);while (TRUE){switch(workstep){case0://发送长脉冲/////////if(Check_OriginSignal(cardno,axis,0)){//已经在原点,不发送长脉冲直接反向退出StopSignal=1;//由原点引起workstep=2;break;}//////////pmove(cardno,axis,backDir?-longPulse:longPulse);workstep++;break;case1://分析是否碰到原点或限位if (backDir==1 && StopSignal==0)//负向回原点if(Check_OriginSignal(cardno,axis,0))StopSignal=1;//由stop0原点引起if (Check_LimitSignal(cardno,axis,1))StopSignal=2;//由负限位引起}if ( backDir==0 && StopSignal==0)//正向回原点{if(Check_OriginSignal(cardno,axis,0))StopSignal=1;//由原点引起if (Check_LimitSignal(cardno,axis,0))StopSignal=2;//由正限位引起}get_status(cardno,axis,&status);//驱动状态检测if (status) break;//驱动进行中,继续检测if (StopSignal==0) //未检测到正常停止信号{set_stop0_mode(cardno,axis,0,0);}if (StopSignal==2) //原点模式时,由限位引起的停止{return -2;}set_stop0_mode(cardno,axis,0,0);StopSignal=0;workstep++;break;case2://低速经过原点set_startv(cardno,axis,searchSpeed);set_speed(cardno,axis,searchSpeed);pmove(cardno,axis,backDir?searchRange:-searchRange);//搜索范围workstep++;break;case3://判断驱动结束,设置原点有效get_status(cardno,axis,&status);//判断运动是否停止if (status) break; //驱动进行中,继续读信号和状态set_stop0_mode(cardno,axis,1,logical0);//设定stop0有效电平workstep++;break;case4://低速接近原点pmove(cardno,axis,backDir?-searchRange:searchRange);workstep++;break;case5://读信号和状态if (backDir==1 && StopSignal==0)//负向回原点{if(Check_OriginSignal(cardno,axis,0))StopSignal=1;//由stop0原点引起if (Check_LimitSignal(cardno,axis,1))StopSignal=2;//由负限位引起}if ( backDir==0 && StopSignal==0)//正向回原点{if(Check_OriginSignal(cardno,axis,0))StopSignal=1;//由stop0原点引起if (Check_LimitSignal(cardno,axis,0))StopSignal=2;//由正限位引起}get_status(cardno,axis,&status);if (status) break;//驱动进行中,继续读信号和状态if (StopSignal==0 || StopSignal==2) //未检测到正常停止信号{set_stop0_mode(cardno,axis,0,0);return -2;}if(logical1==-1){//不搜索Z,回原点完成set_stop0_mode(cardno,axis,0,0);set_command_pos(cardno,axis,0);set_actual_pos(cardno,axis,0);return SUCCESSFUL;}else{if (logical1==0||logical1==1)//搜索Z相{set_stop0_mode(cardno,axis,0,0);workstep++;break;}}case6: //编码器Z相,移动与每转脉冲数等长的位移{StopSignal=0;set_startv(cardno,axis,phaseSpeed);//低速接近Z相set_speed(cardno,axis,phaseSpeed);//低速接近Z相set_stop1_mode(cardno,axis,1,logical1);//设置Stop1有效电平pmove(cardno,axis,backDir?pulseUnit:-pulseUnit);workstep++;break;}case7://判断搜索Z相信号结果{if(Check_OriginSignal(cardno,axis,1))StopSignal=1;//由STOP1引起get_status(cardno,axis,&status);if (status) break;//驱动进行中,继续读信号和状态if (StopSignal==0){//转了一圈仍然没有找到Z信号set_stop1_mode(cardno,axis,0,0);return -2;}set_stop1_mode(cardno,axis,0,0);set_command_pos(cardno,axis,0);set_actual_pos(cardno,axis,0);return SUCCESSFUL;}}if (Stop_Flag[axis-1]==1)//响应外部的停止信号,退出break;//转让控制权PeekMessage(&msg,NULL,0,0,PM_REMOVE);::TranslateMessage( &msg );::DispatchMessage( &msg );nCount++;if(6<=nCount) //每执行6次,睡眠一次{nCount=0;Sleep(1); //强制释放时间片,降低CPU占用率}}//end whileset_stop0_mode(cardno,axis,0,0);//设置STOP0为无效set_stop1_mode(cardno,axis,0,0);//设置STOP1为无效return1;}。

qt creator数据采集卡运动控制卡编程实例

qt creator数据采集卡运动控制卡编程实例

qt creator数据采集卡运动控制卡编程实例Qt Creator是一款强大的集成开发环境(IDE)工具,能够支持多种编程语言的开发,其中包括C++。

本篇文章将向大家介绍如何在Qt Creator中使用C++编程来控制数据采集卡和运动控制卡。

第一步:准备工作在开始编写程序之前,需要先准备好相应的硬件设备以及开发环境。

对于数据采集卡和运动控制卡,需要根据其型号和规格进行适当的连接和配置。

同时,需要安装好Qt Creator开发环境和相关的库文件,如NI-DAQmx、Motion Control和Serial Communication。

第二步:创建Qt项目打开Qt Creator,点击菜单栏中的“File”,然后选择“NewFile or Project”来创建一个新的Qt项目。

在弹出的对话框中,选择“Application”类型,并在下拉菜单中选中“Qt Widgets Application”。

然后,输入项目名称和项目路径,最后点击“Create”按钮来创建项目。

第三步:添加头文件和库文件在Qt Creator中创建新项目后,需要添加相应的头文件和库文件。

在代码文件中加入以下头文件:```c++#include <NIDAQmx.h>#include "MotionControl.h"#include "SerialPort.h"```接着,在项目的.pro文件中添加相应的库文件:```c++LIBS += -lNIDAQmxLIBS += -lMotionControlLIBS += -lSerialPort```第四步:编写程序代码这一步是关键,需要根据具体的设备和需求编写相应的代码。

在此,我们以运动控制卡为例,来展示如何编写一个简单的控制程序。

下面是一个示例代码:```c++#include <QApplication>#include <QDebug>#include "MotionControl.h"int main(int argc, char *argv[]){QApplication a(argc, argv);MotionControl *mc = new MotionControl();mc->connect("COM1");mc->setAxis(1);mc->setServoOn();mc->moveTo(100, 5000);mc->setServoOff();mc->disconnect();delete mc;return a.exec();}```代码中,我们首先启动一个运动控制卡对象,并指定其连接的串口号("COM1")。

《GTS系列运动控制器编程手册》C#例程列表

《GTS系列运动控制器编程手册》C#例程列表

《GTS系列运动控制器编程手册》C#例程列表说明:本例程为《GTS系列运动控制器编程手册》例程的C#版本,部分例程采用控制台形式实现,部分例程采用窗体形式实现(列表给出了窗体界面及操作步骤)。

注意:本例程用的是Visual Studio 2010编程环境开发,如果您所用的VS版本低于2010,可能出现打开工程失败,可以在网上查看VS2010工程与VS低版本工程的相互转换的文章,例如:/glf123/archive/2012/02/24/2366934.html。

此外,本例程的可执行程序运行时需要“.net framework 3.5”的支持,如果您的电脑缺少该组件,那么运行可执行程序时会弹出一个提示对话框,此时可以到Microsoft官网,下载并安装该组件。

/zh-cn/download/details.aspx?id=21。

例程清单:例程4-1 修改编码器计数方向例程4-2 修改限位开关触发电平例程4-3 设置第1轴为脉冲控制“脉冲+方向”方式例程4-4 设置第1轴为闭环控制方式例程5-1 获取轴1的轴状态、运动模式、位置、速度和加速度例程6-1 点位运动Step1Step3Step2Step4Step5例程6-2 Jog运动例程6-3 PT静态FIFO Step1 Step2Step3Step4Step5Step1 Step2Step3Step4Step5例程6-4 PT动态FIFO例程6-5 电子齿轮跟随Step1Step2Step3Step4Step1 Step2 Step3例程6-7 Follow单FIFO模式Step1Step2Step3Step4例程6-8 Follow双FIFO切换Step1Step1Step2Step3例程6-9 建立坐标系例程6-10 直线插补例程例程6-11 圆弧插补例程例程6-12 插补FIFO管理例程6-13 前瞻预处理例程例程6-14 刀向跟随功能GT_BufMove() 例程6-15 刀向跟随功能GT_BufGear()例程 6-16 刀向跟随功能——实际工件加工 (例程6-9~16集成在一起)例程 6-17 PVT 描述方式 例程 6-18 Complete 描述方式 例程 6-19 Percent 描述方式 例程 6-20 Continuous 描述方式 例程 7-1 访问数字IO例程 7-2 读取8个轴编码器和辅助编码器位置值Step1Step2Step3Step1 Step2例程7-3 访问DAC例程7-4 访问ADCStep1Step4Step5Step2Step3Step1Step2例程 8-2 Home 回原点例程 8-3 Home+Index 回原点Step1Step2Step3Step2Step4 Step5 Step6Step1Step2Step3Step4Step5例程8-4 探针捕获例程8-5 HSIO捕获用法示例例程9-1 软限位使用例程10-1 运动程序单线程累加求和例程10-2 运动程序多线程累加求和例程11-1 读取运动控制器版本号例程11-2 电机到位检测功能例程11-3 自动回原点例程11-4 位置比较输出指令详细的用法Step1 Step2Step3Step4 Step5。

运动控制卡应用编程技巧

运动控制卡应用编程技巧

运动控制卡应用编程技巧内容来源网络,由“深圳机械展(11万㎡,1100多家展商,超10万观众)”收集整理!更多cnc加工中心、车铣磨钻床、线切割、数控刀具工具、工业机器人、非标自动化、数字化无人工厂、精密测量、3D打印、激光切割、钣金冲压折弯、精密零件加工等展示,就在深圳机械展.关于源代码的阅读,需要读者有一定的C++编程基础,至少对以下表示形式不会产生误解:?constchar*pString;//指定pString邦定的数据不能被修改?char*constpString;//指定pString的地址不能被修改?constchar*constpString;//含上面两种指定功能?当然,随便提醒一下,这些源代码若需要加入你的软件工程当中,还需要作一些调整和修改,因此,这些源代码实质上称为伪代码也可以,之所以展现它们,是让程序员们有个可视化的快感,特别是那些认为源代码就是一切的程序员。

同时,为了提高针对性,大部分控制卡调用的函数会明确指出是邦定哪些卡的,实际应用时,程序员可自行选择,以体现一下自己的智商是可以写写软件的。

一、控制卡类的单一实例实现?把控制卡类作一个类来处理,几乎所有C++程序员都为举双手表示赞同,故第一个什么都没有的伪代码就此产生,如下表现:classCCtrlCard?{?public:?…Function?public:?…attrib?}于是,用这个CctrlCard可以产生n多个控制卡实例,只要内存足够。

然而,针对现实世界,情况并不那么美好。

通常情况下,PC机内只插同种类型的控制卡1到2张,在通过调用d1000_board_init或d3000_board_init 函数时,它们会负责返回有效卡数nCards,然后从0-nCards*4?-1自行按排好轴数。

初始化函数就是C++的new或malloc的操作,取得系统的资源,但是控制卡的资源与内存不一样,取得资源后必需要释放才可以再次获取,即控制卡资源是唯一的。

运动控制卡

运动控制卡

'该函数用于驱动任意两轴进行插补运动
'参数: axis1 , axis2 - 参与插补的轴号
' pulse1,pulse2-对应轴的输出脉冲数
'返回值=0正确,返回值=1错误
'*******************************************************
' Speed -驱动速度
' Add -加速度
' 返回值=0正确,返回值=1错误
'*********************************************************
Public Function Setup_Speed(ByVal axis As Long, ByVal startv As Long, ByVal speed As Long, ByVal add As Long, ByVal tacc As Double) As Integer
' set_symmetry_speed 0, axis, startv, startv, tacc
Else
Result = adt8940a1_set_startv(gCardIndex, axis, startv)
' pulse1,pulse2,pulse3-对应轴的输出脉冲数
'返回值=0正确,返回值=1错误
'*******************************************************
Public Function Interp_Move3(ByVal axis1 As Long, ByVal axis2 As Long, ByVal axis3 As Long, ByVal pulse1 As Long, ByVal pulse2 As Long, ByVal pulse3 As Long) As Integer

悬挂运动控制系统c程序

悬挂运动控制系统c程序
uchar Menu3[17]="3:Draw Round "; //空格不能删
uchar Kong[17]=" "; //空格不能删
uint Function; //菜单键
uint Ok; //确认键
uint x0; //当前坐标
#include <hidef.h> /* common defines and macros */
#include <math.h>
#include "derivative.h" /* derivative-specific definitions */
#define CW_0 PORTB_PB0 //步进电机转向控制
{
TIOS=0x00; //T口为输入模式
TCTL4=0x55; //T0 T1口捕捉上升沿
TSCR1=0x80; //定时器 计数器使能
TIE=0xFF; //中断使能
TFLG1=0xFF; //清中断标志位
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/***************************************************/
void write_com(uchar com)
HALF_1=1;
RES_1=1;
ENABLE_1=1;
}
/*******************************************/
/* LCD初始化设定 */
#define LCD_EN PORTK_PK2
#define LCD_DAT PTM

校运动会管理系统报告C语言含完整代码精编WORD版

校运动会管理系统报告C语言含完整代码精编WORD版

校运动会管理系统报告C语言含完整代码精编W O R D版IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】目录陈一、程序分析与设计 (1)二、流程图 (1)三、源程序清单 (1)四、调试过程 (2)五、程序有待改进的地方 (2)六、本次实习的收获和建议 (3)附录 (3)一、程序分析与设计(标题四号宋体加黑,正文五号宋体,行间距-固定值18,首行缩进2字符)1.题目描述初始化输入:N-参赛院系总数,M-男子竞赛项目数,W-女子竞赛项目数;即要求输入一些基础数据,如院系名称,每个院系参赛选手及选手编号。

竞赛项目名称与代号。

这些数据存储在文本文件中,不需要每次都单条录入。

各项目名次取法有如下几种:取前4名:第1名得分6,第2名得分4,第3名得分2,第4名得分1;由程序提醒用户填写比赛结果,输入各项目获奖运动员的信息。

所有信息记录完毕后,用户可以查询各个院系或个人的比赛成绩,生成团体总分报表,查看参赛院系信息、获奖运动员、比赛项目信息等。

2.需求分析根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,由于在程序中提供查询功能所以应有显示、查找等操作。

3.总体设计根据上面的需求分析,可以将这个系统的设计分为1、信息输入模块 2、比赛结果录入模块 3、查询模块。

具体校际运动会管理系统分为信息的输入、结果的输入、学校各个项目的得分的查寻、总体报表的生成。

4.详细设计(1)主函数主函数一般设计的比较简洁,只提供输入,处理和输出部分的函数调用。

其中功能模块用菜单方式选择。

(2)密码登陆函数首先进入欢迎界面,提示用户输入密码进入系统,密码输入次数限制为三次,三次输入错误则退出系统,登陆成功显示菜单栏(3)菜单函数提醒用户根据要求选择功能,以及多次功能选取(4)输入函数进入该功能后提醒用户输入相应信息,即数据结构,数据结构采用结构体的形式,选手结构体成员包括选手的姓名、编号、各项目的成绩排名、选手所在学院等。

运动控制卡C程序示例

运动控制卡C程序示例

2. VC编程示例2.1 准备工作(1)新建一个项目,保存为“VCExample.dsw”;(2)根据前面讲述的方法,将静态库“8840.lib”加载到项目中;2.2 运动控制模块(1) 在项目中添加一个新类,头文件保存为“CtrlCard.h”,源文件保存为“CtrlCard.cpp”;(2) 在运动控制模块中首先自定义运动控制卡初始化函数,对需要封装到初始化函数中的库函数进行初始化;(3)继续自定义相关的运动控制函数,如:速度设定函数,单轴运动函数,差补运动函数等;(4)头文件“CtrlCard.h”代码如下:# ifndef __ADT8840__CARD__# define __ADT8840__CARD__/*********************** 运动控制模块********************为了简单、方便、快捷地开发出通用性好、可扩展性强、维护方便的应用系统,我们在控制卡函数库的基础上将所有库函数进行了分类封装。

下面的示例使用一块运动控制卡********************************************************/#define MAXAXIS 4 //最大轴数class CCtrlCard{public:int Setup_HardStop(int value, int logic);int Setup_Stop1Mode(int axis, int value, int logic);(设置stop1信号方式)int Setup_Stop0Mode(int axis, int value, int logic);(设置stop0信号方式)int Setup_LimitMode(int axis, int value1, int value2, int logic);(设置限位信号方式)int Setup_PulseMode(int axis, int value); (设置脉冲输出方式)int Setup_Pos(int axis, long pos, int mode); (设置位置计数器)int Write_Output(int number, int value);(输出单点函数)int Read_Input(int number, int &value);(读入点)int Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed); (获取运动信息)int Get_Status(int axis, int &value, int mode); (获取轴的驱动状态)int StopRun(int axis, int mode); (停止轴驱动)int Interp_Move4(long value1, long value2, long value3, long value4);(四轴差补函数)int Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3);(三轴差补函数)int Interp_Move2(int axis1, int axis2, long value1, long value2);(双轴差补函数)int Axis_Pmove(int axis ,long value);(单轴驱动函数)int Axis_Cmove(int axis ,long value);(单轴连续驱动函数)int Setup_Speed(int axis ,long startv ,long speed ,long add );(设置速度模块)int Init_Board(int dec_num);(函数初始化)(设置速度模块)CCtrlCard(); (定义了一个同名的无参数的构造函数)int Result; //返回值};#endif(5) 源文件“CtrlCard.cpp”代码如下:#include "stdafx.h"#include "DEMO.h"#include "CtrlCard.h"#include "adt8840.h"int devnum=-1;CCtrlCard::CCtrlCard()(构造函数,为什么是空的?){}/*******************初始化函数************************该函数中包含了控制卡初始化常用的库函数,这是调用其他函数的基础,所以必须在示例程序中最先调用返回值<=0表示初始化失败,返回值>0表示初始化成功*****************************************************/int CCtrlCard::Init_Board(int devnum){/***********************************************************/int mode =0;//应答模式为1时,响应串口接收有效,0时无效if(devnum==0)(devnum:设备号){for (int i = 1; i<=MAXAXIS(最大轴数); i++){Result=adt8840a_set_command_pos(devnum, mode,i,0);(设定逻辑计数器)adt8840a_set_actual_pos(devnum, mode,i,0);(设定实位计数器)adt8840a_set_startv(devnum, mode,i,0);(设定初始速度)adt8840a_set_speed(devnum, mode,i,0);(设定驱动速度)adt8840a_set_acc(devnum, mode,i,0);(设定加速度)}if(Result==0 )return 1;elsereturn Result;}elsereturn -1;}/**********************设置速度模块***********************依据参数的值,判断是匀速还是加减速设置轴的初始速度、驱动速度和加速度参数:axis -轴号startv - 初始速度speed -驱动速度add -加速度返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Speed(int axis(轴号), long startv(初始速度), long speed(驱动速度), long add (加速度)) {if (startv - speed >= 0) //匀速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, startv);(设定驱动速度)}else //加减速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, speed); (设定驱动速度)adt8840a_set_acc (devnum,axis, add); (设定加速度)}return Result;}/*********************单轴驱动函数*********************该函数用于驱动单个运动轴运动参数:axis-轴号,value-输出脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Axis_Pmove(int axis, long value){Result = adt8840a_pmove(devnum,axis, value(脉冲数));return Result;}/*******************任意两轴插补函数********************该函数用于驱动任意两轴进行插补运动参数:axis1,axis2-轴号、value1,value2-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move2(int axis1, int axis2, long value1, long value2){Result = adt8840a_inp_move2(devnum,axis1, axis2, value1, value2);return Result;}/*******************任意三轴插补函数********************该函数用于驱动任意三轴进行插补运动参数:axis1,axis2,axis3-轴号、value1,value2,value3-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3) {Result = adt8840a_inp_move3(devnum,axis1, axis2, axis3, value1, value2, value3);return Result;}/*******************四轴插补函数****************************该函数用于驱动XYZW四轴进行插补运动参数:value1,value2,value3,value4-输出脉冲数返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Interp_Move4(long value1, long value2, long value3, long value4){Result = adt8840a_inp_move4(devnum,value1, value2, value3, value4);return Result;}/************************停止轴驱动***********************该函数用于立即或减速停止轴的驱动参数:axis-轴号、mode-减速方式(0-立即停止, 1-减速停止)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::StopRun(int axis, int mode){if(mode == 0) //立即停止{Result = adt8840a_sudden_stop(devnum, axis);}else //减速停止{Result = adt8840a_dec_stop(devnum, axis);}return Result;}/*****************获取轴的驱动状态************************** 该函数用于获取单轴的驱动状态或插补驱动状态参数:axis-轴号,value-状态指针(0-驱动结束,非0-正在驱动)mode(0-获取单轴驱动状态,1-获取插补驱动状态)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_Status(int axis, int &value, int mode){if (mode==0) //获取单轴驱动状态Result=adt8840a_get_status(devnum,axis,&value);else //获取插补驱动状态Result=adt8840a_get_inp_status(devnum,&value);return Result;}/*****************获取运动信息****************************** 该函数用于反馈轴当前的逻辑位置,实际位置和运行速度参数:axis-轴号,LogPos-逻辑位置,ActPos-实际位置,Speed-运行速度返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed ) {Result = adt8840a_get_command_pos(devnum,axis, &LogPos);(获取逻辑位置)adt8840a_get_actual_pos (devnum, axis, &ActPos); (获取实际位置)adt8840a_get_speed (devnum, axis, &Speed);(获取驱动速度)return Result;}/***********************读取输入点******************************* 该函数用于读取单个输入点参数:number-输入点(0 ~ 39)返回值:0 -低电平,1 -高电平,-1 -错误****************************************************************/int CCtrlCard::Read_Input(int number,int &value){Result = adt8840a_read_bit(devnum, number, &value);return Result;}/*********************输出单点函数****************************** 该函数用于输出单点信号参数:number-输出点(0 ~ 15),value 0-低电平、1-高电平返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Write_Output(int number, int value){Result = adt8840a_write_bit(devnum, number, value);return Result;}/*******************设置位置计数器******************************* 该函数用于设置逻辑位置和实际位置参数:axis-轴号,pos-设置的位置值mode 0-设置逻辑位置,非0-设置实际位置返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Setup_Pos(int axis, long pos, int mode){if(mode==0){Result = adt8840a_set_command_pos(devnum,axis, pos);(设置逻辑计数器)}else{Result = adt8840a_set_actual_pos(devnum, axis, pos);(设置实位计数器)}return Result;}/********************设置脉冲输出方式**********************该函数用于设置脉冲的工作方式参数:axis-轴号, value-脉冲方式0-脉冲+脉冲方式1-脉冲+方向方式返回值=0正确,返回值=1错误默认脉冲方式为脉冲+方向方式本程序采用默认的正逻辑脉冲和方向输出信号正逻辑*********************************************************/int CCtrlCard::Setup_PulseMode(int axis, int value){Result = adt8840a_set_pulse_mode(devnum,axis, value, 0, 0);(设置脉冲模式)return Result;}/********************设置限位信号方式********************** 该函数用于设定正/负方向限位输入nLMT信号的模式参数:axis-轴号value1 0-正限位有效1-正限位无效value2 0-负限位有效1-负限位无效logic 0-低电平有效1-高电平有效默认模式为:正限位有效、负限位有效、低电平有效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_LimitMode(int axis, int value1, int value2, int logic) {Result = adt8840a_set_limit_mode(devnum,axis, value1, value2, logic);return Result;}/********************设置stop0信号方式********************** 该函数用于设定stop0信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop0Mode(int axis, int value, int logic){Result = adt8840a_set_stop0_mode(devnum,axis, value ,logic);return Result;}/********************设置stop1信号方式********************** 该函数用于设定stop1信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop1Mode(int axis, int value, int logic){Result = adt8840a_set_stop1_mode(devnum,axis, value, logic);return Result;}/************************单轴连续驱动函数*********************** 该函数用于驱动单个运动轴运动参数:axis-轴号,value-脉冲方向返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Axis_Cmove(int axis, long value){Result = adt8840a_continue_move(devnum,axis, value);return Result;}2.3 功能实现模块2.3.1 界面设计说明:(1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。

VC++运动控制卡软件系统设计方案

VC++运动控制卡软件系统设计方案

基于VC++地运动控制卡软件系统设计在自动控制领域,基于PC和运动控制卡地伺服系统正演绎着一场工业自动化地革命.目前,常用地多轴控制系统主要分为3大块:基于PLC地多轴定位控制系统,基于PC_based地多轴控制系统和基于总线地多轴控制系统.由于PC机在各种工业现场地广泛运动,先进控制理论和DSP技术实现手段地并行发展,各种工业设备地研制和改造中急需一个运动控制模块地硬件平台,以及为了满足新型数控系统地标准化、柔性化、开放性等要求,使得基于PC和运动控制卡地伺服系统备受青睐.本文主要是利用VC++6.0提供地MFC应用程序开发平台探索研究平面2-DOF四分之过驱动并联机构地运动控制系统地软件开发.平面2-DOF四分之过驱动并联机构地控制系统组成并联机构地本体如图1,该机构由4个分支链组成,每条支链地一段与驱动电动机相连,而另一端相交于同一点.该并联机构地操作末端有2个自由度(即X方向和Y方向地平动),驱动输入数目为4,从而组成过驱动并联机构.控制系统地硬件主要有4部分组成:PC机,四轴运动控制卡,伺服驱动器和直流电动机.系统选用地是普通PC机,固高公司地GT-400-SV-PCI运动控制卡,瑞士Maxon公司地四象限直流伺服驱动器及直流永磁电动机.伺服驱动器型号为4-Q-DCADS50/5,与驱动器适配直流电动机型号为Maxon RE-35.运动控制系统地构成如图2所示.上位控制单元由PC机和运动控制卡一起组成,板卡插在PC机主板上地PCI插槽内.PC机主要负责信息流和数据流地管理,以及从运动控制卡读取位置数据,并经过计算后将控制指令发给运动控制卡.驱动器控制模式采用编码器速度控制,驱动器接受到运动控制卡发出地模拟电压,通过内部地PWM电路控制直流电动机RE-35地运转,并接受直流电动机RE-35上地编码器反馈信号调整对电动机地控制,如此构成一个半闭环地直流伺服控制系统.1.1 GT-400-SV控制卡介绍固高公司生产地GT系列运动控制卡GT-400-SV-PCI可以同步控制4个轴,实现多轴协调运动.其核心由ADSP2181数字信号处理器和FPGA组成,能实现高性能地控制计算.控制卡同时提供了C语言函数库和Windows下地动态链接库,可实现复杂地控制功能.主要功能如下:(1) PCI总线,即插即用;(2)可编程伺服采样周期,4轴最小插补周期为200us,单轴点位运动最小控制周期为25us;4路16位分辨率模拟电压输出信号或脉冲输出信号模拟量输出范围:-10V-+10V,每路课独立控制,互不影响;(4) 4路四倍频增量编码器输入,作为各轴反馈信号输入,最高频率8MHz;(5)四轴协调运动;(6)每轴2路限位开关信号、一路原点信号及一路驱动报警信号输入;(7)每轴1路驱动使能信号、1路驱动复位信号输出;(8)运动方式:单轴点位运动、直线插补、圆弧插补、速度控制模式、电子齿轮模式;(9) PID(比例-积分-微分)数字滤波器,带速度和加速度前馈,带积分限值、偏差补偿和低通滤波器;支持DOS、WindowsNT/2000/XP等操作系统,提供底层库函数,可用DOS、VC、VB等进行软件开发.控制卡结构及端子板地接口如图3所示.1.2直流永磁电动机PWM驱动基本原理图4为利用开关管实现直流电动机PWM调速控制地原理图和输入输出电压波形.当开关MOSFET地栅极输入高电平时,开关管导通,直流电动机电枢绕组两端有电压Us.T1时间后,栅极输入变为低电平,开关管截止,电动机电枢两端电压为零.T2时间后,栅极输入重新变为高电平,开关管重复前面地动作过程.这样,对应着输入地点评高低,直流伺服电动机电枢绕组两端地电压波形如图4b所示.占空比a表示了在一个周期T里,开关管导通地时间与周期地比值.a地变化范围为0<a<1.由此式可知,当电源电压Us不变地情况下,电枢绕组两端地电压平均值Uo取决于占空比a地大小,改变a地值就可以改变端电压地平均值,从而达到调速地目地.2 基于GT-400-SV-PCI卡地软件设计GT-400-SV控制卡具有良好地开放性,用户可以再DOS、VC、VB、Delphi环境下进行软件开发.文中是在Windows2000系统下利用Visual C++6.0地MFC以面向对象方式进行编程.控制卡在Windows下开发地底层动态库包括头文件GT400.h,GT400.lib和GT400.dll.在VC++环境中使用时,选择Project—Setting—Link,在Object/Library modules中输入GT400.lib,然后就可以在程序中调用动态链接库中地函数.2.1 Windows程序内部运行原理因为Visual C++6.0是Windows开发语言,所以用Visual C++6.0开发程序之前首先需要弄清楚Windows程序内部运行机制.在Windows环境下地软件开发是完全不同于DOS下地,它是一种事件驱动方式地程序设计模式,主要是基于消息地.当用户需要完成某种功能时,会调用操作系统地某种支持,然后操作系统将用户地需要包装成消息并投递到消息队列当中,最后应用程序从消息队列中取走消息并进行响应.2.2 程序设计运动控制卡接受PC机上发出地操作命令和运动控制系统反馈回地信息,并据其进行实时地运动操作,直接控制伺服驱动器.控制卡控制直流电动机地过程可分为:打开控制卡并初始化,设置运动参数,执行运动程序,关闭卡.控制系统流程图如图5所示.2.2.1卡地初始化卡地初始化应在程序开始时就执行,主要用到地控制函数见表1.表1 函数名称及功能名称功能GT_Open()打开运动控制器设备GT_Reset()复位运动控制器GT_SetSmplTm()设置控制周期GT_LmtSns()设置限位开关地有效电平GT_EncSns()设置编码器地记数方向GT_CloseLp()设置为闭环控制GT_CtrlMode()设置输出模拟量/脉冲量以上参数应根据具体地硬件平台来设置,一般只在程序初始化时设置一次,以后不应再设置.另外,控制周期地设定GT_SetSmplTm(double Timer),参数Timer地单位是us.因为运动控制卡要在控制周期内完成必要地控制计算,控制周期不能太小,因此设定地范围为48-1966.08us.运动控制卡默认地控制周期为200us,这个控制周期对于普通地用户能够安全可靠地工作.一般情况下,在程序中不应改变控制周期值,否则会出现不可预期地后果.2.2.2运动控制模块该运动控制卡可以实现单轴及多轴协调运动.对于单轴所执行地运动操作有绝对运动、连续点动、急停缓停、回零等;对于多轴协调运动有直线插补和圆弧插补.单轴运动控制主要用来调试直流电动机运动性能.采用梯形曲线运动模式,设置速度、加速度、目标位置3个参数,通过设置合适地PIDP控制参数,使电动机运动达到系统设计要求.4轴协调运动采用直线插补法,正确地设置坐标映射,合成速度、加速度,再加轨迹设置命令及目标位置,即可实现四轴协调运动.运动控制卡通过坐标映射函数GT_MapAxis(short Axis_Num,double * map_count)将控制轴由单轴运动控制模式转换为坐标系运动控制模式.同时运动控制卡开辟了底层运动数据缓冲区,在坐标系运动控制模式下,可以实现多段轨迹快速、稳定地连续运动.这些运动操作都是相互独立地,在控制面板中每个操作按键对应一个独立地事件.2.2.3运动状态显示模块通过调用GT_GetAltPos(long * Apos)和GT_GetPrfPnt(double * Pnt)分别获得当前轴地实际位置和坐标系各轴地坐标位置,参数*Apos返回实际位置,双精度参数*Pnt指向一个长度为4地数组.然后转换成各电动机地实际角度,并在控制面板上显示.2编程开发实例现以单轴调试与4轴协调运动实现直线和圆轨迹为例具体介绍开发过程:打开Visual C++6.0,利用MFC AppWizard[exe]创建一个基于对话框地Robot2008工程,将GT400.h,GT400.lib添加进工程,编程时要在头文件里包含头文件GT400.h.在对话框中添加按钮和编辑框等操作见图6.单轴控制模块,先在OnInitDialog()中添加如下代码,进行初始化工作:GT_Open();GT_Reset();GT_LmtsOff();GT_AlarmOff();GT_CtrlMode(0);GT_CloseLp();在CRobot2008Dlg中添加成员变量m_Kp,m_Ki,m_Kd,m_Pos,m_Vel,m_Acc 并作原型说明.然后在“单轴运动”按钮添加BN_CLICKED消息响应地函数OnButtonSrtMov(),并在函数中添加如下代码:GT_Axis();GT_AxisOn();GT_ZeroPos();GT_PrflT();GT_SetKp(m_Kp);GT_SetKi(m_Ki);GT_SetKd(m_Kd);GT_SetPos(m_Pos);GT_SetVel(m_Vel);GT_SetAcc(m_Acc);GT_Update();最后在“单轴停止”按钮BN_CLICKED响应函数OnButtonStop()中添加代码:GT_AxisOff();GT_Close();四轴协调运动地初始化与单轴情况基本相同,但要加入坐标映射函数GT_MapAxis(short Axis_Num,double *map_count).double cnt1[5]={1,0,0,0,0};double cnt2[5]={0,1,0,0,0};double cnt3[5]={0,0,1,0,0};double cnt4[5]={0,0,0,1,0};GT_MapAxis(1,cnt1);GT_MapAxis(2,cnt2)GT_MapAxis(3,cnt3);GT_MapAxis(4,cnt4);GT_MvXYZA(0,0,0,0,1,0.01);前文已提到,运动显示模块经编译无误后生成可执行文件,执行后如图7所示.与硬件连接后可以实现对平面2-DOF四分之过驱动并联机构末端位置地直线及圆运动位置规划,可以实时读出直流电动机转角位置,达到了预期效果.3结语本文利用Visual C++6.0提供地微软基础类库MFC及控制卡支持地底层函数库,详细介绍了二次开发地全过程并给出了编程实例,方便对多轴运动控制卡软件开发地理解.整个控制软件能完成数据及运动状态显示、伺服驱动、并联机构地位置规划等任务.实践证明该并联机构控制系统运行稳定.版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.GMsIa。

运动控制系统开发与应用(初级)课件5.1.2单轴点位运动程序的编写

运动控制系统开发与应用(初级)课件5.1.2单轴点位运动程序的编写
sRtn = GT_AxisOff(AXIS);// 伺服关闭 printf("\nGT_AxisOff()=%d\n", sRtn); return 0; }
单轴点位运动程序的编写
二、运动控制器函数库的调用 3.确认将要进行点位运动的轴目前所处的位置,修正程序sRtn = GT_SetPos(ቤተ መጻሕፍቲ ባይዱXIS, 30000L)这一
行中的目标位置参数,确保轴运动后不会发生碰撞。 4.选择“调试”→“开始执行(不调试)”生成并运行程序。轴运行到目标位置后停止,并将轴
状态变量和规划位置参数的值输出至控制台。
sRtn = GT_GetSts(AXIS, &sts); // 读取AXIS轴的状态 sRtn = GT_GetPrfPos(AXIS, &prfPos); // 读取AXIS轴的规划位置 //将轴状态变量和规划位置参数的值输出至屏幕 printf("sts=0x%-10lxprfPos=%-10.1lf\r", sts, prfPos); }while(sts&0x400); // 等待AXIS轴规划停止
commandhandler("GT_AxisOn", sRtn); sRtn = GT_ZeroPos(AXIS); // 位置清零 sRtn = GT_PrfTrap(AXIS); // 将 AXIS 轴设为点位模式 // 读取点位运动参数(需要读取所有运动参数到上位机变量)
sRtn = GT_GetTrapPrm(AXIS, &trap);
单轴点位运动程序的编写
// 设置需要修改的运动参数 trap.acc = 0.25; trap.dec = 0.125; trap.smoothTime = 25; sRtn = GT_SetTrapPrm(AXIS, &trap);// 设置点位运动参数 sRtn = GT_SetPos(AXIS, 30000L); // 设置 AXIS 轴的目标位置 sRtn = GT_SetVel(AXIS, 50); // 设置AXIS轴的目标速度 // 启动AXIS轴的运动 sRtn = GT_Update(1<<(AXIS-1)); commandhandler("GT_Update", sRtn); do {

校级运动会管理系统c语言程序

校级运动会管理系统c语言程序

#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<string.h>#define SIZE 9#define N 3#define WM 3void bsxm(); //比赛项目void csxx(); //参赛学校void ttzf() ; //团体总分void Information();void main();void menu();void printf_back();void saveathlete();void saveprogram();void saveschool();void savescore();void Search();int i;FILE *fp1,*fp2,*fp3,*fp4;struct athlete //定义运动员信息{char univ[5];char name[8];char prog[15];char mingci[5];int score;}at[SIZE];struct xuexiao //定义学校信息{char univ[5];char prog[15];int num_athlete;}xx[N];struct program //定义项目信息{char prog[5];int quming;char ath1[5];char ath2[5];char univ1[5];char univ2[5];}pro[WM];struct zongfen //定义学校得分信息{char univ[5];char prog1[5];char prog2[5];char prog3[5];int score1;int score2;int score3;int total_score;}zf[N];void Information()//进入信息录入系统选择系统子函数{int n,w ;do{puts("\n\n\n");puts("\t\t***^__^ Welcome to load 信息录入system! ^__^***\n");puts("\t\t*************************MENU*************************\n");puts("\t\t******** 1.saveathlete **************\n");//运动员姓名录入puts("\t\t******** 2.saveschool **************\n");//运动员学校录入puts("\t\t******** 3.saveprogram() **************\n");//参加项目录入puts("\t\t******** 4.back **************\n");//退出puts("\t\t******************************************************\n");printf("Choic your number(1-4):[ ]\b\b");scanf("%d",&n);if (n<1||n>4){w=1;printf("\n\n\t\t----------------------DATAERROR!----------------------\n\n\n");getchar();}else w=0;}while (w==1);switch(n){case 1 : saveathlete(); break;// 保存运动员信息子函数case 2 : saveschool(); break;//保存学校信息子函数case 3 : saveprogram();break;//保存项目比赛信息子函数case 4 : exit(0);}}void saveathlete() //保存运动员信息子函数{printf("\n请输入各项目获奖运动员的信息:");for(i=0;i<SIZE;i++){printf("\n请输入第%d个运动员的信息:\n",i+1);printf("姓名:");scanf("%s",at[i].name);printf("学校:");scanf("%s",at[i].univ);printf("参赛项目:");scanf("%s",at[i].prog);printf("名次:");scanf("%s",at[i].mingci);printf("得分:");scanf("%d",&at[i].score);}fp1=fopen("ath","w");for(i=0;i<SIZE;i++){if(fwrite(&at[i],sizeof(struct athlete),1,fp1)!=1)printf("File write error!\n");}fclose(fp1);fp1=fopen("ath","r");printf("\n现在各运动员的信息如下:\n\n");printf("姓名学校项目名次得分\n");for(i=0;i<SIZE;i++){fread(&at[i],sizeof(struct athlete),1,fp1);printf("%-10s%-10s%-18s%-10s%d\n",at[i].name,at[i].univ,at[i].prog,at[i].mingci,at[i].score);}fclose(fp1);printf_back();}void saveschool() //保存学校信息子函数{printf("\n请输入各参赛学校的信息:");for(i=0;i<N;i++){printf("\n请输入第%d个学校的信息:\n",i+1);printf("学校:");scanf("%s",xx[i].univ);printf("参赛的项目:");scanf("%s",xx[i].prog);printf("参赛者数:");scanf("%d",&xx[i].num_athlete);}fp3=fopen("xxiao","w");for(i=0;i<N;i++){if(fwrite(&xx[i],sizeof(struct xuexiao),1,fp3)!=1)printf("File write error!\n");}fclose(fp3);printf_back();}void saveprogram() //保存项目比赛信息子函数{printf("\n请输入关于比赛项目的信息:");for(i=0;i<WM;i++){printf("\n请输入第%d项比赛的信息:\n",i+1);printf("项目:");scanf("%s",pro[i].prog);printf("取分情况:");scanf("%d",&pro[i].quming);printf("参赛者1:");scanf("%s",pro[i].ath1);printf("所属学校:");scanf("%s",pro[i].univ1);printf("参赛者2:");scanf("%s",pro[i].ath2);printf("所属学校:");scanf("%s",pro[i].univ2);}fp4=fopen("pr","w");for(i=0;i<N;i++){if(fwrite(&pro[i],sizeof(struct program),1,fp4)!=1)printf("File write error!\n");}fclose(fp4);printf_back();}void savescore() //保存学校得分情况子函数{printf("N-参赛学校总数,M-男子竞赛项目数,W-女子竞赛项目数。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. VC 编程示例2.1 准备工作(1) 新建一个项目,保存为“ VCExample.dsw ”;(2) 根据前面讲述的方法,将静态库“ 8840.lib ”加载到项目中;2.2 运动控制模块(1) 在项目中添加一个新类,头文件保存为“ CtrlCard.h ”,源文件保存为“ CtrlCard.cpp ”;(2) 在运动控制模块中首先自定义运动控制卡初始化函数,对需要封装到初始化函数中的库函数进行初始化;(3) 继续自定义相关的运动控制函数, 如:速度设定函数,单轴运动函数,差补运动函数等;(4) 头文件“ CtrlCard.h ”代码如下:# ifndef __ADT8840__CARD__# define __ADT8840__CARD__运动控制模块为了简单、方便、快捷地开发出通用性好、可扩展性强、维护方便的应用系统,我们在控制卡函数库的基础上将所有库函数进行了分类封装。

下面的示例使用一块运动控制卡******************************************************#define MAXAXIS 4 //最大轴数class CCtrlCard{public:int Setup_HardStop(int value, int logic);int Setup_Stop1Mode(int axis, int value, int logic); (设置stop1 信号方式)int Setup_Stop0Mode(int axis, int value, int logic); (设置stop0 信号方式)int Setup_LimitMode(int axis, int value1, int value2, int logic); (设置限位信号方式)int Setup_PulseMode(int axis, int value); (设置脉冲输出方式)int Setup_Pos(int axis, long pos, int mode); (设置位置计数器)int Write_Output(int number, int value); (输出单点函数)int Read_Input(int number, int &value); (读入点)int Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed); (获取运动信息)int Get_Status(int axis, int &value, int mode); (获取轴的驱动状态)int StopRun(int axis, int mode); (停止轴驱动)int Interp_Move4(long value1, long value2, long value3, long value4); (四轴差补函数)int Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3); (三轴差补函数)int Interp_Move2(int axis1, int axis2, long value1, long value2); (双轴差补函数)int Axis_Pmove(int axis ,long value); (单轴驱动函数)int Axis_Cmove(int axis ,long value); (单轴连续驱动函数)int Setup_Speed(int axis ,long startv ,long speed ,long add ); (设置速度模块)int Init_Board(int dec_num); (函数初始化) (设置速度模块)CCtrlCard(); (定义了一个同名的无参数的构造函数)int Result; // 返回值};#endif(5) 源文件 “ CtrlCard.cpp ”代码如下: #include "stdafx.h" #include "DEMO.h" #include "CtrlCard.h" #include"adt8840.h" int devnum=-1;CCtrlCard::CCtrlCard() (构造函数,为什么是空的?) {初始化函数该函数中包含了控制卡初始化常用的库函数 ,这是调用其他函数的基础 ,所以必须在示例程序中最先调用 返回值 <=0 表示初始化失败 ,返回值 >0 表示初始化成功int CCtrlCard::Init_Board(int devnum) {int mode =0;// 应答模式为 1 时 ,响应串口接收有效 ,0 时无效 if(devnum==0) ( devnum :设备号){for (int i = 1; i<=MAXAXIS (最大轴数) ; i++){Result=adt8840a_set_command_pos(devnum, mode,i,0);(设定逻辑计数器)adt8840a_set_actual_pos(devnum, mode,i,0);(设定实位计数器)adt8840a_set_startv(devnum, mode,i,0);(设定初始速度)adt8840a_set_speed(devnum, mode,i,0);(设定驱动速度) adt8840a_set_acc(devnum,mode,i,0);(设定加速度)} if(Result==0 )return 1;elsereturn Result;}elsereturn -1;设置速度模块依据参数的值 ,判断是匀速还是加减速设置轴的初始速度、驱动速度和加速度 参数: axis - 轴号 startv - 初始速度 speed -驱动速度 add-加速度返回值 =0 正确 ,返回值 =1 错误int CCtrlCard::Setup_Speed(int axis (轴号) , long startv (初始速度) , long speed (驱动速度) , long add {if (startv - speed >= 0) // 匀速运动加速度) )}}{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度) adt8840a_set_speed(devnum,axis, startv);(设定驱动速度)}else//加减速运动{ Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度) adt8840a_set_speed(devnum,axis, speed); (设定驱动速度) adt8840a_set_acc (devnum,axis, add); (设定加速度)}return Result;单轴驱动函数该函数用于驱动单个运动轴运动 参数: axis-轴号 ,value- 输出脉冲数 返回值 =0 正确 ,返回值 =1错误int CCtrlCard::Axis_Pmove(int axis, long value){Result = adt8840a_pmove(devnum,axis, value (脉冲数) ); return Result;任意两轴插补函数 ********************该函数用于驱动任意两轴进行插补运动参数: axis1,axis2- 轴号、 value1,value2-脉冲数 返回值 =0 正确 ,返回值 =1 错误int CCtrlCard::Interp_Move2(int axis1, int axis2, long value1, long value2) {Result = adt8840a_inp_move2(devnum,axis1, axis2, value1, value2); return Result;}任意三轴插补函数该函数用于驱动任意三轴进行插补运动参数: axis1,axis2,axis3-轴号、 value1,value2,value3- 脉冲数 返回值 =0 正确 ,返回值 =1 错误int CCtrlCard::Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3){Result = adt8840a_inp_move3(devnum,axis1, axis2, axis3, value1, value2, value3); returnResult;四轴插补函数该函数用于驱动 XYZW 四轴进行插补运动 参数: value1,value2,value3,value4- 输出脉冲数 返回值 =0 正确 ,返回值 =1 错误int CCtrlCard::Interp_Move4(long value1, long value2, long value3, long value4){}} }Result = adt8840a_inp_move4(devnum,value1, value2, value3, value4); return Result;停止轴驱动该函数用于立即或减速停止轴的驱动参数:axis-轴号、mode- 减速方式(0-立即停止, 1-减速停止)返回值=0 正确,返回值=1 错误int CCtrlCard::StopRun(int axis, int mode){ if(mode == 0) // 立即停止{Result = adt8840a_sudden_stop(devnum, axis); } else // 减速停止{Result = adt8840a_dec_stop(devnum, axis); } return Result;}获取轴的驱动状态该函数用于获取单轴的驱动状态或插补驱动状态参数:axis-轴号,value-状态指针(0- 驱动结束,非0-正在驱动) mode(0-获取单轴驱动状态,1-获取插补驱动状态)返回值=0 正确,返回值=1错误int CCtrlCard::Get_Status(int axis, int &value, int mode) {if (mode==0) //获取单轴驱动状态Result=adt8840a_get_status(devnum,axis,&value);else //获取插补驱动状态Result=adt8840a_get_inp_status(devnum,&value); return Result;}/***************** 获取运动信息******************************该函数用于反馈轴当前的逻辑位置,实际位置和运行速度参数:axis-轴号,LogPos- 逻辑位置,ActPos-实际位置,Speed-运行速度返回值=0 正确,返回值=1 错误int CCtrlCard::Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed ){Result = adt8840a_get_command_pos(devnum,axis, &LogPos); (获取逻辑位置) adt8840a_get_actual_pos (devnum, axis, &ActPos); (获取实际位置)adt8840a_get_speed (devnum, axis, &Speed);(获取驱动速度)return Result;}读取输入点该函数用于读取单个输入点参数:number-输入点(0 ~ 39)}返回值:0 -低电平,1 -高电平,-1 -错误int CCtrlCard::Read_Input(int number,int &value){Result = adt8840a_read_bit(devnum, number, &value); return Result;}输出单点函数该函数用于输出单点信号参数:number-输出点(0 ~ 15),value 0- 低电平、1-高电平返回值=0 正确,返回值=1 错误int CCtrlCard::Write_Output(int number, int value){Result = adt8840a_write_bit(devnum, number, value); return Result;}设置位置计数器该函数用于设置逻辑位置和实际位置参数:axis- 轴号,pos-设置的位置值mode 0-设置逻辑位置,非0 -设置实际位置返回值=0 正确,返回值=1 错误int CCtrlCard::Setup_Pos(int axis, long pos, int mode){if(mode==0){Result = adt8840a_set_command_pos(devnum,axis, pos);(设置逻辑计数器) }else{Result = adt8840a_set_actual_pos(devnum, axis, pos);(设置实位计数器) } return Result;}设置脉冲输出方式该函数用于设置脉冲的工作方式参数:axis-轴号, value- 脉冲方式0-脉冲+脉冲方式1-脉冲+方向方式返回值=0 正确,返回值=1 错误默认脉冲方式为脉冲+方向方式本程序采用默认的正逻辑脉冲和方向输出信号正逻辑int CCtrlCard::Setup_PulseMode(int axis, int value){Result = adt8840a_set_pulse_mode(devnum,axis, value, 0, 0);(设置脉冲模式)return Result;}设置限位信号方式该函数用于设定正/负方向限位输入nLMT 信号的模式参数:axis-轴号value1 0 -正限位有效1-正限位无效value2 0 -负限位有效1-负限位无效logic 0-低电平有效1-高电平有效默认模式为:正限位有效、负限位有效、低电平有效返回值=0正确,返回值=1错误int CCtrlCard::Setup_LimitMode(int axis, int value1, int value2, int logic){Result = adt8840a_set_limit_mode(devnum,axis, value1, value2, logic);return Result;stop0 信号方式**********************该函数用于设定stop0 信号的模式参数:axis-轴号value 0-无效 1 -有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误int CCtrlCard::Setup_Stop0Mode(int axis, int value, int logic){Result = adt8840a_set_stop0_mode(devnum,axis, value ,logic); return Result;}设置stop1 信号方式该函数用于设定stop1 信号的模式参axis-轴号value 0-无效 1 -有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误int CCtrlCard::Setup_Stop1Mode(int axis, int value, int logic){Result = adt8840a_set_stop1_mode(devnum,axis, value, logic); return Result;}单轴连续驱动函数该函数用于驱动单个运动轴运动参数:axis-轴号,value- 脉冲方向返回值=0 正确,返回值=1 错误int CCtrlCard::Axis_Cmove(int axis, long value)Result = adt8840a_continue_move(devnum,axis, value); return Result; }}2.3 功能实现模块2.3.1 界面设计说明:(1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。

相关文档
最新文档