对于初识指针的朋友们,只看手册会一脸懵B,因为有很多东西无从理解,知识点也比较广泛。下面举个经典应用给大家,理解后会对指针的应用一目了然。
//Transfer address
L #Value_To_DB_Number
T #Value_To_DB_Number_T
L #Sample_Start_Address
T #Sample_Address
//Initiate LAR1,the Sample_Start_Adress
LAR1 P#256.0
L #Sample_Start_Address
L 256
-I
L 2
/I
T #Counter_1
C_1B: L #Counter_1
L 0
<=I
JC C_2
+AR1 P#2.0
L #Counter_1
L 1
-I
T #Counter_1
JU C_1B
//Initiate LAR2,the Value_To_Start_Address
C_2: LAR2 P#0.0
L #Value_To_Start_Address
L 0
-I
L 1
/I
T #Counter_2
C_2B: L #Counter_2
L 0
<=I
JC Go
+AR2 P#1.0
L #Counter_2
L 1
-I
T #Counter_2
JU C_2B
//Open DataBlock
Go: OPN DB [ #Value_To_DB_Number_T]
//Initiate Alrm_Control_Lamp
R #Alarm_Lamp_Temp
R #Alarm_Voice_Temp
//计算采样值
Top: L PIW [ AR1 , P#0.0 ]
ITD
DTR
T #Value_Sample
// 新工程值
//=采样值*(量程上限-量程下限)/27648+量程下限+修正值,和老工程值做平均滤波
L #Value_Sample
L 2.75e+2
<R
JCN get
L 0.0e+0
T #Value_Sample
get: L DBD [ AR2 , P#16.0 ] //取得量程上限
L DBD [ AR2 , P#12.0 ] //取得量程下限
-R
L #Value_Sample
*R
L 2.7648e+4
/R
L DBD [ AR2 , P#12.0 ] //取得量程下限
+R
L DBD [ AR2 , P#8.0 ] //取得修正值
+R
L DBD [ AR2 , P#0.0 ] //取得工程值
+R
L 2.0e+0
/R
T #Value_Project
L #Value_Project
L DBD [ AR2 , P#12.0 ] //取得量程下限
<=R
JCN LimU
L DBD [ AR2 , P#12.0 ] //取得量程下限
T #Value_Project
JU Perc
LimU: L #Value_Project
L DBD [ AR2 , P#16.0 ] //取得量程上限
>=R
JCN Perc
L DBD [ AR2 , P#16.0 ] //取得量程上限
T #Value_Project
Perc: L #Value_Project
T DBD [ AR2 , P#0.0 ] //送往工程值
// 新百分比
//=(工程值-量程下限)/(量程上限-量程上限)*100.0
L DBD [ AR2 , P#16.0 ] //取得量程上限
L DBD [ AR2 , P#12.0 ] //取得量程下限
-R
T #Sub_Limit
L #Sub_Limit
L 0.0e+0
==R
JCN Per
L 0.0e+0
T DBD [ AR2 , P#4.0 ] //送往百分比
JU Judg
Per: L DBD [ AR2 , P#0.0 ] //取得工程值
L DBD [ AR2 , P#12.0 ] //取得量程下限
-R
L #Sub_Limit //取得量程上限下限差
/R
L 1.0e+2
*R
T #Value_Percentage
L #Value_Percentage
L 0.0e+0
<=R
JC Per1
L #Value_Percentage
T DBD [ AR2 , P#4.0 ] //送往百分比
JU Judg
Per1: L 0.0e+0
T DBD [ AR2 , P#4.0 ] //送往百分比
//报警判断
Judg: L DBD [ AR2 , P#28.0 ] //取得报警信息
T #Alarm_Message_Old
CLR
O DBX [ AR2 , P#32.0 ] //报警允许状态
JC Aler
L 0.0e+0
T DBD [ AR2 , P#28.0 ] //清报警信息
JU Done
Aler: CLR
L DBD [ AR2 , P#0.0 ] //取得工程值
L DBD [ AR2 , P#20.0 ] //取得报警下限
<=R
JCN Al_1
L -1.0e+0
T DBD [ AR2 , P#28.0 ] //置报警信息:-1
S #Alarm_Lamp_Temp //输出灯光报警
JU Al_D
Al_1: L DBD [ AR2 , P#0.0 ] //取得工程值
L DBD [ AR2 , P#24.0 ] //取得报警上限
>=R
JCN Al_2
L 1.0e+0
T DBD [ AR2 , P#28.0 ] //置报警信息:1
S #Alarm_Lamp_Temp //输出灯光报警
JU Al_D
Al_2: L 0.0e+0
T DBD [ AR2 , P#28.0 ] //清报警信息
// ( 0)->( 0) 不处理
// ( 0)->(<>0) 置声音报警,请求消音
// (<>0)->( 0) 不处理
// (<>0)->(<>0) 置声音报警
Al_D: SET
// ( 0)->(<>0) 置声音报警,请求消音
A(
L #Alarm_Message_Old
L 0.0e+0
==R
)
A(
L DBD [ AR2 , P#28.0 ] //取得报警信息
L 0.0e+0
<>R
)
JCN Al_X
S #Alarm_Voice_Temp //置声音报警
S %DBX0.2 //置报警消音
JU Done
Al_X: SET
// (<>0)->(<>0) 置声音报警
A(
L #Alarm_Message_Old
L 0.0e+0
<>R
)
A(
L DBD [ AR2 , P#28.0 ] //取得报警信息
L 0.0e+0
<>R
)
JCN Done
S #Alarm_Voice_Temp //置声音报警
//计算工程值下一路地址
Done: +AR2 P#34.0
//计算采样值下一路地址
+AR1 P#2.0
L 2
L #Sample_Address
+I
T #Sample_Address
L #Sample_Address
L #Sample_End_Address
<=I
JC Top
//报警消音处理
CLR
O #Alarm_Voice_Temp
A %DBX0.2 //与报警消音状态
= #Alarm_Voice_Temp //输出声音报警
//报警输出
CLR
O %DBX0.0 //或报警灯光输出
O #Alarm_Lamp_Temp
= %DBX0.0 //得报警灯光输出
CLR
O %DBX0.1 //或报警声音输出
O #Alarm_Voice_Temp
= %DBX0.1 //得报警声音输出
BEU
//欢迎工控爱好者一起交流成长,该程序可直接使用,是用指针做的模拟量读取转存至DB块中,通知DB块的地址便宜多了一些上下限、报警等;