技术论坛

编程时新手容易犯错的一点

作者 主题
侠客

经验值: 637
发帖数: 166
精华帖: 0
主题:【分享】编程时新手容易犯错的一点
推荐帖


只看楼主 楼主 2016-09-29 15:18:13

前几天看到一个提问是这样的

问为什么C0不计数?而把网络1和网络2交换就可以了?


这个问题对于新手来说是一个很容易犯的错误,我自己也犯过同样的错误。那是因为手册中有段话把我误导了,也是自己对它理解不够。


就是这个程序,我的想法是I0.0是按钮,按下Q0.0接通,在按下Q0.0断开,可实际Q0.0根本不会接通。

那么问题来了,手册中这样说的


我的程序应该I0.0上升沿时Q0.0置位,但要等到扫描完时才会输出Q0.0,那么网络2的I0.0上升沿后面Q0.0就应该为OFF,那么就不会复位,下次按下I0.0时Q0.0复位。应该没问题啊。


而第一个程序是这样的,说明书上说

10ms定时器在扫描开始时刷新,那么当T98 ON的那一个扫描周期计数器就应该计数啊。难道说明书有问题?


后来自己仔细研究才明白,CPU执行程序时用的是过程映像寄存器中的值,Q0.0那个程序就好理解了,置位Q0.0后,寄存器中Q0.0已经ON了,扫描网络2的时候读取寄存器中Q0.0 ——>ON,所以I0.0上升沿——>ON,Q0.0——>0N,所以Q0.0被复位,Q0.0输出OFF。


那定时器这个呢?我在想cpu读取的应该也是寄存器中的值而不是定时器的实际地址,所以

实际就是扫描开始
读取T98实际地址传送给T98寄存器——>T98寄存器ON
网络1  扫描到T98时——>T98寄存器off
网络2  T98寄存器OFF,
所以网络2的T98永远接不通。

这只是我的个人理解,实际是不是这样运算的也没找到资料,想到了电脑CPU的缓存,是不是PLC的过程映像寄存器是一个道理。






 
分享帖版主置评: 多看看书是好事。 (推荐人:zhangli0)
以下网友喜欢您的帖子:

  
重要声明:

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

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

版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点
推荐帖


只看楼主 1楼 2016-09-29 19:34:02

书上是说的没错。

经过我的消化,是这样理解的:

1、与定时器有关的指令,可以分两类,一类是使用定时数据的,另一类是操作定时器的。就象一个闹钟,读时间就是使用闹钟,拨弄闹钟就是操作。

2、使用定时器,也就是读定时器状态或定时器当前的时间值,对定时器是没有影响的,而操作定时器,则会影响定时器的状态及当前值,而且是若有影响,立即生效。所以楼主的T38,定时到时,又被立即复位了,T38=1的状态到不了下面的网络。



 
以下网友喜欢您的帖子:

  
侠客

经验值: 637
发帖数: 166
精华帖: 0
回复:编程时新手容易犯错的一点
推荐帖


只看楼主 楼主 2楼 2016-09-29 20:02:37
以下是引用yanxiao在2016-09-29 19:34:02的发言 >1楼

书上是说的没错。

经过我的消化,是这样理解的:

1、与定时器有关的指令,可以分两类,一类是使用定时数据的,另一类是操作定时器的。就象一个闹钟,读时间就是使用闹钟,拨弄闹钟就是操作。

2、使用定时器,也就是读定时器状态或定时器当前的时间值,对定时器是没有影响的,而操作定时器,则会影响定时器的状态及当前值,而且是若有影响,立即生效。所以楼主的T38,定时到时,又被立即复位了,T38=1的状态到不了下面的网络。


这是一个很微妙的东西,我们也不知道它的内部是怎么样的运算方式。

有一点我们的认识是相同的,“而操作定时器,则会影响定时器的状态及当前值”但你说的T98定时到时,又被立即复位了,这个我不能理解。

因为这和扫描也有关系,如果扫描开始时,T98=0,扫描到程序触点T97时T98计时到时,那么网络2的T98是=0还是=1?(虽然这个可能性很小),因为这时操作了定时器,那么就该=1吗?

这一点也是我没想通的,而且T98定时到时下一个扫描周期刷新状态,那扫描开始是T98=1,那T97复位,T98应该也复位,但说明书上说的是“定时器位和当前值在每个程序扫描周期的开始刷新”,那么这个定时器位怎么理解?如果是T98状态,那它应该还没刷新,应该就是T98=1因为扫描开始的时候是1,,但实际是0。也许是我转牛角尖了,但我确实没理解。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 67546
发帖数: 14783
精华帖: 100
回复:编程时新手容易犯错的一点
推荐帖


只看楼主 3楼 2016-09-29 22:26:43

你的截图已经很明确告诉大家,各种计时器是如何刷新的。

这不是什么牛角尖,而是想尽一切可能的可能性,防止一切的意外运行。如果你的程序真有那么一下子有意外运行,而你又觉得这个可能性很少而不管,那么程序总会运行到这种状态的,这时所谓的死机出现了。

一切按照说明做。手册说什么时候刷新就什么时候刷新。假如你察觉了不plc不按照这么做,你自己必须使用程序手段,实验出来他是怎么执行的。

你上述的计时器问题,当程序扫描到计时器的时候前面的逻辑由1变0了,如果按照说明,他的计时器位不会更新,那么,你做一个程序试验他到底会0还是1。然后以后使用就用一种完全可以绕过这种灰**节的编程手法去做这个任务。

ok?

然而,手册是有提供对应的编程手法给你的。

老实说,我也没有琢磨过10毫秒计时器的这个刷新问题。我比较偏向相信手册,即使遇到上述情景,按照手册去做总是觉得很意外,总之就是,没明白的时候绕开他就是了。


 
以下网友喜欢您的帖子:

  
版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点
推荐帖


只看楼主 4楼 2016-09-29 23:16:07

操作定时器,包括使能位、直接赋定时值、R指令复位等,指令执行后立即生效,不是等到系统刷新时。

这和系统对定时器的刷新机制不冲突,也不矛盾的。

读定时状态位、当时定时值,读到的就是最新鲜的值,包括由操作定时器指令立即产生的结果。但读指令本身不会改变定时器的状态。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8830
发帖数: 791
精华帖: 4
回复:编程时新手容易犯错的一点


只看楼主 5楼 2016-09-30 08:17:54

扫描是按行进行,这一行的结果只影响下一行,这一行的结果只受上一行或者上面最近出现过这个点的值影响。刚学PLC是看哈工大老师讲的,主要是梯形图,好像是这么讲的这么理解的。


good good study,day day up!!!!
以下网友喜欢您的帖子:

  
版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点


只看楼主 6楼 2016-09-30 08:56:09

 这一行的结果,影响后面执行的所有行,也影响以后执行的所有周期。

这一行所受的,是历史上所有所的有关的行的执行结果。

影响范围怎么会只限上、下一行呢?


 
以下网友喜欢您的帖子:

  
侠客

经验值: 637
发帖数: 166
精华帖: 0
回复:编程时新手容易犯错的一点


只看楼主 楼主 7楼 2016-09-30 09:05:36
以下是引用qqzxx123在2016-09-30 08:17:54的发言 >5楼

扫描是按行进行,这一行的结果只影响下一行,这一行的结果只受上一行或者上面最近出现过这个点的值影响。刚学PLC是看哈工大老师讲的,主要是梯形图,好像是这么讲的这么理解的。

这一行的结果会影响后面所以程序,无双线圈的情况下。

这一行的指令条件会受这一行之前所有的有关结果的影响,包括上一周期这一行之后的计算结果。

没有你说的只影响下一行,和最近出现这个点的影响。



 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8830
发帖数: 791
精华帖: 4
回复:编程时新手容易犯错的一点


只看楼主 8楼 2016-09-30 10:02:53
以下是引用ransad在2016-09-30 09:05:36的发言 >

这一行的结果会影响后面所以程序,无双线圈的情况下。

这一行的指令条件会受这一行之前所有的有关结果的影响,包括上一周期这一行之后的计算结果。

没有你说的只影响下一行,和最近出现这个点的影响。


http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=146856&cid=1029

楼主看看这个,一行程序两个M0.4

我也迷糊了,不懂了


good good study,day day up!!!!
以下网友喜欢您的帖子:

  
奇侠

经验值: 8830
发帖数: 791
精华帖: 4
回复:编程时新手容易犯错的一点


只看楼主 9楼 2016-09-30 10:09:21

仿真了一下,网络3的,T97换成t98的时候确实不计数,理论上不是应该接通一个扫描周期吗?


good good study,day day up!!!!
以下网友喜欢您的帖子:

  
奇侠

经验值: 5763
发帖数: 1383
精华帖: 2
回复:编程时新手容易犯错的一点


只看楼主 10楼 2016-09-30 10:47:13

感觉每个指令弄清楚都不那么容易


我爱自动化
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:编程时新手容易犯错的一点


只看楼主 11楼 2016-09-30 10:47:21

这个问题总会有人经过,找找我的旧帖子,可能会帮到一点


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

  
侠客

经验值: 637
发帖数: 166
精华帖: 0
回复:编程时新手容易犯错的一点


只看楼主 楼主 12楼 2016-09-30 11:00:29
以下是引用qqzxx123在2016-09-30 10:02:53的发言 >8楼

http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=146856&cid=1029

楼主看看这个,一行程序两个M0.4

我也迷糊了,不懂了

以下是引用ransad在2016-09-30 09:05:36的发言 >:这一行的结果会影响...

引用详细内容:

这一行的结果会影响后面所以程序,无双线圈的情况下。

这一行的指令条件会受这一行之前所有的有关结果的影响,包括上一周期这一行之后的计算结果。

没有你说的只影响下一行,和最近出现这个点的影响。


你说的这个双线圈问题,就是受最后一个状态的影响。

理解你的意思了,你前面(哈工大那个)说的最近,我觉得应该说最后一个状态准确点。

M0.2接通

M0.4不接通就是这个道理


 
以下网友喜欢您的帖子:

  
版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点


只看楼主 13楼 2016-09-30 11:43:34

Q有点特别,内部的Q点和外部线路上的Q点,由于刷新机制的关系,在时间上会不同步,“双线圈”一说还有点市场。

现在M点,也来谈“双线圈”,应该是把书给读死了。


 
以下网友喜欢您的帖子:

  
侠客

经验值: 637
发帖数: 166
精华帖: 0
回复:编程时新手容易犯错的一点


只看楼主 楼主 14楼 2016-09-30 11:59:47
以下是引用yanxiao在2016-09-30 11:43:34的发言 >13楼

Q有点特别,内部的Q点和外部线路上的Q点,由于刷新机制的关系,在时间上会不同步,“双线圈”一说还有点市场。

现在M点,也来谈“双线圈”,应该是把书给读死了。

这里面用Q点和M结果是一样的,

而双线圈的定义没去仔细研究过。只是在网上找的是这样定义的:在用户程序中,同一个编程元件的线圈使用了两次或多次,称为双线圈输出。

M点不是编程元件?



 
以下网友喜欢您的帖子:

  
版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点


只看楼主 15楼 2016-09-30 13:57:11

PLC里的“线圈”,是从传统继电器上引过来的概念。PLC最初的目的,就是要代替继电器的功能。

这个“线圈”有没有标准定义,我也不清楚(我估计不会有,PLC只是仿真继电器,线圈是形象的叫法)。

在这里,你把Q、M点当作线圈,就按此定义:把PLC内的位变量当作线圈。

可是你想想,位变量是字节的一部分,8个线圈组成一个字节,同一个程序中若位变量不能输出两次,那包含它的字节怎么办?也不能输出(就是写啦)两次?有了这个框框,你还怎么写程序?


PLC不是继电器,可以仿继电器功能,但大部分的程序不是在仿继电器。就算是仿继电器这一部分功能,也可以突破传统继电器的概念。所以我说,“双线圈”是死读书。


 
以下网友喜欢您的帖子:

  
侠客

经验值: 637
发帖数: 166
精华帖: 0
回复:编程时新手容易犯错的一点


只看楼主 楼主 16楼 2016-09-30 19:44:27

你也说了线圈只是一个形象的叫法,有什么关系呢?我也没说不能输出两次,我后面那2个程序不就是输出的2次吗?对于线圈,西门子200的手册是这样解释的:

线圈

输出

输出指令(=)将新值写入输出点的过程映像寄存器。当输出指

令执行时,S7--200将输出过程映像寄存器中的位接通或者断

开。在LAD和FBD中,指定点的值等于功率流。在STL中,栈

顶的值复制到指定位。


对于线圈,双线圈大家都知道是怎么回事,就是理解和表达不一样而已,不想打了。。。。

想起了,是日系的PLC说线圈。如果斑竹用过的话,可以看看说明书,out指令是怎么说的


 
以下网友喜欢您的帖子:

  
版主

经验值: 25997
发帖数: 11809
精华帖: 43
回复:编程时新手容易犯错的一点


只看楼主 17楼 2016-09-30 19:53:53

我开了一个双线圈的新贴,请您捧场!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 17965
发帖数: 2974
精华帖: 7
回复:编程时新手容易犯错的一点


只看楼主 18楼 2016-09-30 20:01:21

 我认为是定时器刷新方式不同造成的。在S7-200中1ms 定时器、10ms定时器、100ms 定时器刷新方式是不一样的。楼主换成100ms 定时器试试看看呢。在使用STEP7软件仿真我认为不妥,因为S7-300定时器刷新方式和S7-200定时器刷新方式不一样。


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3599
发帖数: 564
精华帖: 0
回复:编程时新手容易犯错的一点


只看楼主 19楼 2016-09-30 22:16:12
以下是引用qqzxx123在2016-09-30 10:09:21的发言 >9楼

仿真了一下,网络3的,T97换成t98的时候确实不计数,理论上不是应该接通一个扫描周期吗?

    我觉得这里的10ms定时器用300的S5TIME来模拟不严谨,因为300的S5TIME的刷新机制和200的1ms的刷新机制是一样的。


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

  
收起
编程时新手容易犯错的一点
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。