在plc中传统的atan(x)函数所得出的角度范围是[-pi/2,pi/2],而在我们的算法中需要得出大于九十度的值时就会出现错误。所以需要用到atan2(y,x)这个函数。atan2(y,x)所计算出来的结果范围是[2*pi,pi]。我将其写为ST中的function,其具体代码如下:
变量声明:
FUNCTION atan2 : lREAL
VAR_INPUT
y:LREAL; // y
x:LREAL; // x
END_VAR
VAR
state:INT;
a1: LREAL;
mid:lreal;
END_VAR
内部逻辑:
IF (y>0 AND x>0) THEN
state:=1;
END_IF
IF (y>0 AND x<0) THEN
state:=2;
END_IF
IF (y<0 AND x<0) THEN
state:=3;
END_IF
IF (y<0 AND x>0) THEN
state:=4;
END_IF
CASE state OF
1:
atan2:=ATAN(y/x);
2:
mid:=ABS(y/x);
atan2:=pi-ATAN(mid);
3:
mid:=ABS(y/x);
atan2:=-pi+ATAN(mid);
4:
mid:=ABS(y/x);
atan2:=ATAN(mid);
END_CASE