技术论坛

无限次调用,无限个参数,的库程序解决参考。

作者 主题
至圣

经验值: 67548
发帖数: 14783
精华帖: 100
主题:无限次调用,无限个参数,的库程序解决参考。


只看楼主 楼主 2015-01-26 11:24:30
下面给出一个程序,包含三大种参数传送方式的表现形式。供参考。
其中“间接寻址”子程序结尾,略微提到了一个结合另外两种形式的最佳方案。
程序实际表现内容为,4个字型参数相加得到一个和的结果。(程序功能仅作为载体,带出话题而随便确定的)
使用了三种形式传递四个参数到子程序里面计算。然后传出一个得数。
第一种是常规的IN OUT参数传递。
第二种是库内存传递。
第三种是纯间接寻址的传递。间接寻址里面又隐含着两种方式的指针计算。两种方式各有千秋。这里最后就提到了一种结合库内存形式的优化。但程序上明没有展示这种效果。

点击此处查看附件

这个程序,直接把扩展名改成mwp,就可以用编程软件打开。或者用smart软件打开。可以下载在两种plc里面运行。
 
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 67548
发帖数: 14783
精华帖: 100
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 楼主 1楼 2015-02-17 11:59:44
差点捞不上来了。
 
以下网友喜欢您的帖子:

  
游民

经验值: 63
发帖数: 20
精华帖: 0
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 2楼 2015-02-18 09:46:11
问您一个问题,比我我开中断程序后,里面有一个q0.0输出,当我分离中断关中断后,q0.0会保持常亮,怎么回事?
 
以下网友喜欢您的帖子:

  
至圣

经验值: 43587
发帖数: 15780
精华帖: 61
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 3楼 2015-02-19 18:31:19
q输出点是保持型的,你可以再断开中断前,先复位q点输出,然后在断开中断。
活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
奇侠

经验值: 5205
发帖数: 1315
精华帖: 41
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 4楼 2015-04-30 19:19:03
以下是引用瞌睡的王子在2015-02-18 09:46:11的发言 >2楼:问您一个问题,比我我开中断程序后,里面有一个q0.0输出,当我分离中断关中断后,q0.0会保持常亮,怎么回事?
嘿嘿,主程序没扫描到q0.0,其状态不会发生改变。
弱者道之用。
以下网友喜欢您的帖子:

  
新手

经验值: 44
发帖数: 2
精华帖: 0
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 5楼 2015-06-12 12:20:53
附件里面的压缩包已经损坏,根本打不开
 
以下网友喜欢您的帖子:

  
游士

经验值: 287
发帖数: 63
精华帖: 1
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 6楼 2015-07-01 15:22:57
大师好,求指点迷津,输送带加编码器后剔除不良品程序设计,QQ328233863,大师指点下!




 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 7楼 2015-07-02 07:07:08
楼主的附件下不了可否再传以赐教?
工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 8楼 2015-07-02 07:08:30
楼主的附件下不了可否再传以赐教?
工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 67548
发帖数: 14783
精华帖: 100
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 楼主 9楼 2015-07-02 10:17:58
可以啊。
下载完了之后不要解压,直接把扩展名改了。就行了。


这程序是我刚下的。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67548
发帖数: 14783
精华帖: 100
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 楼主 10楼 2015-07-02 10:27:15
用土办法吧。但是土办法的话可能导入会不成功。经常有很多空格需要删除等等。对语句规则不熟的话你根本没有办法导入。
最好还是直接下载。
分割线==================================以下一行开始复制导入
ORGANIZATION_BLOCK 主程序:OB1
TITLE=
BEGIN
Network 1 // 这是常规的把4个数作为in参数带入子程序。
// 网络注释
LD SM0.0
MOVW 1, VW0
MOVW 2, VW2
MOVW 3, VW4
MOVW 4, VW6
CALL SBR2, VW0, VW2, VW4, VW6, VW8
Network 2 // 这是把参数写到库内存上作为参数。参数属于in还是out,就视符程序的逻辑。
LD SM0.0
MOVW 1, VW10
MOVW 2, VW12
MOVW 3, VW14
MOVW 4, VW16
CALL SBR1
Network 3 // 这里你自己在状态图上监控vw20到vw28试试。
LD SM0.0
CALL SBR3, 20
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK 库传递:SBR1
TITLE=程序使用库内存作为参数的出入口,计算4个字的和。
// 库内存起始地址可以在符号表里面,或者从库内存对话框里面安排。
// 这中方法的参数个数没有多少限制,仅仅是plc记忆空间的限制。它不可以多次调用这个子程序。因为每次调用的库程序都是使用相同一套参数。对多次调用来说毫无意义。这类型的库程序只适合通讯口,高速计数器,高速脉冲等等的必然唯一的对象使用。
BEGIN
Network 1
// 程序段注释
LD SM0.0
MOVW VW12, VW18
+I VW10, VW18
+I VW14, VW18
+I VW16, VW18

END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 常规:SBR2
TITLE=这种参数的进出口方式是最平常的in out形式。
// 无法超过16个输入输出参数的就是这样的结构。任何次数的调用只收到记忆空间的限制。
// 不多说了。
VAR_INPUT
加数1:WORD;
加数2:WORD;
加数3:WORD;
加数4:WORD;
END_VAR
VAR_OUTPUT
和:WORD;
END_VAR
BEGIN
Network 1
// 程序段注释
LD SM0.0
MOVW LW2, LW8
+I LW0, LW8
+I LW4, LW8
+I LW6, LW8

Network 2 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 间接寻址:SBR3
TITLE=程序使用表的概念放置所有参与运算的任何值。用户在运算之前把对应的参数填写入表。调用时只需要填写表头偏移值,便可自动拾取表中对应参数进行计算。
// 这种结构,调用次数和参数个数,仅受到plc记忆空间的限制,没有实际次数的限制。
VAR_INPUT
表头:WORD;
END_VAR
VAR
表头指针:DWORD;
加数1针:DWORD;
加数2针:DWORD;
临时值1:WORD;
临时值2:DWORD;
END_VAR
BEGIN
Network 1 // 确定参数放置的位置。 现在解释一下计划中的表的成分。 表头 和 字 加数1 字 加数2 字 加数3 字 加数4 字 确立一个指针指向表头,后面的所有参数都依照这个表头安排参数自身的位置。
// 网络注释
LD SM0.0
MOVW 16#0800, LW2
MOVW LW0, LW4
Network 2 // 本例采用两个方式确立参数的具体位置。
Network 3 // 确立加数1和加数2的位置,把位置写进去TEMP,备用。 由于这两个参数都是字型参数,必然安排在表头参数后面的字上面,所以表头加2就是下一个参数,加4就是再下一个参数。两个加数指针可以在后面的计算过程中直接使用。
// 网络注释
LD SM0.0
MOVD LD2, LD6
+D +2, LD6
MOVD LD2, LD10
+D +4, LD10
Network 4 // 加数3和加数4采用另外一种方式确立,供各位在两种方式上面进行对比。
Network 5 // 这里开始计算加法。中间结果暂时放置在LW14当中备用。
LD SM0.0
MOVW *LD6, LW14
+I *LD10, LW14
Network 6 // 这是现场确立加数3。位置结果暂时放置在LD16当中备用。
LD SM0.0
MOVD LD2, LD16
+D +6, LD16
Network 7 // 刚才备用的中间值,加上,备用的加数3的指针对象,放置在LW14当中。 现在LW14已经是3个加数的和了。
LD SM0.0
+I *LD16, LW14
Network 8 // 这是现场确立加数4。位置结果暂时放置在LD16当中备用。 这里由于是暂时存放,所以使用了上面加数3使用过的暂存位置。 以后还有多少个加数,都可以再次计算指针。重复使用暂存位置,不会再增加占用L空间。
LD SM0.0
MOVD LD2, LD16
+D +8, LD16
Network 9 // 这里就是把加数4累加的指令。这个指令的两个IN值和刚才计算加数3的时候是一模一样的。可是现在的两个IN已经不是刚才的IN了。 最后把结果传到表头。
LD SM0.0
MOVW LW14, *LD2
+I *LD16, *LD2
Network 10 // 上述两种确立参数位置的方式体现了两种不同的风格。 1,利用固定的L保存参数的位置的指针,可以在后面的计算当中直接使用指针进行计算。但是指针需要占用L来保存。如上面的(加数1针,加数2针)两个变量。 2,当需要用到某参数的时候才计算指针,随用随算,可以节省L变量的使用。但是每次使用某参数都要重复计算一次,即使是相同的参数也要重算。占用程序运行时间。
Network 11 // 这里可以延伸一些做法,扩展L区TEMP的空间。 就是把上面安排(加数1针)(加数2针)的地址改成库内存。 便可以腾出很多L空间,而又有大量的库内存空间装载指针。大量的指针都可以一次计算之后以后全部直读。 到此为止。 这就是任意个数参数,任意调用次数,库程序的完美解决方案。
END_SUBROUTINE_BLOCK
 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 11楼 2015-07-02 13:52:14
库内存消耗V区,每一类似结构控制对象需要一片V区存储计算结果,N次调用就需要N片,楼主的做法需要编程者注意安排V区数据结构和随着调用而增加的实际消耗量,以确保在CPU的V区容纳范围之内。而这在300,400,1200系列中是以编程软件自动计算并监控消耗量的FB背景数据块的形式实现的。200的子程序和库更接近上述系列的FC。另外子程序嵌套调用子程序也会为V内存的消耗监控而进一步占用编程者的精力,300则是以多重背景数据块来实现内存消耗自动管理的。楼主的做法我实际使用过就是那个输入延时输出的库。
工控爱好者
以下网友喜欢您的帖子:

  
游侠

经验值: 471
发帖数: 24
精华帖: 0
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 12楼 2015-07-24 10:21:35
厉害 头回见到这种用法
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67548
发帖数: 14783
精华帖: 100
回复:938


只看楼主 楼主 13楼 2015-08-11 08:21:08

11楼可否详述一下你最后提到过的那个库?


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:无限次调用,无限个参数,的库程序解决参考。


只看楼主 14楼 2015-08-11 10:56:28

找到了,好像就是这个贴http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=3&a_id=839675&s_id=1&num=15#anch


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

  
至圣

经验值: 67548
发帖数: 14783
精华帖: 100
回复:938


只看楼主 楼主 15楼 2015-08-11 11:34:03

哦!谢谢!想起来了。

当时我程序上出现这么一个错误还一直记在心上。如今也仍然被这个错误困扰着。其实我不知道什么时候已经修改过了这个错误了,我自己都忘记了,老想着我这程序是有个错误的,在哪里呢?我修改好了没有呢?我也曾经找过这个指正我的帖子,可是一直没有找到。正是看到了这个贴我才肯定自己已经修改过了这个错误。

一个心结。一个心结。解开了。解开了。


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
无限次调用,无限个参数,的库程序解决参考。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。