一个困扰我多年的问题: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变量处理逻辑时是没问题的,在高实时性场合需要审慎考虑逻辑。
希望以上测试能对你有所帮助。