运动控制卡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;}。

  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)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。

相关文档
最新文档