注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SIEMENS运动控制器/伺服驱动器

SIMOTION/S120——纯技术BLOG

 
 
 

日志

 
 

每天学点SIMOTION(21)TO编程7:转换或步进条件  

2016-01-28 17:18:42|  分类: SIMOTION_D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
TO命令用来实现工艺功能,TO会在指定的执行周期里处理这些TO命令,比如在IPO周期。
有一些TO命令是直接执行的,比如快速输出OutputCam, MearingInput,等,其他TO命令会随后执行。
除了直接执行的命令,一些运动命令可以给速度轴、位置轴、跟随轴、跟随对象等。TO有个结构体用于命令管理。
一个命令管理的例子如下:
每天学点SIMOTION(21)TO编程:转换或步进条件 - lvqd - SIEMENS运动控制器/伺服驱动器
运动缓冲区中保存了运动命令,它们在插补器中是顺序执行的。缓冲区中保存的运动命令的数量是在这个配置数据中配置的:TypeOfAxis.DecodingConfig.numberOfMaxbufferedCommandId,这表示可以发给TO多个命令,而不用管当前激活的是哪条命令。
在使用时,CommandId会分配给每一个命令,这是全局唯一的Id,它会与命令一直关联,可以使用CommandId来追踪该命令的运行状态。
命令是分配到不同的命令组里的,命令组里尚未执行的命令是在插补器里并行处理的。已确定的命令会在TO中立即激活,并在缓冲区中排好队;其他命令,比如叠加命令会立即生效。
命令组和命令缓冲区的行为,会因TO不同而不同。比如在一个IPO2周期里,同时调用 _enableaxistorquelimitpositive 和 _enableaxistorquelimitnegative 时,只有一条命令会生效。
当前命令的转换行为
在TO命令的输入参数MergeMode中指定转换行为。这个参数指定了该命令在TO命令序列中的位置,或者该命令该分配给哪一个命令组。
每天学点SIMOTION(21)TO编程:转换或步进条件 - lvqd - SIEMENS运动控制器/伺服驱动器
转换、步进条件
TO命令的步进条件可以在程序中指定。它指定了下一语言何时执行。命令中的输入参数nextCommand用于这个目的。
在使用“同步执行”与“异步执行”时,需要注意这个参数别设得不合理。
一般在异步执行的场合,需设置为IMMEDIATELY,不然可能造成程序超时。
下面是例子:
 Example of asynchronous program execution (cyclic programming) - Part 1
 
INTERFACE
USEPACKAGE CAM;
    PROGRAM ProgramCycle;
END_INTERFACE
 
IMPLEMENTATION
 
PROGRAM ProgramCycle 
    VAR
        boStartCommand : BOOL; // Command - issue command
        boCommandStarted : BOOL; //Auxiliary variable - command issued
        boCommandDone : BOOL; // Auxiliary variable - command executed
        i32Ret : DINT; // Return value of system functions
        sCommandId : CommandIdType; // CommandId
        // Return value - _getStateOfAxisCommand
        sRetCommandState : StructRetCommandState;
        // Instance of the system FB for the edge detection
        r_trig_1 : R_TRIG; 
    END_VAR
 
    r_trig_1 (boStartCommand); // Call the edge detection
 
    IF r_trig_1.q THEN
        // Request for a system-wide unique commandId 
        sCommandId := _getCommandId ();
        // Register commandId at the TO
        // --> Diagnostics of end or abort of command possible
        i32Ret := _bufferAxisCommandId (
        axis := Axis_1,
        commandId := sCommandId );
        // Evaluation of return value of system function
        // ...
        // Issuing of a command - motion with USER_DEFAULT values
        i32Ret := _move( 
        axis := Axis_1, 
        nextCommand := IMMEDIATELY,
        commandId := sCommandId );
        // Evaluation of return value of system function
        // ...
        // Auxiliary variables for coordination of command execution
        boCommandStarted := TRUE;
        boCommandDone := FALSE;
//---------------------------------------------------------------------
// Continuation follows
 Table 5-12 Example of asynchronous program execution (cyclic programming) - Part 2
 
// Continuation
//---------------------------------------------------------------------
    ELSIF boCommandStarted AND NOT boCommandDone THEN
        // Query command execution status
 sRetCommandState := _getStateOfAxisCommand( 
        axis := Axis_1, 
        commandId := sCommandId );
 
    IF sRetCommandState.functionResult = 0 THEN
        IF sRetCommandState.commandIdState = EXECUTED THEN
            // Command has been executed (completed)
            boCommandStarted := FALSE;
            boCommandDone := TRUE;
            // Remove registered commandId on TO
            i32Ret := _removeBufferedAxisCommandId( 
            axis := Axis_1, 
            commandId := sCommandId );
        END_IF;
    ELSE
        // Error handling for _getStateOfAxisCommand function call
        // ...
        ;
    END_IF;
 
    ELSIF boCommandDone THEN 
        // Execution after command execution
        // ...
        ;
    END_IF;
 
 // Further user program as of here
 // ...
 
END_PROGRAM
 
END_IMPLEMENTATION
Example of synchronous program execution (sequential programming)
 
INTERFACE
    USEPACKAGE CAM;
    VAR_GLOBAL
        g_boCommandStarted : BOOL; //Auxiliary variable - command issued
        g_boCommandDone : BOOL; // Auxiliary variable - command executed
        END_VAR
        PROGRAM ProgramSequential;
END_INTERFACE
 
IMPLEMENTATION
    PROGRAM ProgramSequential
        VAR
            i32Ret : DINT: // Return value of system function
        END_VAR;
        g_boCommandStarted := TRUE;
        g_boCommandDone := FALSE;
        // Statements executed before the motion.
// ...
        i32Ret := _move( 
        axis := Axis_1,
        nextCommand:= WHEN_MOTION_DONE, 
        commandId:= _getCommandId () );
 
        // Statements executed after the motion.
        // ...
        // Evaluation of return value of system function
        // ...
 
        g_boCommandStarted := FALSE;
        g_boCommandDone := TRUE;
 
    END_PROGRAM
 
  评论这张
 
阅读(282)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017