关于simotion建立同步/解除同步的问题
关于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建立同步/解除同步的问题的更多相关文章
- HCNP Routing&Switching之IS-IS邻居建立、LSDB同步、拓扑计算和路由形成
前文我们了解了IS-IS的报文结构和类型相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15260670.html:今天我们来聊一聊IS-IS建立邻居. ...
- OSPF协议原理及配置4-邻接关系的建立和LSDB同步
OSPF协议原理及配置4-邻接关系的建立和LSDB同步 进入ExStart状态后,广播和NBMA型网络要等待4倍的Hello时间,确定DR和BDR.然后建立邻接关系,并交互链路状态通告,以使用LS ...
- 线程同步 synchronized 同步代码块 同步方法 同步锁
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- android账号与同步之同步实现
上一篇博文我先介绍了账号与同步的账号管理,这篇就介绍一下还有一部分.就是android给提供的sync同步机制的使用. 事实上sync机制的使用和上一篇博文中介绍的账号管理非常类似,也是基于binde ...
- C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]
C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...
- MYSQL同步--主从同步问题集锦
1 同步停止,报错误: Could not find first log file name in binary log index file 数据库主从出错: Slave_IO_Running: ...
- 彻底理解线程同步与同步代码块synchronized
public class Demo { public static synchronized void fun1(){ } public synchronized void fun2(){ } pub ...
- rsync 远程同步 实时同步备份 两种免交互的方式实现实时备份
rsync 远程同步: 一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步 作用:做数据备份 备份方式: 完全备份 增量备份 ...
- 同步对象(同步条件Event)
event = threading.Event() #创建同步对象 event.wait() #同步对象等待状态 event.set() #同步对象设置Trueevent.clear() ...
随机推荐
- java mybatis学习二
<select id="find1" parameterType="java.util.HashMap" resultType="com.xxx ...
- 全排列 next_permutation() 函数的使用
看来看去还是这篇博客比较简洁明了 https://www.cnblogs.com/My-Sunshine/p/4985366.html 顺便给出牛客网的一道题,虽然这道题用dfs写出全排列也能做,题意 ...
- python3.6 子类的__init__调用父类的__init__
python3.6 子类的__init__调用父类的__init__ 父类 class worker: def __init__(self): self.a=1 self.b=2 if __name_ ...
- OSG DB的插件地址设置
今天搞了一整天OSG,结果每次都说could not find plugin,就是说找不到OSG的插件去加载文件,我大概看了下OSG的插件机制,发现他是用插件的形式下去读取文件的 http://blo ...
- nutz框架使用记录之Cnd.wrap
这是对Cnd.wrap 官方用法 , 直接硬编码 , [JAVA]List<Person> crowd = dao.query(Person.class, Cnd.wrap("n ...
- s-2、charles 入门
本文的内容主要包括: Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Https ...
- Python 进阶
高阶函数 定义 函数接受的参数是一个函数 函数的返回值为一个函数 满足以上2点中其中一个就是高阶函数 函数嵌套 定义 函数中def定义一个函数 嵌套会存在闭包, 其他情况不会有闭包(闭包闭的是变量) ...
- nyoj 12——喷水装置二——————【贪心-区间覆盖】
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- 1、块:ion-item
因为ion-item 一般写于ion-list里 所以在ion-list里面我会仔细讲解. 1. ion-badge /* --- page1.html ---*/ <ion-navbar *n ...
- 泛型(Generic)委托
泛型(Generic)委托 您可以通过类型参数定义泛型委托.例如: delegate T NumberChanger<T>(T n); 下面的实例演示了委托的使用: using Syste ...