技术论坛

【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作

作者 主题
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
主题:【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 楼主 2021-11-17 16:07:52

就算看帖的小伙伴不考虑什么标准化编程,能突破子程序的一些限制也是好的。

先说说标准化程序的要求:对象化编程,程序中不使用M,T,C,子程序内逻辑程序不可出现全局变量,更多的规则以后再说,先解决最基本问题。

我们首先看看200子程序有哪些限制:

1、最多128个子程序

这个限制是说你可以有128个子程序,不是调用限制,所以调用多少次都可以,受PLC资源限制。这个限制没法破。

2、子程序只能有16个脚

为什么会有这个限制呢?临时变量一共64个字节,如果脚上都是最大的双字数据类型,64除以4等于16,所以就有了这个16脚限制。注意最后四个字节的临时变量系统保留。咱也不知道干啥用了。那么这个限制如何破解呢,比如说把bool数据类型的变量整合成byte字节型的变量给子程序,比如连接的多个连续V区参数以指针的方式传给子程序。

3、最多嵌套8层

这个没啥说的,没法破,但一般情况下够用了。

4、带有计数器和定时器的子程序无法多次调用

高速计数器未试验过,先排除。普通的计数器其实就是整数加,整数减,破解无压力。定时器,我们用时间间隔定时器BGN_ITIME和CAL_ITIME指令实现毫秒级计时,多次调用无问题,破解无压力。

5、子程序内不能使用沿指令

虽然不能使用沿使令,但是通过梯形图逻辑可以产生沿信号,使用不受限

6、置位,复位指令使用受限

这个破解没问题。


更多的限制网友提一提,我们看看能不能破解。


200子程序多次调用总是出问题是因为什么的呢,200的子程序运行起来就是没有静态区的FC,问题就出在temp区,因为temp不会保存啊,所以我们就要划出V区来保存temp的数据,像建立FB背影数据块那样。这部分背景数区上电时清零,子程序内需要断电保持的数据要记得用INOUT脚引出。工作起来也简单,进入子程序后先将V区数据复制到temp,子程序逻辑运行完,把temp里的数据复制回V区。有伙伴会说,这不是就是带库的子程序嘛,应该是不同的。采用标准化方式的子程序必须全部无条件调用,就是每次扫描都得运行。


这里给出简单的例程:

例程中有嵌套,有标准化定时器、标准化计数器,子程序多次调用,沿信号的生成和使用




【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程

https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1732419&b_id=64&s_id=0&num=2#anch

下面是最新程序的改进:

仅用一个全局指针变量用最少的计算量和程序量实现背景数据的索引,并且用SMD2040来实现,不再有V区全局变量,实现程序中无全局变量的要求。关于最后字节的获取,在OB1最后的程序段,绝对的画龙点睛。最新程序定时器增加了过程值,增加了单按钮控制启停的对象,还新增了正**作的设备对象及其它。

【S7-200 Smart开源标准化编程】modbus rtu终极封装-单条msg指令多任务读轮询写优先掉站跳过掉站恢复

最新的程序也在下面的这个帖子里

https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1760741&b_id=64&s_id=0&num=29#anch



13478405725
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1730780&b_id=64&s_id=0&num=0

奇侠

经验值: 8530
发帖数: 203
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 1楼 2021-11-17 16:24:39

感谢分享   


学无止境
以下网友喜欢您的帖子:

  
奇侠

经验值: 5057
发帖数: 453
精华帖: 3
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 2楼 2021-11-17 16:46:01

先下载学习下,感谢楼主分享


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8877
发帖数: 2002
精华帖: 12
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 3楼 2021-11-17 17:01:34

厉害,如果是我早选择1200了,才不愿意在200上再花精力搞标准化呢。


污水处理自控工程师,简称污师。
以下网友喜欢您的帖子:

  
至圣

经验值: 24344
发帖数: 4846
精华帖: 6
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 4楼 2021-11-17 18:32:19

 有呼吁更有干货,更有号召力!


谨慎低调
以下网友喜欢您的帖子:

  
至圣

经验值: 18416
发帖数: 2409
精华帖: 1
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 5楼 2021-11-17 19:26:39

这个还是取决于设计单位


 
以下网友喜欢您的帖子:

  
至圣

经验值: 12737
发帖数: 1586
精华帖: 1
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 6楼 2021-11-18 00:10:23

谢谢楼主分享,下载学习


努力学习西门子
以下网友喜欢您的帖子:

  
侠客

经验值: 849
发帖数: 90
精华帖: 1
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 7楼 2021-11-18 00:15:04

太好了,就是在找这个呢,感谢分享!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10588
发帖数: 848
精华帖: 9
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 8楼 2021-11-18 07:59:46

一直想试试标准化


学如逆水行舟,不进则退! wwhoho@163.com
以下网友喜欢您的帖子:

  
至圣

经验值: 76239
发帖数: 19148
精华帖: 378
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 9楼 2021-11-18 08:20:42

呵呵,大失所望,不接地气。


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
至圣

经验值: 67550
发帖数: 14784
精华帖: 100
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 10楼 2021-11-18 08:25:37

ac0123与其保存到最后四个LD,为何不在程序里直接使用某LD?莫非运行AC的速度比LD快很多?可是也说不过去啊。8次的LD和AC之间的时间也不少。除非程序运行非常多次的AC,显得这8次仍然是值得的。可这两个程序也不符合这个观点。

聊聊,继续聊聊。我是想不到为什么。

我继续消化消化


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 楼主 11楼 2021-11-18 08:35:54
以下是引用芳季在2021-11-18 08:25:37的发言 >10楼

mov 4000到ac3这里为什么不需要&符号?计时和计数这两个子程序。

ac0123与其保存到最后四个LD,为何不在程序里直接使用某LD?莫非运行AC的速度比LD快很多?可是也说不过去啊。8次的LD和AC之间的时间也不少。除非程序运行非常多次的AC,显得这8次仍然是值得的。可这两个程序也不符合这个观点。

聊聊,继续聊聊。我是想不到为什么。

mov 4000到ac3这里为什么不需要&符号?计时和计数这两个子程序。

答:因为移动的是指针,移动的不是指针所指的数据

ac0123与其保存到最后四个LD,为何不在程序里直接使用某LD?

答:因为共享出的是标准化程序的一部分,最后四个LD不太常用所以用来暂存AC.

暂存AC和恢复AC是基于子程序嵌套考虑,上层子程序使用AC的话不受影响


13478405725
以下网友喜欢您的帖子:

  
至圣

经验值: 67550
发帖数: 14784
精华帖: 100
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 12楼 2021-11-18 08:53:52

第一个问题我后来想到了。4000本来就是一个指针了。

后面

问题是你现在最后四个Ld也是临时使用,AC也是临时使用。运行过程中暂存一下AC的值就恢复回去了。要是我简直就不使用AC而直接使用最后四个LD,那又怎样?

你在暂存AC的时候也没问过什么程序也使用过这最后四个LD啊。

我的观点就是我不使用AC,你其他的程序怎么用AC,与我河水不犯井水。

我心里对标准化概念很弱。如果程序标准到里面什么东西都只使用AC运行,那么这事情我是意想不到的。

不懂就问。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 楼主 13楼 2021-11-18 08:59:46
以下是引用芳季在2021-11-18 08:53:52的发言 >12楼

问题是你现在最后四个Ld也是临时使用,AC也是临时使用。运行过程中暂存一下AC的值就恢复回去了。要是我简直就不使用AC而直接使用最后四个LD,那又怎样?

你在暂存AC的时候也没问过什么程序也使用过这最后四个LD啊。

我的观点就是我不使用AC,你其他的程序怎么用AC,与我河水不犯井水。

我心里对标准化概念很弱。如果程序标准到里面什么东西都只使用AC运行,那么这事情我是意想不到的。

不懂就问。

你看到的程序是小程序。当有时程序太大时,L变量会不够用,所以应尽可能的使用AC,原则上不需要存到V区的L,都用AC,这个可以节省V区的占用


13478405725
以下网友喜欢您的帖子:

  
侠圣

经验值: 2508
发帖数: 296
精华帖: 1
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 14楼 2021-11-18 09:03:06

小菜也发表下看了程序之后的观点:这个标准化一般吧,对大佬来说,有点简单,或者说有点过于为标准化而标准化,对小菜来说,又有点复杂,有点不上不下;

所谓的标准化,不是在某个行业干了许久之后,回过头发现,唉,一直在重复同样动作啊,完全可以把一些流程精简优化,作为比较通用的功能吗,这样以后就不用简单动作重复八百遍了;

当然,那些动不动就说要颠覆某个行业,如“马保国”之流,要一招标准化用于所有行业的,不是骗子,就是妄人,还真的以为自己比别人多吃了几年干饭,刚接触某行,就以为自己那点小骗术能给人家颠覆掉,也就坑下病急投医的人吧!


千万不要和杠精抬杠,因为他会把你拉低到他的水平,然后再恶心你
以下网友喜欢您的帖子:

  
至圣

经验值: 67550
发帖数: 14784
精华帖: 100
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 15楼 2021-11-18 10:02:25
以下是引用不欲勿施13478405725在2021-11-18 08:59:46的发言 >13楼

你看到的程序是小程序。当有时程序太大时,L变量会不够用,所以应尽可能的使用AC,原则上不需要存到V区的L,都用AC,这个可以节省V区的占用

以下是引用芳季在2021-11-18 08:53:52的发言 >12楼:问题是你现在最后四...

引用12楼详细内容:

问题是你现在最后四个Ld也是临时使用,AC也是临时使用。运行过程中暂存一下AC的值就恢复回去了。要是我简直就不使用AC而直接使用最后四个LD,那又怎样?

你在暂存AC的时候也没问过什么程序也使用过这最后四个LD啊。

我的观点就是我不使用AC,你其他的程序怎么用AC,与我河水不犯井水。

我心里对标准化概念很弱。如果程序标准到里面什么东西都只使用AC运行,那么这事情我是意想不到的。

不懂就问。

不。我不同意这个观点。

L区有多忙?忙得连4个AC都放不下的时候你往哪找地方暂存AC?

既然你有地方暂存AC那何苦搬运一次?直接用这地方代替AC,要是我只需要3个D的空间就完事了,何苦用4个D的地方放置AC?

这是我从21x的时候就开始不明白AC存在的意义。很久很久了。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
推荐帖


只看楼主 楼主 16楼 2021-11-18 10:15:06
以下是引用芳季在2021-11-18 10:02:25的发言 >15楼

不。我不同意这个观点。

L区有多忙?忙得连4个AC都放不下的时候你往哪找地方暂存AC?

既然你有地方暂存AC那何苦搬运一次?直接用这地方代替AC,要是我只需要3个D的空间就完事了,何苦用4个D的地方放置AC?

这是我从21x的时候就开始不明白AC存在的意义。很久很久了。

以下是引用不欲勿施13478405725在2021-11-18 08:59:46的发言 >13楼:你看到的程序是小程...

引用13楼详细内容:

你看到的程序是小程序。当有时程序太大时,L变量会不够用,所以应尽可能的使用AC,原则上不需要存到V区的L,都用AC,这个可以节省V区的占用

以下是引用芳季在2021-11-18 08:53:52的发言 >12楼:问题是你现在最后四...

引用12楼详细内容:

问题是你现在最后四个Ld也是临时使用,AC也是临时使用。运行过程中暂存一下AC的值就恢复回去了。要是我简直就不使用AC而直接使用最后四个LD,那又怎样?

你在暂存AC的时候也没问过什么程序也使用过这最后四个LD啊。

我的观点就是我不使用AC,你其他的程序怎么用AC,与我河水不犯井水。

我心里对标准化概念很弱。如果程序标准到里面什么东西都只使用AC运行,那么这事情我是意想不到的。

不懂就问。

不同意也没关系,或许只有做了才知道妙处。为了子程序嵌套不影响上层程序的值。因为不使用全局变量,做为4个累加器对于标准化编程来说是挺可贵的,因为一但遇到L不够用,有4个双字可以用还是非常好的。杀猪杀屁股,各有各杀法。您可以按自己的想法做。AC的应用在这里做为一种方式存在而已。


13478405725
以下网友喜欢您的帖子:

  
侠圣

经验值: 4872
发帖数: 741
精华帖: 10
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作


只看楼主 17楼 2021-11-18 11:41:24

好帖,谢谢分享。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作


只看楼主 18楼 2021-11-18 11:44:53

     被标准化编程的字眼吸引进来了。标准化很难。一个程序块的输入输出界定清楚都不是那么容易。楼主的子程序中的temp变量存储的是子程序运行的过程数据,由于这些数据需要保存至少1个以上的扫描周期是需要存储到V,M区中的,楼主因此采用了进入子程序后立即把这些数据由预先指定的V区搬入L区,子程序执行结束再搬回原来的V区的办法,其实这种操作就是子程序IN_OUT类型变量的操作,只不过后者是编程者在接口上给他分配存储区。我经历过的是进入子程序后过程数据先搬入特定的V区再执行子程序,子程序执行结束再搬回原来的V区的办法,因为子程序中L区执行起来速度是低于V区的,而这特定的V区可以用库存储区进行一次分配后就可以重复调用这含V的子程序。

     另外楼主的子程序L800Example第一个网络中VD4000=VD4000+9是不是用早了点,嵌套在里面的定时和计数子程序也会做类似的操作。V区的分配其实还是依赖编程者手工分配,这与FB的背景数据区自动分配不同的。但已经是向模块化编程前进的一大步了为楼主点个赞。


工控爱好者
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作


只看楼主 楼主 19楼 2021-11-18 11:54:06
以下是引用winter938在2021-11-18 11:44:53的发言 >18楼

     被标准化编程的字眼吸引进来了。标准化很难。一个程序块的输入输出界定清楚都不是那么容易。楼主的子程序中的temp变量存储的是子程序运行的过程数据,由于这些数据需要保存至少1个以上的扫描周期是需要存储到V,M区中的,楼主因此采用了进入子程序后立即把这些数据由预先指定的V区搬入L区,子程序执行结束再搬回原来的V区的办法,其实这种操作就是子程序IN_OUT类型变量的操作,只不过后者是编程者在接口上给他分配存储区。我经历过的是进入子程序后过程数据先搬入特定的V区再执行子程序,子程序执行结束再搬回原来的V区的办法,因为子程序中L区执行起来速度是低于V区的,而这特定的V区可以用库存储区进行一次分配后就可以重复调用这含V的子程序。

     另外楼主的子程序L800Example第一个网络中VD4000=VD4000+9是不是用早了点,嵌套在里面的定时和计数子程序也会做类似的操作。V区的分配其实还是依赖编程者手工分配,这与FB的背景数据区自动分配不同的。但已经是向模块化编程前进的一大步了为楼主点个赞。

另外楼主的子程序L800Example第一个网络中VD4000=VD4000+9是不是用早了点

答:一点也不早,这里加完增量后,此子程序就可以调用下一级子程序了。如果等到此子程序快运行完了再加增量,那此子程序调用下级子程序时该咋办。


关于手工分配,做好的对象程序只分配一次即可,之后多次调用会自动加就不必考虑了。在FB的静态区和临时区建立变量不也得手工敲嘛


13478405725
以下网友喜欢您的帖子:

  
收起
【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。