故事作者:空果仁

最近创作

看看TA的故事

同样的程序在不同PLC中有不同的响应_解答

已锁定

空果仁

官方工程师 西门子1847工业学习平台

  • 帖子

    210
  • 精华

    47
  • 被关注

    310

论坛等级:侠圣

注册时间:2011-07-11

普通 普通 如何晋级?

同样的程序在不同PLC中有不同的响应_解答

6183

19

2019-01-10 16:32:47

star star star

       这个原因是由于通信造成的,关键点是HMI发送的数据在哪一时刻传到CPU中,S7-300的通信点在循环控制访问点(CCP)完成的,参考图1.


 

图1

      

       即在每一个程序处理完成后进行数据的交换,那么为什么S7-300就没有问题呢?原因是FB块的IN/OUT接口,在FB块调用前读入,在执行完成后写回,HMI发送的值,先复制到FB的形参中进行计算,然后将计算结果再写回实参(注意是在FB块所有代码执行完),所以每次HMI发送的值到实参,然后复制到形参,FB块执行完成后再写回到实参,周而复始,不会出现问题。但是S7-400和S7-1500为了增强通信性能,与HMI通信的时间点是在每一个时间片(TS)中完成的,参考图2.


图2 

      

       如果程序执行的时间比较长,通信的数据可以交换多次,这样就提高了通信效率,使通信与CPU的扫描周期分开了,这样对于上述的操作有可能会有问题,如果调用的FB块已经读到实参的值,例如11,在运行中新的值13写到实参中,FB块在执行完成后写回实参中,11将13覆盖了,所以感觉没有写成功,实际是被覆盖了,为什么有时会成功呢?只有在这个FB块执行前或者执行后,通信的值到了才不会被覆盖,我在程序中使用了延时,如果将延时减小,成功的概率就会大增,但是编程必须严谨,这样的问题一次都不能出现,方法很简单,就是HMI发送的数据先到通信缓存区,例如DB块中(这样也便于管理),然后再将缓冲区的数据使用MOVE指令复制到实参中,这样可以确保HMI发送的数据在FB块执行前或者执行后才进行交换。

       那么为什么数组就没有问题呢?简单数据类型实参的值是复制到形参的,参考图3.


 

图3

      

       这时在FB块中访问IN/OUT参数是在对形参进行操作,FB执行完成后再复制到实参中;使用数组和结构体是使用pointer引用方式,参考图4.


 

图4

      

       我们可以自己在FB的静态参数区添加一个数组,不管多大和多小都是占用6个字节(使用非优化的块,否则看不出地址偏移),6个字节,很容易让我们想起了POINTER类型。如果在FB块中对IN/OUT参数操作时,实际是直接对引用的变量进行操作,执行完了立刻写回,这样就不会等待FB块完全执行完了再写回,由于我们在FB中编写的程序只有一条,而这条指令又不能被通信中断,就是说在MOVE一半时是不能通信赋值的,所有不会被覆盖。如果也是按照图3复制的方式编写FB即先读出,然后经过计算,最后在FB块的结尾写回,问题同样会出现的。

 

同样的程序在不同PLC中有不同的响应_解答 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

崔工谈博途与PLC

共有103条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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