下面是SCL寫的模擬量采集,用來調(diào)用。放在了FC塊,跑起來也沒什么不一樣,放在FB塊 就是多一個(gè)DB塊,里面也就是 當(dāng)前的傳感器數(shù)據(jù) 也沒什么重要的東西,所以有了疑問,是放在那個(gè)塊比較好呢???
下面SCL使用方法,保存為txt文件,修改文件后綴為scl ,博圖導(dǎo)入外部源文件 就可以生成fc塊了
復(fù)制代碼- FUNCTION "模擬量數(shù)據(jù)處理" : Void
- { S7_Optimized_Access := 'TRUE' }
- VERSION : 0.1
- VAR_INPUT
- 模擬量輸入 : Int;
- 傳感器量程上限 : Real;
- 傳感器量程下限 : Real;
- 模擬量量程上限 : Int;
- 模擬量量程下限 : Int;
- 傳感器修正值 : Real;
- END_VAR
- VAR_OUTPUT
- 傳感器實(shí)際值 : Real;
- 傳感器修正后結(jié)果 : Real;
- 傳感器故障 : Bool;
- END_VAR
- VAR_TEMP
- i : Int;
- j : Real;
- k : Int;
- END_VAR
- BEGIN
- //數(shù)據(jù)處理
- IF #模擬量輸入 <= #模擬量量程下限 THEN //判斷輸入值是否低于模擬量設(shè)定下限值
- #傳感器實(shí)際值 := #傳感器量程下限; //輸出直接為浮點(diǎn)數(shù)設(shè)定值下限
- END_IF;
- IF #模擬量輸入 >= #模擬量量程上限 THEN //判斷輸入值是否高于模擬量設(shè)定上限值
- #傳感器實(shí)際值 := #傳感器量程上限; //輸出直接為浮點(diǎn)數(shù)設(shè)定值上限
- END_IF;
- IF #模擬量輸入 > #模擬量量程下限 AND #模擬量輸入 < #模擬量量程上限 THEN
- //判斷輸入值是否在設(shè)定值限值內(nèi)
- #i := #模擬量輸入 - #模擬量量程下限; //實(shí)時(shí)值與模擬量下限值的差
- #k := #模擬量量程上限 - #模擬量量程下限; //模擬量設(shè)定值的區(qū)間
- #j := #傳感器量程上限 - #傳感器量程下限; //浮點(diǎn)數(shù)設(shè)定值的區(qū)間
- #傳感器實(shí)際值 := #j * #i / #k + #傳感器量程下限;
- END_IF;
- //傳感器數(shù)值修正
- #傳感器修正后結(jié)果 := #傳感器實(shí)際值 + #傳感器修正值; //對(duì)實(shí)際的的傳感器數(shù)值進(jìn)行結(jié)果修正
- //傳感器故障檢測(cè)
- IF #模擬量輸入 < #模擬量量程下限 THEN //判斷輸入值是否低于模擬量設(shè)定下限值
- #傳感器故障 := true; //輸出傳感器故障
- END_IF;
- IF #模擬量輸入 > #模擬量量程上限 THEN //判斷輸入值是否高于模擬量設(shè)定上限值
- #傳感器故障 := true; //輸出傳感器故障
- END_IF;
- IF #傳感器實(shí)際值 < #傳感器量程下限 THEN //判斷結(jié)果是否低于傳感器量程設(shè)定下限值
- #傳感器故障 := true; //輸出傳感器故障
- END_IF;
- IF #傳感器實(shí)際值 > #傳感器量程上限 THEN //判斷結(jié)果是否高于傳感器量程設(shè)定上限值
- #傳感器故障 := true; //輸出傳感器故障
- END_IF;
- END_FUNCTION
|