求s7-200带参数子程序调用实例 点击:9534 | 回复:17



爱在远方

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:11帖 | 86回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2005年5月20日
发表于:2008-05-15 11:34:26
楼主

一个控制系统有几十个相同的部分,只是输入输出(多个)各不相同,我想写一个带参数的子程序,在主程序中分别调用同一个子程序,只是不懂如何在主程序中调用子程序的时候把输入输出值赋给子程序对应的参数,看了论坛里面的一些这方面的文章,不是无参调用就是写了很多文字,还是不太明白,那位高手可以给一个这方面的的实例吗?




爱在远方

  • 精华:0帖
  • 求助:1帖
  • 帖子:11帖 | 86回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2005年5月20日
发表于:2008-05-20 08:26:57
1楼

没人给个回应吗?自己顶一下

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-20 08:46:38
2楼
子程序中的输入输出参数不直接使用I和Q,采用V或M的位。当调用某个子程序的同时,把对应的IB(或IW、ID)MOV至对应的VB(VW)或MB(MW),把对应输出的VB、MB(或VW、MW)MOV至对应的QB或QM。

zhongdingjidian

  • 精华:3帖
  • 求助:0帖
  • 帖子:167帖 | 1364回
  • 年度积分:0
  • 历史总积分:2372
  • 注册:2003年5月29日
发表于:2008-05-20 09:50:53
3楼
楼上说的有道理,可以实现的

shijian

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 85回
  • 年度积分:0
  • 历史总积分:282
  • 注册:2005年4月12日
发表于:2008-05-20 22:18:11
4楼
2楼所说的方法只能实现这些相同的部分不同时动作的工况下

shijian

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 85回
  • 年度积分:0
  • 历史总积分:282
  • 注册:2005年4月12日
发表于:2008-05-20 22:20:30
5楼
可以从ACC这方面考虑,就象300PLC里调用FC、FB那样的效果

爱在远方

  • 精华:0帖
  • 求助:1帖
  • 帖子:11帖 | 86回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2005年5月20日
发表于:2008-05-21 10:00:19
6楼

老愚者可否给一个简单的例子?在300plc里面如FC或者FB是另一个程序框,可以定义输入输出参数,200里面怎么做?新手阿,大家原谅这么幼稚的问题。

楼上说的是,我也想象300plc调用FC/FB那样的,直接一个功能块,比较直观/简单,不知道如何实现?

龙唐西门道

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 301回
  • 年度积分:1
  • 历史总积分:787
  • 注册:2004年2月26日
发表于:2008-05-21 16:49:11
7楼

200里如果想用300里那种FB、FC的功能很难实现。建议你还是ctrl+C再ctrl+V吧。2楼的说的不怎么明白,没这么用过,或许可以行得通。自己试试吧!!!

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-21 23:42:15
8楼

TITLE=程序注释 Network 1 // 每个周期控制一个对象, 这里共控制3个对象,子程序0公用 // 网络注释 LD SM0.0 INCB VB500 Network 2 // V10.0-V10.2是子程序0的输入,V20.0-V20.2是子程序0的输出 LD M30.1 AB= VB500, 1 LPS A I0.0 = V10.0 LRD A I0.1 = V10.1 LRD A I0.2 = V10.2 LPP CALL SBR0 Network 3 LD M30.1 LPS A V20.0 S Q0.0, 1 LRD A V20.1 S Q0.1, 1 LPP A V20.2 S Q0.2, 1 Network 4 LDN M30.1 R Q0.0, 3 Network 5 // 第二个对象的输入是I0.3-I0.5, 输出是Q0.3-Q0.5 M30.2是第二个对象的能使 LD M30.2 AB= VB500, 2 LPS A I0.3 = V10.0 LRD A I0.4 = V10.1 LRD A I0.5 = V10.2 LPP CALL SBR0 Network 6 LD M30.2 LPS A V20.0 S Q0.3, 1 LRD A V20.1 S Q0.4, 1 LPP A V20.2 S Q0.5, 1 Network 7 LDN M30.2 R Q0.3, 3 Network 8 // 第三个对象的输入是I0.6-I1.0, 输出是Q0.6-Q1.0 M30.3是第三个对象的能使 LD M30.3 AB= VB500, 3 LPS A I0.6 = V10.0 LRD A I0.7 = V10.1 LRD A I1.0 = V10.2 LPP CALL SBR0 Network 9 LD M30.3 LPS A V20.0 S Q0.6, 1 LRD A V20.1 S Q0.7, 1 LPP A V20.2 S Q1.0, 1 Network 10 LDN M30.3 R Q0.6, 3 Network 11 LDB>= VB500, 3 MOVB 0, VB500

因为举例简单,所以不采用写字节或字,而采用写位。

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-21 23:51:06
9楼

TITLE=程序注释

Network 1 // 每个周期控制一个对象, 这里共控制3个对象,子程序0公用

  LD SM0.0

INCB VB500

Network 2 // V10.0-V10.2是子程序0的输入,V20.0-V20.2是子程序0的输出

LD M30.1

AB= VB500, 1

LPS

A I0.0

= V10.0

LRD

A I0.1

= V10.1

LRD

A I0.2

= V10.2

LPP

CALL SBR0

Network 3

LD M30.1

  LPS

A V20.0

S Q0.0, 1

LRD

A V20.1

S Q0.1, 1

LPP

A V20.2

S Q0.2, 1

Network 4

LDN M30.1

R Q0.0, 3

Network 5 // 第二个对象的输入是I0.3-I0.5, 输出是Q0.3-Q0.5 M30.2是第二个对象的能使

LD M30.2

AB= VB500, 2

LPS

A I0.3

= V10.0

LRD

A I0.4

= V10.1

LRD

A I0.5

= V10.2

LPP

CALL SBR0

Network 6

LD M30.2

LPS

A V20.0

S Q0.3, 1

LRD

A V20.1

S Q0.4, 1

LPP

A V20.2

S Q0.5, 1

Network 7

LDN M30.2

R Q0.3, 3

Network 8 // 第三个对象的输入是I0.6-I1.0, 输出是Q0.6-Q1.0 M30.3是第三个对象的能使

LD M30.3

AB= VB500, 3

LPS

A I0.6

= V10.0

LRD

A I0.7

= V10.1

LRD

A I1.0

= V10.2

LPP

CALL SBR0

Network 9

LD M30.3

LPS

A V20.0

S Q0.6, 1

LRD

A V20.1

S Q0.7, 1

LPP

A V20.2

S Q1.0, 1

Network 10

LDN M30.3

R Q0.6, 3

Network 11

LDB>= VB500, 3

MOVB 0, VB500

因为举例简单,所以不采用写字节或字,而采用写位。

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-22 00:02:21
10楼
TITLE=程序注释 Network 1 // 每个周期控制一个对象, 这里共控制3个对象,子程序0公用 LD SM0.0 INCB VB500 Network 2 // V10.0-V10.2是子程序0的输入,V20.0-V20.2是子程序0的输出 LD M30.1 AB= VB500, 1 LPS A I0.0 = V10.0 LRD A I0.1 = V10.1 LRD A I0.2 = V10.2 LPP CALL SBR0 Network 3 LD M30.1 LPS A V20.0 S Q0.0, 1 LRD A V20.1 S Q0.1, 1 LPP A V20.2 S Q0.2, 1 Network 4 LDN M30.1 R Q0.0, 3 Network 5 // 第二个对象的输入是I0.3-I0.5, 输出是Q0.3-Q0.5 M30.2是第二个对象的能使 LD M30.2 AB= VB500, 2 LPS A I0.3 = V10.0 LRD A I0.4 = V10.1 LRD A I0.5 = V10.2 LPP CALL SBR0 Network 6 LD M30.2 LPS A V20.0 S Q0.3, 1 LRD A V20.1 S Q0.4, 1 LPP A V20.2 S Q0.5, 1 Network 7 LDN M30.2 R Q0.3, 3 Network 8 // 第三个对象的输入是I0.6-I1.0, 输出是Q0.6-Q1.0 M30.3是第三个对象的能使 LD M30.3 AB= VB500, 3 LPS A I0.6 = V10.0 LRD A I0.7 = V10.1 LRD A I1.0 = V10.2 LPP CALL SBR0 Network 9 LD M30.3 LPS A V20.0 S Q0.6, 1 LRD A V20.1 S Q0.7, 1 LPP A V20.2 S Q1.0, 1 Network 10 LDN M30.3 R Q0.6, 3 Network 11 LDB>= VB500, 3 MOVB 0, VB500 因为举例简单,所以不采用写字节或字,而采用写位。

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-22 06:31:27
11楼

上面的例子采用每一个扫描周期只对一个对象进行控制,如果对象很多,对单一对象的控制将会产生较大的迟后。下面的例子每一个扫描周期都对全部对象进行控制。

 

Network 1 // V10.0-V10.2是子程序0的输入,V20.0-V20.2是子程序0的输出

LD M30.1

EU

LPS

R V10.0, 3

A I0.0

= V10.0

LRD

A I0.1

= V10.1

LRD

A I0.2

= V10.2

LPP

CALL SBR0

 

Network 2

LD M30.1

EU

LPS

A V20.0

S Q0.0, 1

LRD

A V20.1

S Q0.1, 1

LPP

A V20.2

S Q0.2, 1

 

Network 3

LD M30.1

ED

R Q0.0, 3

 

Network 4 // 第二个对象的输入是I0.3-I0.5, 输出是Q0.3-Q0.5 M30.2是第二个对象的能使

LD M30.2

EU

LPS

R V10.0, 3

A I0.3

= V10.0

LRD

A I0.4

= V10.1

LRD

A I0.5

= V10.2

LPP

CALL SBR0

 

Network 5

LD M30.2

EU

LPS

A V20.0

S Q0.3, 1

LRD

A V20.1

S Q0.4, 1

LPP

A V20.2

S Q0.5, 1

 

Network 6

LD M30.2

ED

R Q0.3, 3

 

Network 7 // 第三个对象的输入是I0.6-I1.0, 输出是Q0.6-Q1.0 M30.3是第三个对象的能使

LD M30.3

EU

LPS

R V10.0, 3

A I0.6

= V10.0

LRD

A I0.7

= V10.1

LRD

A I1.0

= V10.2

LPP

CALL SBR0

 

Network 8

LD M30.3

EU

LPS

A V20.0

S Q0.6, 1

LRD

A V20.1

S Q0.7, 1

LPP

A V20.2

S Q1.0, 1

 

Network 9

LD M30.3

ED

R Q0.6, 3

 

因为举例简单,所以不采用写字节或字,而采用写位。

剑思庭

  • 精华:1帖
  • 求助:0帖
  • 帖子:4帖 | 1028回
  • 年度积分:0
  • 历史总积分:2548
  • 注册:2002年7月26日
发表于:2008-05-22 12:28:12
12楼

我可以增值开发s7200的库,但是需要利用C语言,可以放在系统里调用。

需要的话电话联系。剑思庭

爱在远方

  • 精华:0帖
  • 求助:1帖
  • 帖子:11帖 | 86回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2005年5月20日
发表于:2008-05-23 08:30:01
13楼
多谢老愚者,在下茅塞顿开!只是你说“每一个扫描周期都对全部对象进行控制,对单一对象的控制将会产生较大的迟后”,不是很明白这个意思,这个滞后指什么?会延长扫描周期?同一时间用同一个子程序,子程序会不会不知道输入的参数是哪个被控对象的?还是在同一个扫描周期也分先后?如果这样的话,子程序输入输出参数较多,被控对象也比较多,并且输入输出一般为字或双字,真个周期不是很长?还是有些不太明白,能否说直白一些

老愚者

  • 精华:1帖
  • 求助:0帖
  • 帖子:9帖 | 2253回
  • 年度积分:0
  • 历史总积分:10007
  • 注册:2006年8月20日
发表于:2008-05-23 10:39:08
14楼

第一例子采用每一个扫描周期只对一个对象进行控制,如果对象很多,对单一对象的控制将会产生较大的迟后。下面的例子每一个扫描周期都对全部对象进行控制, 并非每一个扫描周期都对全部对象进行控制。如果有20个控制对象,每个扫描周期15mS,则轮流到某个控制对象的时间=20x15mS=30mS,迟后就是指这个时间。


第二个例子可能更实用些。扫描周期的长短跟程序编法有很大的关系,可以粗略统计出来。

爱在远方

  • 精华:0帖
  • 求助:1帖
  • 帖子:11帖 | 86回
  • 年度积分:0
  • 历史总积分:146
  • 注册:2005年5月20日
发表于:2008-05-27 11:55:25
15楼

自己做了些程序,终于明白了,谢谢楼上的兄弟!

gk2017

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:33
  • 注册:2017年7月25日
发表于:2017-09-05 15:58:24
16楼

不错 不错  不错哟

偏不一样

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 119回
  • 年度积分:0
  • 历史总积分:111
  • 注册:2017年9月01日
发表于:2017-09-06 17:25:17
17楼

感谢楼主,一起来学习。共同提高感谢楼主,一起来学习。共同提高


热门招聘
相关主题

官方公众号

智造工程师