关于simotion建立同步/解除同步的问题。

问题:

【enable gearing】【disable gearing】【enable camming】【disable camming】都是一个过程,需要通过逻辑来保证该指令【能够执行一次,且仅执行一次】。

方法1)如果同步命令在background/IPO中执行,使用上升沿来保证“只执行一次”

方法2)建立【gearoff-running】【gearon-running】变量,在指令执行时置1,同步建立/解除后置0

可以参考我写的relative gear里面的时序。我的这个程序里面,方法1和方法2都用了。自己写程序可以只用其中一种方法。

    FUNCTION_BLOCK FB_RelativeGear
//--------------------------------------------------------------------------
// SFAE / Beijing, China
//--------------------------------------------------------------------------
//functionality: two axis relative sync
//assignment: Ipo task / background
//--------------------------------------------------------------------------
//change log table:
//version date expert in charge changes applied
//01.00.00 24.10.2016 Zheng lei Created
//01.01.00 29.06.2018 Zheng lei fix 'GearOffRunning' signal bug
//01.01.01 28.11.2018 Zheng lei 1)reset 'GearOnRunning''GearOffRunning' signal when command change
// 2)change gearRatio on-the-fly
//========================================================================== VAR_INPUT
TO_master :PosAxis := TO#nil;
TO_slave :FollowingAxis;
TO_slaveSync :FollowingObjectType := TO#nil;
GearOn :BOOL:= FALSE;
GearRatio :LREAL:= 1.0;
Acc :LREAL:= 50.0;
//superImpose(options)
SPos_Length :LREAL:= 1.0;
SPos_Spd :LREAL:= 2.0;
SPos_Positive :BOOL:= FALSE;
SPos_Negative :BOOL:= FALSE;
END_VAR VAR_OUTPUT
gearOnOK :BOOL;
END_VAR VAR
myRetDINT :DINT;
rtrig_gearOn :R_TRIG;
ftrig_gearOff :F_TRIG;
GearOnRunning :BOOL;
GearOffRunning :BOOL;
GearRatioChanged :BOOL;
oldGearRatio :LREAL;
PosP_Trig :R_TRIG;
PosN_Trig :R_TRIG;
END_VAR rtrig_gearOn(GearOn);//rtrig
ftrig_gearOff(GearOn);//ftrig IF rtrig_gearOn.q OR ftrig_gearOff.q THEN
GearOnRunning := FALSE;
GearOffRunning := FALSE;
END_IF; GearRatioChanged := (GearRatio <> oldGearRatio);
oldGearRatio := GearRatio; //gear on
IF (rtrig_gearOn.q OR GearRatioChanged)
AND TO_slave.control = active
AND (TO_slave.syncMonitoring.syncState <> Yes OR GearRatioChanged)
AND (TO_slave.motionStateData.motionState = STANDSTILL OR GearRatioChanged)
AND TO_master <> TO#nil
AND TO_slave <> TO#nil
AND TO_slaveSync <> TO#nil
AND NOT GearOnRunning
THEN
myRetDINT := _setMaster( //set master
followingObject := TO_slaveSync
,master := TO_master
,transientBehavior := DIRECT
,nextCommand := IMMEDIATELY
); myRetDINT := _enableGearing(
followingObject := TO_slaveSync
,direction := BY_VALUE
,gearingType := RELATIVE
,gearingMode := GEARING_WITH_RATIO
,gearingRatioType := DIRECT
,gearingRatio := GearRatio
,synchronizingMode := IMMEDIATELY
,syncProfileReference := RELATE_SYNC_PROFILE_TO_TIME
,positiveAccelType := DIRECT
,positiveAccel := Acc
,negativeAccelType := DIRECT
,negativeAccel := Acc
,velocityProfile := TRAPEZOIDAL
,mergeMode := IMMEDIATELY
,nextCommand := IMMEDIATELY
,synchronizingDirection := SHORTEST_WAY
);
GearOnRunning := TRUE;
END_IF; IF TO_slave.syncMonitoring.syncState = Yes
OR NOT GearOn OR TO_slave.control = INACTIVE
THEN //gear on finish
GearOnRunning := FALSE;
END_IF; //gear off
IF TO_slave.control = active
AND ftrig_gearOff.q
AND TO_slave.syncMonitoring.syncState = Yes
AND NOT GearOffRunning
AND TO_slaveSync <> TO#nil
THEN
GearOffRunning := TRUE;
myRetDINT := _disableGearing(
followingObject := TO_slaveSync
,syncOffMode := IMMEDIATELY
,syncProfileReference := RELATE_SYNC_PROFILE_TO_TIME
,positiveAccelType := DIRECT
,positiveAccel := Acc
,negativeAccelType := DIRECT
,negativeAccel := Acc
,velocityProfile := TRAPEZOIDAL
,mergeMode := IMMEDIATELY
,nextCommand := IMMEDIATELY
);
END_IF; IF TO_slave.syncMonitoring.syncState <> Yes THEN //gearoff finish
GearOffRunning := FALSE;
END_IF; //------------------- SuperImpose pos ------------------------
PosP_Trig(SPos_Positive);
PosN_Trig(SPos_Negative); IF PosP_Trig.q
AND TO_slave.control = active
THEN
myRetDINT := _pos(
axis := TO_slave
,direction := POSITIVE
,positioningMode := RELATIVE
,position := SPos_Length
,velocityType := DIRECT
,velocity := SPos_Spd
,positiveAccelType := DIRECT
,positiveAccel := Acc
,negativeAccelType := DIRECT
,negativeAccel := Acc
,velocityProfile := TRAPEZOIDAL
,blendingMode := INACTIVE
,mergeMode := SUPERIMPOSED_MOTION_MERGE
,nextCommand := IMMEDIATELY
);
END_IF; IF PosN_Trig.q
AND TO_slave.control = active
THEN
myRetDINT := _pos(
axis := TO_slave
,direction := NEGATIVE
,positioningMode := RELATIVE
,position := SPos_Length
,velocityType := DIRECT
,velocity := SPos_Spd
,positiveAccelType := DIRECT
,positiveAccel := Acc
,negativeAccelType := DIRECT
,negativeAccel := Acc
,velocityProfile := TRAPEZOIDAL
,blendingMode := INACTIVE
,mergeMode := SUPERIMPOSED_MOTION_MERGE
,nextCommand := IMMEDIATELY
);
END_IF; gearOnOK := TO_slave.syncMonitoring.syncState = Yes
AND TO_slave.control = active; END_FUNCTION_BLOCK

关于simotion建立同步/解除同步的问题的更多相关文章

  1. HCNP Routing&Switching之IS-IS邻居建立、LSDB同步、拓扑计算和路由形成

    前文我们了解了IS-IS的报文结构和类型相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15260670.html:今天我们来聊一聊IS-IS建立邻居. ...

  2. OSPF协议原理及配置4-邻接关系的建立和LSDB同步

    OSPF协议原理及配置4-邻接关系的建立和LSDB同步   进入ExStart状态后,广播和NBMA型网络要等待4倍的Hello时间,确定DR和BDR.然后建立邻接关系,并交互链路状态通告,以使用LS ...

  3. 线程同步 synchronized 同步代码块 同步方法 同步锁

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  4. android账号与同步之同步实现

    上一篇博文我先介绍了账号与同步的账号管理,这篇就介绍一下还有一部分.就是android给提供的sync同步机制的使用. 事实上sync机制的使用和上一篇博文中介绍的账号管理非常类似,也是基于binde ...

  5. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

  6. MYSQL同步--主从同步问题集锦

    1  同步停止,报错误:  Could not find first log file name in binary log index file 数据库主从出错: Slave_IO_Running: ...

  7. 彻底理解线程同步与同步代码块synchronized

    public class Demo { public static synchronized void fun1(){ } public synchronized void fun2(){ } pub ...

  8. rsync 远程同步 实时同步备份 两种免交互的方式实现实时备份

    rsync 远程同步: 一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步 作用:做数据备份 备份方式:      完全备份      增量备份 ...

  9. 同步对象(同步条件Event)

    event = threading.Event()   #创建同步对象 event.wait()     #同步对象等待状态 event.set() #同步对象设置Trueevent.clear()  ...

随机推荐

  1. ansys 14.0

    张建伟等.2012.12 人民邮电 一天一本书,这种感觉 真是爽啊. 但我觉得什么也没学到. 话说回来,此authors 确实书写得比较一般,实例不如百度文档上的WORD实例,理论不如我看的那本CFD ...

  2. C++ GUI Qt4编程(12)-6.1FindFileDialog

    1. 主要介绍了QGridLayout, QHBoxLayout, QVBoxLayout3种布局管理器的使用方法. 2. 在linux中,继承自QDialog的对话框,没有最大化.最小化.关闭按钮, ...

  3. python 计数器Counter

    from collections import Counter colours=( ('Yasoob','Yellow',1), ('Ali','Blue',2), ('Arham','Green', ...

  4. pjsip与QT进行适配

    pjsip是纯C语言写的一个sip协议库,整个代码写得还是比较模块化的,得益于此的设计,只要理解了pjsip的设计,就可以对其网络层进行扩展. 我们项目是QT作为主要开发工具,而PJSIP的库默认是利 ...

  5. Ubuntu 14.04 下安装搜狗输入法,不要删除ibus

    今天安装了 sougou输入法.在ubuntu下面,然后网上一般的帖子都是要求你先删除 ibus 但是你删除了ibus之后,就会导系统设置被删除很多设置项,甚至无法打开, 所有你设置ubuntu输入法 ...

  6. 【VMware&Vritualbox】虚拟机安装windows server2016

    一.下载镜像 参考链接:https://blog.csdn.net/yenange/article/details/52981769 http://blog.sina.com.cn/s/blog_10 ...

  7. PCU

    PCU(Peak concurrent users ),互联网术语,应用在网络游戏和其他互联网服务领域,意思是最高同时在线人数 业务系统架构性能提升主要分为两种不同的方式,scale-out(横向扩展 ...

  8. Java Socket通信示例

    Socket分为ServerSocket和Socket两大类: 其中ServerSocket用于服务器端,可以通过accept方法监听请求,监听到请求后返回Socket: Socket用户具体完成数据 ...

  9. MVC5 下拉框绑定(单选)

    1.Model [Display(Name = "学历")] public ICollection<System.Web.Mvc.SelectListItem> asd ...

  10. Gitflow 工作流程

    目存在两个长期分支: 主分支master 开发分支develop 前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版: 后者用于日常开发,存放最新的开发版. 其次,开发新功能或者修 ...