功能块构造函数无法使用字符串,如何声明不定长字符串或替代方案?
问题解决:ST功能块构造函数传递字符串文件名报错
问题根源
你当前的代码中,FB_init的输入参数是REFERENCE TO T_MaxString,直接传递字符串字面量(如'c:/config/config.csv')会触发编译器错误——因为引用类型必须绑定一个具有稳定生命周期的变量,而字面量是临时对象,无法被引用绑定。
解决方案
方案1:先定义变量再传递引用
如果坚持使用引用类型参数,需在主程序中先定义一个T_MaxString类型的变量存储文件名,再将该变量传递给功能块构造函数:
修正后的FB_LogFile代码:
FUNCTION_BLOCK FB_LogFile VAR sFileName : REFERENCE TO T_MaxString; END_VAR METHOD FB_init : BOOL VAR_INPUT sFileName: REFERENCE TO T_MaxString; // 修正原代码参数名拼写错误 END_VAR THIS^.sFileName := sFileName;
Main程序代码:
PROGRAM Main VAR sLogFilePath : T_MaxString := 'c:/config/config.csv'; // 先定义变量存储文件名 LogTest: FB_LogFile(sFileName := sLogFilePath); // 传递变量引用 END_VAR LogTest();
方案2:改用值传递参数(更简洁)
如果不需要引用绑定,直接将FB_init的参数改为值类型,即可直接传递字符串字面量:
修改后的FB_LogFile代码:
FUNCTION_BLOCK FB_LogFile VAR sFileName : T_MaxString; // 存储文件名的值 END_VAR METHOD FB_init : BOOL VAR_INPUT sFileName: T_MaxString; // 值类型参数 END_VAR THIS^.sFileName := sFileName;
Main程序代码:
PROGRAM Main VAR LogTest: FB_LogFile(sFileName := 'c:/config/config.csv'); // 直接传字面量 END_VAR LogTest();
关于不定长字符串的支持
多数PLC的结构化文本(ST)支持STRING类型,可以指定最大长度(如STRING(255))来实现“不定长”效果,只需将代码中的T_MaxString替换为对应长度的STRING类型即可,上述两种方案同样适用。
内容的提问来源于stack exchange,提问作者Chris Smith
相关产品推荐
相关产品推荐

