我想用一个FC块来实现批量处理模拟量转换的功能:事先把所有的相似模拟量输入值采集到一个DB块中,通过引用该FC块将该DB块中的数据批量转换成工程量值,输出到另外一个DB块中。编好后可以运行,但是结果没输出,编程如下:
L #db_num1 //数据块号1,如DB3则该值为3
T #tdb_num1 //传输到临时变量
OPN DB [#tdb_num1] //打开数据块1
L #db_num2 //数据块号2,如DB3则该值为3
T #tdb_num2 //传输到临时变量
OPN DI [#tdb_num2] //打开数据块2
L #data_number //装载需要处理的数据数量
nex: T #buffer //传输到临时变量
L #pointer1 //数据块号1中待处理数据的起始地址
SLD 3 //左移三位,供双字指针寻址用
T #pointer1_act //左移后传给临时变量
L #pointer2 //数据块号2中待处理数据的起始地址
SLD 3 //左移三位,供双字指针寻址用
T #pointer2_act //左移后传给临时变量
L #pointer1 //自此往下3行:数据块1中起始地址加偏移量供下次取用
L #len //加载地址偏移量
+I //起始地址+偏移量
T #pointer1 //#pointer1=#pointer1+#len
L #pointer2 //同上
L #len
+I
T #pointer2
SET //此处往下为模拟量处理部分,下面引用FC105中程序注释
A #BIPOLAR // 如果极性 #BIPOLAR=0
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 to real ( 转换输入值成real值)
L DBW [#pointer1_act] // ACC1= DBW [#pointer1_act](将DB中数据装载进累加器1)
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(以下段程序判断模拟量值是否超限,如果输入模拟量超出K1,K2的范围则进行修正
// is clamped to the nearer of either the LO_LIM or the HI_LIM 修正方法是采取K1.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.
// changed 2/14/00 by ERI per RQ210693
L #IN_REAL // if(IN_REAL L #K1 // .
>=R // .
JC EL02 // {
L 8 // error
T #RET_VAL // .
L #LO_LIM // ACC1=LO_LIM
T DIW [#pointer2_act] // 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 DIW [#pointer2_act] // 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 DIW [#pointer2_act] // 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 //
L #buffer
FAIL: CLR // RLO = 0 (ERROR)
SVBR: SAVE // BR = RLO
BE
另外,本人不知道怎么贴图和上传附件,为了方便大家理解,我把我的程序打包传到了如下地址,可以下载调试。里面有程序的注释,地址如下:www.doma6039.com/test_dbc.rar