• DMC运动控制器


    DMC_21x3控制器,Galil

     

    连接控制器代码

    void CREBot6VDlg::OnButtonConnectController() 
    {
        
    ///连接运动控制器,并作初始化
        
    ///DCM2163 controller object

      CDMCWin m_DMCWin;
        CDMCWinRegistry DMCWinRegistry;
        GALILREGISTRY galilregistry;

        
    ///判断运动控制器是否注册
        if (DMCWinRegistry.GetGalilRegistryInfo(m_nController, &galilregistry) != 0)
        
    {
          
    //SetDlgItemText(IDC_EDIT_SYS_MSG,"请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!");
         ShowInfo("请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!",ICON_ALERT);
         
    return;
        }

        
    if(galilregistry.fControllerType!=ControllerTypeEthernet||strcmp(galilregistry.szModel,"DMC-21x3/2")!=0)
        
    {
           ShowInfo(
    "请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!并且使用以太网通讯!",ICON_ALERT);
    //     SetDlgItemText(IDC_EDIT_SYS_MSG,"请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!并且使用以太网通讯!");
         return;
        }

      
        
    /// 初始化运动控制器,设置为在注册表中第一个运动控制器
        m_DMCWin.SetController(m_nController);
        m_DMCWin.SethWnd(GetSafeHwnd());

        
    /// 打开和DMC运动控制器间的连接
        m_DMCWin.Open();

        CString TempString;
        
    if(m_DMCWin.IsConnected())
        
    {
         TempString
    ="已经连接: ";
         
    if (m_DMCWin.GetVersion(szResponse, sizeof(szResponse)) == 0)
         
    {
           
    //SetDlgItemText(IDC_EDIT_SYS_MSG,TempString);
          TempString+=szResponse;
          ShowInfo(TempString,ICON_INFO);
         }


         ((CStatic 
    *)GetDlgItem(IDC_STATIC_COMU_STATUS))->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_ROBOT_READY));
        }

        
    else
        
    {
         
    /// 返回错误信息
         m_DMCWin.GetErrorText(m_DMCWin.GetLastError(),szResponse,sizeof(szResponse));
         TempString 
    = "连接运动控制器失败:  ";
         TempString 
    += szResponse;
         
    //SetDlgItemText(IDC_EDIT_SYS_MSG,TempString);
         ShowInfo(TempString,ICON_ERROR);
         
    return;
        }


        GetDlgItem(IDC_BUTTON_CALIBRATE)
    ->EnableWindow(TRUE);
        GetDlgItem(IDC_BUTTON_CONNECT_CONTROLLER)
    ->EnableWindow(FALSE);

    }


     

    ///获取运动控制状态线程
    char *const COMMAND_GET_AXIS_POS[18]={"MG_TDA\r","MG_LFA\r","MG_LRA\r",
                                         
    "MG_TDB\r","MG_LFB\r","MG_LRB\r",
                                         
    "MG_TDC\r","MG_LFC\r","MG_LRC\r",
                                         
    "MG_TDD\r","MG_LFD\r","MG_LRD\r",
                                         
    "MG_TDE\r","MG_LFE\r","MG_LRE\r",
                                         
    "MG_TDF\r","MG_LFF\r","MG_LRF\r"
    }

    bool gbGetMotionStatusThreadRunning=true;
    DWORD WINAPI threadProc_GetMotionStatus( LPVOID pParam )
    {
        
    //t_Axis *axisArray=(t_Axis *)pParam;
        long rc;
        
    char szRepaly[4096];
        
    int axisIndex=0;
        
    int errorOkCount=0;

        FILE 
    *fdebug=fopen("d.txt","wt");

        
    while(gbGetMotionStatusThreadRunning)
        
    {
           ::WaitForSingleObject(ghMutexVisit,INFINITE);
    //当ghMutexVisit变成有信号才返回,否则,一直等下去。
             for(axisIndex=0;axisIndex<6;axisIndex++)
           
    {
                
               rc 
    = m_DMCWin.Command(COMMAND_GET_AXIS_POS[3*axisIndex],szRepaly,sizeof(szRepaly));
               
    if (rc == DMCNOERROR)
                     gCurAxisPulse[axisIndex]
    =atol(szRepaly);
               
    else if (rc == DMCERROR_TIMEOUT)
                  gDMCTimeOutCount
    ++;
               rc 
    = m_DMCWin.Command(COMMAND_GET_AXIS_POS[3*axisIndex+1],szRepaly,sizeof(szRepaly));
               
    if (rc == DMCNOERROR)
                     gCurAxisForwardLimit[axisIndex]
    =atoi(szRepaly);
               
    else if (rc == DMCERROR_TIMEOUT)
                  gDMCTimeOutCount
    ++;
               rc 
    = m_DMCWin.Command(COMMAND_GET_AXIS_POS[3*axisIndex+2],szRepaly,sizeof(szRepaly));
               
    if (rc == DMCNOERROR)
                     gCurAxisBackwardLimit[axisIndex]
    =atoi(szRepaly);
               
    else if (rc == DMCERROR_TIMEOUT)
                  gDMCTimeOutCount
    ++;
            }

               
    ///rc = m_DMCWin.Command("MG_BGS\r",szRepaly,sizeof(szRepaly));
            if(gbMotionFinished==false)
             
    {
               errorOkCount
    =0;
                  
    for(axisIndex=0;axisIndex<6;axisIndex++)
               
    {
                   fprintf(fdebug,
    "%d ",(int)(fabs(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex])));

                   
    if(fabs(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex])<CONTROL_ERROR_PULSE)
                    errorOkCount
    ++;
               }

               
    if(errorOkCount==6)
                   gbMotionFinished
    =true;
               fprintf(fdebug,
    "\n");
    //               lVectroError+=(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex])*(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex]);
    //           fprintf(fdebug,"%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",gCurAxisPulse[0],glLIMoveGoalPulse[0],gCurAxisPulse[1],glLIMoveGoalPulse[1],gCurAxisPulse[2],glLIMoveGoalPulse[2],gCurAxisPulse[3],glLIMoveGoalPulse[3],gCurAxisPulse[4],glLIMoveGoalPulse[4],gCurAxisPulse[5],glLIMoveGoalPulse[5],lVectroError);
    //           if(lVectroError<CONTROL_ERROR_PULSE)
    //                gbMotionFinished=true;
             }

            ::ReleaseMutex(ghMutexVisit);
            Sleep(
    20);  
            
        }


        fclose(fdebug);
        
        
    return 0;   // thread completed successfully
    }


     

    从绝对编码器读取值。机器人零点位置标定

    ///机器人运行前必须至少进行一次标定操作!
    void CREBot6VDlg::OnButtonCalibrate() 
    {
        

      
    ///DMC运动控制器已经设置好

    /*    m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[0],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[1],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[2],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[3],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[4],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[5],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[6],szResponse,sizeof(szResponse));
        m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[7],szResponse,sizeof(szResponse));
    */



      
    ///打开RS232C串口读取绝对编码器值
      if(OpenCommPort(COM1,BAUDRATE_19200)==FALSE)
      
    {
         AfxMessageBox(
    "打开RS232C通讯端口失败! 标定没有完成!");
         
    return;
      }

      
    int i;
      
    long absPulse[6];
      
    for(i=1;i<=6;i++)
      
    {
        
    if(ReadAbsPositonFromRS422(i,absPulse[i-1])!=RS422_NOERROR)
        
    {
           AfxMessageBox(
    "绝对编码器读取数据失败!");
           CloseCommPort();
           
    return;
        }

        absPulse[i
    -1]=-absPulse[i-1];
        Sleep(
    50);
      }

      CloseCommPort();

      
    long rc;
      
    //DPABS_1,ABS_2,ABS_3,ABS_4,ABS_5,ABS_6
      ///将绝对编码器的值设置为当前运动控制器的规划值和目标值
      sprintf(szCommandStr,"DP%d,%d,%d,%d,%d,%d\r",absPulse[0],absPulse[1],absPulse[2],absPulse[3],absPulse[4],absPulse[5]);
      m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
    ///for stepper mode,set TP pulse
         sprintf(szCommandStr,"DE%d,%d,%d,%d,%d,%d\r",absPulse[0],absPulse[1],absPulse[2],absPulse[3],absPulse[4],absPulse[5]);
         m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
    ///

       
    ///从配置文件读取较准原点坐标数据

       FILE *fin=fopen(ORG_SET_FILE_NAME,"rt");
       
    if(fin==NULL)
       
    {
          AfxMessageBox(
    "打开原点配置文件REOrg.ini失败!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。");
             ShowInfo(
    "运行前必须对机器人绝对位置数据作校准!",ICON_ALERT);
          
    return;
       }

       
    int readCount=0;
       readCount
    =fscanf(fin,"%ld %ld %ld %ld %ld %ld",&absPulse[0],&absPulse[1],&absPulse[2],&absPulse[3],&absPulse[4],&absPulse[5]);
       
    if(readCount!=6)
       
    {
          AfxMessageBox(
    "打开原点配置文件REOrg.ini失败!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。");
             ShowInfo(
    "运行前必须对机器人绝对位置数据作校准!",ICON_ALERT);
          EnableJOGButtons(TRUE);
          fclose(fin);
          
    return;
       }

       fclose(fin);
       ABS_AXIS_HOME_PULSE[
    0]=absPulse[0];ABS_AXIS_HOME_PULSE[1]=absPulse[1];ABS_AXIS_HOME_PULSE[2]=absPulse[2];
       ABS_AXIS_HOME_PULSE[
    3]=absPulse[3];ABS_AXIS_HOME_PULSE[4]=absPulse[4];ABS_AXIS_HOME_PULSE[5]=absPulse[5];
        

      
    if(MessageBox("机器人将依次运动R,U,L,S,T,B六个轴到达标定零点位姿。\n\n在运动过程中请确保所有人员远离机器人作业范围!\n\n如果机器人运动过程不正常请立刻按下急停按钮!\n\n\n确认机器人可以安全动作了吗?",
                    
    "机器人回标定零点",MB_YESNO|MB_ICONQUESTION)==IDYES)
      
    {
        
         sprintf(szCommandStr,
    "PA%ld,%ld,%ld,%ld,%ld,%ld\r",ABS_AXIS_HOME_PULSE[0],ABS_AXIS_HOME_PULSE[1],ABS_AXIS_HOME_PULSE[2],ABS_AXIS_HOME_PULSE[3],ABS_AXIS_HOME_PULSE[4],ABS_AXIS_HOME_PULSE[5]);
         m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
         sprintf(szCommandStr,
    "SP20000,30000,30000,50000,50000,50000\r");
         m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
         sprintf(szCommandStr,
    "AC100000,100000,100000,100000,100000,100000\r");
         m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
         sprintf(szCommandStr,
    "DC100000,100000,100000,100000,100000,100000\r");
         m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
         
         
    for(i=3;i>=0;i--)
         
    {
            m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i],szResponse,
    sizeof(szResponse));
           
    ///wait motion complete
           while(1)
           
    {
             rc
    =m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i+6],szResponse,sizeof(szResponse));
             
    //if(atoi(szResponse)==0)
            
    //    break;
            
    //if(szResponse[0]=='0')
            
    //     break;
            if (rc == DMCNOERROR)
            
    {
               
    if(atoi(szResponse)==0)
                   
    break;
            }

            
    else if (rc == DMCERROR_TIMEOUT)
                gDMCTimeOutCount
    ++;
            
           }

            
         }

         
    for(i=4;i<=5;i++)
         
    {
            m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i],szResponse,
    sizeof(szResponse));
           
    ///wait motion complete
           while(1)
           
    {
             rc
    =m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i+6],szResponse,sizeof(szResponse));
             
    //if(atoi(szResponse)==0)
            
    //    break;
            
    //if(szResponse[0]=='0')
            
    //     break;
            if (rc == DMCNOERROR)
            
    {
               
    if(atoi(szResponse)==0)
                   
    break;
            }

            
    else if (rc == DMCERROR_TIMEOUT)
                gDMCTimeOutCount
    ++;
            
           }

         }


         
         
    if(MessageBox("请确认机器人S,L,U,R,B,T,六个轴准确到达标定零点位姿?","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)
         
    {
            ShowInfo(
    "机器人完成标定检查过程,现在可以正常操作机器人。",ICON_OK);
            
    for(i=0;i<6;i++)
            
    {
             sprintf(szCommandStr,
    "FL%c=%ld;BL%c=%ld;\r", (char)('A'+i),(long)(ABS_AXIS_HOME_PULSE[i]+gSoftLimitDegree[2*i+1]*gPulsePerDegree[i]),(char)('A'+i),(long)(ABS_AXIS_HOME_PULSE[i]+gSoftLimitDegree[2*i]*gPulsePerDegree[i]));
             m_DMCWin.Command(szCommandStr,szResponse,
    sizeof(szResponse));
            }

         }

         
    else
         
    {
            AfxMessageBox(
    "机器人绝对原点标定数据不正确!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。");
             
            ShowInfo(
    "运行前必须对机器人绝对位置数据作校准!",ICON_ALERT);
            m_DMCWin.Clear();
            m_DMCWin.Close();
            
    return;
         }

      }

      
    else
      
    {
        m_DMCWin.Clear();
        
    //m_DMCWin.Close();
        return;
      }


      GetDlgItem(IDC_BUTTON_CALIBRATE)
    ->EnableWindow(FALSE);
      GetDlgItem(IDC_BUTTON_GO_STOP_POSITION)
    ->EnableWindow(TRUE);

      EnableMotionButtons(TRUE);
      EnableJOGButtons(TRUE);
      
      
    ///Resume the thread
      if(m_GetStatusThreadHandle!=NULL)
         ResumeThread(m_GetStatusThreadHandle);
      
      SetTimer(
    1,150,NULL);

    }

  • 相关阅读:
    Java基础知识强化之集合框架笔记48:产生10个1~20之间的随机数(要求:随机数不能重复) 简洁版
    Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)
    Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)
    Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)
    Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
    docker学习整理
    python爬虫入门
    h3c 交换机配置VLAN和远程管理
    linux 使用串口连接设备console
    走势部署
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1010342.html
Copyright © 2020-2023  润新知