PLC论坛-全力打造可编程控制器专业技术论坛

 找回密码
 注册哦

QQ登录

只需一步,快速开始

微信扫码登录

查看: 119|回复: 0

[西门子] 一文总结200SMART PLC子程序里的那些“坑”,新人注意避“...

[复制链接]
发表于 2024-7-11 17:17:24 | 显示全部楼层 |阅读模式
S7-200 SMART是西门子公司给我国量身定制的一款高性价比小型 PLC,该PLC在我国也是深受广大工程师的喜爱,应用在各行各业的小型项目。同时该款PLC对于初学者来讲也算是个性价比不错的“大玩具”,很多人学习PLC编程都是从款PLC入门的,我也同样如此,相较于别的品牌的PLC,我很喜欢它里面的这个子程序这个程序组织单元的设计,这个设计能让我们更好的组织程序结构,便于调试和阅读。
200SMART PLC


但是在初学这款PLC的时候关于子程序真踩过不少的“坑”,并且有些“坑”还比较隐蔽,对于初学者可能还不容易找到问题,其实这些“坑”在200SMART编程手册中都能找到相应的答案,但是就那么一句话,大家可能都不太注意,那么今天我就来总结一下关于这款PLC里面子程序的一些“坑”,给后面的学习者提供一些参考,如果有一天你写的子程序运行时出现了异常并且找不到答案的时候,就回头翻翻这篇文章,或许能找到答案顺利解决问题,当真如此,这篇文章也算是体现它的价值了。

  • 第一“坑” :200SMART子程序数量限制

描述:200SMART子程序数量是有限制的最多128个,编号为0-127,并且其嵌套深度也是有限制的,所谓的嵌套就是1号程序调用2号子程序,而2号子程序又调用了3号子程序,如此套娃行为,其深度在主程序中最多8层,在中断程序中最多4层。以上技术参数一般够用,但是我也碰到过调用超过限制的,请大家注意。



200SMART样本中子程序数量限制


解决方法:优化程序结构,使程序的数量和嵌套深度不超过上述限制。

  • 第二“坑” :子程序接口输入输出数量限制
描述:子程序接口输入(IN)、输入输出(IN_OUT)或输出(OUT) 接口数量不能超过13个,并且子程序L区容量不能超过60字节,否则就会变红报错。
子程序接口数量超过16个报错


解决办法:优化数据结构,以输入为例,把多个输入BOOL数据类型合并成一个WORD类型即可节省大量输入接口。如果输入是多个BYTE、WORD或者DWORD类型,可使用间接寻址的方式进行参数传递即可节省大量输入接口。

接口使用间接寻址传递参数


  • 第三“坑” :  触点必须位于输出指令之前

描述:子程序无条件调用时会出现编译错误,提示“触点必须位于输出指令之前”。



子程序直接连接左母线报错


解决办法:对于子程序无条件调用,200SMART不让直接将子程序连接到左侧母线,咱也不知到为啥,只能按照人家要求来,如果无条件调用子程序可以使用SM0.0作为使能条件即可。



子程序无条件调用要使用SM0.0


  • 第四“坑”:子程序已经不激活了,但是子程序的输出没有复位

描述:子程序已经不激活了,但是子程序的输出(包括OUT和IN_OUT类型)没有复位。以下面子程序SBR_0为例,SBR_0将一个IN类型的布尔变量IN1直接连接到一个OUT布尔变量OUT1。在主程序中使用M0.0条件调用SBR_0,当M0.0为‘1’时,子程序执行,CPU_输入0有信号时,CPU_输出0有信号输出。此时将M0.0复位,则子程序不再执行,输出OUT1保持子程序最后一次执行的状态,不会被自动复位。



演示子程序1


解决办法:当子程序不被调用时如果希望输出点复位,一定要在子程序外部有相应的程序对子程序的输出引脚上挂的实际输出点如上图所示的CPU_输出0进行复位操作。

  • 第五“坑”:使用TEMP或者OUT时子程序输出不正常

描述:使用TEMP或者OUT时子程序输出不正常,如下图子程序SBR_0,该子程序的接口声明一个INT类型的IN变量‘Pressure’和一个BOOL类型的OUT变量‘OPEN’,子程序中只有一个程序段,在程序段1中编写当输入Pressure数值大于500时将输出OPEN置位,实际测试中当输入Pressure达到过500时,输出OPEN被置位;但当输入Pressure从未达到过500时,输出OPEN可能是1,也可能是0,原因是子程序的OUT变量是一个局部变量,仅在本次调用时有效,且每次获取到的局部变量资源有一定的随机性,有可能已经具有一个随机的数据存储在该局部变量地址中,导致其输出异常。不仅是OUT变量TEMP变量也同样如此。



演示子程序2


解决办法:子程序中的OUT或TEMP变量不会被初始化,因此在使用时一定要先赋值后使用,请牢记这句话并且写程序时要遵守这个规定,否则即使你写出来的程序是能正常运行的,从逻辑上来说也是不严密的。另一种比较简单的方法是直接使用IN_OUT类型的变量直接可以避免这个问题。

  • 第六“坑”:子程序中有上升沿、下降沿、计数器和定时器指令异常

描述:当子程序中有上升沿、下降沿、计数器、定时器指令时一定要注意,该子程序在同一个周期内单次调用是没问题,但是多次调用时程序就会出现异常,这是因为沿信号都有自己的沿存储位,当在同一个扫描周期内多次调用子程序时系统无法分配给每一个子程序的沿存储位,因此导致造成沿信号互相干扰造成程序异常,具体参考我这篇文章:

电工想学会PLC?先搞懂上升沿、下降沿!这篇文章带你搞清楚它!

而对于计数器和定时器来说相同编号的定时器或计数器被多个子程序使用,且同一扫描周期内这些子程序有两个或者以上被调用,则定时器或者计数器资源会因重叠使用而相互影响,造成程序逻辑等方面的错误。



子程序中含有上升沿且非单次调用




子程序中含有上升沿且非单次调用执行结果异常


解决办法:自己编写上升沿、下降沿、定时器子程序并将其保存为库文件,在子程序中使用且该子程序在同一扫描周期被多次调用时直接使用即可,而对于计数器则可以使用整数的自增等指令替代即可。

.第七“坑”:数据块并不是ST语言也不是SCL语言
     数据块并不是ST语言也不是SCL语言  ,说白了就是初始化V寄存器的一个参数表,虽然看起来像,高级语言,其实很鸡肋!也因此误导了不少小白!

好了,关于200SMART PLC子程序里面的那些“坑”今天就给大家聊到这里,后面我会详细讲解下关于OUT和TEMP使用注意事项,并且编写一下沿指令和定时器指令子程序,希望可以给大家带来帮助。另外我的主页中有很多关于PLC基础知识的文章和视频,都是一些学习PLC必要的知识,同时考虑到初学者初次理解困难,全部采用大白话讲解的,有兴趣的可以去看下,希望这些文章和视频够帮到大家,如果还有其它关于电工和PLC的问题,可以下方留言讨论,谢谢大家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则

QQ|小黑屋|手机版|Archiver|PLC技术网-PLC论坛 ( 粤ICP备17165530号 )|网站地图

GMT+8, 2024-8-14 07:17 , Processed in 0.047470 second(s), 26 queries .

快速回复 返回顶部 返回列表