西门子工业支持中心,以专业共创价值!
西门子工业支持中心,以专业共创价值!
1.应用的基本信息
1.1基本应用信息描述(您所经历过的现场或案例,描述设备运行的异常情况,语言简要、故障要点突出,现象表达清楚,涉及具体设备的版本信息,网络规模,主要产品列表等)
我在项目中应用的Siemens 1516 PLC V2.6 , 通过socket通信的方式,向上位机发送消息,在100ms时间中断OB30里,向发送缓冲区写入数据,在OB1里检测发送缓冲区是否有数据,如果有数据,将数据加载至TSEND的发送缓冲区,并执行发送命令。遇到的问题:通过上位机的接收记录分析发现,存在漏发消息的情况,并且可以重现;
2.故障的检测和解决
2.1 故障或问题分析(根据故障或问题,进行分析,从而提出潜在的一些解决方案用于解决该问题)
漏消息的原因可能有:
1:写入缓冲的数据过大,消息缓存区被覆盖重写;
2:PLC程序周期过大,执行发送的速度小于写入的速度;
3:PLC设定通信循环负荷的影响;
4:上位机处理延迟;
5:时间中断OB30执行时对主流程OB1中发送指令造成了影响;
2.2故障或问题处理(根据分析各种导致故障的可能性,逐步排查,描述您解决此问题的操作步骤,最终确认原因,排查过程有条理,思路清晰)
根据2.1中分析,逐一分析排查。
测试工具:socket助手;
3.实践联系理论
TSEND指令为异步指令,执行过程可能会延续到夸多个周期的调用。这要求,在发送指令为完成前(未收到Done=1),发送缓存要求保持不变,而时间中断里的写入操作,可能对这部分产生了影响。
4.经验总结
4.1遗留的问题(故障排查后,是否对故障或者解决问题的方式仍然有些疑问或者不理解的地方)
时间中断对异步执行指令的影响,有疑问,因为时间中断中写入的数据并非直接写入TSEND指令对应的buff。
4.2改进方法(解决问题后,根据原因结果,针对故障现象可以采取的预防措施,技术要点等。可以提出更好的解决方式或建议)
遇到异步执行的发送指令时,写入和发送操作放置主循环OB1中执行。
这要看网络的状况了,非实时通信,延迟是很正常的事情,延迟的时间也是不确定的,比如网络里正好有大报文在发送,没有优先级的通信就只能等待,另外工业现场还有干扰的问题,都会造成通信延迟,100ms对于这些延迟可能都不算啥,这时就会导致数据被覆盖。
我不认为,楼主把数据拷贝到发送缓冲区的操作放到OB1执行就是解决问题了。
@元顺 :
接收端的接受周期是多少?如何判断当前无发送任务?依靠什么信号?
假如接收端的接收周期与发送周期类似,都很少。那么理论上不会出现这样的问题。我们来看看。
1,100Ms的OB30装入新数据,然后OB1检测到新数据的存在,最多两个周期也就是10ms,那么发送50个字节,最多2个周期,10ms。那么就是20ms就结束了。
2,我们等待下一次新的数据的写入,需要等待100ms,在重复第一个的任务动作。从哪方面考虑,都不会出现漏发。
出现漏发是如何出现。如果程序上没有问题的话,我们来看看何时漏发。
1,如果接收端的接收周期很慢,例如50分钟,我们举一个极端的例子,如果每隔100ms,都检测到数据写入,这样说明每隔100ms都会写入数据,我们不去详细计算缓冲区多长时间占满,但是通过这个例子,当接收和发送的缓冲区全部占满,那么再次出现100ms的数据写入,并且有写入多次,必然会出现漏发的情况,因为数据被不断的覆盖了。
2,当然还有一种情况,就是发送时间很长,比如我们发送50个字节用了500ms,当然不存在这种情况,毕竟1516,我仅仅是举例子能够让你理解,那么此时每隔100ms的新数据,自然不能被发送,因为同数据被不断的覆盖了。
@元顺 :
我试着理解一下你的案例的这句话。“在100ms时间中断OB30里,向发送缓冲区写入数据,在OB1里检测发送缓冲区是否有数据,如果有数据,将数据加载至TSEND的发送缓冲区,并执行发送命令。“
OB30里面编写的程序就是往DB中写入数据,准备发送的数据。
OB1中编写TSEND,当发送DB数据发生变化,说明有新数据,然后再发送数据。
至于漏发,指的是TSEND并没有把每次的变化的数据发送出去。是这样吗?或者说我想知道是如何触发TSNED的使能位。
如果是我说的那样,还有3个问题。1是发送的数据量未知,2是CPU的循环周期未知,3是接收端的接收周期是多少?
如果我猜测正确的话,例如CPU周期是2ms,程序不多的情况下,接收端的接收周期也很小,比如10ms,那么8k数据最多30ms就能刚接收完毕,不会出现上述所处的漏发。
只有CPU的周期很长,例如200ms,或接收端的周期很长例如200ms,那么才会出现上述的情况.说白了是时间匹配的问题。
请填写推广理由: