最近有个朋友问我能不能给把一个STL程序块给转换成SCL,他说这个程序是他们公司大佬写的程序,有个模拟量处理的块是STL的他看不懂,想让我给转成SCL的,我一看这不是SCALE块,这个块以前我解读过,就把这个代码分享一下。
STL源码
使用博图之后数据接口和程序的可读性好了很多
STL代码解读
1、SET
2、A #BIPOLAR //模拟量极性
3、JC EL01
如果#BIPOLAR为TRUE,也就是设置了模拟量的极性跳转到第7行EL01处。
4、L 0.0e+0
5、T #K1
6、JU EI01
如果未设置模拟量的极性#K1等于0.0,强制跳转到第9行EI01行。
7、EL01: L -2.7648e+4
8、T #K1
如果设置模拟量的极性#K1等于-2.7648e+4。
9、EI01: NOP 0
10、L 2.7648e+4
11、T #K2
变量#K2赋值为2.7648e+4。
12、L #IN
13、ITD
14、DTR
15、T #IN_REAL
将模拟量接口的数值#IN,转换为双整形,再转换为实形,赋值给#IN_REAL。
16、L #HI_LIM
17、L #LO_LIM
18、-R
19、T #SPAN
计算模拟量实际值的上下限的范围赋值给#SPAN。
20、L #IN_REAL
21、L #K1
22、>=R
23、JC EL02
如果输入值#IN_REAL>#K1,正常模拟量通道返回的值#IN_REAL应该在K1和K2之间。判断模拟量的值是否大于下限。
取值正常跳转到第29行EL02处,不在正常范围内执行24行。
24、L 8
25、T #scale //返回值
26、L #LO_LIM
27、T #OUT
28、JU FAIL
低于下限异常处理代码,返回值#scale为8,输出下限值,跳转到58行FAIL处。
29、EL02: POP
30、L #K2
31、<=R
32、JC EI04
此处判断模拟量取值是否高于上限,正常值跳转到38行EL04处,超出则执行33行
33、L 8
34、T #scale
35、L #HI_LIM
36、T #OUT
37、JU FAIL
高于上限异常处理代码,返回值#scale为8,输出上限值,跳转到58行FAIL处。
38、EI04: NOP 0
39、NOP 0
40、L #K2 //27648.0
41、L #K1 //0或者-27648.0
42、-R
43、T #TEMP1
44、L #IN_REAL
45、L #K1
46、-R
47、L #TEMP1
48、/R
49、L #SPAN
50、*R
51、L #LO_LIM
52、+R
53、T #OUT
执行模拟量运算的经典公式,OUT为模拟量计算的输出值
54、L 0
55、T #scale
56、SET
57、JU SVBR
模拟量值正常是,则返回值#scale为0,使能ENO输出。
58、FAIL: CLR
59、SVBR: SAVE
如果模拟量超过上下限的时候,返回值#scale为8,不使能ENO输出。
SCL代码解读
下面是根据STL代码转写的SCL程序,用SCL一行可以实现很多的运算。
IF #BIPOLAR THEN //根据极性确定K1的值
#K1 := -2.7648e+4;
ELSE
#K1 := 0.0e0;
END_IF;
#K2:= 2.7648e+4;
#IN_REAL := INT_TO_REAL(#IN); //通道输入模拟量转为浮点型
#SPAN := #HI_LIM - #LO_LIM; //模拟量上下限范围
IF #IN_REAL < #K1 THEN //低于下限异常处理
#scale2 := 8;
ENO := false;
#OUT := #LO_LIM;
ELSIF #IN_REAL > #K2 THEN //高于上限异常处理
#scale2 := 8;
ENO := false;
#OUT := #HI_LIM;
ELSE //正常数值计算
#TEMP1 := #K2 - #K1;
#OUT := (#IN_REAL - #K1) / #TEMP1 * #SPAN + #LO_LIM;
#scale2 := 0;
END_IF;
如果大家有代码需要解读,欢迎私信给我,我是山东王建设,专注于西门子STL代码解读,期待您的点赞与关注。