一、前言
本文是本系列 《西门子S7-1200PLC 控制步进电机 MD-4240-PN》的番外篇—— 仿SinaPos (FB284) 块编写。
MD-4240-PN是一款支持profinet 总线的一体式闭环步进电机,还不了解MD-4240-PN的可以翻看我往期的文章,有详细的从开箱到使用;这一篇番外是记录我为了更好的使用它而参考SinaPos仿写了一个操作逻辑类似的块。我为什么要写这个块? 原因是SinaPos的接口简单,易上手,很多项目都是基于它来写的,使用起来也更习惯,它具有和SinaPos相似的管脚,并且我会开放出来给大家使用。
原创博主博客
往期的文章可以看
西门子S7-1200PLC 控制步进电机 MD-4240-PN (1) 电机开箱
西门子S7-1200 PLC控制步进电机 MD-4240-PN (2) 硬件搭建
西门子S7-1200 PLC控制步进电机 MD-4240-PN (3) 软件组态
西门子S7-1200 PLC控制步进电机 MD-4240-PN (4) 抓包分析
西门子S7-1200 PLC控制步进电机 MD-4240-PN (5) 报文分析
西门子S7-1200 PLC控制步进电机 MD-4240-PN (6) 触摸屏项目搭建
二、什么是SinaPos
经常使用 V90 PN 的朋友应该都不陌生,它是西门子提供的可以实现V90 PN基本定位控制的功能块,能够让电机以 相对定位、绝对定位、连续运行、主动回零、直接设置回零位置、程序段、速度点动、距离点动模式进行运动。
通过编写程序控制块的管脚就能够对V90 PN 进行控制。
它的接口定义如下:
三、仿SinaPos(FB284)块
进入正题,要仿写SinaPos(FB284)块,就要明确块的大致需求,以下是我对需求的总结:
1、管脚大致相似。 (这样能以极低甚至是零学习成本来使用)
2、最好有中文与注释。(SinaPos块的管脚是英文的,这让我这个英语不好的要经常翻帮助文档)
3、自由度高。(块的如何对接我自己能够掌控,有问题可以随时查看)
综合以上我就按照这样的方向去写这个块。
1、输入接口定义
2、输出接口定义
对于一些接口我选择了隐藏,这样不展开时块就会比较简洁。
3、接口展示
展开后如下(隐藏的都是警告、报警、故障,便于使用,不需要是可以收起来)
来个横向对比SinaPos(FB284)
其中需要关注的是块的左下角设备模块硬件标识符,它和前几篇中提到的,调用scl生成的块所需填入的是一样的,
需要注意的是!如果使用了厂家提供的SCL生成的块则不能使用我写的块。因为会造成抢控制权的问题。
这里我做好了中文注释,有不清楚这个管脚的可以将鼠标放在管脚上,提示就能够显示了。
包括有一些管脚它能填写的范围都有提示。
4、部分代码
ModePos设定值判断
IF #ModePos > 8 THEN
//选择的运行模式不正确 将“ModePos”设置为0至8
#Error := True;
#"Static variables".swStatus := 16#8202;
ELSIF #ModePos < 0 THEN
//选择的运行模式不正确 将“ModePos”设置为0至8
#Error := True;
#"Static variables".swStatus := 16#8202;
ELSE
#"Static variables".siModePos := #ModePos;
//使能标志位
IF #EnableAxis THEN
#out._2_motion_mode := #"Static variables".siModePos;
ELSE
#out._2_motion_mode := 0;
END_IF;
//一旦触发撤消错误 无故障
IF #"Static variables".swStatus = 16#8202 THEN
#"Static variables".swStatus := 16#7002;
#Error := False;
END_IF;
END_IF;
OverV输入值判断
//检查OverV是否在可能的速度超控范围内(0到199%)
IF (#OverV < 0) OR (#OverV > 199) THEN
#"Static variables".swStatus := 16#8203;
#Error := True;
ELSE
//速度转换用于匹配报文
#"Static variables".siOverV := INT_TO_SINT(#OverV - 100);
END_IF;
OverAcc输入值判断
// 检查OverAcc是否在可能的速度超控范围内 (0% - 100%)
IF (#OverAcc < 0) OR (#OverAcc > 100) THEN
#"Static variables".swStatus := 16#8203;
#Error := True;
ELSE
#"Static variables".siOverAcc := INT_TO_SINT(#OverAcc - 100);
END_IF;
错误恢复
//一旦触发撤消错误 无故障
IF NOT (#OverV < 0) AND NOT (#OverV > 199) AND NOT (#OverAcc < 0) AND NOT (#OverAcc > 100) THEN
IF #"Static variables".swStatus = 16#8203 THEN
#"Static variables".swStatus := 16#7002;
#Error := False;
END_IF;
END_IF;
Postive、Negative管脚功能实现
// 3=速度模式下速度由#Positive #Negative来控制旋转方向
IF #"Static variables".siModePos = 3 THEN
#"Static variables".sdVelocity := ABS(#Velocity);
IF #Positive AND NOT #Negative THEN
#out._1_VTarget_mdi := #"Static variables".sdVelocity;
ELSIF #Negative AND NOT #Positive THEN
#out._1_VTarget_mdi := -#"Static variables".sdVelocity;
ELSE
#out._1_VTarget_mdi := 0;
END_IF;
ELSE
//其它模式直接赋值位置与速度
#out._0_XTarget_mdi := #Position;
#out._1_VTarget_mdi := #Velocity;
END_IF;
由于篇幅问题这里不再进行过多描述。
我写的块中有大量的注释,能够让使用的人能够自由地修改这个块,如果有好的想法也可以大家一起完善。
这样就符合了我的设计需求。
1、管脚大致相似
2、最好有中文与注释
3、自由度高
四、调用MD-Ctrl
就像使用SinaPos(FB284)类似,把这个块放在一个OB块中,可以是Main[OB1],也可以是自己创建的周期调用的OB块中。
这里我放在了之前创建的块中。
这里大家可能有疑问,为什么我放了两个块,不是说它们不能同时被调用吗?
在它的“设备符号硬件标识符”中,我并未填写参数,也就是说这个块会被运行,但是它没有控制对象,只有当我给定了相应的“设备模块硬件标识符”后,这个块才能控制设备。
这里我选择“md42-dev~Module_1”
这样就基本完成了对接。
我将这个块导出为scl文件,如果有什么疑问欢迎评论区讨论,有需要这个scl的可以在私信找我,人多的话我就上传网盘。
往期的文章可以搜索《西门子S7-1200PLC 控制步进电机 MD-4240-PN》找到我的CSDN博客
CSDN博主:小小小小小6-CSDN博客
四、结尾
本番外篇主要是将了我仿SinaPos(FB284)做了一个块,在使用上更熟悉,能够快速上手。1200控制的系列到这里就差不多完结了。我准备开坑一个新系列,用S7-200 SMART来控制MD-4240-PN,并且把这个块也移植到S7-200 SMART上使用。
标签:MD,番外,FB284,4240,SinaPos,Static,PN,variables From: https://blog.csdn.net/weixin_44969644/article/details/144267344