用户自定义电机初始化

2024-08-21 20:28

本文主要是介绍用户自定义电机初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用户自定义电机初始化,一般就是举升和旋转电机初始化

int AGVBasicDriverControl::controlUserMotorInit()
{int result=0;KEYSTATE keyStatus;KEYSTATE keyStatusUp, keyStatusDown;float angleDiff, heightDiff;bool initActionFinshFlag=false;if(mLiftManualPlatformControl.size()==0//小车举升平台控制输出&&mRotateManualPlatformControl.size()==0)//小车旋转平台控制输出{result=1;qDebug()<<"没有举升旋转马达,直接退出初始化";return result;}if(mUserMotorInitStep==0) //初始化第0步,将各个控制马达初始化标志置复位{for(int i=0;i<mLiftManualPlatformControl.size();i++){mLiftManualPlatformControl[i].nLiftPlatformInitStep=0;if(mCartLiftMotorParameterList[i].downLimitIoAddr!=0&&mCartLiftMotorParameterList[i].upLimitIoAddr==0)//有下限位,没有上限位{getInputIOStatus(mCartLiftMotorParameterList[i].downLimitIoAddr,keyStatusUp);if(keyStatusUp==KEY_OFF)mLiftManualPlatformControl[i].nLiftPlatformInitStep=1;//跳过顶盘上升5mm阶段,进入顶盘下降寻找原点}mLiftManualPlatformControl[i].mLiftMotorInitFlag=false;mLiftManualPlatformControl[i].mLiftPlatformHeightRef=0;pComManualLiftMotorCurrentHeight[i]=-1;//用于显示举升马达当前高度mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.clear();//平台升降位置记忆序列}for(int i=0;i<mRotateManualPlatformControl.size();i++){mRotateManualPlatformControl[i].nRotationPlatformInitStep=0;mRotateManualPlatformControl[i].mRotationMotorInitFlag=false;mRotateManualPlatformControl[i].mRotationPlatformAngleRef=0;pComManualRotateMotorCurrentAngle[i]=-1;mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.clear();}mUserMotorInitStep=1;qDebug()<<"用户马达初始化跳转到第 1 步";}else if(mUserMotorInitStep==1)//初始化第1步,升降电机归位零点{if(mLiftManualPlatformControl.size()==0){mUserMotorInitStep=2; //跳转到旋转盘升降初始化}initActionFinshFlag=true;for(int i=0;i<mLiftManualPlatformControl.size();i++){if(mCartLiftMotorParameterList[i].downLimitIoAddr==0)//没有指定升降马达IO,不需要初始化{mLiftManualPlatformControl[i].mLiftMotorInitFlag=true;}if(mLiftManualPlatformControl[i].mLiftMotorInitFlag==false){initActionFinshFlag=false;if(mCartLiftMotorParameterList[i].downLimitIoAddr!=0&&mCartLiftMotorParameterList[i].upLimitIoAddr!=0)//有上下限位{getInputIOStatus(mCartLiftMotorParameterList[i].downLimitIoAddr,keyStatusUp);getInputIOStatus(mCartLiftMotorParameterList[i].upLimitIoAddr,keyStatusDown);if(keyStatusUp==KEY_ON&&keyStatusDown==KEY_ON){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_LIFT_MOTOR_INIT_FAULT,0);qDebug()<<"升降电机上下限位同时感应到信号,请检查,确定限位的常开常闭属性";}}if(mLiftManualPlatformControl[i].nLiftPlatformInitStep==0)//顶盘上升5mm{if(getInputIOStatus(mCartLiftMotorParameterList[i].upLimitIoAddr,keyStatus)==true){
//                        qDebug()<<"mLiftManualPlatformControl[i].mLiftPlatformHeightRef"<<mLiftManualPlatformControl[i].mLiftPlatformHeightRef<<"mCartLiftMotorParif(mLiftManualPlatformControl[i].mLiftPlatformHeightRef>5.0f||keyStatus==KEY_ON){mLiftManualPlatformControl[i].nLiftPlatformInitStep=1;mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.clear();setLiftPlatformMotorSpeed(i,0);qDebug()<<"升降电机初始化第 0步完成,进入第1步";}else{setLiftPlatformMotorSpeed(i,PLATFORM_LIFT_INIT_SPEED_FAST);//上升控制mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.append(mLiftManualPlatformControl[i].mLiftPlatformHeightRef);if(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.size()>MAX_MOTOR_POS_REM){mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.removeAt(0);if(fabs(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[MAX_MOTOR_POS_REM-1]-mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[0])<PLATFORM_LIFT_INIT_SPEED_FAST/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_LIFT_MOTOR_INIT_FAULT,0);}}}}else{setLiftPlatformMotorSpeed(i,0);qDebug()<<"IO通信主板超时等待中";}}else if(mLiftManualPlatformControl[i].nLiftPlatformInitStep==1)//顶盘下降寻找原点{if(getInputIOStatus(mCartLiftMotorParameterList[i].downLimitIoAddr,keyStatus)==true){if(keyStatus==KEY_ON){mLiftManualPlatformControl[i].nLiftPlatformInitStep=2;mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.clear();setFollowPlatformLiftMotorSpeed(0);qDebug()<<"顶升马达初始化第 1步完成,进入第2步";}else{
//                            qDebug()<<"顶升马达速度输出"<<PLATFORM_LIFT_INIT_SPEED_FAST;setLiftPlatformMotorSpeed(i,PLATFORM_LIFT_INIT_SPEED_FAST*-1);//下降控制mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.append(mLiftManualPlatformControl[i].mLiftPlatformHeightRef);if(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.size()>MAX_MOTOR_POS_REM){mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.removeAt(0);if(fabs(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[MAX_MOTOR_POS_REM-1]-mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[0])<PLATFORM_LIFT_INIT_SPEED_FAST/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_LIFT_MOTOR_INIT_FAULT,0);}}}}else{setLiftPlatformMotorSpeed(i,0);qDebug()<<"IO通信主板超时等待中";}}else if(mLiftManualPlatformControl[i].nLiftPlatformInitStep==2)//顶盘举升确定顶升原点{if(getInputIOStatus(mCartLiftMotorParameterList[i].downLimitIoAddr,keyStatus)==true){if(keyStatus==KEY_OFF){mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem=mLiftManualPlatformControl[i].mLiftPlatformHeightRef*-1;if(mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem>mCartLiftMotorParameterList[i].liftHeight){mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem=mCartLiftMotorParameterList[i].liftHeight;}if(mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem<0){mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem=0;}mLiftManualPlatformControl[i].nLiftMotorPlusNum=0;mLiftManualPlatformControl[i].nLiftPlatformInitStep=3;mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.clear();setLiftPlatformMotorSpeed(i,0);qDebug()<<"举升马达初始化第 2步完成,进入第3步,回到原来高度 "<<mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem;}else{setLiftPlatformMotorSpeed(i,PLATFORM_LIFT_INIT_SPEED_SLOW);//上升控制mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.append(mLiftManualPlatformControl[i].mLiftPlatformHeightRef);if(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.size()>MAX_MOTOR_POS_REM){mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem.removeAt(0);if(fabs(mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[MAX_MOTOR_POS_REM-1]-mLiftManualPlatformControl[i].lstPlatformLiftHeightRefRem[0])<PLATFORM_LIFT_INIT_SPEED_FAST/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_LIFT_MOTOR_INIT_FAULT,0);}}}}else{setLiftPlatformMotorSpeed(i,0);qDebug()<<"IO通信主板超时等待中";}}else if(mLiftManualPlatformControl[i].nLiftPlatformInitStep==3)//顶盘举升到原来起始位置{heightDiff=mLiftManualPlatformControl[i].mFollowPlatformLiftBeginHeightRem-mLiftManualPlatformControl[i].mLiftPlatformHeightRef;if(fabs(heightDiff)<0.5){mLiftManualPlatformControl[i].nLiftPlatformInitStep=4;//跳到转盘初始化步骤setLiftPlatformMotorSpeed(i,0);//上升控制qDebug()<<"举升马达初始化第 3步完成,进入第4步";}else{setLiftPlatformMotorSpeed(i,PLATFORM_LIFT_INIT_SPEED_FAST*sign(heightDiff));//上升控制}}else{mLiftManualPlatformControl[i].mLiftMotorInitFlag=true;qDebug()<<"完成举升马达"<<i<<"初始化所有动作";}}else{setLiftPlatformMotorSpeed(i,0);}}if(initActionFinshFlag==true){mUserMotorInitStep=2;//跳转到旋转马达初始化qDebug()<<"完成举伸马达初始化所有动作,进入旋转马达初始化";}}else if(mUserMotorInitStep==2)//初始化第2步,旋转电机归位零点{if(mRotateManualPlatformControl.size()==0){mUserMotorInitStep=3; //跳转到下一步}initActionFinshFlag=true;for(int i=0;i<mRotateManualPlatformControl.size();i++){if(mCartRotateMotorParameterList[i].rotateRightZeroIoAddr==0)//没有指定旋转马达IO,不需要初始化{mRotateManualPlatformControl[i].mRotationMotorInitFlag=true;}if(mRotateManualPlatformControl[i].mRotationMotorInitFlag==false){initActionFinshFlag=false;if(mRotateManualPlatformControl[i].nRotationPlatformInitStep==0)//顶盘逆时针旋转10度{if(getInputIOStatus(mCartRotateMotorParameterList[i].rotateLeftLimitIoAddr,keyStatus)==true){setRotatePlatformMotorSpeed(i,PLATFORM_ROTATE_INIT_SPEED_FAST);mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.append(mRotateManualPlatformControl[i].mRotationPlatformAngleRef);if(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.size()>MAX_MOTOR_POS_REM){mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.removeAt(0);if(fabs(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[MAX_MOTOR_POS_REM-1]-mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[0])<PLATFORM_ROTATE_INIT_SPEED_FAST/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_ROTATE_MOTOR_INIT_FAULT,0);}}if(mRotateManualPlatformControl[i].mRotationPlatformAngleRef>10.0f||keyStatus==KEY_ON){mRotateManualPlatformControl[i].nRotationPlatformInitStep=1;mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.clear();setRotatePlatformMotorSpeed(i,0);}}else{qDebug()<<"IO通信主板超时等待中";}}else if(mRotateManualPlatformControl[i].nRotationPlatformInitStep==1)//顶盘顺时针旋转查找原点{if(getInputIOStatus(mCartRotateMotorParameterList[i].rotateRightZeroIoAddr,keyStatus)==true){setRotatePlatformMotorSpeed(i,PLATFORM_ROTATE_INIT_SPEED_FAST*-1);mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.append(mRotateManualPlatformControl[i].mRotationPlatformAngleRef);if(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.size()>MAX_MOTOR_POS_REM){mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.removeAt(0);if(fabs(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[MAX_MOTOR_POS_REM-1]-mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[0])<PLATFORM_ROTATE_INIT_SPEED_FAST/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_ROTATE_MOTOR_INIT_FAULT,0);}}if(keyStatus==KEY_ON){mRotateManualPlatformControl[i].nRotationPlatformInitStep=2;mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.clear();setRotatePlatformMotorSpeed(i,0);qDebug()<<"旋转马达初始化第 1步完成,进入第2步";}}else{setRotatePlatformMotorSpeed(i,0);qDebug()<<"IO通信主板超时等待中";}}else if(mRotateManualPlatformControl[i].nRotationPlatformInitStep==2)//顶盘逆时针旋转确定原点{if(getInputIOStatus(mCartRotateMotorParameterList[i].rotateRightZeroIoAddr,keyStatus)==true){setRotatePlatformMotorSpeed(i,PLATFORM_ROTATE_INIT_SPEED_SLOW);mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.append(mRotateManualPlatformControl[i].mRotationPlatformAngleRef);if(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.size()>MAX_MOTOR_POS_REM){mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.removeAt(0);if(fabs(mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[MAX_MOTOR_POS_REM-1]-mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem[0])<PLATFORM_ROTATE_INIT_SPEED_SLOW/10.0f){xAGVAlarmErrorManager::addErrorCode(ERROR_AGV_ROTATE_MOTOR_INIT_FAULT,0);}}if(keyStatus==KEY_OFF){mRotateManualPlatformControl[i].nRotationPlatformInitStep=3;mRotateManualPlatformControl[i].mFollowPlatformRotationBeginAngleRem=mRotateManualPlatformControl[i].mRotationPlatformAngleRef*-1;mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.clear();mRotateManualPlatformControl[i].nRotationMotorPlusNum=0;setRotatePlatformMotorSpeed(i,0);qDebug()<<"旋转马达初始化第 2步完成,进入第3步";}}else{setRotatePlatformMotorSpeed(i,0);qDebug()<<"IO通信主板超时等待中";}}else if(mRotateManualPlatformControl[i].nRotationPlatformInitStep==3)//顶盘旋转到原来起始位置{angleDiff=fmodToNP180Degree(mRotateManualPlatformControl[i].mFollowPlatformRotationBeginAngleRem-mRotateManualPlatformControl[i].mRotationPlif(fabs(angleDiff)<0.1){setRotatePlatformMotorSpeed(i,0);mRotateManualPlatformControl[i].nRotationPlatformInitStep=6;//跳到顶盘旋转到原来起始位置步骤mRotateManualPlatformControl[i].lstPlatformRotateAngleRefRem.clear();qDebug()<<"顶盘初始化第 5步完成,进入第6步";}else{if(fabs(angleDiff)>5)setRotatePlatformMotorSpeed(i,PLATFORM_ROTATE_INIT_SPEED_FAST*sign(angleDiff));elsesetRotatePlatformMotorSpeed(i,PLATFORM_ROTATE_INIT_SPEED_SLOW*sign(angleDiff));}}else{mRotateManualPlatformControl[i].nRotationPlatformInitStep=4;mRotateManualPlatformControl[i].mRotationMotorInitFlag=true;qDebug()<<"完成旋转马达"<<i<<"初始化所有动作";}}else{setRotatePlatformMotorSpeed(i,0);mRotateManualPlatformControl[i].mRotationMotorInitFlag=true;}}if(initActionFinshFlag==true){mUserMotorInitStep=3;//跳转到旋转马达初始化qDebug()<<"完成旋转马达初始化所有动作,结束用户马达初始化动作";}}else if(mUserMotorInitStep==3)//初始化第3步,升降电机回复原来高度{result=1;}return result;
}

这篇关于用户自定义电机初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094198

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b