关于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. Apache Shiro(六)-基于URL配置权限

    数据库 先准备数据库啦. DROP DATABASE IF EXISTS shiro; CREATE DATABASE shiro DEFAULT CHARACTER SET utf8; USE sh ...

  2. Dojo2 前端框架基本操作

    安裝CLI,需要先有npm: npm install -g @dojo/cli npm install -g @dojo/cli-create-app 创建项目目录,-n 后面是名字,创建完成后会自动 ...

  3. 腾讯云(Linux)安装.net core sdk2.1、net core runtime2.1

    按照微软指令安装: sdk2.1:https://www.microsoft.com/net/download/linux-package-manager/centos/sdk-current 1. ...

  4. centos 7 gitlab部署 以及汉化

    =============================================== 2018-04-26   08:56:48 ============================== ...

  5. poj3187

    一.题意:给定n,求1~n的一个排列,这个排列需要满足以下两个要求:1.杨辉三角最后的和为sum  2.字典序最小 二.思路:暴力枚举每一个排列,然后计算和并与sum进行比较.这里我比较费解的是为什么 ...

  6. Tomcat疑难杂症解决记录

    1. startup.bat闪退 cmd中运行startup.bat报错: The JRE_HOME environment variable is not defined correctly Thi ...

  7. jacob自己动生成word文档目录

    任务目的 1自动生成word文档目录. 用例测试操作步骤 在一个word文档的第二页填写占位符: {目录}保存.调用程序读取目标文档,自动根据标题生成目录到{目录}位置. 效果 关键代码 insert ...

  8. nyoj 456——邮票分你一半——————【背包思想搜索】

    邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...

  9. (六-1)Firefox插件安装

    1.安装火狐插件 ①旧版本firefox 火狐浏览器右上角-->附件-->获取更多附件-->搜索-->Firebug 安装 Firebug 扩展:https://addons. ...

  10. 很有用的PHP笔试题系列一

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 3.用PHP打印出前一天的时间,打印格式是2007年5月10日22:21:21 Echo date(‘Y-m-d H:i:s’,st ...