首先,由于网上实在没有什么ST语言函数定义的资料,在这里传播一下,无意间得知ST函数返回值其实就是函数名本身,有点像Matlab,但是返回值是不需要声明的,而是直接使用函数名。
如我要建一个FUN,那么在局部标签中按顺序声明VAR_INPUT的标签,那么这些标签就代表函数形参,从上到下各标签就是形参表从左到右的形参名字。
比如我这个叫"setOrReset"的函数:
局部标签如下:
VAR_INPUT default Bit
VAR_INPUT set0 Bit
VAR_INPUT set1 Bit
函数本体如下:
IF set0 & NOT set1 THEN
setOrReset := FALSE;
ELSIF NOT set0 & set1 THEN
setOrReset := TRUE;
ELSE
setOrReset := default;
END_IF;
返回值是直接使用函数名"setOrReset"。
这就是三菱GX work的函数。
这个函数是正常的。然后我这里有一个不正常的函数,叫"isRaise"
局部标签:
VAR_INPUT signDigitalIn Bit
函数本体:
isRaise := LDP(TRUE, signDigitalIn);
在主程序中调用为:
M0:= isRaise(X0);
M1:=isRaise(X1);
Y0 := setOrReset(Y0, M0, M1);
这时候isRaise就不正常了,变成一个普通的赋值。
而只要将第一行改一下,变成 :
M0:= LDP(TRUE, X0);
M1:=isRaise(X1);
Y0 := setOrReset(Y0, M0, M1);
第二行就正常了。没错,改了第一行把第二行搞正常了。
初步断定GXWorks2中对函数套用的支持不好,不能在一个函数中套用另一个函数。
如我要建一个FUN,那么在局部标签中按顺序声明VAR_INPUT的标签,那么这些标签就代表函数形参,从上到下各标签就是形参表从左到右的形参名字。
比如我这个叫"setOrReset"的函数:
局部标签如下:
VAR_INPUT default Bit
VAR_INPUT set0 Bit
VAR_INPUT set1 Bit
函数本体如下:
IF set0 & NOT set1 THEN
setOrReset := FALSE;
ELSIF NOT set0 & set1 THEN
setOrReset := TRUE;
ELSE
setOrReset := default;
END_IF;
返回值是直接使用函数名"setOrReset"。
这就是三菱GX work的函数。
这个函数是正常的。然后我这里有一个不正常的函数,叫"isRaise"
局部标签:
VAR_INPUT signDigitalIn Bit
函数本体:
isRaise := LDP(TRUE, signDigitalIn);
在主程序中调用为:
M0:= isRaise(X0);
M1:=isRaise(X1);
Y0 := setOrReset(Y0, M0, M1);
这时候isRaise就不正常了,变成一个普通的赋值。
而只要将第一行改一下,变成 :
M0:= LDP(TRUE, X0);
M1:=isRaise(X1);
Y0 := setOrReset(Y0, M0, M1);
第二行就正常了。没错,改了第一行把第二行搞正常了。
初步断定GXWorks2中对函数套用的支持不好,不能在一个函数中套用另一个函数。