Y值根据一般线性方程计算:y = a x b.
由此引出以下关系:
( y1 -y0 )
y = -------------- * ( x - x0 ) y0
( x1 - x0 )
线性缩放功能块 “ SclScaleLinearIntToReal ” 。
代码语言:javascript复制FUNCTION "SclScaleLinearInt" : Int
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
x : Int;
yMin : Int;
yMax : Int;
x0 : Int;
y0 : Int;
x1 : Int;
y1 : Int;
END_VAR
VAR_TEMP
tempYwert : Real;
tempX0real : Real;
tempX1real : Real;
tempY0real : Real;
tempY1real : Real;
tempXreal : Real;
tempYminReal : Real;
tempYmaxReal : Real;
END_VAR
BEGIN
#tempX0real := INT_TO_REAL(#x0);
#tempX1real := INT_TO_REAL(#x1);
#tempY0real := INT_TO_REAL(#y0);
#tempY1real := INT_TO_REAL(#y1);
#tempXreal := INT_TO_REAL(#x);
#tempYminReal := INT_TO_REAL(#yMin);
#tempYmaxReal := INT_TO_REAL(#yMax);
IF (#x1 - #x0) = 0 OR (#x - #x0) = 0 OR (#y1 - #y0) = 0 OR #yMin > #yMax
THEN
#tempYwert := 0;
ELSE
#tempYwert := (#tempY1real - #tempY0real) / (#tempX1real - #tempX0real) * (#tempXreal - #tempX0real) #tempY0real;
END_IF;
IF #tempYwert < #tempYminReal THEN
#SclScaleLinearInt := 0;
ELSIF #tempYwert > #tempYmaxReal THEN
#SclScaleLinearInt := #yMax;
ELSE
#SclScaleLinearInt := REAL_TO_INT(#tempYwert);
END_IF;
END_FUNCTION
代码语言:javascript复制FUNCTION "SclScaleLinearIntToReal" : Real
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
x : Int;
yMin : Real;
yMax : Real;
x0 : Int;
y0 : Real;
x1 : Int;
y1 : Real;
END_VAR
VAR_TEMP
tempXreal : Real;
tempX1real : Real;
tempX0real : Real;
tempYwert : Real;
END_VAR
BEGIN
#tempXreal := INT_TO_REAL(#x);
#tempX0real := INT_TO_REAL(#x0);
#tempX1real := INT_TO_REAL(#x1);
IF (#x1 - #x0) = 0 OR (#x - #x0) = 0 OR (#y1 - #y0) = 0 OR #yMin > #yMax
THEN
#tempYwert := 0;
ELSE
#tempYwert := (#y1 - #y0) / (#tempX1real - #tempX0real) * (#tempXreal - #tempX0real) #y0;
END_IF;
IF #tempYwert < #yMin THEN
#SclScaleLinearIntToReal := 0;
ELSIF #tempYwert > #yMax THEN
#SclScaleLinearIntToReal := #yMax;
ELSE
#SclScaleLinearIntToReal := #tempYwert;
END_IF;
END_FUNCTION
代码语言:javascript复制FUNCTION "SclScaleLinearReal" : Real
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
x : Real;
yMin : Real;
yMax : Real;
x0 : Real;
y0 : Real;
x1 : Real;
y1 : Real;
END_VAR
VAR_TEMP
tempYtemp : Real;
END_VAR
BEGIN
IF (#y1 - #y0) = 0 OR (#x1 - #x0) = 0 OR (#x - #x0) = 0 OR #yMin > #yMax
THEN
#tempYtemp := 0;
ELSE
#tempYtemp := (#y1 - #y0) / (#x1 - #x0) * (#x - #x0) #y0;
END_IF;
IF #tempYtemp < #yMin THEN
#SclScaleLinearReal := 0;
ELSIF #tempYtemp > #yMax THEN
#SclScaleLinearReal := #yMax;
ELSE
#SclScaleLinearReal := #tempYtemp;
END_IF;
END_FUNCTION
代码语言:javascript复制FUNCTION "SclScaleLinearRealToInt" : Int
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
x : Real;
yMin : Int;
yMax : Int;
x0 : Real;
y0 : Int;
x1 : Real;
y1 : Int;
END_VAR
VAR_TEMP
tempY0real : Real;
tempY1real : Real;
tempYreal : Real;
tempYminReal : Real;
tempYmaxReal : Real;
END_VAR
BEGIN
#tempY0real := INT_TO_REAL(#y0);
#tempY1real := INT_TO_REAL(#y1);
#tempYminReal := INT_TO_REAL(#yMin);
#tempYmaxReal := INT_TO_REAL(#yMax);
IF (#y1 - #y0) = 0 OR (#x1 - #x0) = 0 OR (#x - #x0) = 0 OR #yMin > #yMax
THEN
#SclScaleLinearRealToInt := 0;
ELSE
#tempYreal := (#tempY1real - #tempY0real) / (#x1 - #x0) * (#x - #x0) #tempY0real;
END_IF;
IF #tempYreal < #tempYminReal THEN
#SclScaleLinearRealToInt := 0;
ELSIF #tempYreal > #tempYmaxReal THEN
#SclScaleLinearRealToInt := #yMax;
ELSE
#SclScaleLinearRealToInt := REAL_TO_INT(#tempYreal);
END_IF;
END_FUNCTION
例子
模拟量输入模块用来测量一个4mA 至 20mA 的电流信号。此信号在 CPU 内部被转换为 0 至27648。液位用此计算值来测量。
由此可知 :
4mA 对应 0.0m 液位,
而 20mA 对应 1.7m 液位。
按照如下确定参数:
- P0 ( x0=0; y0=0.0 )
- P1 ( x1= 27648; y1=1.7 )
图4“SclScaleLinearIntToReal”函数的调用和参数。
( y1 -y0 )
y = -------------- * ( x - x0 ) y0
( x1 - x0 )
( 1.7-0.0)
= -------------- * ( 12556 - 0 ) 0.0
( 27648- 0)
=0.7720341...