关于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. 原生js操作类名

  2. [转] javascript 判断对象是否存在的10种方法总结

    [From] http://www.jb51.net/article/44726.htm Javascript语言的设计不够严谨,很多地方一不小心就会出错.举例来说,请考虑以下情况.现在,我们要判断一 ...

  3. 代理ip的使用以及多进程爬取

    一.代理皮的简单使用 简单的看一二例子即可 import requests #代理ip 高频的ip容易被封,所以使用ip代理 #免费代理 ip:www.goubanjia.com 快代理 西祠代理 h ...

  4. EntityFramework CodeFirst 数据库迁移

    参考: https://msdn.microsoft.com/en-us/data/jj591621 https://msdn.microsoft.com/en-us/library/dd394698 ...

  5. PIE SDK正射校正

    1. 算法功能简介 正射校正是对影像空间和几何畸变进行校正生成多中心投影平面正射图像的处理过程.它除了能纠正一般系统因素产生的几何畸变外,还可以消除地形引起的几何畸变 PIE支持算法功能的执行,下面对 ...

  6. yii2 表单输入框设置

    <?= $form->field($userRole, 'userid', ['options' =>['class' => 'bigDiv'] ])->textInpu ...

  7. HDU 5596 ——GTW likes gt——————【想法题】

    GTW likes gt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  8. Linux systemd资源控制初探

    Linux systemd资源控制初探 本文记录一次cgroup子目录丢失问题,并简单探索了Linux systemd的资源控制机制. 问题现象 我们希望通过systemd拉起服务并通过cgroup限 ...

  9. 【XShell】xshell 中“快速命令集”的使用

    突然看到朋友的xshell比我多一个按钮,且一点,哈哈哈 ,实现了很炫酷的功能,耐不住好奇,问了一句,原来是快速命令集! 1.选择快速命令集(两种方法a&b) a:文件 > 属性 > ...

  10. SpringMVC:系统认识一下maven

    网上看了很多springMVC helloworld的教程,非常不满意:首先,maven构建的就很少,再者,绝大部分都是断章取义,让人不明就里.其中有几篇讲的好的,我摘录了一些,自己试着构建了一下项目 ...