您好,欢迎访问泰安宏盛自动化科技有限公司!
20年专注工控自动化研发制造 系统设计\制作\安装一条龙服务
全国咨询热线:18605386049
当前位置: 首页 > 技术资料 > 程序案例

V90通过工艺对象在1200上的使用 _

作者:小编 时间:2025-07-17 11:50:02 点击:

配置CU参数

  • 打开V-Assistant,新建工程
  • 选择驱动
  • 选择电机型号
  • 选择控制模式

V90伺服定位控制方式分为两种,一种是通过工艺对象,另外一种是通过EPOS标准块:
a.如果选用工艺对象控制伺服电机,控制模式选用速度控制。报文选用标准报文3.
b.如果选用EPOS标准块控制伺服电机,控制模式选用基本定位器控制(EPOS)。报文选用报文111.

  • 设置PROFINET

注意:PN站名和IP地址要和博图组态一致。在配置完设备名称以及 IP 地址之后,必须保存参数并重启驱动来激活配置。

  • 设置参数

由于 S7-1200 轴工艺对象中已经组态了轴运行的加减速时间,所以在SINAMICS V-ASSISTANT 侧激活斜坡功能模块并将斜坡上升时间和斜坡下降时间设置为 0.0000 S

  • 设置限值:扭矩和速度参数查阅电机铭牌或手册填写。
  • 优化电机(动态调式):

动态刚度等级:这是优化V90伺服电机的动态性能参数,数值越高,电机的动态相应特性越好。但是,过高的动态响应特性会引起电机的谐振,导致整个控制系统不稳定,根据摆动的需求选择合适的范围。
电机优化的旋转角度:绝对值型编码器建议为180°,增量型编码器建议为720°
电机优化时正反转运行的最长时间:通常按照默认的2000毫秒填写即可。

配置工艺对象

  • 添加工艺对象,选择TO_PosotioningAxis
  • 常规设置,选择PROFIDrive
  • 驱动器设置,选择标准报文3

  • 设置编码器,选择PROFINET上的装置
  • 编码器选择”的步骤和驱动器设置步骤一样。
  • 填写拓展参数,丝杠一转的位移
  • 位置限制设置

如果系统有限位开关要勾选“启用硬限位开关”并且填入开关的符号地址。当限位开关感应到后,伺服电机立即停止。此时伺服读取的当前位置会发生变化,和实际数值不符,需要让电机反方向运转,离开限位开关,并断电重启。

  • 动态常规设置

加减速度的斜坡时间设置为0.1,可以时伺服电机快速启动和停止。此处是设置伺服电机的启动和停止时间。

  • 主动回原点设置

系统如果有原点开关,需要勾选“通过数字量输入使用原点开关”,并输入开关地址。
只对主动回原点参数进行设置,被动回原点采用默认。

  • 随动误差设置

当运行伺服电机提示超出范围错误时,可以通过修改“最大随动误差”和“随动误差”参数来解决错误。

  • 电机抱闸功能:
    • 对于 400 V 系列伺服驱动,电机抱闸接口(X7)集成在前面板。将其与带抱闸的伺服电机连接即可使用电机抱闸功能。
    • 对于 200 V 系列伺服驱动,没有集成单独的抱闸接口。为使用抱闸功能,需要通过控制状态接口(X8)将驱动连接至第三方设备。
    • 电机抱闸用于在伺服系统未激活(如,伺服系统断电)时,停止运动负载的非预期运动(如,在重力作用下的掉落)。伺服电机在断电后可能因为其自身重量或者受到外力而发生意外移动。
    • 带抱闸版本的伺服电机中内置了抱闸:

    以上是伺服控制器X8接口
    抱闸仅用实现于“保持”功能,即仅用于保持负载的静止状态。不得用于对运动中的负载进行制动。只能对已停止的电机使用抱闸。
    抱闸在电机断电的同时即激活。

    控制程序

    REGION 动作路径长度,最大设置不能超过18
        IF #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual > 18 THEN
            #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual := 18;    END_IF;    
    END_REGIONREGION 逻辑处理
        // 手动    #MannualStart := #In_Mode.ManualMode AND #In_MoveCondition AND #H_Collection.ButtonAndStatus.Button_Mannual;
        
        //自动    #AutoStart := #In_Mode.AutoMode AND #In_MoveCondition AND #In_MoveAutoCondition AND #InOut_MoveAuto;
        
        //Home
        #JogHome := #In_Mode.ManualMode AND #In_HomeCondition AND (#H_Collection.ButtonAndStatus.Button_Home OR #In_Mode.HomeMode);END_REGIONREGION JOG点动
        
        //硬限位激活    IF #In_HwLimitActive THEN
            //上限        IF #H_Collection.ButtonAndStatus."Button_JOG+" AND #In_Mode.ManualMode THEN
                #Velocity := #H_Collection.ButtonAndStatus.In_Value_JogVel;            IF #In_Axis.PositionLimits_HW.MaxSwitchLevel THEN
                    #"JOG+" := #H_Collection.ButtonAndStatus."Button_JOG+";            ELSE
                    #"JOG+" := FALSE;            END_IF;        ELSE
                #"JOG+" := FALSE;        END_IF;
            //下限        IF #H_Collection.ButtonAndStatus."Button_JOG-" AND #In_Mode.ManualMode THEN
                #Velocity := #H_Collection.ButtonAndStatus.In_Value_JogVel;            IF #In_Axis.PositionLimits_HW.MinSwitchLevel THEN
                    #"JOG-" := #H_Collection.ButtonAndStatus."Button_JOG-";            ELSE
                    #"JOG-" := FALSE;            END_IF;        ELSE
                #"JOG-" := FALSE;        END_IF;
            
        //软限位激活    ELSE
            //上限        IF #H_Collection.ButtonAndStatus."Button_JOG+" AND #In_Mode.ManualMode THEN
                #Velocity := #H_Collection.ButtonAndStatus.In_Value_JogVel;            IF #In_Axis.ActualPosition < #In_Axis.PositionLimits_SW.MaxPosition THEN
                    #"JOG+" := #H_Collection.ButtonAndStatus."Button_JOG+";            ELSE
                    #"JOG+" := FALSE;            END_IF;        ELSE
                #"JOG+" := FALSE;        END_IF;
            //下限        IF #H_Collection.ButtonAndStatus."Button_JOG-" AND #In_Mode.ManualMode THEN
                #Velocity := #H_Collection.ButtonAndStatus.In_Value_JogVel;            IF #In_Axis.ActualPosition > #In_Axis.PositionLimits_SW.MinPosition THEN
                    #"JOG-" := #H_Collection.ButtonAndStatus."Button_JOG-";            ELSE
                    #"JOG-" := FALSE;            END_IF;        ELSE
                #"JOG-" := FALSE;        END_IF;    END_IF;
        
        //按钮防错    IF #H_Collection.ButtonAndStatus."Button_JOG+" AND #H_Collection.ButtonAndStatus."Button_JOG-" THEN
            #H_Collection.ButtonAndStatus."Button_JOG+" := FALSE;        #H_Collection.ButtonAndStatus."Button_JOG-" := FALSE;    END_IF;END_REGIONREGION 回原点
        //1.模式0:绝对式直接回零,把当前位置直接设置为0.0,重启后恢复当前位置值
        //2.模式1:相对式直接回零:把当前位置值+Position值作为原点
        //3.模式2:被动回原点:按照工艺组态回原点,回原点后把当前位置设置为Position值
        //4.模式3:主动回原点:按照工艺组态回原点,回原点后把当前位置设置为Position值
        //5.模式7:绝对编码器值回原点:将当前位置设置为Position值,计算出绝对偏移值并保存:例:当伺服处于机械零点时,此时归位,伺服会把当前值设置为Position值(校零)
        //6.选择绝对值式伺服电机无原点开关时,回原点模式选择7。
        //7.选择增量式伺服电机有原点开关时,回原点模式选择3。END_REGIONREGION 手动移动到位    IF #MannualStart AND #Enable.Status AND NOT #Pluse[0] THEN
            IF #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual < 0 THEN
                #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual := 0;        END_IF;        
            IF #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual > 18 THEN
                #H_Collection.ButtonAndStatus.In_MoveNumber_Mannual := 18;        END_IF;        #Absolute_Pos_OK := FALSE;        #Velocity := #H_Collection.ButtonAndStatus.In_Value_AbsVel;        #AbsPos := #H_Collection.ButtonAndStatus.In_Value_AbsPosition[#H_Collection.ButtonAndStatus.In_MoveNumber_Mannual];        #MC_MoveAbsolute_Excute := #MannualStart;    END_IF;    #Pluse[0] := #MannualStart;    
        IF NOT #MannualStart AND #Pluse[1] THEN
            #MC_MoveAbsolute_Excute := FALSE;    END_IF;    #Pluse[1] := #MannualStart;        
    END_REGIONREGION 自动移动到位    IF #AutoStart AND #Enable.Status AND NOT #Pluse[2] THEN
            IF #InOut_MoveNumber_Auto < 0 THEN
                #InOut_MoveNumber_Auto := 0;        END_IF;        
            IF #InOut_MoveNumber_Auto > 18 THEN
                #InOut_MoveNumber_Auto := 18;        END_IF;        #Absolute_Pos_OK := FALSE;        #Velocity := #H_Collection.ButtonAndStatus.In_Value_AbsVel;        #AbsPos := #H_Collection.ButtonAndStatus.In_Value_AbsPosition[#InOut_MoveNumber_Auto];        #MC_MoveAbsolute_Excute := #InOut_MoveAuto;    END_IF;    #Pluse[2] := #AutoStart;    
        IF NOT #AutoStart AND #Pluse[3] THEN
            #MC_MoveAbsolute_Excute := FALSE;    END_IF;    #Pluse[3] := #MannualStart;    
    END_REGIONREGION 运行中    
        #Running := #Absolute.Busy OR #Home.Busy OR #JOG.Busy;    
    END_REGIONREGION 绝对定位到位    #Timer1(IN:= ABS_REAL(#In_Axis.ActualPosition-#AbsPos)<10 AND (NOT #Absolute_Pos_OK) AND (NOT #Absolute.Busy),            PT:=T#500MS);    IF #Timer1.Q THEN
            #Absolute_Pos_OK := TRUE;    ELSIF #Running THEN
            #Absolute_Pos_OK := FALSE;    END_IF;    
    END_REGIONREGION 初始化
        //初始化    IF #In_Mode.ManualMode AND NOT #Pluse[4] THEN
            #InOut_MoveAuto := FALSE;        #Absolute_Pos_OK := FALSE;    END_IF;    #Pluse[4] := #In_Mode.ManualMode;END_REGIONREGION 示教模式
        
        //处理示教点信号    IF #H_Collection.ButtonAndStatus.In_TeachNumber < 0 THEN
            #H_Collection.ButtonAndStatus.In_TeachNumber := 0;    ELSIF
            #H_Collection.ButtonAndStatus.In_TeachNumber > 18 THEN
            #H_Collection.ButtonAndStatus.In_TeachNumber := 18;    END_IF;
        //开始示教    IF #In_Mode.ManualMode AND NOT #Running AND
            #Enable.Status AND #H_Collection.ButtonAndStatus.Button_Teach AND (NOT #Pluse[5])    THEN
            #H_Collection.ButtonAndStatus.In_Value_AbsPosition[#H_Collection.ButtonAndStatus.In_TeachNumber] := #In_Axis.ActualPosition;    END_IF;    #Pluse[5] := #H_Collection.ButtonAndStatus.Button_Teach;    
    END_REGIONREGION 轴控制
        // Statement section REGION
        //**************************轴使能****************************    #MC_Power_Instance(Axis := #In_Axis,                       Enable := #In_Enable,                       StartMode := #In_MC_Power_StartMode,                       StopMode := #In_MC_Power_StopMode,                       Status => #Enable.Status,                       Busy => #Enable.Busy,                       Error => #Enable.Error,                       ErrorID => #Enable.ErrorID,                       ErrorInfo => #Enable.ErrorInfo);
        
        //***************************轴复位****************************    #MC_Reset_Instance(Axis := #In_Axis,                       Execute := #In_Mode.Reset,                       Restart := #In_MC_Reset_Restart,                       Done => #Reset.Done,                       Busy => #Reset.Busy,                       Error => #Reset.Error,                       ErrorID => #Reset.ErrorID,                       ErrorInfo => #Reset.ErrorInfo);
        
        //*****************************轴原点**************************    #MC_Home_Instance(Axis := #In_Axis,                      Execute := #JogHome,                      Position := #In_MC_Home_Position,                      Mode := #In_MC_Home_Mode,                      Done => #Home.Done,                      Busy =>#Home.Busy,                      CommandAborted => #Home.CommandAborted,                      Error => #Home.Error,                      ErrorID => #Home.ErrorID,                      ErrorInfo => #Home.ErrorInfo,                      ReferenceMarkPosition => #Home.ReferenceMarkPosition);
        
    
        
        //*****************************轴JOG*******************************    #MC_MoveJog_Instance(Axis := #In_Axis,                         JogForward := #"JOG+",                         JogBackward := #"JOG-",                         Velocity := #Velocity,                         PositionControlled := #In_MC_MoveJog_PositionControlled,                         InVelocity => #JOG.inVelocity,                         Busy => #JOG.Busy,                         CommandAborted => #JOG.CommandAborted,                         Error => #JOG.Error,                         ErrorID => #JOG.ErrorID,                         ErrorInfo => #JOG.ErrorInfo);
        
        //***************************轴绝对定位***************************    #MC_MoveAbsolute_Instance(Axis := #In_Axis,                              Execute := #MC_MoveAbsolute_Excute,                              Position :=#AbsPos,                              Velocity := #Velocity,                              Direction := #In_MC_MoveAbsolute_Direction,                              Done => #Absolute.Done,                              Busy =>#Absolute.Busy,                              CommandAborted => #Absolute.CommandAborted,                              Error => #Absolute.Error,                              ErrorID => #Absolute.ErrorID,                              ErrorInfo => #Absolute.ErrorInfo);
        
        //***************************暂停轴***********************************    #Auto_TRIAG(CLK:=#In_Mode.AutoMode);    
        #Mannual_TRIG(CLK:=#In_Mode.ManualMode);    
        #MC_Halt_Instance(Axis := #In_Axis,                      Execute := (#In_Enable OR #Auto_TRIAG.Q OR #Mannual_TRIG.Q),                      Done => #Halt.Done,                      Busy => #Halt.Busy,                      CommandAborted => #Halt.CommandAborted,                      Error => #Halt.Error,                      ErrorID => #Halt.ErrorID,                      ErrorInfo => #Halt.ErrorInfo);    
    END_REGION//*****************************反馈输出*******************************REGION 输出    #Out_ActualVelocity := #In_Axis.ActualVelocity;    #Out_ActualPosition := #In_Axis.ActualPosition;    #Out_Running := #Running;    #Out_Abs_PosOK := #Absolute_Pos_OK;    #Out_Enabled := #Enable.Status;    #Out_Home := #Home.Done;END_REGION//**********************************报警**************************#Alarm := #In_Alarm OR #Enable.Error OR #Reset.Error OR #JOG.Error OR #Absolute.Error OR #Halt.Error;IF #Alarm THEN
        #Out_Alarm := TRUE;ELSIF NOT #Alarm AND #In_Mode.Reset THEN
        #Out_Alarm := FALSE;END_IF;
    
    //**********************************HMI Collection**************************
    //输出#H_Collection.Enable := #Enable;#H_Collection.Reset := #Reset;#H_Collection.Home := #Home;#H_Collection.JOG := #JOG;#H_Collection.Absolute := #Absolute;#H_Collection.Halt := #Halt;#H_Collection.ButtonAndStatus.Out_ActualVelocity := #In_Axis.ActualVelocity;#H_Collection.ButtonAndStatus.Out_ActualPosition := #In_Axis.ActualPosition;
    • 对于MC_Home的Mode接口的解释:
      • 0:绝对式直接归位:新的轴位置为参数“Position”位置的值。例:假如当前位置为20.00,此时回原点把当前的位置设置成原点,位置为0.00。但是此时断电在重启,当前位置又恢复为20.00.
      • 1:相对式直接归位:新的轴位置等于当前轴位置 + 参数“Position”位置的值。例:假如当前位置为20.00,此时回原点,为20.00+0.0(Position的参数)=20.00。
      • 2:被动回原点:将根据轴组态进行回原点。回原点后,将新的轴位置设置为参数“Position”的值.
      • 3:主动回原点: 按照轴组态进行回原点操作。回原点后,将新的轴位置设置为参数“Position”的值。
      • 7: 绝对编码器调节(绝对): 将当前的轴位置设置为参数“Position”的值。计算出的绝对值偏移值保持性地保存在 CPU 内。 (<轴名称>.StatusSensor.AbsEncoderOffset)例:当伺服处在机械零点位置时,此时归位,伺服会把当前位置设置为0(Position的参数)。
      • 注意:选择绝对值式伺服电机无原点开关时,回原点模式选择7;选择增量式伺服电机有原点开关时,回原点模式选择3。

    关于工艺对象(TO)

    • 当基本定位控制方案时由S7-1200/S7-1500 PLC通过PROFINET通信连接S120/V90 PN 驱动实现定位功能时,位置控制器可以在PLC中也可以在驱动器中,他们分别对应于PLC的工艺对象(TO)及驱动中的基本定位功能(EPOS)。
      • PLC的工艺对象(TO):此种定位控制时将位置闭环放在PLC中执行,此种方式回占用PLC资源,因此根据型号不同,PLC最大带轴数量也有很大差别。如下图:。不过使用S7-1500/1500T PLC通过工艺对象(TO)方式控制V90的优点是除了可以实现单轴基本定位功能外,还可以实现齿轮同步,凸轮同步等高级位置控制功能。注意:由于S7-1500及V90 PN支持PROFINET IRT通信,使用工艺对象(TO)的方式可以实现高动态,高精度的位置控制。
      • 驱动中的基本定位功能(EPOS):V90 PN驱动器内部集成了基本定位控制器(EPOS),激活后可以通过EPOS功能是想单轴的点动、回零、程序步、相对定位及绝对定位等操作。此时,位置闭环由驱动器本身完成,PLC只需通过报文发送启动命令、定位速度、目标位置等信息至驱动器即可。此种控制方式优点在于,基本定位功能不会占用PLC资源,PLC控制的轴的最大数量主要受PLC本身所能连接的PROFINENT站点数量的限制,缺点在于只能实现单轴的定位。在博图中推荐使用驱动库中基于111报文的功能块FB284控制V90 PN实现基本定位控制

    关于绝对值编码器的校准

    • 通过工艺对象的方式控制V90 PN,但是绝对值编码器无法校准,V90 PN的ABS功能怎么找不到,还有调试软件中的绝对值编码器校准怎么也是灰的。这是因为通过工艺对象的方式所使用的V90控制模式是速度模式,是没有激活位置控制器的,所以驱动端的绝对值编码器校准是不起作用的。如果箱给绝对值编码器进行校准,那么需要在PLC侧去执行,这里要用到的就是MC_HOME块,在MODE管脚要选6或7(结合平时的项目调试,选7适用)。


    QQ在线咨询
    联系电话
    17658151177
    售后服务
    17658151177
    本站访客:1172