V90通过EPOS位置控制

news/2025/3/3 23:30:01/文章来源:https://www.cnblogs.com/xiacuncun/p/18747012

硬件组态

  • 选择西门子报文111

V-ASSISTANT的设置

  • 选择EPOS
  • 选111报文
  • 设置IP
  • 设置减速比
  • 设置限位及原点传感器
  • 设置控制字以启用输入输出
  • 设置回零参数
  • 电机抱闸设置
  • 在线检查
  • 设置完毕后,自动优化电机
  • 设置点动速度的控制字
  • 电机监控和诊断状态字
  • 参数保存后需重启驱动器才能生效。
  • LU单位和长度的对应关系:需要设置正确的齿轮比,以及设置负载转动一圈物体移动距离所对应的长度单位(LU)。如果定义1LU对应0.001mm,负载转动一圈移动10mm,则此时负载转动一圈对应的长度单位为10000LU。

程序设置

  • FB284的使用
#FB_SINA_POS_Instance(ModePos := #Servo.ModePos,//2绝对定位 4回零 7点动EnableAxis := #Servo.EnableAxis,//使能CancelTraversing := #Servo.CancelTraversing,//0 = 拒绝激活的运行任务 1 = 不拒绝(停止)IntermediateStop := #Servo.IntermediateStop,//中间停止:0 = 中间停止运行任务 1 = 不停止(急停)Positive := #Servo.Positive,//正方向Negative := #Servo.Negative,//负方向#Servo.NegativeJog1 := #Servo.Jog1,Jog2 := #Servo.Jog2,FlyRef := #Servo.FlyRef,//不选择运动中回零AckError := #Servo.AckError OR #In_Mode.Reset,//故障复位ExecuteMode := #Servo.ExecuteMode,Position := #Servo.Position,Velocity := #Servo.Velocity,OverV := #Servo.OverV,//加速度OverAcc := #Servo.OverAcc,//加速倍率OverDec := #Servo.OverDec,//减速倍率ConfigEPos := #Servo.ConfigEPos,//EPOS配置值HWIDSTW := #Servo.HWIDSTW,//硬件标识符HWIDZSW := #Servo.HWIDZSW,//硬件标识符Error => #Servo.Error,//驱动故障Status => #Servo.Status,//状态显示DiagID => #Servo.DiagID,//扩展的通讯故障AxisEnabled => #Servo.AxisEnabled,//驱动已使能AxisError => #Servo.AxisError,AxisWarn => #Servo.AxisWarn,AxisPosOk => #Servo.AxisPosOk,AxisRef => #Servo.AxisRef,//驱动器已回零ActVelocity => #Servo.ActVelocity,ActPosition => #Servo.ActPosition,ActMode => #Servo.ActMode,//当前运行模式Lockout => #Servo.Lockout,EPosZSW1 => #Servo.EPosZSW1,//状态字EPosZSW2 => #Servo.EPosZSW2,//状态字ActWarn => #Servo.ActWarn,//当前报警代码ActFault => #Servo.ActFault);//当前故障代码
//正负限位及原点//伺服位置反馈,无硬限位时的反馈逻辑IF #In_Home_HWLimitActive THEN#Status.Home_Done := #Servo.AxisRef;#Status.LM_Zero := #FB_SINA_POS_Instance.sxRecvBuf.Reserve.%X2;//原点#Status.LM_Postive := #FB_SINA_POS_Instance.sxRecvBuf.Reserve.%X0;//正限位#Status.LM_Negative := #FB_SINA_POS_Instance.sxRecvBuf.Reserve.%X1;//负限位//没有软限位及零点的时候需要考虑逻辑上设计软零位ELSIF NOT #In_Home_HWLimitActive THEN#Status.Home_Done := #Servo.AxisRef;#Status.LM_Zero := #FB_SINA_POS_Instance.sxRecvBuf.Reserve.%X2; //原点#Status.LM_Postive := TRUE;//正限位#Status.LM_Negative := TRUE;//负限位END_IF;
//回原点时的手动处理//ConfigEPos:bit0=OFF2自由停车 bit1=OFF3紧急停车 bit2=软限位开关激活//bit3=停止挡块激活 bit6=参考点挡块生效IF 4 = #Servo.ModePos AND #In_Home_HWLimitActive THEN#Servo.ConfigEPos := 16#3;//0011ELSIF 4 = #Servo.ModePos AND NOT #In_Home_HWLimitActive THEN#Servo.ConfigEPos := 16#3; (* 16#47;//0100 0111 *)END_IF;IF  #In_Home_HWLimitActive THEN#Servo.ConfigEPos := 16#B;//1011,硬限位激活ELSIF NOT #In_Home_HWLimitActive THEN#Servo.ConfigEPos := 16#7;//0111,软限位激活END_IF;
//想要获取报文内容的方法
// 读取伺服驱动器里面的数据12word,填硬件标识符,和284一致;输出用长度12个字的数组
#Tp_piRetSFC := DPRD_DAT(LADDR := #In_HW_ID, RECORD => #Tp_swRecvBuf);
#St_swDiagID := INT_TO_WORD(#Tp_piRetSFC);
//手动回原点逻辑(非必要)
(*
St_sxSendBuf	Struct	
STW1	Word	16#043e
EPosSTW1	Word	16#0
EPosSTW2	Word	16#0
STW2	Word	16#0
OverrideV	Word	16#4000
Position	DInt	0
Velocity	DInt	0
OverrideA	Word	16#4000
OverrideD	Word	16#4000
Reserve	Word	16#0St_sxRecvBuf	Struct	
ZSW1	Word	16#0
EPosZSW1	Word	16#0
EPosZSW2	Word	16#0
ZSW2	Word	16#0
MELDW	Word	16#0
Position	DInt	0
Velocity	DInt	0
ErrNr	Word	16#0
WarnNr	Word	16#0
Reserve	Word	16#0
*)#St_P_clear(CLK := NOT #In_Execute);
IF #St_P_clear.Q THEN#St_sbJog1 := false;#St_sbJog2 := FALSE;#St_sbJogToRef := FALSE;#St_sbRefCamFallingFlag := false;#St_sbModeFlag := false;#St_sbExecute := false;#St_sbOff1 := 1;#St_ST_STEP := 0;#Out_Error := false; RESET_TIMER(#time);
END_IF;// 读取伺服驱动器里面的数据12word
#Tp_piRetSFC := DPRD_DAT(LADDR := #In_HW_ID, RECORD => #Tp_swRecvBuf);
#St_swDiagID := INT_TO_WORD(#Tp_piRetSFC);//check the receiving communication error
/在软限位激活的情况下强制把物理正负限位置1
IF #Tp_piRetSFC <> 0 AND #Out_Error = false THEN#Out_Error := true;#Out_ErrorInfo := #St_swDiagID;
ELSEIF TRUE = #In_HWLimitActive THEN#St_sxRecvBuf.Reserve := #Tp_swRecvBuf[11];///DI状态ELSE#St_sxRecvBuf.Reserve.%X0 := TRUE;//正限位#St_sxRecvBuf.Reserve.%X1 := TRUE;//负限位//零位#St_sxRecvBuf.Reserve.%X2 := #Tp_swRecvBuf[11].%X2;END_IF;#St_sxRecvBuf.EPosZSW1 := #Tp_swRecvBuf[1];////正负限位原点Jog信息#St_sxRecvBuf.ZSW1 := #Tp_swRecvBuf[0];///其他信息#St_sxRecvBuf.Position.%W1 := #Tp_swRecvBuf[5]; //位置实际值#St_sxRecvBuf.Position.%W0 := #Tp_swRecvBuf[6];///位置实际值#St_sxRecvBuf.Velocity.%W1 := #Tp_swRecvBuf[7];///速度实际值#St_sxRecvBuf.Velocity.%W0 := #Tp_swRecvBuf[8];///速度实际值#St_sbRefOk := #St_sxRecvBuf.ZSW1.%X11;///已设置参考点#St_sbCWLActive := #St_sxRecvBuf.EPosZSW1.%X9;///正向停止挡块生效#St_sbCCWLActive := #St_sxRecvBuf.EPosZSW1.%X8;///负向停止挡块生效#St_sbDriveFault := #St_sxRecvBuf.ZSW1.%X3;///存在故障#St_sbDriveReady := #St_sxRecvBuf.ZSW1.%X0;//准备接通信号#St_sbDriveEnabled := #St_sxRecvBuf.ZSW1.%X2; //使能信号#St_sbJogEnabled := #St_sxRecvBuf.EPosZSW1.%X10;////JOG生效CASE #St_ST_STEP OF0://#St_sbExecuteFlag := FALSE;#St_sbSetREF := false;#St_sbHWLimitActive := #In_HWLimitActive;#St_sbRefDir := #In_RefDir;IF #St_sxRecvBuf.Reserve.%X0 = TRUE AND #St_sxRecvBuf.Reserve.%X1 = TRUE AND #In_Execute THEN//X0表示正限位 X1表示负限位  X2表示原点#St_ST_STEP := 1;ELSE#St_sbJog1 := false;#St_sbJog2 := FALSE;#St_sbJogToRef := FALSE;#St_sbRefCamFallingFlag := false;#St_sbModeFlag := false;#St_sbExecute := false;END_IF;1:IF #St_sbModeFlag = false AND  #St_sxRecvBuf.Reserve.%X0 = TRUE AND #St_sxRecvBuf.Reserve.%X1 = TRUE  THEN#St_sbExecute := true; //开始回参考点信号END_IF;IF #In_RefCamPin = 1 THEN#St_sbRefCam := #St_sxRecvBuf.Reserve.%X2;ELSIF #In_RefCamPin = 2 THEN#St_sbRefCam := #St_sxRecvBuf.Reserve.%X1;ELSIF #In_RefCamPin = 3 THEN#St_sbRefCam := #St_sxRecvBuf.Reserve.%X2;ELSIF #In_RefCamPin = 4 THEN#St_sbRefCam := #St_sxRecvBuf.Reserve.%X3;ELSE#St_sbRefCam := false;END_IF;IF #St_sbModeFlag = FALSE AND (#St_sxRecvBuf.Reserve.%X0 = FALSE OR #St_sxRecvBuf.Reserve.%X1 = FALSE) THEN//修改20200731#St_sbExecute := false;#St_sbOff1 := false;#St_T_Delay(IN := NOT #St_sbOff1,PT := T#200MS);IF #St_T_Delay.Q THEN#St_sbHWLimitActive := FALSE;#St_sbAckError := true;#time(IN := #St_sbAckError AND NOT #St_sbDriveFault,PT := t#100ms);IF #time.Q THEN#St_sbModeFlag := true;END_IF;END_IF;END_IF;IF #St_sbModeFlag = true THENIF #St_sbDriveFault = false THEN#St_sbAckError := false;#St_sbOff1 := true;//使能END_IF;IF #St_sxRecvBuf.Reserve.%X0 = FALSE AND #St_sbDriveEnabled = true AND   #St_sbOff1 THEN//修改20200731// IF #St_sxRecvBuf.Reserve.%X0 = FALSE THEN#St_sbJog1 := TRUE;#St_sbJog2 := FALSE;END_IF;IF #St_sxRecvBuf.Reserve.%X1 = FALSE AND #St_sbDriveEnabled = true AND   #St_sbOff1  THEN//修改20200731// IF #St_sxRecvBuf.Reserve.%X1 = FALSE  THEN#St_sbJog1 := FALSE;#St_sbJog2 := true;END_IF;#St_sbRefCamFalling(CLK := #St_sbRefCam,Q => #St_sbRefCamFallingFlag);IF #St_sbJogToRef = true AND #St_sbJogEnabled = false THEN#St_sbJogToRef := false;#St_sbExecute := true;END_IF;IF #St_sbRefCamFallingFlag = true THEN#St_sbJog1 := false;#St_sbJog2 := FALSE;#St_sbJogToRef := true;//已JOG至原点标志#St_sbRefCamFallingFlag := false;END_IF;END_IF;IF #St_sbRefOk = true OR #In_Execute = false THEN// #St_sbHWLimitActive := TRUE;#St_sbModeFlag := false;END_IF;END_CASE;
END_IF;//输出给V90信号
//Send data
#St_sxSendBuf.STW1.%X0 := #St_sbOff1 AND #In_EnableAxis;///使能
#St_sxSendBuf.STW1.%X7 := #St_sbAckError OR #In_AckError ;//应答故障
#St_sxSendBuf.STW1.%X8 := #St_sbJog1;///jog1信号
#St_sxSendBuf.STW1.%X9 := #St_sbJog2;///Jog2信号 
#St_sxSendBuf.STW1.%X11 := #St_sbExecute AND #In_Execute;///开始回参考点
#St_sxSendBuf.EPosSTW2.%X1 := #St_sbSetREF;///设置参考点
#St_sxSendBuf.EPosSTW2.%X2 := #St_sbRefCam;///参考点档位生效
#St_sxSendBuf.EPosSTW2.%X9 := #St_sbRefDir;////1=开始反向搜索参考点 0=开始正向搜索参考点
#St_sxSendBuf.EPosSTW2.%X14 := (NOT #In_HWLimitActive);//激活软限位开关
#St_sxSendBuf.EPosSTW2.%X15 :=  #St_sbHWLimitActive AND #In_HWLimitActive; ///1=停止挡块生效#Tp_swSendBuf[0] := #St_sxSendBuf.STW1;
#Tp_swSendBuf[1] := #St_sxSendBuf.EPosSTW1;
#Tp_swSendBuf[2] := #St_sxSendBuf.EPosSTW2;
#Tp_swSendBuf[3] := #St_sxSendBuf.STW2;
#Tp_swSendBuf[4] := #St_sxSendBuf.OverrideV;
#Tp_swSendBuf[5] := #St_sxSendBuf.Position.%W1;
#Tp_swSendBuf[6] := #St_sxSendBuf.Position.%W0;
#Tp_swSendBuf[7] := #St_sxSendBuf.Velocity.%W1;
#Tp_swSendBuf[8] := #St_sxSendBuf.Velocity.%W0;
#Tp_swSendBuf[9] := #St_sxSendBuf.OverrideA;
#Tp_swSendBuf[10] := #St_sxSendBuf.OverrideD;
#Tp_swSendBuf[11] := #St_sxSendBuf.Reserve;
//send the command to the drive
IF #Out_Error = false THEN#Tp_piRetSFC := DPWR_DAT(LADDR := #In_HW_ID, RECORD := #Tp_swSendBuf);#St_swDiagID := INT_TO_WORD(#Tp_piRetSFC);
END_IF;IF #Tp_piRetSFC <> 0 AND #Out_Error = false THEN#Out_Error := true;#Out_ErrorInfo := #St_swDiagID;
END_IF;
#Out_RefOK := #St_sbRefOk;
#Out_Zero := #St_sxRecvBuf.Reserve.%X2;
#Out_Postive := #St_sxRecvBuf.Reserve.%X0;
#Out_Negative := #St_sxRecvBuf.Reserve.%X1;
///注意1: 在触发回原点信号的时候要先保证 轴已经使能 而且没有点动信号
///注意2: 在模式选择为4的时候才可以触发回原点指令 在模式选择不为4的时候触发FB284
///注意3: 在触发回原点的时候  用沿触发来把模式选择进行调整 同时复位回原点信号
///注意4: 需要在此块外面 再加上别的一些程序进行处理

关于FB284,常遇到的一些问题汇总

  • FB284基本定控制常问问题



  • FB284的参数管脚说明


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/892447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年 IDEA 插件推荐,告别低效!

前言 IDEA插件没有绝对的好坏,每个人的需求不一样,选择合适的插件,并定期清理和维护,才能提高效率,否则适得其反。 Rainbow Brackets 会将不同层级的括号用不同的颜色标记出来,很快就能分辨出括号的对应关系,避免括号匹配错误。 我更喜欢默认的括号高亮显示,它已经足够…

web开发 辅助学习管理系统开发日记 day6

今天回学校了,下的雨好大,全身甚至被子都湿了,不过学习在于持之以恒,不能因为回学校就不学习。 废了好大劲完成了添加员工模块接下来分享一些在写代码中遇到的一些问题 Q1:首先本模块由数据库中的两个表组成分别是员工表与员工工作经历表需要现在员工表的实体类中定义一个工…

Python进阶教程

print for i in range(1, 10):for j in range(1, i + 1):print(f"{j} x {i} = {i * j}", end="\t")# print(*objects, sep= , end=\n, file=None, flush=False)# 当object为空时,则 print() 将只写入 end。# print默认自带换行的功能,因此 print("\…

C# 基础知识

int i=null; int? i=null; 我们用一个问号 来指定这个值类型是可空的 属性是只读的从上面可以看出来,s2指向的是常量值,后面局部变量的s1做任何修改都不会改变s2自身的值

2025-03-02 ip地址ping不通?==》安全组没有放行icmp

请在安全组添加规则,如图示例:但是!放行icmp只是其中一个解决方案,如果你放行了还不行,那你得参考更具体的文档,传送门:https://cloud.tencent.com/document/product/213/14639#CheckLinuxFirewall

【嵌入式分享1】通过反汇编定位死机问题原因

背景: 该问题是实际项目中,生产产线反馈的一例机器反复重启。 原因分析: 通过导出的日志可以看到死机原因是发生非法访问,日志如下:点击查看代码 LR :0007a18f PC :0005c7e0 Memory management fault is caused by data access violation The memory management fault oc…

JavaWeb学习(四)

JavaWeb学习(四):JavaScript 目录JavaWeb学习(四):JavaScript概念JS 引入方式JS 基础语法JS 函数JS 对象JS 事件监听 本文为个人学习记录,内容学习自 黑马程序员概念JavaScript,简称 JS,是一门跨平台、面向对象的脚本语言,用于控制网页行为 JavaScript 和 Java 是完全…

水晶分班5.21-分析记录

水晶分班5.21-分析记录 目录程序信息注册按钮事件-TfrmZc_btnZcClick_008C41B4浏览器回调-TForm1_WebBrowserZcDocumentComplete_008D6EDC启动时检验-TForm1_FormShow_008D71B0MG_MD5_81D008(todo)ps 程序信息 版本"5.21 <2024.9.7>" PE32操作系统: Windows(…

[Docker] 如何给 Docker 配置网络代理?

序 有时因为网络原因,比如公司 NAT,或其它啥的,需要使用代理。Docker 的代理配置,略显复杂,因为有三种场景。但基本原理都是一致的,都是利用 Linux 的 http_proxy 等环境变量。 概述:Docker 网络代理方案 方案1:Dockerd 代理在执行docker pull时,是由守护进程dockerd来…

牛客题解 | 验证IP地址

牛客题库题解题目 题目链接 题目主要信息:IPv4只有十进制数和分割点,其中数字在0-255之间,共4组,且不能有零开头的非零数,不能缺省 IPv6由8组16进制数组成,会出现a-fA-F,通过冒号分割,不可缺省,可以零开头,或者为一个单独零,每组最多4位。举一反三: 学会了本题的思…

牛客题解 | 链表中环的入口结点

牛客题库题解题目 题目链接 题目主要信息:给定一个链表,首先判断其是否有环,然后找到环的入口举一反三: 学习完本题的思路你可以解决如下题目: BM4.合并有序链表 BM5.合并k个已排序的链表 BM6.判断链表中是否有环 BM8.链表中倒数最后k个节点 BM9.删除链表的倒数第n个节点 B…

牛客题解 | 链表中环的入口结点_1

牛客题库题解题目 题目链接 描述 这是一篇针对初学者的题解,共用两种方法解决。 知识点:单链表,哈希,双指针 难度:二星题解 题目抽象:给定一个单链表,如果有环,返回环的入口结点,否则,返回nullptr 方法一:哈希法遍历单链表的每个结点 如果当前结点地址没有出现在set…