使用过一段时间的PCS7 感觉CFC的模块化处理比较方便。
在几个小的项目中(1200,300,1500都使用同样的方法),配合Wincc的结构变量,感觉编写比较简单。
下面将个人的方法写出来。
使用环境为 笔记本装TIA-V14SP1,台式机装Wincc7.4。 两个软件有冲突,不能同时装在一台计算机中。
解决冲突的方法是,安装TIA的时候,选择自定义,然后取消掉所有带有wincc标志的选项。(网传的,没试验过,不知道可不可以)。欢迎试验过的兄弟,贴图说明一下。
首先自行编写功能FB库。
1:模拟量输入处理。
FUNCTION_BLOCK "AI_convert"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_inAW : Int; // AI输入采集端,对应硬件地址
_inHI : Real := 100.0; // AI量程上限
_inLi : Real; // AI量程下限
_AlarmHiSP : Real := 95.0; // AI报警上限
_AlarmLiSP : Real := 0.0; // AI报警下限
_AlarmHHiSP : Real; // AI报警上上限
_AlarmLLiSP : Real; // AI报警下下限
END_VAR
VAR_OUTPUT
_out : Real; // AI转换输出值,PV值
_Alarm_H : Bool; // 高报
_Alarm_L : Bool; // 低报
_Alarm_HH : Bool; // 高高报
_Alarm_LL : Bool; // 低低报
END_VAR
VAR
Err_Code : Word; // 转换错误代码,word字节中的第一位高报,第二位低报,第三位转换错误。其中转换错误代码是Err_Code.
Err : Bool; // 报警数字输出
_out_N : Real; // 输出0-1之间的比例,
END_VAR
VAR_TEMP
"Var" : Word;
END_VAR
BEGIN
#Var := SCALE(IN := #_inAW, HI_LIM := 1.0, LO_LIM := 0.0, BIPOLAR := 0, OUT => #_out_N); //将采集的信号缩放到0-1之间
#Var := SCALE(IN := #_inAW, HI_LIM := #_inHI, LO_LIM := #_inLi, BIPOLAR := 0, OUT => #_out); //将采集的信号缩放到需要的量程范围内。
IF #_out > #_AlarmHiSP THEN //高限报警触发。
#_Alarm_H := 1;
#Err_Code := #Err_Code OR 16#1;
ELSE
#_Alarm_H := 0;
#Err_Code := #Err_Code AND 16#fe;
END_IF;
IF #_out < #_AlarmLiSP THEN //低限报警触发。
#_Alarm_L := 1;
#Err_Code := #Err_Code OR 16#2;
ELSE
#_Alarm_L := 0;
#Err_Code := #Err_Code AND 16#fd;
END_IF;
IF #Var <> 0 THEN //自带的Scale功能块运算错误报警
#Err_Code := #Err_Code OR 16#4;
ELSE
#Err_Code := #Err_Code AND 16#fb;
END_IF;
IF #_out > #_AlarmHHiSP THEN //高高限报警触发。
#_Alarm_HH := 1;
#Err_Code := #Err_Code OR 16#8;
ELSE
#_Alarm_HH := 0;
#Err_Code := #Err_Code AND 16#f7;
END_IF;
IF #_out < #_AlarmLLiSP THEN //低低限报警触发。
#_Alarm_LL := 1;
#Err_Code := #Err_Code OR 16#10;
ELSE
#_Alarm_LL := 0;
#Err_Code := #Err_Code AND 16#ef;
END_IF;
IF #Err_Code <> 0 THEN
#Err := 1;
ELSE
#Err := 0;
END_IF;
//word字节中的第一位高报,第二位低报,第三位转换错误,第四位高高报警,第五位低低报警。
END_FUNCTION_BLOCK
2:RTD输入处理
FUNCTION_BLOCK "RTD_Convert"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_inAW : Int := 0; // AI输入采集端,对应硬件地址
_inHI : Real := 100.0; // AI量程上限
_inLi : Real := 0.0; // AI量程下限
_AlarmHiSP : Real := 90.0; // AI报警上限
_AlarmLiSP : Real := 0.0; // AI报警下限
_AlarmHHiSP : Real := 95.0; // AI报警上上限
_AlarmLLiSP : Real := 0.0; // AI报警下下限
END_VAR
VAR_OUTPUT
_out : Real; // AI转换输出值,PV值
_Alarm_H : Bool; // 高报
_Alarm_L : Bool; // 低报
_Alarm_HH : Bool; // 高高报
_Alarm_LL : Bool; // 低低报
END_VAR
VAR
Err_Code : Word; // 转换错误代码
Err : Bool; // word字节中的第一位高报,第二位低报,第三位转换错误。其中转换错误代码是Err_Code.
_out_N : Real; // 将输出转换为0-1之间,供PID回路使用。
END_VAR
VAR_TEMP
"Var" : Word;
END_VAR
BEGIN
#_out := INT_TO_REAL(#_inAW) / 10; //将温度采集的信号直接除以10,即可得到实际的温度数值。
#_out_N := #_out / #_inHI;
IF #_out > #_AlarmHiSP THEN //高限报警触发。
#_Alarm_H := 1;
#Err_Code := #Err_Code OR 16#1;
ELSE
#_Alarm_H := 0;
#Err_Code := #Err_Code AND 16#fe;
END_IF;
IF #_out < #_AlarmLiSP THEN //低限报警触发。
#_Alarm_L := 1;
#Err_Code := #Err_Code OR 16#2;
ELSE
#_Alarm_L := 0;
#Err_Code := #Err_Code AND 16#fd;
END_IF;
IF #Var <> 0 THEN //自带的Scale功能块运算错误报警
#Err_Code := #Err_Code OR 16#4;
ELSE
#Err_Code := #Err_Code AND 16#fb;
END_IF;
IF #_out > #_AlarmHHiSP THEN //高高限报警触发。
#_Alarm_HH := 1;
#Err_Code := #Err_Code OR 16#8;
ELSE
#_Alarm_HH := 0;
#Err_Code := #Err_Code AND 16#f7;
END_IF;
IF #_out < #_AlarmLLiSP THEN //低低限报警触发。
#_Alarm_LL := 1;
#Err_Code := #Err_Code OR 16#10;
ELSE
#_Alarm_LL := 0;
#Err_Code := #Err_Code AND 16#ef;
END_IF;
IF #Err_Code <> 0 THEN
#Err := 1;
ELSE
#Err := 0;
END_IF;
//word字节中的第一位高报,第二位低报,第三位转换错误,第四位高高报警,第五位低低报警。
END_FUNCTION_BLOCK
3: 建立FC功能连接所有模入。在调用FB是弹出DB号尽量成连续的,这样在Wincc中输入变量时比较方便。
未完待续。。。。。持续更新。。。。。