4-20mA转换如下:
A(
L #in_put
L 0
I
)
JCN _002
L 2.764800e+004
T #temp1
JU _003
_002: L #in_put
ITD
DTR
T #temp1
JU _003
_003: L #ph
L #pl
-R
L #temp1
*R
L 2.764800e+004
/R
L #pl
+R
T #out_put
其中:ph pl 分别为测量仪表的上下限,real型;in_put为模块测量得到的字,WORD型;temp1为中间变量,real型;out_put为电脑显示的测量值,real型。
当然,很多仪表下限都是0,这样_003可简化。
孔板流量计等一些需要开方,此时需要小信号切除或对其作线性处理,其程序如下: A( L #in_put L 1000 //小信号字值 <I ) JCN _001 JU _004 _001: A( L #in_put L 27648 >I ) JCN _002 L 2.764800e+004 T #temp1 JU _003 _002: L #in_put ITD DTR T #temp1 JU _003 _003: L #ph //_003部分为开方处理 L #pl -R T #temp2 L #temp1 L 2.764800e+004 /R SQRT L #temp2 *R L #pl +R T #out_put _004: L #in_put //_004部分为线性处理 ITD DTR L 2.764800e+004 /R L #temp2 *R L #pl +R T #out_put
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
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 // .
// 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 HI_LIM and LO_LIM range, the output // is clamped to the nearer of either K1 or K2 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.
L #SPAN // if(SPAN<0) reverse scaling L 0.000000e+000 // . <R // . JCN EL02 // { L #IN // if(IN<HI_LIM) L #HI_LIM // . >=R // . JC EI03 // { L 8 // error T #RET_VAL // . L #K1 // ACC1=K1 JU WRIT // write OUT EI03: NOP 0 // } POP // if(IN>LO_LIM) L #LO_LIM // . <=R // . JC EI04 // { L 8 // error T #RET_VAL // . L #K2 // ACC1=K2 JU WRIT // write OUT EI04: NOP 0 // } JU EI02 // } else { direct scaling EL02: L #IN // if(IN<LO_LIM) L #LO_LIM // . >=R // . JC EI05 // { L 8 // error T #RET_VAL // . L #K1 // ACC1=K1 JU WRIT // write OUT EI05: NOP 0 // } POP // if(IN>HI_LIM) L #HI_LIM // . <=R // . JC EI06 // { L 8 // error T #RET_VAL // . L #K2 // ACC1=K2 JU WRIT // write OUT EI06: NOP 0 // } EI02: NOP 0 // } JU CALC // perform unscale calculation WRIT: TRUNC // convert to integer T #OUT // OUT=ACC1 JU FAIL // error
// unscale the input
CALC: L #K2 // TEMP1=K2-K1 L #K1 // . -R // . T #TEMP1 // . L #IN // IN-LO_LIM L #LO_LIM // . -R // . L #SPAN // divide by SPAN /R // . L #TEMP1 // multiply by TEMP1 *R // . L #K1 // add K1 +R // . TRUNC // convert to DINT T #OUT // OUT=unscale(IN)
// 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