运动控制类实现:

#pragma once#include <afx.h>#include "Tool.h"
#include "Planning.h"#define AXIS_SHEAR_ANGLE   360class ServoControl
{
public:ServoControl();~ServoControl();void Set_SimulationMode(bool bSim);  // 设置仿真模式void Set_MotionPara();  // 设置运动参数int Servo_Init();   // 初始化int Servo_Close(); // 关闭int Servo_Enable(bool enable); // 使能int Servo_Halt();   // 暂停int Servo_SmoothStop(); // 平滑停止int Servo_EStop();  // 急停bool IfAllAxisStop();int Servo_AxisMove(Axis dMove);int Servo_AxisShear(Step dShear);int Get_JointPosition(OUT double gdPos[]); // 获取关节位置int Get_JointVel(OUT double gdVel[]);      // 获取关节速度CString Get_ServoErr(int err);     // 获取伺服错误信息int Clear_ServoErr();                      // 清除错误private:unsigned short m_nCardNum; bool m_bInitFlag;bool m_bFlag_Simulation;  // 仿真测试标志short m_nDir[5];// 缓冲区运动参数double m_dMaxV;ULONG m_lMaxAccTime;double m_dV_ini;double m_dV_end;double m_dPercent;double m_dInflection;USHORT m_iVelocity_Ratio_Enable;
};

#include "ServoControl.h"#pragma comment(lib,"PMC.lib")ServoControl::ServoControl()
{int i;for (i=0; i<5; i++){m_nDir[i] = 1;}m_bFlag_Simulation = false;m_bInitFlag = false;m_nCardNum = 1;m_dMaxV = 50;m_lMaxAccTime = 500;m_dV_ini = 0;m_dV_end = 0;m_dPercent = 1;m_dInflection = 1;m_iVelocity_Ratio_Enable = 1;
}ServoControl::~ServoControl()
{}int ServoControl::Servo_EStop()
{if (m_bFlag_Simulation){return SYSTEM_OK;}int i;for (i=0; i<m_nCardNum; i++){RETURN( PMC_Emergent_Stop(AXIS_8ALL, i) );   //紧急停止}return SYSTEM_OK;
}bool ServoControl::IfAllAxisStop()
{if (m_bFlag_Simulation){return true;}unsigned long uAxis;int i;for (i=0; i<m_nCardNum; i++){PMC_Get_Execute_Axis(&uAxis, i) ;   //控制卡i上的轴是否停止if ((uAxis & AXIS_8ALL) != 0){return false;}}return true;
}int ServoControl::Servo_AxisMove(Axis dMove)
{if (m_bFlag_Simulation){return SYSTEM_OK;}short rtn = 0;unsigned short uAxis = AXIS_1_S1 + AXIS_1_S2 + AXIS_1_O1 + AXIS_1_V + AXIS_1_O2 + AXIS_1_C1;// 本地卡0//PMC_AxisOn(AXIS_8ALL, 0);// 开辟缓冲区BANK0// 启动缓冲区RETURN (PMC_Start_Buffer(0, 1));         // 开辟 BANK为0,空间为 1*1024的缓冲区 ,卡号默认为 0rtn = PMC_Set_BufferProfile(m_dMaxV, m_lMaxAccTime, m_dV_ini, m_dV_end, m_dPercent, m_dInflection, m_iVelocity_Ratio_Enable);rtn = PMC_Line6(uAxis, dMove.S1, dMove.S2, dMove.O1, dMove.V, dMove.O2, dMove.C1,POSITION_OPPOSITE);ULONG number;rtn = PMC_End_Buffer(&number);rtn = PMC_Execute_Buffer(0);         // 启动BANK0 连续轨迹运动RETURN(rtn);return SYSTEM_OK;
}int ServoControl::Servo_AxisShear(Step dShear)
{if (m_bFlag_Simulation){return SYSTEM_OK;}short rtn = 0;unsigned short uAxis = 0;double ld_pos[5];int i;for (i=0; i<5; i++){ld_pos[i] = 0;}if (dShear.Action_O1){uAxis += AXIS_2_O1;m_nDir[0] = (m_nDir[0]) ? -1 : 1;ld_pos[0] = AXIS_SHEAR_ANGLE * m_nDir[0];}if (dShear.Action_V){m_nDir[1] = (m_nDir[1]) ? -1 : 1;ld_pos[1] = AXIS_SHEAR_ANGLE * m_nDir[1];}if (dShear.Action_O2){m_nDir[2] = (m_nDir[2]) ? -1 : 1;ld_pos[2] = AXIS_SHEAR_ANGLE * m_nDir[2];}if (dShear.Action_C1){m_nDir[3] = (m_nDir[3]) ? -1 : 1;ld_pos[3] = AXIS_SHEAR_ANGLE * m_nDir[3];}if (dShear.Action_C2){m_nDir[4] = (m_nDir[4]) ? -1 : 1;ld_pos[4] = AXIS_SHEAR_ANGLE * m_nDir[4];}// PMC_AxisOn(uAxis, 1);// 开辟缓冲区BANK0// 启动缓冲区rtn = PMC_Start_Buffer(0, 1);         // 开辟 BANK为0,空间为 1*1024的缓冲区 ,卡号默认为 0rtn = PMC_Set_BufferProfile(m_dMaxV, m_lMaxAccTime, m_dV_ini, m_dV_end, m_dPercent, m_dInflection, m_iVelocity_Ratio_Enable);// 网络扩展卡0// 1号冲孔、V剪、2号冲孔、剪刀1uAxis = AXIS_2_O1 + AXIS_2_V + AXIS_2_O2 + AXIS_2_C1;rtn = PMC_RM_Line4(uAxis,ld_pos[0], ld_pos[1], ld_pos[2], ld_pos[3], POSITION_OPPOSITE, 0, 0);// 网络扩展卡1// 剪刀2uAxis = 0x0001;rtn = PMC_RM_Update(uAxis, ld_pos[4], POSITION_OPPOSITE, 1, 0);ULONG number;rtn = PMC_End_Buffer(&number, 1);rtn = PMC_Execute_Buffer(0, 0, 1);          // 启动BANK0 连续轨迹运动RETURN(rtn);return SYSTEM_OK;
}CString ServoControl::Get_ServoErr(int err)
{CString ls_str;switch(err){case ERR_LIB_INIT_ERROR:ls_str = "初始化库失败,检查是否安装主动程序";break;case ERR_COMMUNICATE_ERROR:ls_str = "通讯出错";break;case ERR_CARD_NOT_EXIST:ls_str = "当前卡不存在,检查卡号";break;case ERR_CLOSE_CARD_FAILE:ls_str = "关闭卡失败";break;case ERR_SEND_COMMAND_ERROR:ls_str = "运动指令传输错误";break;case ERR_COMMAND_EXECUTING:ls_str = "指令正在执行";break;case ERR_VEL_PROFILE_PARA_ERROR:ls_str = "速度曲线参数设置错误";break;case ERR_AXIS_SET_ERROR:ls_str = "轴号设置错误";break;case ERR_ARC_INTPL_DIR_ERROR:ls_str = " 圆弧插补方向设置错误";break;case ERR_JOINT_MOVE_ERROR:ls_str = "多轴联动错误";break;case ERR_STOP_PROFILE_PARA_ERROR :ls_str = "停止运动速度曲线参数错误";break;case ERR_VEL_MODE_PARA_ERROR:ls_str = "速度模式参数设置错误";break;case ERR_BUF_CREATE_PARA_ERROR:ls_str = "开辟缓冲区参数错误";break;case ERR_BUF_TERMINATE_PARA_ERROR:ls_str = "结束缓冲区错误";break;case ERR_BUF_NO_COMMAND:ls_str = "执行的缓冲区没有指令";break;case ERR_HOME_FAIL:ls_str = "零位寻找失败";break;case ERR_SET_PROSPECT_PROFILE_ERROR:ls_str = "设置前瞻参数错误";break;case ERR_SET_PROSPECT_MOVE_ERROR:ls_str = "设置前瞻运动错误";break;case ERR_COMMAND_WAIT_TIMEOUT:ls_str = "等待命令完成超时";break;case ERR_WAIT_ORDER_EVENT_TRIGGER_ERROR:ls_str = "表示等待命令出现事件触发";break;case ERR_DATA_CAPTURE_BUF_ERROR:ls_str = "数据捕捉缓失败存设置错误";break;case ERR_MEMORY_ALLOCATE_FAILE:ls_str = "内存开辟 ";break;case ERR_COMMAND_LENGTH_EXCEED:ls_str = "指令长度超出所开辟的内存";break;case ERR_GEAR_PARA_ERROR :ls_str = "电子齿轮参数设置错误";break;case ERR_SERVO_ALARM:ls_str = "伺服报警而不能设置使能,需处理好伺服报警并清除状态位";break;case ERR_PARA_OVERFLOW:ls_str = "指令参数溢出 ";break;case ERR_EVENT_TRIGGER_ERR:ls_str = "表示指令运行的轴有事件触发被禁止运行";break;case ERR_WAIT_IO_INPUT_DELAY_ERROR:ls_str = "表示缓冲区等待输入IO超时";break;case ERR_PROCESS_EXCEED_ERROR:ls_str = "表示进程数超出范围";break;case ERR_CARD_TIMER_ERROR:ls_str = "表示控制卡定时器出错";break;case ERR_NETWORK_COMMUNICATE_ERROR:ls_str = "表示网络通讯错误";break;case ERR_ILLEGAL_INSTRUCTION_ERROR:ls_str = "表示非法指令运行";break;case ERR_HOME_THREAD_CREATE_FAILE:ls_str = "回零线程创建失败";break;case ERR_HOME_IN_PROCESS:ls_str = "正在回零中";break;case ERR_HOME_PROFILE_PARA_ERROR:ls_str = "回零参数设置错误";break;case ERR_IO_MODE_SET_ERROR:ls_str = "IO模式设置错误";break;default:break;}return ls_str;
}

【运动控制】运动控制类实现相关推荐

  1. matlab运动控制,运动控制MATLAB仿真.doc

    运动控制MATLAB仿真 大作业: 直流双闭环调速MATLAB仿真 课程名称:运动控制技术姓 名:学 院:电气学院专 业:自动化学 号:指导教师:孟濬 2012年 6月 2日 -------浙---- ...

  2. 三菱PLC单轴运动控制

    1.什么是运动控制 ​ 运动控制,也可叫做电力拖动控制:它是自动化的一个分支,其动力源大部分都基于电动机. 也就是说,运动控制其实是基于电动机,实现物体对于角位移.速度.转矩等物理量改变的控制. 这里 ...

  3. 【朝夕教育】2023年03月 其他-运动控制和机器视觉面试题(34道)

    文章目录 一.运动控制和机器视觉 1.什么是运动控制 2.运动控制卡和运动控制器有区别吗? 3.运动控制系统的主要组成部分有哪些? 4.运动控制系统包含那些分类? 5.运动控制器应用的领域有哪些? 6 ...

  4. 【愚公系列】2023年03月 其他-运动控制和机器视觉面试题(34道)

    文章目录 一.运动控制和机器视觉 1.什么是运动控制 2.运动控制卡和运动控制器有区别吗? 3.运动控制系统的主要组成部分有哪些? 4.运动控制系统包含那些分类? 5.运动控制器应用的领域有哪些? 6 ...

  5. 直观地理解车辆的运动控制

    直观地理解车辆的运动控制   运动控制的目的是使车辆沿着一条给定的路线运行,尽可能保证车辆和路线的横向偏移量尽可能小,且运行速度越快越好.以下将以差速轮和阿克曼结构的车通俗地介绍如何对车辆进行控制. ...

  6. 强化学习——双臂攀爬机构运动控制

    使用强化学习控制双臂攀爬机构的运动学模型 源码地址 演示效果 测试环境 概述 核心内容 机器人运动学 DDPG DQN 实验过程及效果 代码结构 运动学环境搭建 移动上臂攀爬 Actor Critic ...

  7. 什么是运动控制,工业控制与自动化领域中运动控制器的作用是什么?- 顶控科技

    作为一个工控人,时常都会提到运动控制.那么,什么是运动控制?在工业控制与自动化范畴中,运动控制器的作用是什么呢? 什么是运动控制 运动控制,也可叫做电力拖动控制:它是自动化的一个分支,其动力源大部分都 ...

  8. 人体肌肉力量分析系统设计:基于MATLAB的肌肉力量分析和仿真,包括肌肉动力学建模、肌肉极限力量评估和运动控制

    以下是基于MATLAB的人体肌肉力量分析系统设计的详细内容,包括肌肉动力学建模.肌肉极限力量评估和运动控制等原理详解,以及相应的代码实现和运行结果. 肌肉动力学建模 肌肉动力学建模是肌肉力量分析系统的 ...

  9. c#上位机 源码 控制固高,研华,雷赛这类的运动板卡。偏向 程序运动控制。winform+板卡+sqlite

    c#上位机 源码 控制固高,研华,雷赛这类的运动板卡.偏向 程序运动控制.winform+板卡+sqlite

最新文章

  1. ORACLE学习第三天
  2. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
  3. 【数理知识】《数值分析》李庆扬老师-目录
  4. Android实现支付宝AR功能,Android RecyclerView 实现支付宝首页效果
  5. 同一页面引入多个JS文件的编码问题
  6. pb 保存变量文件名_【Tensorflow 2.0 正式版教程】模型的保存、加载与迁移
  7. 20200320:反转字符串中的元音字母(leetcode345)
  8. Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)
  9. what's the differences between readonly const in C# 在C#中readonly和const的区别
  10. 建设数据中心机房主要看这几点,否则被定为劣质机房
  11. em gmm matlab,EM方法解高斯混合模型(GMM)Matlab实现
  12. R语言空间权重矩阵columbus及画图
  13. 学习强国中车万翔老师回文数代码在python3.7中输出inf问题
  14. 一位10年Java工作经验的架构师聊Java和工作经验
  15. 5990. 找出数组中的所有孤独数字
  16. 社群运营的用户画像分析有哪些方法?
  17. 聚美优品启动上市,真的那么赚钱吗?
  18. dau计算-预测日活
  19. 科技节编程大赛三等奖作品——李白杨
  20. linux批量卸载rpm,shell实现rpm -e 一键卸载所有相关包以及依赖

热门文章

  1. 螺距规的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. spring-cloud服务监控
  3. python fabs() 函数
  4. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part3
  5. (网页)HTML小技巧的一些小技巧
  6. Mysql数据库可视化工具Navicat使用
  7. 机器学习笔记——逻辑斯蒂回归(Logistic)
  8. ubuntu20.04卸载virtualbox失败,“if your system is using efi secure boot you may need to sign the kernel “
  9. Post请求body为list,校验里面的对象
  10. 请问,电子产品中常用的12V转5V的DCDC电源芯片有哪些