关于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() ...
随机推荐
- Oracle之UTL_FILE 包用法详解
[转自] http://zhangzhongjie.iteye.com/blog/1903024 UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服 ...
- B. Divisors of Two Integers
B. Divisors of Two Integers time limit per test 1 second memory limit per test 256 megabytes input s ...
- 使用类和对象、方法、循环、List、泛型来实现简单的图书管理系统
Book.java import java.util.List; import java.util.Scanner; public class Book { private String name; ...
- TT 安装 之 LINUX
# useradd ttadmin -- 创建用户 # groupadd ttadmin -- 创建用户组 # mkdir /etc/TimesTen -- 创建目录 # chgrp -R ttadm ...
- 文献综述九:Oracle数据库性能模型的研究
一.基本信息 标题:Oracle数据库性能模型的研究 时间:2018 出版源:数字技术与应用 文件分类:对框架的研究 二.研究背景 帮助运维人员分析数据库性能,发现问题,指导调优. 三.具体内容 文献 ...
- 引导篇之HTTP事务
一个完整的HTTP事务流图: HTTP报文格式: 起始行:在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况 首部:起始行后面有0个或多个首部字段.每个首部字段都包含一个名字和一个值,为了 ...
- Tor网络介绍
Tor网络介绍 1.Tor的全称是“The Onion Router”,“An anonymous Internet communicaton system:通过Tor访问一个地址时,所经过的节点在T ...
- Coursera 机器学习 第5章 Neural Networks: Learning 学习笔记
5.1节 Cost Function神经网络的代价函数. 上图回顾神经网络中的一些概念: L 神经网络的总层数. sl 第l层的单元数量(不包括偏差单元). 2类分类问题:二元分类和多元分类. 上 ...
- pat1014. Waiting in Line (30)
1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- 使用mini-define实现前端代码的模块化管理
这篇文章主要介绍了使用mini-define实现前端代码的模块化管理,十分不错的一篇文章,这里推荐给有需要的小伙伴. mini-define 依据require实现的简易的前端模块化框架.如果你不想花 ...