1200有自己带的一套功能库,名字是:Basic Process Library
但是使用西门子的功能库,会发现资源占用好多,用了十多个,发现内存超了,无法下载。
以下是自行编写的一些简易功能块,希望一起斧正。尽量已短小精悍为主,实现多种功能。
1、
1200 AI数据采集功能块
FUNCTION_BLOCK "AI_convert"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_inAW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // AI输入采集端,对应硬件地址
_inHI : Real := 100.0; // AI量程上限
_inLi : Real; // AI量程下限
_AlarmHiSP : Real := 90.0; // AI报警上限
_AlarmLiSP : Real := 0.0; // AI报警下限
_AlarmHHiSP : Real := 95.0; // 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
#_out_N := NORM_X(MIN := 0, VALUE := #_inAW, MAX := 27648); //将采集的信号缩放到0-1之间
#_out := SCALE_X(MIN:=#_inLi, VALUE:=#_out_N, MAX:=#_inHI); //将采集的信号缩放到需要的量程范围内。
//当上上限小于上限时,更改上上限值为上限值。
//当下下限大于下限时,更改下下限值为下限值。
IF #_AlarmHHiSP < #_AlarmHiSP THEN
#_AlarmHHiSP := #_AlarmHiSP;
END_IF;
IF #_AlarmLLiSP > #_AlarmLiSP THEN
#_AlarmLLiSP := #_AlarmLiSP;
END_IF;
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 #_out > #_AlarmHHiSP THEN //高高限报警触发。
#_Alarm_HH := 1;
#Err_Code := #Err_Code OR 16#4;
ELSE
#_Alarm_HH := 0;
#Err_Code := #Err_Code AND 16#fb;
END_IF;
IF #_out < #_AlarmLLiSP THEN //低低限报警触发。
#_Alarm_LL := 1;
#Err_Code := #Err_Code OR 16#8;
ELSE
#_Alarm_LL := 0;
#Err_Code := #Err_Code AND 16#f7;
END_IF;
IF #Var <> 0 THEN //自带的Scale功能块运算错误报警
#Err_Code := #Err_Code OR 16#10;
ELSE
#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、
1500 AI采集功能块
FUNCTION_BLOCK "AI_convert"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_inAW : Int; // AI输入采集端,对应硬件地址
_inLi : Real; // AI量程下限
_inHI : Real := 100.0; // AI量程上限
_AlarmLiSP : Real := 0.0; // AI报警下限
_AlarmHiSP : Real := 95.0; // AI报警上限
_AlarmLLiSP : Real; // AI报警下下限
_AlarmHHiSP : Real; // AI报警上上限
END_VAR
VAR_OUTPUT
_out : Real; // AI转换输出值,PV值
_Alarm_L : Bool; // 低报
_Alarm_H : Bool; // 高报
_Alarm_LL : Bool; // 低低报
_Alarm_HH : 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 #_AlarmHHiSP < #_AlarmHiSP THEN
#_AlarmHHiSP := #_AlarmHiSP;
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 #_AlarmLLiSP > #_AlarmLiSP THEN
#_AlarmLLiSP := #_AlarmLiSP;
END_IF;
IF #Err_Code <> 0 THEN
#Err := 1;
ELSE
#Err := 0;
END_IF;
//word字节中的第一位高报,第二位低报,第三位转换错误,第四位高高报警,第五位低低报警。
END_FUNCTION_BLOCK
3、
RTD 采集功能块
FUNCTION_BLOCK "RTD_Convert"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_inAW : Int := 0; // RTD输入采集端,对应硬件地址
_inLi : Real := 0.0; // RTD量程下限,供上位机使用
_inHI : Real := 100.0; // RTD量程上限,供上位机使用
_AlarmLiSP : Real := 0.0; // RTD报警下限
_AlarmHiSP : Real := 90.0; // RTD报警上限
_AlarmLLiSP : Real := 0.0; // RTD报警下下限
_AlarmHHiSP : Real := 95.0; // RTD报警上上限
END_VAR
VAR_OUTPUT
_out : Real; // AI转换输出值,PV值
_Alarm_L : Bool; // 低报
_Alarm_H : Bool; // 高报
_Alarm_LL : Bool; // 低低报
_Alarm_HH : 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 #_out > #_AlarmHHiSP THEN //高高限报警触发。
#_Alarm_HH := 1;
#Err_Code := #Err_Code OR 16#4;
ELSE
#_Alarm_HH := 0;
#Err_Code := #Err_Code AND 16#fb;
END_IF;
IF #_out < #_AlarmLLiSP THEN //低低限报警触发。
#_Alarm_LL := 1;
#Err_Code := #Err_Code OR 16#8;
ELSE
#_Alarm_LL := 0;
#Err_Code := #Err_Code AND 16#f7;
END_IF;
IF #Var <> 0 THEN //自带的Scale功能块运算错误报警
#Err_Code := #Err_Code OR 16#10;
ELSE
#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
使用方法:
将文本复制到记事本里,另存为后缀为“xxx.scl"的文件。
再TIA中 使用:外部源文件 添加 同时生成块文件
楼主最近还看过