技术论坛

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

返回主题列表
作者 主题
空果仁
侠圣

经验值: 4926
发帖数: 210
精华帖: 47
楼主    2019-01-10 16:32:47
主题:同样的程序在不同PLC中有不同的响应_解答 精华帖 

       这个原因是由于通信造成的,关键点是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块的结尾写回,问题同样会出现的。

 

来自西门工业子技术支持 高级专家
HUANGZE75
至圣

经验值: 63260
发帖数: 12669
精华帖: 121
1楼    2019-01-10 17:44:23
主题:回复:同样的程序在不同PLC中有不同的响应_解答

学习了,分享还不错啊!

云山雾绕
至圣

经验值: 16384
发帖数: 2396
精华帖: 0
2楼    2019-01-10 20:44:03
主题:回复:同样的程序在不同PLC中有不同的响应_解答

感谢你的分享!

开心每一天,懂得包容、感恩!
不断攀登
至圣

经验值: 12543
发帖数: 1843
精华帖: 0
3楼    2019-01-11 08:20:29
主题:回复:同样的程序在不同PLC中有不同的响应_解答

感谢分享!

邮箱 yongquancun@126.com
千万个为什么
至圣

经验值: 10582
发帖数: 848
精华帖: 9
4楼    2019-01-11 10:40:52
主题:回复:同样的程序在不同PLC中有不同的响应_解答

感谢楼主分享

学如逆水行舟,不进则退! wwhoho@163.com
KITT
奇侠

经验值: 9334
发帖数: 1238
精华帖: 13
5楼    2019-01-11 18:58:25
主题:回复:同样的程序在不同PLC中有不同的响应_解答

多谢大师解惑,多提一句西门子发行几本书,西门子SIMATIC WinCC 使用指南 上下册+SIMATIC S7-1500与TIA博途软件使用指南+西门子S7-1200 plc编程及使用指南可以下手了

SIMATIC!
聂昌
奇侠

经验值: 5313
发帖数: 617
精华帖: 0
6楼    2019-01-11 19:32:28
主题:回复:同样的程序在不同PLC中有不同的响应_解答

谢谢分享解惑!点个赞!

决不为短期利益而牺牲未来
sangshunyang
侠圣

经验值: 4092
发帖数: 565
精华帖: 4
7楼    2019-01-12 08:51:57
主题:回复:同样的程序在不同PLC中有不同的响应_解答

文中提到了,S7-300;S7-400, S7-1500;那么S7-1200的情况又是如何呢,和300相同还是和400相同?

我们用的S7-1200会更多。

周杰伦
至圣

经验值: 13745
发帖数: 2031
精华帖: 16
8楼    2019-01-12 19:38:10
主题:回复:同样的程序在不同PLC中有不同的响应_解答

多谢分享


1.HMI写入变量B


2.PLC程序执行

A:=B;

执行FB,inout管脚是A


3.这样可以避免了HMI写入值在程序执行中插入问题,但是在HMI端显示就有问题了,显示的还是B啊!



工控毁我青春!
master_mb
侠圣

经验值: 4030
发帖数: 1261
精华帖: 6
13楼    2019-01-21 08:19:23
主题:回复:同样的程序在不同PLC中有不同的响应_解答

 个人感觉这种通讯机制是一种倒退。原因主要如下:

1:没有必要,HMI的通讯是人操作的,实时性要求不高,不知道减少几毫秒的反应时间有什么实际意义。

2:增加了HMI变量的编程复杂度。

3:不同PLC间程序移植后逻辑容易出错。

QQ 402550360 TEL 17606539722
一天到晚游泳的猪
侠圣

经验值: 2639
发帖数: 781
精华帖: 10
17楼    2019-02-14 12:05:05
主题:回复:同样的程序在不同PLC中有不同的响应_解答

一般hmi发给plc的指令,最常见的就是bool类指令和模拟量设定两大类型

其中bool类指令诸如启动、停止或者开阀、关阀这种,一般在fc或者fb中定义为IN-OUT类型管脚,这样HMI只管发1,不用再发个0来复位,而是由plc收到1指令以后来复0

如果按照楼主的介绍,那么在400/1500中,即使fb的程序中把in-out变量复位指令放在最后,也是有问题的:当fb中前面的程序执行完成后,还没执行最后的复位指令时,正好被HMI的赋值打断了,那么这次赋值其实就是无效的了

我觉得简单的方法,就是修改一下fb,在判断in-out为1时,还要保证fb已经被完整的执行过(或者执行过两个周期以上),否则用一个缓冲db再去move到各个fb的in-out也蛮费劲的(除非一开始把变量区规划的很好很齐整),而且缓冲db本身的复位还需要plc程序负责

有生之年,狭路相逢,终不能幸免
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。