以下是引用scp09在2013/3/15 22:09:44的发言:
太感谢你了,你写的程序真的太高明了,我也就只能写个简单点的程序,你看着我写的那个程序下到plc中,输出口会有电流吗?我测过了,是没有呢,那是什么原因呢
我看了FC105的程序,它是将一个模拟量输入量-27648----+27648(0---+27648)的量转换到所需要的范围(如:0---100) 你的程序的输出值是4--20 那么输出到模拟量的值是可以忽略不计的!!
你可以修改FC105的程序来达到你的目的,以下是FC105的程序,希望对你有帮助!!
FC105 - <离线>
"SCALE" Scaling Values
名称: SCALE 系列: CONVERT
名称 数据类型 地址 注释
+++++++++++++++++++IN++++++++++++++++++++++++
IN Int 0.0 input value to be scaled
HI_LIM Real 2.0 upper limit in engineering units
LO_LIM Real 6.0 lower limit in engineering units
BIPOLAR Bool 10.0 1=bipolar; 0=unipolar
+++++++++++++++++++OUT++++++++++++++++++++++
OUT Real 14.0 result of the scale conversion
+++++++++++++++++++TEMP++++++++++++++++++++++++
IN_REAL Real 0.0 input value as a REAL number
K1 Real 4.0 low limit for input value
K2 Real 8.0 high limit for input value
SPAN Real 12.0 HI_LIM - LO_LIM
TEMP1 Real 16.0 temporary result
+++++++++++++++++++RETURN+++++++++++++++++++++++
RET_VAL Word 12.0
//FC105 SCALING VALUES
//set K1 and K2 constants based upon BIPOLAR
SET // if(BIPOLAR=0)
A #BIPOLAR // .
JC EL01 // {
L 0.000000e+000 // K1=0
T #K1 // .
JU EI01 // } else {
EL01: L -2.764800e+004 // K1=-27648.0
T #K1 // .
EI01: NOP 0 // }
L 2.764800e+004 // K2=+27648.0
T #K2 // .
// convert input (IN) to real
L #IN // ACC1=IN
ITD // convert to double integer
DTR // convert to real
T #IN_REAL // IN_REAL-IN as a real
// determine SPAN = HI_LIM - LO_LIM
L #HI_LIM // SPAN=HI_LIM-LO_LIM
L #LO_LIM // .
-R // .
T #SPAN // .
// If the input value is outside the K1 and K2 range, the output
// is clamped to the nearer of either the LO_LIM or the HI_LIM
// and an error is logged. If the input value is exactly at a limit the
// output will be set to the computed limit with no error returned.
// changed 2/14/00 by ERI per RQ210693
L #IN_REAL // if(IN_REAL<K1)
L #K1 // .
>=R // .
JC EL02 // {
L 8 // error
T #RET_VAL // .
L #LO_LIM // ACC1=LO_LIM
T #OUT // OUT=ACC1
JU FAIL // error
EL02: POP // } else {
L #K2 // if(IN_REAL>K2)
<=R // .
JC EI04 // {
L 8 // error
T #RET_VAL // .
L #HI_LIM // ACC1=HI_LIM
T #OUT // OUT=ACC1
JU FAIL // error
EI04: NOP 0 // }
NOP 0 // }
// scale the input
L #K2 // TEMP1=K2-K1
L #K1 // .
-R // .
T #TEMP1 // .
L #IN_REAL // IN_REAL-K1
L #K1 // .
-R // .
L #TEMP1 // divide by TEMP1
/R // .
L #SPAN // multiply by SPAN
*R // .
L #LO_LIM // add LO_LIM
+R // .
T #OUT // OUT=scale(IN_REAL)
// set BR bit : no error-set BR bit to 1; with error-set BR bit to 0.
L 0 // return error code 0
T #RET_VAL
SET // RLO = 1 (NO ERROR)
JU SVBR //
FAIL: CLR // RLO = 0 (ERROR)
SVBR: SAVE // BR = RLO