伺服电机程序
编制控制伺服电机定长正、反旋转的PLC程序
编制控制伺服电机定长正、反旋转的PLC程序上位机设定伺服电机旋转速度单位为(转/分),伺服电机设定为1000个脉冲转一圈.PLC输出脉冲频率=(速度设定值/6)*100(HZ)。
上位机设定伺服电机行走长度单位为(0.1mm),伺服电机每转一圈的行走长度10mm,伺服电机转一圈需要的脉冲数为1000,故PLC发出一个脉冲的行走长度为0.01mm(一个丝)。
PLC输出脉冲数=长度设定值*10。
上面两点的计算都是在伺服电机参数设定完的基础上得出的。
也就是说,在计算PLC发出脉冲频率与脉冲前,必须先根据机械条件,综合考虑精度与速度要求设定好伺服电机的电子齿轮比!大致方法如下:机械安装结束,伺服电机转动一圈的行走长度已经固定(如上面所说的10mm),设计要求的行走精度为0.1mm(10个丝)。
为了保证此精度,一般情况下是让一个脉冲的行走长度低于0.1mm,如设定一个脉冲的行走长度为如上所述的0.01mm,于是电机转一圈所需要脉冲数即为1000个脉冲。
此种设定当电机速度要求为1200转/分时,PLC应该发出的脉冲频率为20K。
松下PLC的CPU本体可以发脉冲频率为100K,完全可以满足要求。
如果电机转动一圈为100mm,设定一个脉冲行走仍然是0.01mm,电机转一圈所需要脉冲数即为10000个脉冲,电机速度为1200转时所需要脉冲频率就是200K。
PLC的CPU本体就不够了。
需要加大成本,如增加脉冲输出专用模块等方式。
知道了频率与脉冲数的算法就简单了,只需应用PLC的相应脉冲指令发出脉冲即可,松下PLC的程序图如下:以松下Minas A4系列伺服驱动器为例,介绍PLC控制伺服电机的方法。
伺服电机有三种控制模式:速度控制,位置控制,转矩控制{由伺服电机驱动器的Pr02参数与32(C-MODE)端子状态选择},本章简要介绍位置模式的控制方法一、按照伺服电机驱动器说明书上的"位置控制模式控制信号接线图"连接导线来源于:528工控网3(PULS1),4(PULS2)为脉冲信号端子,PULS1连接直流电源正极(24V电源需串连2K左右的电阻),PULS2连接控制器(如PLC的输出端子)。
用WinDriver开发伺服电机控制卡驱动程序
发 行 包 和 Wi Drv r 发 文 档 , 附 带 了驱 动 程 序 调 试 n ie 开 还 工 具 ( DDEBUG) 驱 动 程 序 安 装 工 具 ( D G) 。 W , W RE 等
W iDrv r内 部 机 制 如 图 1所 示 , 由 图 可 见 它 包 括 n ie
W a gT o n a Yu h o n C a W u Pi go g u Kea n l n L f
A s at I i p pr yteea peo einn C b t c nt s a e,b x m l f s igP L一8 2 IA cr )die,as l fc n a ei igd v edie r h h d g 3 ( ad r r i ee i t yt d s nn e i r ri S v mp i f e w o g c v n
的 设 备 驱 动 程 序 开 发 软 件 包 。 开 发 者 只 需 要 在 用 户 层 上 进 行 开 发 ,从 而 使 复 杂 的设 备 驱 动 程 序 的 开 发 变 得 简 捷 ; Wi Dr e n i r开 发 出 的 设 备 驱 动 程 序 还 具 有 稳 定 、 v 高 效 的 特 点 ,是 诸 如 I A 卡 等 设 备 驱 动 程 序 开 发 强 有 S 力 且 方 便 的 3_ 。 - 具 用 W iDrv r开 发 设 备 驱 动 程 序 不 需 要 熟 悉 Wi . n ie n dw o s操 作 系 统 的 内 核 , 需 了 解 Wi Dr e 仅 n i r的 内 部 机 制 v 和 开 发 步 骤 ,就 可 以 快 速 而 安 全 的 开 发 出 与 传 统 开 发 方 法 同 样 效 率 和 可靠 性 的设 备 驱 动 程 序 。
SEW伺服电机IPOS典型控制程序
/**************************************************************************** --------------------------------10.18.01 D.Broerman Copied from Version 5 of Rack Stacker Software08.01.02 D.Broerman Added Position_6a to control the Vaccum Cup extend position 10.08.02 D.Broerman V04 Added sequence to Load from Rack31.01.03 St. Reuter V05 Communication via Device Net17.04.03 IBB China CSG Pos.13Necessary Parameters:--------------------------Operating Mode = VFC-n-Reg. & IPOSParameter P700Parameter P100 Sollwertquelle = FeldbusParameter P101 Steuerquelle = FeldbusBinary Inputs Base UnitDI00 EnableP600 DI01 Release/Rapid StopP601 DI02 High Speed Input 1P602 DI03 High Speed Input 2P603 DI04 SpareP604 DI05 SpareaaaBinary Option Card 1P610 DI10 IPOS Input (Vacuum Cup Extended Prox)P611 DI11 IPOS Input (V acuum Cup Retracted Prox)P612 DI12 IPOS Input (Vacuum Switch)P613 DI13 IPOS Input (Spare)P614 DI14 IPOS Input (Spare)P615 DI15 IPOS Input (Spare)P616 DI16 IPOS Input (Spare)P617 DI17 IPOS Input (Spare)Binary Inputs IPOS Inputs PA 1 (Device Net)DI20 IPOS Input (Start Cycle Signal Stacking)DI21 IPOS Input (Stop Cycle Signal)DI22 IPOS Input (MotorRight/ Halt, Arm Up Hand)DI23 IPOS Input (MotorLeft/ Halt, Arm Down Hand)DI24 IPOS Input (Vacuum Man Mode)DI25 IPOS Input (Release Man Mode)DI26 IPOS Input (Vacuum Cup In/Out Man Mode)DI27 IPOS Input (Stacker Mode)(Automatic = 1)(ManualMode = 0)DI30 IPOS Input (Loading Cycle Start)DI31 IPOS Input (Start Rack Reference)DI32 SpareDI33 SpareDI34 SpareDI35 SpareDI36 SpareDI37 SpareBinary Outputs Base UnitDB00 Configured with BrakeP620 DO01 Drive ReadyP621 DO02 Drive FaultBinary Output Option Card 1P630 DO10 IPOS Output (Arm Down)P631 DO11 IPOS Output (Conv Release In Transport)P632 DO12 IPOS Output (Stacker Fault)P633 DO13 IPOS Output (Basic Position)P634 DO14 IPOS Output (Conv Release Out Transport)P635 DO15 IPOS Output (Vacuum Cup Extended)P636 DO16 IPOS Output (Rack Reference Position)P637 DO17 IPOS Output (Vacuum Fault)Output Option Card 2DO20 IPOS Output (Vacuum Cup Extend Sol)DO21 IPOS Output (Vacuum Cup Retract Sol)DO22 IPOS Output (Vacuum On Sol)D023 IPOS Output (Vacuum Off Sol)DO24 IPOS Output (Blow Off On)DO25 IPOS Output (Spare)DO26 IPOS Output (Spare)DO27 IPOS Output (Spare)P941 IPOS Geberquelle = Motor Encoder on Terminal X15Anwenderprogramm mit folgenden Funktionen :-------------------------------------------1)Allgemeiner ManualMode eines positioniergeregelten Antriebs.- 黚er zwei Eingangsklemmen kann der Antrieb mit einer festenGeschwindigkeit in beide Richtungen gefahren werden.- Die Lageregelung ist dabei aktiv.- Eine vorherige Referenzfahrt ist nicht notwendig.2)Betriebsart Automatic****************************************************************************/#include <const.h>#include <io.h>//================= Fahr Variables ===========================================#pragma globals 200 250long V_MotorRight, V_MotorLeft;//================= Ziel Position - Variables ==============================#define Position_0 H0#define Position_1 H1#define Position_2 H2#define Position_3 H3#define Position_4 H4#define Position_5 H5#define Position_6 H6#define Position_7 H7#define Position_8 H8#define Position_9 H9#define Position_10 H10#define Ref_Pos H11#define Position_6a H12#define Auto_Speed_0 H20#define Auto_Speed_1 H21#define Auto_Speed_2 H22#define Ref_Speed_0 H23#define Auto_Speed_3 H24#define Man_Speed_0 H25#define Auto_Speed_4 H26#define Auto_Speed_5 H27#define Auto_Speed_6 H28#define Position_Window H30#define M_State H31#define M_Fault H32#define M_Merker H33#define Pos_0 H35#define M_Loading H36#define M_Stacking H37#define Load_Pos_0 H40#define Load_Pos_1 H41#define Load_Pos_2 H42#define Load_Pos_3 H43#define Load_Pos_4 H44#define Load_Pos_5 H45#define Load_Pos_6 H46#define Load_Pos_7 H47#define Load_Pos_8 H48#define Load_Pos_9 H49#define Load_Pos_10 H50#define Load_Pos_11 H51#define Load_Pos_12 H52#define Load_Pos_6a H53#define Bustyp H100#define Le_PA_DATA H101#define PA1 H102#define PA2 H103#define PA3 H104#define Le_PE_DA TA H110#define PE1 H111#define PE2 H112#define PE3 H113//================= INPUTS ========================================= //Onboard Inputs#define E_DriveEnable DI00#define E_DriveRel DI01#define E_Touchp_1 DI02#define E_Touchp_2 DI03#define E_Spare_1 DI04#define E_Spare_2 DI05//Inputs Card DIO 11A#define E_CupExtendedProx DI10#define E_CupRetractedProx DI11#define E_VacuumSwitch DI12#define E_Spare_3 DI13#define E_Spare_4 DI14#define E_Spare_5 DI15#define E_Spare_6 DI16#define E_Spare_7 DI17//Inputs Field Bus#define E_Start_Cycle ((PA1 & 0b1)!=0)#define E_Stop_Cycle ((PA1 & 0b10)!=0)#define E_ArmRight ((PA1 & 0b100)!=0)#define E_ArmLeft ((PA1 & 0b1000)!=0)#define E_VacManMode ((PA1 & 0b10000)!=0)#define E_RelManMode ((PA1 & 0b100000)!=0)#define E_CupInOutManMode ((PA1 & 0b1000000)!=0)#define E_AutoMode ((PA1 & 0b10000000)!=0)#define E_LoadCycleStart ((PA1 & 0b100000000)!=0)#define E_ReferenceRack ((PA1 & 0b1000000000)!=0)#define E_Continue_Cycle ((PA1 & 0b10000000000)!=0)#define E_Reset_Cycle ((PA1 & 0b100000000000)!=0)#define E_Resume_Cycle ((PA1 & 0b1000000000000)!=0)#define E_Vacuum_On_Auto ((PA1 & 0b10000000000000)!=0)//================= OUTPUTS =========================================//Onboard Outputs#define A_DriveReady DO01#define A_DriveFault DO02//Outputs Card DIO 11A#define A_CupExtendSol 0 //DO20#define A_CupRetractSol 1 //DO21#define A_VacuumOnSol 2 //DO22#define A_VacuumOffSol 3 //DO23#define A_BlowOffSol 4 //DO24//Outputs Fieldbus#define PE1_Output PE1#define A_StackerArmDown 0#define A_ConvRel 1 //((PE1 & 0b10)!=0)#define A_StackerFault 2 //((PE1 & 0b100)!=0)#define A_HomePosition 3 //((PE1 & 0b1000)!=0)#define A_ConvRelOut 4 //((PE1 & 0b10000)!=0)#define A_CupExtendSwitch 5 //((PE1 & 0b100000)!=0)#define A_ArmReferencePos 6 //((PE1 & 0b1000000)!=0)#define A_VacuumFault 7 //((PE1 & 0b10000000)!=0)#define A_ArmProbePos 8 //((PE1 & 0b100000000)!=0)#define A_CupRetractSwitch 9 //((PE1 & 0b1000000000)!=0)#define A_VacuumConfirm 10 //((PE1 & 0b10000000000)!=0)#define A_RelCrosstrREV 11 //((PE1 & 0b100000000000)!=0)//================= Festwerte ===============================================#pragma list/*==================================================================== =======Subroutines====================================================================== =====*//*================================================Subroutine for Initializing the System.==================================================*/Initialize(){_AxisStop( AS_RSTOP );OptOutpIPOS = 0; // all Outputs OffControlWord = 0; // IPOS Control Word OffPos_0 = 1000;Auto_Speed_0 = 15000; // Touch Probe SearchingAuto_Speed_1 = 19500; // Drive Down StackingAuto_Speed_2 = 5000;Auto_Speed_3 = 10000;Auto_Speed_4 = 15000; // Drive UP StackingAuto_Speed_5 = 1500; // Med Peel off speedAuto_Speed_6 = 100; // Slow Peel off speedRef_Speed_0 = 29000;Man_Speed_0 = 5000;Position_1 = 250000;M_State = 0;M_Fault = 0;M_Loading = 0;M_Stacking = 0;Bustyp = 3; //Value 3 = FieldbusLe_PA_DATA = 3; //Value 3 = Rrocess Input WordsLe_PE_DATA = 3; //Value 3 = Rrocess Output Words}// End Initialize()/*================================================= Interrupt Subroutine=================================================*/ Interrupt(){_TouchProbe( TP_DIS1 );M_State = 4 ;Position_2 = H507;Position_3 = H507 + 10000; // Vacuum On 10000 Position_4 = H507 + 345834; // 345834 Position_5 = H507 + 140000; // Vac Cups Ret 200000 Position_6 = H507 + 320000; // Slow Speed 400000 Position_6a = H507 + 363000; // Vac Cup Ext 411000 Position_7 = H507 + 421000; // Vac Rel vorher 250000 // 425000 Position_8 = H507 + 438000; // Blow-off off 438000 Position_9 = H507 + 850000; // Conv Rel 850000 Position_10 = H507 + 870000; // 870000Ref_Pos = H507 + 415000; // 275000 Load_Pos_0 = H507 -10000;Load_Pos_1 = H507 + 80000; // Vac Cups RetLoad_Pos_2 = H507 + 200000; // Slow SpeedLoad_Pos_3 = H507 + 230000; // Vac Cups Ext Vac OnLoad_Pos_4 = H507 + 280000; //Load_Pos_5 = H507 + 250000; // Ret Vac CupLoad_Pos_6 = H507 + 248000; // Low SpeedLoad_Pos_6a = H507 + 220000; // Med SpeedLoad_Pos_7 = H507 + 185000; // Hi Speed Ext Vac CupLoad_Pos_8 = H507 + 70000; // Low SpeedLoad_Pos_9 = H507 + 40000; // Vac RelLoad_Pos_10 = H507 + 2000; // Conv Relreturn;} // End Interrupt()/***************************************************************** Cycling Subroutine.******************************************************************/ Cycling(){if (!E_DriveRel){M_State = 0;_BitClear (PE1_Output, A_ArmProbePos );_BitClear (PE1_Output, A_ArmReferencePos);_AxisStop(AS_RSTOP);TargetPos = SetpointPos;}}// End Cycling/***************************************************************** Manual Mode Subroutine******************************************************************/ ManualMode(){// Stacker Arm Up and Downif(E_ArmRight || E_ArmLeft ){_AxisStop( AS_ENABLE );V_MotorRight = V_MotorLeft = Man_Speed_0;_SetSys (SS_POSSPEED, V_MotorRight);if (E_ArmRight && (!E_ArmLeft)) // Klemmen abfragen_GoAbs(GO_NOW AIT, (ActPos_Mot + 409600));if (E_ArmLeft && (!E_ArmRight))_GoAbs(GO_NOW AIT, (ActPos_Mot - 409600));}if(!E_ArmRight && !E_ArmLeft ){_AxisStop( AS_RSTOP );TargetPos = SetpointPos;}// Vacuum and Releaseif (E_VacManMode){_BitSet(OptOutpIPOS, A_VacuumOnSol);_BitClear (OptOutpIPOS, A_VacuumOffSol);}if (E_RelManMode && !E_VacManMode){_BitSet(OptOutpIPOS, A_VacuumOffSol);_BitSet(OptOutpIPOS, A_BlowOffSol);_BitClear (OptOutpIPOS, A_VacuumOnSol);}else{_BitClear (OptOutpIPOS, A_BlowOffSol);}// Vacuum Cup In Out Sequenceif (E_CupInOutManMode && E_CupExtendedProx && !(M_Merker && Bit_0)) {_BitSet(OptOutpIPOS, A_CupRetractSol);_BitClear (OptOutpIPOS, A_CupExtendSol);_BitSet (M_Merker, Bit_0);}if (E_CupInOutManMode && !E_CupExtendedProx && !(M_Merker && Bit_0)) {_BitClear(OptOutpIPOS, A_CupRetractSol);_BitSet (OptOutpIPOS, A_CupExtendSol);_BitSet (M_Merker, Bit_0);}if (!E_CupInOutManMode)_BitClear (M_Merker, Bit_0);/*if (E_CupExtendedProx){_BitClear (OptOutpIPOS, A_CupExtendSol);}if (E_CupRetractedProx){_BitClear (OptOutpIPOS, A_CupRetractSol);}*/} // End ManualMode()/*================================================Automatic Mode Subroutine==================================================*/AutomaticMode(){// Scope474 = StatusWord; // only for testingif (E_Start_Cycle && !E_Stop_Cycle && E_Touchp_1 && E_DriveEnable && E_DriveRel && (M_State == 0) && (M_Fault == 0 )){_BitClear (PE1_Output, A_ConvRel);_BitSet (OptOutpIPOS, A_CupExtendSol);_BitClear(OptOutpIPOS, A_CupRetractSol);M_State = 1 ;M_Stacking = 1 ;M_Loading = 0 ;}if (E_LoadCycleStart && !E_Stop_Cycle && E_Touchp_1 && E_DriveEnable && E_DriveRel&& (M_State == 0) && (M_Fault == 0 )){_BitClear (PE1_Output, A_ConvRel);M_State = 1 ;M_Stacking = 0 ;M_Loading = 1 ;}if (E_Stop_Cycle){M_State = 0 ;M_Fault = 0 ;_AxisStop( AS_RSTOP );_TouchProbe( TP_DIS1 );_BitClear (PE1_Output, A_ArmReferencePos);_BitClear (PE1_Output, A_ArmProbePos);_BitClear (OptOutpIPOS, A_CupExtendSol);_BitClear (OptOutpIPOS, A_CupRetractSol);}switch (M_State){case 1:_SetSys( SS_ACTPOS, Pos_0 );_BitSet(H484,1);_Wait(2);ActPos_Mot = 0;TargetPos = 0;_Wait(2);_BitClear(H484,1);_TouchProbe( TP_EN1 );V_MotorRight = V_MotorLeft = Auto_Speed_0;_SetSys (SS_POSSPEED, V_MotorRight);_GoAbs (GO_NOW AIT, Position_1);M_State = 2 ;break ;case 2: //Check Drive Stopped, Start Position not Found if (StatusWord & Bit_19){( M_State = 3 );}break ;case 3: //Start Position Not Found _AxisStop( AS_RSTOP );_BitSet(PE1_Output, A_StackerFault);_TouchProbe( TP_DIS1 );M_State = 0 ;M_Fault = 1 ;break ;case 4: // Start Position Found if (!E_ReferenceRack){M_State = 5 ;}else{M_State = 8 ;}break ;case 5: // Move to Rack Reference Position V_MotorRight = V_MotorLeft = Auto_Speed_1;_SetSys (SS_POSSPEED, V_MotorRight);_GoAbs (GO_NOW AIT, Ref_Pos); // Rack Reference PositionM_State = 6 ;break ;case 6: // Release Rack Reference Motion (ge鋘dert: Stadelmeierif ((StatusWord & Bit_19) && E_CupExtendedProx) // 15.09.03){M_State = 7 ;_BitSet(PE1_Output, A_ArmReferencePos);_BitSet(PE1_Output, A_ArmProbePos);}break ;case 7:if (E_Continue_Cycle){if (!E_ReferenceRack && (M_Stacking == 1)){_BitClear (OptOutpIPOS, A_VacuumOnSol);_BitSet (OptOutpIPOS, A_VacuumOffSol);_BitSet(OptOutpIPOS, A_BlowOffSol);_Wait(500);_BitClear (PE1_Output, A_ArmReferencePos);_BitClear (PE1_Output, A_ArmProbePos);M_State = 8 ;}}else if (M_Loading == 1){_Wait(500);_BitClear (PE1_Output, A_ArmReferencePos);_BitClear (PE1_Output, A_ArmProbePos);if (!E_VacuumSwitch){M_State = 8 ;_BitSet(PE1_Output, A_VacuumFault);}else{M_State = 8 ;}}break ;case 8: // move to End Positionif (M_Stacking == 1){V_MotorRight = V_MotorLeft = Auto_Speed_4; //*******_SetSys (SS_POSSPEED, V_MotorRight);_GoAbs (GO_NOW AIT, Position_10); //End PositionM_State = 9 ;}else if (M_Loading == 1){V_MotorRight = V_MotorLeft = Auto_Speed_5; //*******_SetSys (SS_POSSPEED, V_MotorRight);_GoAbs (GO_NOW AIT, Load_Pos_0); //End PositionM_State = 9 ;}break ;case 9:if (StatusWord & Bit_19) // in Position{( M_State = 0 );}break ;}} // End AutomaticMode()/*================================================Task2 Program PositionStateMachine.Hier werden die binary Output zur R點kmeldungder Istposition gesetzt.=================================================*/ PositionStateMachine(){if (E_AutoMode && (M_State >= 5) && (M_Stacking == 1)) // Stacking Active {if ((ActPos_Mot > Position_3) && (ActPos_Mot <= Position_4)){_BitClear (OptOutpIPOS, A_VacuumOffSol); // Vac On_BitSet(OptOutpIPOS, A_VacuumOnSol);}if ((ActPos_Mot > Position_4) && (ActPos_Mot <= Position_5)){}if ((ActPos_Mot > Position_5) && (ActPos_Mot <= Position_6)){/* _BitClear (OptOutpIPOS, A_CupExtendSol); // Vac Cup Ret*//* _BitSet(OptOutpIPOS, A_CupRetractSol);*/}if ((ActPos_Mot > Position_6) && (ActPos_Mot <= Position_7)){V_MotorRight = V_MotorLeft = Auto_Speed_2; // Slow Speed_SetSys (SS_POSSPEED, V_MotorRight);if (A_CupExtendSol && (!E_VacuumSwitch)) // Check Vac Switch_BitSet(PE1_Output, A_VacuumFault);}if ((ActPos_Mot > Position_6a) && (ActPos_Mot <= Position_7)) {/* _BitClear (OptOutpIPOS, A_CupRetractSol); // Vac Cup Ext*//* _BitSet(OptOutpIPOS, A_CupExtendSol);*/_BitClear (OptOutpIPOS, A_CupExtendSol);}if ((ActPos_Mot > Position_7) && (ActPos_Mot <= Position_8)){if ((M_State >= 8)){_BitClear (OptOutpIPOS, A_VacuumOnSol); // Vac Rel_BitSet (OptOutpIPOS, A_VacuumOffSol);_BitSet (OptOutpIPOS, A_BlowOffSol);}}if ((ActPos_Mot > Position_8) && (ActPos_Mot <= Position_9)){_BitClear (OptOutpIPOS, A_VacuumOffSol); // Blow-Off Off_BitClear(OptOutpIPOS, A_CupExtendSol);V_MotorRight = V_MotorLeft = Auto_Speed_1;_SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Position_9) && (ActPos_Mot <= Position_10)){_BitClear (OptOutpIPOS, A_BlowOffSol);_BitSet (PE1_Output, A_ConvRel); // Conv Release_BitClear (OptOutpIPOS, A_CupExtendSol);_BitSet(OptOutpIPOS, A_CupRetractSol);}} // End Stacking Activeif (E_AutoMode && (M_State == 6) && (M_Loading == 1)) // Loading Active{if ((ActPos_Mot > Load_Pos_1) && (ActPos_Mot <= Load_Pos_2)){_BitClear (OptOutpIPOS, A_CupExtendSol); // Vac Cup Ret_BitSet(OptOutpIPOS, A_CupRetractSol);}if ((ActPos_Mot > Load_Pos_2) && (ActPos_Mot <= Load_Pos_3)){// V_MotorRight = V_MotorLeft = Auto_Speed_2; // Slow Speed// _SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Load_Pos_3) && (ActPos_Mot <= Load_Pos_4)){_BitClear(OptOutpIPOS, A_CupRetractSol);_BitSet (OptOutpIPOS, A_CupExtendSol); // Vac Cup Ext_BitClear (OptOutpIPOS, A_VacuumOffSol); // Vac On_BitSet(OptOutpIPOS, A_VacuumOnSol);}} // End Loading Up Activeif (E_AutoMode && (M_State == 9) && (M_Loading == 1)) // Loading Down{if ((ActPos_Mot > Load_Pos_6) && (ActPos_Mot <= Load_Pos_5)){_BitClear(OptOutpIPOS, A_CupExtendSol);_BitSet (OptOutpIPOS, A_CupRetractSol); // Vac Cup RetV_MotorRight = V_MotorLeft = Auto_Speed_6; // Low Speed_SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Load_Pos_6a) && (ActPos_Mot <= Load_Pos_6)){V_MotorRight = V_MotorLeft = Auto_Speed_2; // Med Speed*******************************_SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Load_Pos_7) && (ActPos_Mot <= Load_Pos_6a)){V_MotorRight = V_MotorLeft = Auto_Speed_4; // Hi Speed *******************************_SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Load_Pos_8) && (ActPos_Mot <= Load_Pos_7)){V_MotorRight = V_MotorLeft = Auto_Speed_4; // Hi Speed_SetSys (SS_POSSPEED, V_MotorRight);_BitClear(OptOutpIPOS, A_CupRetractSol);_BitSet (OptOutpIPOS, A_CupExtendSol); // Vac Cup Ext}if ((ActPos_Mot > Load_Pos_9) && (ActPos_Mot <= Load_Pos_8)){V_MotorRight = V_MotorLeft = Auto_Speed_2; // Slow Speed_SetSys (SS_POSSPEED, V_MotorRight);}if ((ActPos_Mot > Load_Pos_10) && (ActPos_Mot <= Load_Pos_9)){_BitClear (OptOutpIPOS, A_VacuumOnSol); // Vac Rel_BitSet (OptOutpIPOS, A_VacuumOffSol);_BitSet(OptOutpIPOS, A_BlowOffSol);}if ((ActPos_Mot <= Load_Pos_10)){_BitClear (OptOutpIPOS, A_VacuumOffSol); // Blow Off Off_BitClear(OptOutpIPOS, A_CupExtendSol);_BitClear (OptOutpIPOS, A_BlowOffSol);_BitSet(OptOutpIPOS, A_CupRetractSol);_BitSet (PE1_Output, A_ConvRel); // Conv Rel}} // End Loading Activeif ( E_Touchp_1 ) // Arm Down Signal {_BitSet (PE1_Output, A_StackerArmDown);_BitClear(PE1_Output, A_VacuumFault); // Reset Vacuum Fault}else{_BitClear (PE1_Output, A_StackerArmDown);}if ( E_CupExtendedProx ) // Cup Extended Signal {_BitSet (PE1_Output, A_CupExtendSwitch);}else{_BitClear (PE1_Output, A_CupExtendSwitch);}//Signal VacuumCups retract Switch => SPSif ( E_CupRetractedProx ){_BitSet(PE1_Output, A_CupRetractSwitch);}else{_BitClear(PE1_Output, A_CupRetractSwitch);}if ( E_VacuumSwitch ) // Vacuum Confirm Signal {_BitSet (PE1_Output, A_VacuumConfirm);}else{_BitClear (PE1_Output, A_VacuumConfirm);}Cycling ();} // End PositionStateMachine()/*=============================================Main Program (IPOS-Eintrittsfunktion)===============================================*/main(){/*-------------------------------------Initialization--------------------------------------*/Initialize();_SetInterrupt( SI_TOUCHP1, Interrupt);_SetTask2(T2_START, PositionStateMachine);/*-------------------------------------Main Program--------------------------------------*/while(1){_GetSys (Bustyp, GS_PODATA); //PA-Data from Field Bus in Var.H102-H104if (!E_AutoMode){M_Fault = 0;M_State = 0;_BitClear (PE1_Output, A_StackerFault);_BitClear (PE1_Output, A_ArmReferencePos);_BitClear (PE1_Output, A_ArmProbePos);_TouchProbe( TP_DIS1 );ManualMode();}if (E_AutoMode){AutomaticMode();}if (E_AutoMode && !E_Stop_Cycle && !E_V acuumSwitch && (M_State == 0) && (M_Fault == 0 )){/* _BitClear (OptOutpIPOS, A_CupExtendSol);_BitSet(OptOutpIPOS, A_CupRetractSol);*/}_SetSys (SS_PIDA TA, Le_PE_DA TA); //Variablen H111-113 as PE-Data back to Fieldbus}}。
伺服电机控制程序讲解
伺服电机控制程序讲解(原创版)目录1.伺服电机控制程序概述2.伺服电机控制程序的构成3.伺服电机控制程序的工作原理4.伺服电机控制程序的应用实例5.伺服电机控制程序的未来发展趋势正文【伺服电机控制程序概述】伺服电机是一种将电脉冲转换为角位移的电机,它可以通过控制脉冲的数量和频率来精确地控制旋转速度和位置。
伺服电机控制程序则是指用于控制伺服电机的计算机程序,通常由上位机或嵌入式系统执行。
本文将详细讲解伺服电机控制程序的原理和应用,并探讨其未来发展趋势。
【伺服电机控制程序的构成】一个典型的伺服电机控制程序主要包括以下几个部分:1.控制算法:根据给定的指令和实际反馈信号,计算出需要发送给伺服电机的脉冲数量和频率。
2.脉冲发生器:将控制算法计算出的脉冲数量和频率转换为实际的脉冲信号,以便驱动伺服电机。
3.通信接口:将脉冲信号发送给伺服电机的驱动器,并从驱动器接收反馈信号,如转速和位置等。
4.错误处理:对通信异常、电机故障等情况进行检测和处理,确保控制系统的稳定性和可靠性。
【伺服电机控制程序的工作原理】伺服电机控制程序的工作原理可以概括为以下几个步骤:1.接收指令:程序接收来自上位机或其他设备的指令,包括目标位置、速度等信息。
2.计算脉冲:根据指令和实时反馈信号,控制算法计算出需要发送给伺服电机的脉冲数量和频率。
3.发送脉冲:将计算出的脉冲数量和频率转换为实际的脉冲信号,并通过通信接口发送给伺服电机的驱动器。
4.反馈控制:根据伺服电机的实时反馈信号(如转速、位置等),对脉冲信号进行调整,以实现精确的控制。
5.错误处理:对通信异常、电机故障等情况进行检测和处理,确保控制系统的稳定性和可靠性。
【伺服电机控制程序的应用实例】伺服电机控制程序广泛应用于各种工业自动化设备和机器人系统中,如数控机床、自动化生产线、机器人手臂等。
例如,在数控机床中,伺服电机控制程序可以精确地控制刀具的移动速度和位置,实现高精度的加工。
昆仑通态控制伺服电机程序
昆仑通态控制伺服电机程序
昆仑通态控制伺服电机程序是一种用于控制伺服电机的程序,它通过昆仑通态控制技术实现对电机的精确控制。
在这个程序中,我们可以利用昆仑通态控制算法来实现电机的位置、速度和力矩控制。
我们需要明确伺服电机的控制目标。
对于位置控制,我们希望电机能够按照预设的位置进行准确定位。
这需要通过编写程序来计算电机的位置误差,并将其转化为控制信号送给电机驱动器,以调整电机的转动角度。
对于速度控制,我们希望电机能够按照预设的速度进行运动。
这需要通过编写程序来测量电机的转速,并与预设速度进行比较,从而产生相应的控制信号,使电机的转速达到预期值。
对于力矩控制,我们希望电机能够按照预设的力矩进行工作。
这需要通过编写程序来测量电机的输出力矩,并与预设力矩进行比较,从而产生相应的控制信号,使电机的输出力矩达到预期值。
在编写昆仑通态控制伺服电机程序时,我们需要考虑以下几个方面。
首先,要根据具体的控制要求选择合适的控制算法,例如PID控制算法。
其次,要考虑信号的采样频率,以确保控制的实时性和稳定性。
同时,还需要考虑控制信号的传递方式,可以通过模拟信号或数字信号传递给电机驱动器。
为了提高控制的精度和稳定性,还可以加入一些补偿算法,例如前
馈控制和自适应控制。
昆仑通态控制伺服电机程序是一种实现对伺服电机精确控制的重要工具。
通过合理编写程序,我们可以实现电机的位置、速度和力矩控制,从而满足不同应用场景下的控制需求。
乐高马达伺服电机编程
乐高马达伺服电机编程
乐高马达伺服电机编程可以使用乐高EV3软件或者其他编程软件来完成。
以下是使用乐高EV3软件来编程的步骤:
1. 首先,连接乐高EV3主机和乐高马达伺服电机。
2. 打开乐高EV3软件,并创建一个新的项目。
3. 在程序编辑器中,选择电机块(Motor block),将其拖放到程序区域中。
4. 选择要控制的电机,例如A、B、C或D,并选择所需的控制模式(例如正向、反向、停止等)。
5. 添加其他的程序块来完成所需的功能。
例如,可以添加传感器块,使马达根据传感器的反馈进行控制。
6. 调整每个电机块的参数,例如速度、转向角度等,以满足具体需求。
7. 最后,下载程序到乐高EV3主机上,可以通过蓝牙或USB 线连接进行下载。
8. 运行程序,观察乐高马达伺服电机的动作。
除了使用乐高EV3软件,还可以使用其他编程软件,例如Python等来编程控制乐高马达伺服电机。
具体编程方法和步骤可能会有所不同,需要根据具体的编程环境进行调整。
23STM32控制伺服电机运动程序设计
23STM32控制伺服电机运动程序设计为了实现对伺服电机的运动控制,首先需要确认伺服电机的工作原理和接口,一般伺服电机的控制信号分为脉冲信号、方向信号和使能信号。
接下来,我们将详细介绍如何使用STM32控制伺服电机的程序设计。
步骤1:准备工作
首先,需要准备以下硬件和软件:
1.一台装有STM32单片机的开发板;
2.一个支持伺服电机的驱动模块;
3.一个伺服电机;
4. STM32CubeMX软件,用于生成基本的代码框架;
5. Keil MDK集成开发环境,用于编写和调试代码。
步骤2:设置GPIO引脚
在STM32CubeMX软件中,选择适当的GPIO引脚作为控制伺服电机的信号线。
一般选择一个输出引脚作为脉冲信号,一个输出引脚作为方向信号,以及一个输出引脚作为使能信号。
根据伺服电机的要求,设置引脚的输出模式和初始值。
步骤3:配置定时器
伺服电机一般需要一个精确的脉冲信号来控制其运动,因此我们需要配置STM32的定时器来生成精确的脉冲信号。
在STM32CubeMX软件中,配置一个定时器,并设置其工作模式和脉冲信号的周期和占空比。
步骤4:编写控制代码
在Keil MDK中编写控制代码。
首先需要初始化GPIO引脚和定时器,然后编写控制函数来生成脉冲信号、方向信号和使能信号。
控制函数根据需求来控制伺服电机的运动方向和速度,可以通过调整脉冲信号的周期和占空比来控制电机的转速。
步骤5:调试和优化
总结:。
伺服电机控制程序讲解
伺服电机控制程序讲解摘要:1.伺服电机的概念和原理2.伺服电机控制程序的作用3.伺服电机控制程序的分类4.常见伺服电机控制程序的原理及应用5.伺服电机控制程序的发展趋势正文:伺服电机是一种可以精确控制转速和转矩的电机,其转速和转矩由输入信号控制。
伺服电机广泛应用于各种自动化设备中,如数控机床、机器人、自动化生产线等。
伺服电机控制程序是控制伺服电机运行的核心部分,它可以实现对伺服电机的精确控制,保证设备的稳定性和精度。
一、伺服电机的概念和原理伺服电机是一种闭环控制系统,其工作原理是:通过比较电机的实际转速和目标转速的差值,然后根据这个差值来调整电机的工作状态,从而使电机的转速和转矩达到预定的目标值。
二、伺服电机控制程序的作用伺服电机控制程序的主要作用是控制伺服电机的转速和转矩,使其达到预定的目标值。
它通过接收外部输入信号,然后根据预设的控制算法,生成相应的控制指令,从而控制伺服电机的运行。
三、伺服电机控制程序的分类根据控制方法的不同,伺服电机控制程序可以分为PID 控制、模糊控制、神经网络控制等。
1.PID 控制:PID 控制器是一种线性控制器,其结构简单,参数调节方便,因此在实际应用中得到广泛应用。
2.模糊控制:模糊控制器是一种非线性控制器,其可以根据实际情况进行智能化调整,因此在处理非线性、时变、不确定性系统中具有较好的性能。
3.神经网络控制:神经网络控制器是一种智能控制器,其可以通过学习自适应调整控制参数,因此在处理复杂的非线性系统中具有较好的性能。
四、常见伺服电机控制程序的原理及应用1.PID 控制:PID 控制器通过比例、积分、微分三个环节的组合,可以实现对系统的精确控制。
在伺服电机控制中,PID 控制器可以根据目标转速和转矩值,以及电机的实际转速和转矩值,生成相应的控制指令,从而实现对伺服电机的精确控制。
2.模糊控制:模糊控制器通过将连续的输入值转换为模糊集合,然后根据模糊规则进行推理,最后生成相应的控制指令。
三菱伺服电机FX系列两轴定位程序
D160 是Y轴定位 距离
D260 A/S A/S D160 A/S B/D D270 A/S A/S D170 A/S B/D M0 A/S B/D M40 B/D B/D M5 A/S B/D
342 456 342 355 456 355 58 369 369
DMUL
D270 K100 脉冲频率 Y
20
DMOV
K30000
D8353 Y1最高速 度低位
D8353 B/D B/D
25
MOV
K500
D8352 Y1基底
D8352 B/D B/D
34
MOV
K200
D8358 Y1加速时 间
D8358 B/D B/D
39
MOV
K200
D8359 Y1减速时 间
D8359 B/D B/D
44
M8000 49
481
* <D8350是Y轴行走距离 M8000 490
DMOV 自动接通 运行
D8350
D120 是Y轴定位 距离
D8350 A/S 491 A/S D120 A/S 402 B/D 288 D8340 A/S 481 A/S D110 A/S 382 B/D 274 D8350 A/S 491 A/S D130 A/S 402 B/D 301 D8340 A/S 481 A/S D400 B/D 521 B/D D8340 A/S 481 A/S D402 B/D 534 B/D
M8029
RST 定位完成 接通M802
M21 启动回零 Y
243 259
M8000 260
DMUL 自动接通 运行
D200 K100 定位长度 X
松下PLC控制伺服电机实例程序
~
必000置素突 情000置素突
~
~
~~
~
~~
~
~
~
~
~
~~
~
~~
~~
~
~
~
~
~
~~
~
~~
~~
必00 慢00
~
突肯突源~慢00W
~
情000置素突
~
~~
~~
~
~
~
管肯磁
(肯源突肯置~突精脱精置
~
~
~
始
始
密~
始
(
噪始
必0 密~
始
密~
始
始
始
始
密
度0 機
始 型
始 7
始 ~ ~
~
~~
~~
~
必拉00
~
情措0°山度0000機0密0情措°
度操
~
必度操機度情度0操必
情措0°山度情度0操必機显密旋显 ~
度密旋°
度山措拉拉 ~
~~
~
~~
~
~
~
~
~
~~
~~
~
~
环环脱
~
~~
~
~~
~~
~
6
情00 措00置素突
~
长ttp果山山www密f釐高釐高密那o骤~ ~~
~ ~
~
5
~
~~
~
~
~
~
~
~
~~
~
~~
~~
情密措° 度密旋°
~
0密操必~° 0密情措°
欧姆龙PLC控制伺服电机单轴运动程序
4.相对坐标
W5.02 MOVL
(498)
[OP1] [OP2]
D100 D24
分层预压设定 压制高度低位 伺服定位-脉冲 输出设定量低 位
<cD00024>
c46
000010 (000040) W5.02 20.10 PLS2
(887)
#0 #0010 D20 D26
[OP1] [OP2] [OP3]
[OP1] [OP2] [OP3] <cD00015>
c17 c20 <15.02> a32
SET 15.02 000008 (000032) 15.02 14.10 SPED
(885)
伺服下降 按钮
I:1.01
#0 #0010 #0
[OP1] [OP2] [OP3]
<15.02> a32
RSET 15.02 000009 (000038)
伺服定位-加速 比率
<cD00020>
c10 c50
[OP4]
伺服定位-启动 频率低位
<cD00026>
c14 c50
A280.03 20.10
<20.10> b41
000011 (000045)
5.绝对坐标(相对于原点坐标的位置)
W1.03 MOV
(021)
D102 D24
[OP1] [OP2]
伺服定位-脉冲 输出设定量低 位
伺服定位-启动 频率低位
<cD00026>
c42 c50
MOV
(021)
#0 D27
[OP1] [OP2]
伺服定位-启动 频率高位
arduino uno r3 控制工业伺服电机程序
} }
if (d2==1)//中断后进入此程序,也就是碰到零点开关后。 {
delay(dy); digitalWrite(0,LOW); digitalWrite(1,HIGH); digitalWrite(DIR_1,HIGH);
while (d0>0) {
digitalWrite(PUL_1,HIGH); delayMicroseconds(t1); digitalWrite(PUL_1,LOW); delayMicroseconds(t1); d0--; } delay(dy); digitalWrite(1,LOW); digitalWrite(0,HIGH); digitalWrite(DIR_1,LOW); while (d1>0) { digitalWrite(PUL_1,HIGH); delayMicroseconds(t1); digitalWrite(PUL_1,LOW); delayMicroseconds(t1); d1--; } d0=30000;//数值重装 d1=30000; //数值重装 } }
void loop() {
if (d2==0) { delay(dy); digitalWrite(DIR_1,LOW); while (d2==0)
51单片机驱动伺服电机程序
51单片机驱动伺服电机程序51单片机除了几款加强版的带pwm,很多都不带,所以要用51控制伺服电机很多时候就要软件模拟pwm。
看了些代码有的是通过延时来输出pwm波,有的也用了定时器但是那些代码要驱动多路伺服电路就显得比较麻烦。
下面的代码是通过定时器0产生每0.5ms一次的提醒,程序在大循环中通过调用DJ()函数可以返还值给伺服电机信号引脚,DJ()函数可以定旋转的角度,但是因为定时器设置是0.5ms的中断这就决定了旋转呢角度只能是-45,-90,0,45,90。
如果要提高精度就要通过设置定时器的初值,改变函数的num值来达成。
#include"reg52.h"unsigned int num=0;//舵机sbit DJ1=P3^6;sbit DJ2=P3^7;/*引脚定义*/int DJ(int a);//函数声明timerinit()//定时器中断初始化{TMOD=0x01;//设置定时器0为工作方式1EA=1;//开总中断ET0=1;//定时器0中断允许TH0 = (65536-500)/256;//初值使得定时器0.5毫秒溢出TL0 = (65536-500)%256;TR0=0;}main(){timerinit();while(1){}}timer() interrupt 0//0.5ms发生一次中断,20ms后定时器置0重新计数{num++;DJ1=DJ(3);DJ2=DJ(3);if(num>;=40){num=0;TH0 = (65536-500)/256;//初值使得定时器0.5毫秒溢出TL0 = (65536-500)%256;return;}}int DJ(char a)//当a=3舵机所在的位置是0度a=2 a=1分别对应的位置是-45 -90度a=4 a=5对应位置为45 90度{if(num>;=a||num>;=5)return 0;if(num>;=1)return 1;}时间仓促还没有测试程序的可行性(通常是没有问题呢,呵呵),等有时间的话会继续完善程序加上可以控制舵机旋转速度的功能。
松下PLC控制伺服电机实例程序
松下PLC控制伺服电机实例程序上位机设定伺服电机旋转速度单位为(转/分),伺服电机设定为1000个脉冲转一圈.PLC输出脉冲频率=(速度设定值/6)*100(HZ)。
上位机设定伺服电机行走长度单位为(0.1mm),伺服电机每转一圈的行走长度10mm,伺服电机转一圈需要的脉冲数为1000,故PLC发出一个脉冲的行走长度为0.01mm(一个丝)。
PLC输出脉冲数=长度设定值*10。
上面两点的计算都是在伺服电机参数设定完的基础上得出的。
也就是说,在计算PLC发出脉冲频率与脉冲前,必须先根据机械条件,综合考虑精度与速度要求设定好伺服电机的电子齿轮比!大致方法如下:机械安装结束,伺服电机转动一圈的行走长度已经固定(如上面所说的10mm),设计要求的行走精度为0.1mm(10个丝)。
为了保证此精度,一般情况下是让一个脉冲的行走长度低于0.1mm,如设定一个脉冲的行走长度为如上所述的0.01mm,于是电机转一圈所需要脉冲数即为1000个脉冲。
此种设定当电机速度要求为1200转/分时,PLC应该发出的脉冲频率为20K。
松下PLC的CPU本体可以发脉冲频率为100K,完全可以满足要求。
如果电机转动一圈为100mm,设定一个脉冲行走仍然是0.01mm,电机转一圈所需要脉冲数即为10000个脉冲,电机速度为1200转时所需要脉冲频率就是200K。
PLC的CPU本体就不够了。
需要加大成本,如增加脉冲输出专用模块等方式。
知道了频率与脉冲数的算法就简单了,只需应用PLC的相应脉冲指令发出脉冲即可,松下PLC的程序图如下:松下伺服常见问题一、基本接线主电源输入采用~220V,从L1、L3接入(实际使用应参照操作手册);控制电源输入r、t也可直接接~220V;电机接线见操作手册第22、23页,编码器接线见操作手册第24~26页,切勿接错。
二、试机步骤1.JOG试机功能仅按基本接线就可试机;在数码显示为初始状态‘r0’下,按‘SET’键,然后连续按‘MODE’键直至数码显示为‘AF-AcL’,然后按上、下键至‘AF-JoG’;按‘SET’键,显示‘JoG-’:按住‘^’键直至显示‘rEAdy’;按住‘<’键直至显示‘SrV-on’;按住‘^’键电机反时针旋转,按‘V’电机顺时针旋转,其转速可由参数Pr57设定。
PLC如何控制伺服电机
PLC如何控制伺服电机PLC(可编程逻辑控制器)是一种用于控制工业设备和机器的计算机系统。
伺服电机是一种精密控制设备,可以通过PLC进行控制以实现精确的位置和速度控制。
本文将探讨PLC如何控制伺服电机的工作原理和步骤。
伺服电机是一种能够根据外部反馈信号来调整输出位置或速度的电动机。
它包括电动机、编码器和控制器三部分。
编码器用于检测电动机的位置和速度,并将反馈信号发送给控制器,控制器根据反馈信号来调整电动机的输出。
PLC可以通过与伺服电机的控制器进行通信,并发送指令来控制伺服电机的运动。
下面将详细介绍PLC如何控制伺服电机的步骤:1.配置PLC和伺服电机的通信:首先需要在PLC上配置与伺服电机相关的通信参数。
这些参数包括通信速率、通信地址等。
根据伺服电机的型号和规格,设置正确的通信参数。
2.编写PLC程序:PLC程序是用于控制伺服电机的指令序列。
根据具体的应用需求,编写PLC程序来实现伺服电机的运动控制。
PLC程序可以使用编程软件(如梯形图、函数图等)来编写。
4.接收反馈信号:伺服电机运动过程中,编码器将不断发送反馈信号给控制器。
PLC将接收并处理这些反馈信号,以调整伺服电机的输出。
5.调整参数:根据反馈信号,PLC可以根据需要调整伺服电机的工作参数。
例如,可以通过调整电流、速度和位置参数来实现精确的运动控制。
6.监控伺服电机状态:PLC可以通过监测伺服电机的状态来确保其正常工作。
如果发现故障或异常,PLC可以进行相应的报警和处理。
总结起来,PLC通过与伺服电机控制器的通信,发送指令并接收反馈信号来控制伺服电机的运动。
通过调整参数和监控状态,PLC可以实现对伺服电机的精确控制。
这种控制方式在工业自动化领域得到广泛应用,可以实现高效、精确的运动控制。
用PLC控制伺服电机控制的程序
用PLC控制伺服电机控制的程序
伺服电机和步进电机控制方法区别不大,看你怎么用,你要是开环使用,步进和伺服是一样的;
1 简单的用法就是一边输出脉冲,一边读反馈回来的反映运转情况的脉冲(或模拟信号),根据这个脉冲调整输出脉冲。
这种用法用PLC的高速计数器就行。
2 还可以通过AD输出模拟信号,然后读反馈回来的反映运转情况的脉冲(或模拟信号),这种方法一般用在单片机控制伺服电机中,比较灵活,可以脉冲和模拟信号混合使用;
3第三种方法,是PLC和伺服电机比较正规的接法,就是用PLC的运动控制模块,这种模块在PLC的手册里都能查到,你查一下就知道。
这里有很专业的位置控制方法,包括升降速梯度,JOG,零点,极限位置保护等。
伺服电机报警复位程序
伺服电机报警处理程序
1.正常情况下断电复位。
若不行则:
2.检查伺服电机相间绝缘,相对地绝缘,刹车电阻阻值,接线。
如果正常,则:
3.连接笔记本电脑,启动VD4.2软件,检查报警说明。
4.此时若连接成功,则先复位,按Reset按钮,若不成功,则下载.par 文件。
点击File 菜单,在下拉菜单中再点击Load Parameters:
5.在弹出的对话框中相应的文件夹下选择相应的.par文件(par 15.3 lijn 6):
6.点击Open后显示如下,表示参数已装载:7.点击OK后,画面如下:
8.装载成功后,把文件存储到EEPROM中:点击File,在下拉菜单中点击Store Parameter to EEPROM:
9.等待存储过程,屏幕会提示进展指示条,等待进展结束后,选择OK。
此时再按Reset按钮,报警应该可以消除。
10.若要下载.seq文件,则选择Utilities,在下拉菜单中点击Sequence Setup选项(或者直接按第5个快捷按钮):
11. 弹出如下界面:
12.选择并点击File 菜单下的Load Sequence from Disk:
13.出现如下界面:
14.在相应的文件夹下选择相应的.seq文件,然后点击Open:
15. 点击Transfer, 在下拉菜单下点击Send Sequences to Drive. 16: 在提示框内选择Yes:
17. 等待提示进程结束后,退出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PLC触摸屏控制伺服电机程序设计
伺服电机又称执行电机,它是控制电机的一种。
它是一种用电脉冲信号进行控制的,并将脉冲信号转变成相应的角位移或直线位移和角速度的执行元件。
根据控制对象的不同,由伺服电机组成的伺服系统一般有三种基本控制方式,即位置控制、速度控制、力矩控制。
本系统我们采用位置控制。
1控制系统中元件的选型
PLC
三菱公司的FX3U晶体管输出的PLC可以进行6点同时100 kHz 高速计数及3轴独立100 kHz的定位功能,并且可以通过基本指令0.065 μs、PCMIX值实现了以4.5倍的高速度,完全满足了我们控制伺服电机的要求,我们选用FX3U-48MT的PLC。
伺服电机
在选择伺服电机和驱动器时,只需要知道电机驱动负载的转距要求及安装方式即可,我们选择额定转距为2.4 N·m,额定转速为3 000 r/min,每转为131072 p/rev分辨率的三菱公司
HF-KE73W1-S100伺服电机,与之配套使用的驱动器我们选用MR-E-70A-KH003伺服驱动器。
三菱的此款伺服系统具有500 Hz
的高响应性,高精度定位,高水平的自动调节,能轻易实现增益设置,且采用自适应振动抑止控制,有位置、速度和转距三种控制功能,完全满足要求。
同时我们采用三菱GT1155-QFBD-C型触摸屏,对伺服电机进行自动操作控制。
2 PLC控制系统设计
我们需要伺服电机实现正点、反点、原点回归和自动调节等动作,另外为确保本系统的精确性我们增加编码器对伺服电机进行闭环控制。
PLC控制系统I/O接线图如图1。
图1 I/O接线图
上图中的公共端的电源不能直接接在输入端的24 V电源上。
根据控制要求设计了PLC控制系统梯形图如图2。
图2 梯形图
M806控制伺服急停,M801控制伺服电机原点回归,M802控制伺服正点,M803控制伺服反点,M804为自动调节,M805为压力校正即编码器的补偿输入。
在电机运行前需要首先进行原点回归,以确保系统的准确性和稳定性,当M50和M53同时接通时,伺服电机以2 kHz的速度从Y0输出脉冲,开始做原点回归动作,当碰到近点信号M30=ON时,变成寸动速度1 kHz,从Y0输出脉冲直到M30=OFF后停止。
M30是在自动调节时,电机转动的角度与零点相等时为ON。
电机在进行正反点时,我们采用FX3U具有的专用表格定位指令DTBL S1 S2;在使用表格定位之前,我们首先要在梯形图左边的PLC parameter(PLC参数)中进行定位设定。
正反点控制我们采用指令DRVA S1 S2 D1 D2绝对定位指令。
在自动运行时,我们利用PLC内强大的浮点运算指令,根据系统的多方面参数进行计算;在操作时,我们只需要在触摸屏上设定参数,伺服电机便根据程序里的运算公式转化成为脉冲信号输出到驱动器,驱动器给电机信号运转。
在伺服电机运行的过程中为确保电机能达到我们需要的精度,我们采用增量式编码器与伺服电机形成闭环控制,我们把计算到的角度与编码器实际测量角度进行比较,根据结果调整伺服电机的脉冲输
出,从而实现高精度定位。
整个程序我们采用步进指令控制(也可以采用一般指令控制),简单方便。
3 伺服系统设置
3.1伺服驱动器的接线
伺服系统的接线很简单,我们只需要按照规定接入相对应的插头即可。
将三相电源线L1,L2,L3插头接入CPN1,将伺服电机插头接入CN2,将编码器插头接入CNP2,控制线插头接入CN1。
我们在调试程序时需要用伺服电机的专用软件,通过RS422接口接到伺服系统的CN3上即可。
对于CN1控制线接法如表1。
表1控制线接法
名称 VIN OPC RES EMG ALM SG PP NP 12389132325
引脚
号
接线 110110Y2Y1600Y0Y3
3.2伺服驱动器的参数设定
系统采用定位控制。
三菱MR-E系列的伺服驱动器,主要有两组参数,一组为基本参数,另一组为扩展参数,根据本系统要求,我
们主要设定基本参数,主要有
NO.0,NO.1,NO.2,NO.3,NO.4,NO.5,NO.7,NO.18,NO.19,扩展参数要根据具体情况进行设定。
同时我们也可以通过伺服设置软件SETUP221E进行参数设置。
我们在伺服电机进行调试过程中建议先设为速度模式,进行伺服电机的点动测试。
4 触摸屏程序设计
建立初始画面,在画面上分别设置按钮开关,在开关上分别写上,压力+、压力-、原点回归、自动调节、压力校正、伺服急停等字样,其中继电器的对应情况如上所写。
控制画面如图3和图4。
图3画面设置
图4参数显示
本系统同时还设置有手动调节功能,确保在自动调节出现问题时及时补救。
触摸屏上我们设置了指示灯,可显示此时的工作状态。
同时我们在手动和自动指示灯的中间部分,设置了脉冲的输出指示,即伺服电机的运转指示,当有脉冲输出时,会有“脉冲输出中”的红色指示灯出现。
当无红色指示灯显示时,即表示电机有故障,此时操作者需根据伺服驱动器上显示的异常字母进行故障查询,简单方便。
5 总结
利用PLC可以直接对伺服电机进行位置和速度控制,无需增加定位模块,节约成本。
PLC的处理速度高,输出脉冲的频率也很高,而且指令也很简单,在系统联机的情况下也可方便地进行所有指令的修改工作。
本系统通过触摸屏进行调节控制,使操作简单,也减少了在运行过程中的故障查找环节,大大提高了工作效率。
系统运用一年多来,从未出现故障,稳定性好,且定位精确,为用户节约很多时间。