万国企业网 » 新闻资讯 » » 西门子S7-1200模块6ES7231-4HF32-0XB0

西门子S7-1200模块6ES7231-4HF32-0XB0

放大字体  缩小字体 发布日期:2024-10-12  浏览次数:0
核心提示:西门子,S7-1200,模块,全新原装,现货

一个困扰我多年的问题:FB,FC 内部的output变量,在块内是否可读?

虽然我写了很多程序,但对FB,FC内部对output管脚的输出变量进行读取操作,一致没有高清。虽然经常滥用,也没出现过问题。


请教各位这个output的变量能读取吗?下面是一位大神的回复。但是我心里还是不确定,特来论坛请教各位。谢谢。


是的,您正确地指出了在FB(功能块)内部读取输出变量可能导致逻辑上的问题。在西门子PLC的功能块编程中,输出变量通常在块的逻辑执行结束时被赋值,并且它们的值是为了传递到功能块外部而设计的。输出变量在功能块内部不是用来保存状态的,它们不保留上一次调用FB时的值。

如果您在FB内部读取一个输出变量,您可能会得到一个不确定的值,因为在逻辑流程中,输出变量的值可能还没有被更新或者是上一次操作的残留值。这可能会导致不可预测的行为,特别是如果输出变量的值依赖于块内部的一系列计算和条件。

因此,佳实践是在FB内部使用局部变量或静态变量来进行计算和保存状态。局部变量仅在FB的当前调用中有效,而静态变量则在FB的调用之间保持它们的值。这样,您可以确保您在FB内部使用的值是可控和可预测的。

总的来说,为了避免逻辑错误和不确定性,应避免在功能块内部读取输出变量。相反,应该使用其他类型的变量来处理内部逻辑,并在逻辑处理完成后,将终结果赋值给输出变量。这样做可以确保功能块的行为是清晰和一致的。

我认为主要还是因为直接读取out会容易产生时序问题导致程序无法按照预定方式执行。

以一个测试程序为例,在程序块中编写两组启保停指令,同时1组在启保停程序前用输出复位启动命令,另1组在启保停程序后用输出复位启动命令。以下是三组不同方式的执行结果。

第1组:使用FB块,输出变量定义在output区域。


第2组:使用FC块,输出变量定义在inout区域。


第3组:使用FC块,输出变量定义在out区域。

第3种状态便是你文中描述的“输出变量在功能块内部不是用来保存状态的,它们不保留上一次调用FB时的值。如果您在FB内部读取一个输出变量,您可能会得到一个不确定的值,因为在逻辑流程中,输出变量的值可能还没有被更新或者是上一次操作的残留值。”

在考虑好时序与逻辑的影响或者对逻辑与时序要求不高时,读取out变量处理逻辑时是没问题的,在高实时性场合需要审慎考虑逻辑。

希望以上测试能对你有所帮助。


 
 
[ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 违规举报 ]  [ 关闭窗口 ]
 
  • 联系人:田子龙
  • 电话:15221760199
  • 地址:上海市松江区科技园区平原街880弄65号201
  • 邮件:271463402@qq.com
  • 手机:15221760199