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

芳季

西门子1847工业学习平台

  • 帖子

    15507
  • 精华

    101
  • 被关注

    961

论坛等级:至圣

注册时间:2007-08-03

钻石 钻石 如何晋级?

发布于 2015-07-02 10:27:15

10楼

用土办法吧。但是土办法的话可能导入会不成功。经常有很多空格需要删除等等。对语句规则不熟的话你根本没有办法导入。
最好还是直接下载。
分割线==================================以下一行开始复制导入
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
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。