求购程序 点击:2876 | 回复:108



芳季

    
  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-01-11 13:06:08
楼主
抽象描述: 
   一个平皮带输送机,前进方向前端主动轮有动力令皮带转动。方向不变,速度不定,不能自主控制。皮带输送机被动轮侧称为入口,主动轮侧称为出口。
   有物件从入口进入被送往出口。物件的形状是一致的。进入的方向也是一致的。就是进入的时间不确定,也跟皮带的速度无关。
物件在传送的过程中到达皮带某个指定的位置时,有一个电眼A去检测。当A检测到物件的时候,当然可以输出一个信号马上控制其他东西。使用过程中按需要,用手可以随便移前移后这个电眼。这样的电眼在皮带机上有几个。实际数量看机型配置具体的数量。
   现在问题是这些应该安装电眼的地方是不可能安装到电眼的。只能在入口的附近才具备安装条件。入口端的皮带轮同轴安装旋转编码器。
   问:这样的一个程序用S7-200编成库要多少两银子。



miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-01-30 19:54:45
81楼

你提前返回了吧!

我不知道你所说的漏洞, 我认为程序达到你的要求了, 你只是简单的要求2个bool 量输出! 你在主程序中 用SM0.0 常开点调用!确保子程序在每个扫描周期都执行!

至于你所说的 IN_OUT 类型 是用来保存值的,  呵呵, 你竟然这样理解保存值啊! IN_OUT类型只是用来修改输入形参的! 看具体要求了,很多情况下不需要这种类型!

  子程序在返回后所有的零时变量值是0或随机值!

子程序输出赋值给主程序变量就相当于把结果保存!

 

 

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-01-30 19:56:45
82楼

还有我觉得你不需要别人帮忙嘛!  那你还购买什么程序啊!

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-01-30 20:32:54
83楼

不是这样的。这是社会分功的原理。安排别人做不等于自己不能做不会做。在这个社会分工上没有能力高低的区别。

我请你做一个简单的实验。要求是给子程序一个输入点。一个输出点。要求子程序做翻转的动作。0变1,1变0。而且这个子程序要多次调用互不影响。

你用仿真软件应该可以模拟的了。你就模拟用I0.0翻转Q0.0。用I0.1翻转Q0.1。就两个。

我的程序一定是用SM0.0调用的。这个毫无疑问。当整个程序只有你的这个子程序和主程序相应的指令外没有其他东西了。此时程序无疑是正常的。这个我不否认。但是像我前面说的,主程序中紧跟你的子程序后加这个子程序。那么……。

不存在什么提前返回。<子程序输出赋值给主程序变量就相当于把结果保存! >这个不等于的。保存IN/OUT是双向可操作可读可写。OUT只能输出,以后要是子程序要求知道输出的状态,是不可能的,他没有反向的过程。覆水难收。所以我说“这个不等于的”。

我能够加一个子程序可以完全颠覆你的程序。足可以证明我的确知道你程序的漏洞。<至于你所说的 IN_OUT 类型 是用来保存值的, 呵呵, 你竟然这样理解保存值啊>这个我暂时保持沉默。待你自己再模拟一下后,我们再研究研究。

说说一个正面的问题。有一个我对你有佩服。不说其他事情。你的程序可以净用触点指令可以完成所有程序。是我意料之外。我以为会用到很多边缘指令和置位复位。其实没有,这个应该是一个很易读的程序。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-01-31 12:21:05
84楼

呵呵,我说过了IN_OUT  和 out 变量是很不同的. 我说了半天感情你没听懂我的意思! IN_OUT 变量是有必要用到时候再用,你觉得那么简单的子程序有必要用吗?  我知道IN_OUT 类型,说白了,是传指针(地址), 可以改变外部变量值,你不用怀疑我对这个变量类型的理解及应用!  我觉得我没必要说太多!

你说的连续调用 子程序会出错, 我不理解,  除非你重复调用,我没有硬件,我不敢说我的程序没漏洞! 我没有在硬件上模拟!

 "你的程序可以净用触点指令可以完成所有程序。是我意料之外。我以为会用到很多边缘指令和置位复位。其实没有,这个应该是一个很易读的程序。"

难道你看到了我的程序!  哪西门子加密文件也太垃圾了!

 

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-01-31 20:11:50
85楼

引用<除非你重复调用,我没有硬件,我不敢说我的程序没漏洞! >

请平心净气听我解释。

1.我没有打开你的子程序。我是从交叉引用中看到的。你自己也可以试试看到。

2.我建议你在模拟软件上试试调用两次,并且把T99T100换成其他10毫秒的。用两次调用分别控制Q0.1 Q0.0。看看有没有问题。

3.你再尝试增加我所说的子程序。

这三点我非常诚恳请你尝试一下。然后慢慢坐下来再商量商量。好吗?

没事的。欢迎讨论。

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-01-31 21:01:14
86楼
给你发了个邮件。你按照上面自己试试。

何不控制?

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 63回
  • 年度积分:0
  • 历史总积分:85
  • 注册:2004年3月22日
发表于:2010-01-31 21:46:53
87楼
我想应该是电眼监测到物体后,在PLC中按编码器的读数开始计算物体的位置。可以动态计算出该物体位置坐标,一直到物体输出。用子程序直观些

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-01-31 22:17:55
88楼

是的。我只希望用子程序做。以便日后能多次调用。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-01-31 23:07:37
89楼

我觉得没必要讨论了, 你认为你怎么样,就是了,我说过我手头没有硬件,我不敢说我在没有硬件的情况下, 对S7-200理解的很透彻! 你在硬件上测试了,那就是了!  

 

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-01-31 23:27:07
90楼

我开了你发给我的邮件了, 我有时间在改改吧!    你们是做什么的? 不妨给大家讲讲! 

我倒是很乐意和你讨论一下! 你给我或给大家讲一下什么是 [横向传递]。你又是怎么破坏的,  我实在是水平有限!

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 08:33:53
91楼

我只是在一个廿多人的机械厂里做编程的。只是有时候工作太挤了想找外协。但是又不能把全部的工作外判。因为有售后的问题。所以只能用部件的形式购买程序。中心的控制还是必须自己做的。

横向传递和破坏两个概念组合起来书本上只用了,引用

<

S7-200PLC给主程序分配64字节个局部变量,给每级嵌套子程序分配64个字节局部变量存储器,给中断程序分配64个字节局部变量存储器。

使用局部变量存储器规定,子程序不能访问分配给主程序、中断程序和其他子程序的局部变量,子程序和中断程序不能访问主程序的局部变量存储器,中断程序也不能访问主程序和子程序的局部变量。

>

和<进入和退出子程序后的值都是不定的>之类的文字。

在以上描述中并没有否定子程序和子程序之间 “能” 互相访问。这就是[横向传递]。还有要留意:

<给每级嵌套子程序分配64个字节>这里说的是“每级”,不是每个,也不是公用。每级有不同的64个字节使用。级和级之间是公用的。第一级嵌套子程序共用64字节。第二级嵌套子程序共用另外64字节。第三、四、五、六、七、八级嵌套子程序共用另另另另另另外64字节。这样的方式很显然把程序结构画成树型结构的话是只能水平方向上的子程序共用相同的64字节。而垂直方向是没有看见相同的东西的。真正可以表述为[横向传递]。(相反累加器AC就是中断程序和其他程序的横向隔离。)

传递的方向只能按照扫描方向传递。

要知道L取也是储存空间。上电初始值都是零的,更改了之后要是没有在修改都是不变的。为何<进入和退出子程序后的值都是不定的>呢?到底是什么东西什么时候写了值呢?

文章中没有说为什么。只是要求你不要乱使用。先辅值再使用。值是不定的。之类的话。

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 08:45:55
92楼

你的程序在实验的过程中始终保持只有你一个子程序。并没有任何横向的东西。所以任何写到L上的数值都得以保存,也就所以你不需要额外的辅助保存动作,子程序仍然可以记忆过去的值。同时主程序也不可能破坏这个记忆。横向吗,纵向是隔离的。

当我增加后面的子程序后……(给每级嵌套子程序分配64个字节局部变量存储器,)我的程序和你的程序是同一级。我可以改写你的L区。之后你的子程序就没有了当初的记忆了。

这种情况就是书本上归纳为<进入和退出子程序后的值都是不定的><先辅值再使用。>并没有再详细解释了。

或许这个概念很难理解好象跟书本上的描述都完全不一致。

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 08:48:49
93楼

例如一个程序:
主程序
LD SM0.0
MOVB 10 LB0
CALL SBR0
CALL SBR1
END
子程序1
LD SM0.0
MOVB 12 LB0
RET
子程序2
LD SM0.0
MOVB LB0 MB0
RET
然后你监控一下MB0.

这的确表明子程序1中12的这个值毫无影响地[横向传递]到子程序2了。中途的主程序并没有干涉到。

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 08:51:30
94楼

再举一例

复制后保存为*.AWL文件就可以导入了。模拟软件应该可以模拟的。
ORGANIZATION_BLOCK 主程序:OB1
TITLE=程序注释
// SBR0对一级嵌套的子程序所使用的L区写值。
// SBR 1 2 3 4 都是一级子程序,都读取共享区数据并输出。
//
// SBR5是二级嵌套的子程序。对二级共享的L区域写值。
// SBR 6 7 都是二级子程序,都读取共享区数据并输出。
//
// 在此。一 二级的共享区使用了相同的编程符号。LB0。但通过上机运行,显然互不干涉。
BEGIN
Network 1 // 网络标题
// 网络注释
LD SM0.0
CALL SBR0
CALL SBR1
CALL SBR2
CALL SBR3
CALL SBR4
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD SM0.5
EU
LD SM0.5
ED
OLD
INCB LB0
Network 2
LD SM0.0
CALL SBR5
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_1:SBR1
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.0
= Q0.0
Network 2
LD SM0.0
CALL SBR6
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_2:SBR2
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.1
= Q0.1
Network 2
LD SM0.0
CALL SBR7
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_3:SBR3
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.2
= Q0.2
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_4:SBR4
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.3
= Q0.3
Network 2 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_5:SBR5
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD SM0.5
EU
INCB LB0
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_6:SBR6
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.0
= Q1.0
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_7:SBR7
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD L0.1
= Q1.1
Network 2 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_INTERRUPT_BLOCK

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 09:05:49
95楼

我总结:

L区的值是由主程序,各级子程序,中断程序各自操控的,互不影响。可以看作是64×(1+8+1)=640字节的空间。(虽然层间地址是相同但是是隔离的)

中断程序何以嵌套一层子程序。他们两个共同使用相同的64字节。

主程序和中断程序没有横向的东西。可以认为是独享的64字节。可以作为非保持的M和V等等的使用。但是CALL指令会把当前层的内容复制到下一层,垂直传递。实现带参数调用子程序。

同级嵌套的子程序谁最后写入,值就一直保持到下次的谁再写入。

winter938

  • 精华:1帖
  • 求助:0帖
  • 帖子:55帖 | 945回
  • 年度积分:0
  • 历史总积分:3418
  • 注册:2005年6月12日
发表于:2010-02-01 09:40:42
96楼

中断程序何以嵌套一层子程序。他们两个共同使用相同的64字节

你验证过吗?

winter938

  • 精华:1帖
  • 求助:0帖
  • 帖子:55帖 | 945回
  • 年度积分:0
  • 历史总积分:3418
  • 注册:2005年6月12日
发表于:2010-02-01 09:57:59
97楼
你所谓的横向传递系统手册没有明确提出建议慎用,我理解L区是执行哪里的程序就是哪里的存储器,正因为这种共用性为了获得明确的值要求使用前赋值,看看中断程序和主程序的L区只有TEMP型的可以辅助理解这一点,因为TEMP型L区的值是由这些程序执行过程中产生的明确的值,另外我看到手册提到什么语句编程序时可以寻址所有的64个字节,但是建议不要使用局部存储器的最后四个字节,这些说明了L区很特殊还是老老实实按手册说的去用安全点

winter938

  • 精华:1帖
  • 求助:0帖
  • 帖子:55帖 | 945回
  • 年度积分:0
  • 历史总积分:3418
  • 注册:2005年6月12日
发表于:2010-02-01 10:08:30
98楼
以下图片摘自系统手册中

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-02-01 12:09:25
99楼
引用芳季 的回复内容:

例如一个程序:
主程序
LD SM0.0
MOVB 10 LB0
CALL SBR0
CALL SBR1
END
子程序1
LD SM0.0
MOVB 12 LB0
RET
子程序2
LD SM0.0
MOVB LB0 MB0
RET
然后你监控一下MB0.

这的确表明子程序1中12的这个值毫无影响地[横向传递]到子程序2了。中途的主程序并没有干涉到。




你的LB0是系统分配给主程序的 TEMP 存储区的零时变量, 在主程序中共享TEMP (L区), 你所说的横向传递就是这样的啊!呵呵!

你改变调用顺序,你看看主程序会不会影响LB0, 例如:

主程序
LD SM0.0

CALL SBR0

MOVB 10 LB0
CALL SBR1
END

显然MB0是10 ; 

当我仔细看了系统手册后,我发现我的库文件是失败的! 这样的要求应该用IN_OUT类型指定外部公共变量,调用不同的实例,就指定不同外部共享变量;

看看,系统手册上说的, 局部存储器在分配时PLC不进行初始化! 初值可能是任意的,当在子程序调用中传递参数时,用子程序的局部存储器中由cpu 替换其被传递的参数值,局部存储器在参数传递过程中值,在分配时不被初始化, 可能包含任意值.

这说明,每个子程序的 L区,只有一份存储区(60byte ), 而且这个区是编译时系统自动分配的,  不论你调用多少次子程序,其共享60byte  L区,  不同的子程序有各自的 L 区, 它们互不干扰!  当子程序调用大于2次调用时,第2次调用是 L区 保持上一次调用的值! 一次类推! 始终保持上一次调用的 L区值!  系统手册已经解释的很清楚了! 这是标准的子程序的定义! 子程序调用是压栈方式进行的!    它不同于某些品牌PLC 的功能块 !

我是懒得去看系统手册!  呵呵,有时间再改了!

 


 

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2010-02-01 12:15:39
100楼

中断程序的确可以嵌套一级子程序。系统手册不知道在哪里有写着的。这个我试过了。但是是不是中断跟嵌套的公用就没有办法试验。因为中断我无法检测L的值。

引用<我理解L区是执行哪里的程序就是哪里的存储器>

我上面第二个程序可以验证。不是执行到哪里就那里。是执行到哪层就那层。

这才符合,引用<S7-200PLC给主程序分配64字节个局部变量,给每级嵌套子程序分配64个字节局部变量存储器,给中断程序分配64个字节局部变量存储器。>


热门招聘
相关主题

官方公众号

智造工程师