西门子S7-1200 PLC控制步进电机 MD-4240-PN (番外) 仿SinaPos (FB284) 块编写

一、前言

本文是本系列 《西门子S7-1200PLC 控制步进电机 MD-4240-PN》的番外篇—— 仿SinaPos (FB284) 块编写。

MD-4240-PN是一款支持profinet 总线的一体式闭环步进电机,还不了解MD-4240-PN的可以翻看我往期的文章,有详细的从开箱到使用;这一篇番外是记录我为了更好的使用它而参考SinaPos仿写了一个操作逻辑类似的块。我为什么要写这个块? 原因是SinaPos的接口简单,易上手,很多项目都是基于它来写的,使用起来也更习惯,它具有和SinaPos相似的管脚,并且我会开放出来给大家使用。

 原创博主博客

小小小小小6-优快云博客

往期的文章可以看

西门子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》找到我的优快云博客

优快云博主:小小小小小6-优快云博客

四、结尾

本番外篇主要是将了我仿SinaPos(FB284)做了一个块,在使用上更熟悉,能够快速上手。1200控制的系列到这里就差不多完结了。我准备开坑一个新系列,用S7-200 SMART来控制MD-4240-PN,并且把这个块也移植到S7-200 SMART上使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值