首页 上一页 1 2 下一页 尾页

自己写的一点基础功能块(一) 点击:3643 | 回复:33



tyfeixian

    
  • 精华:4帖
  • 求助:2帖
  • 帖子:14帖 | 50回
  • 年度积分:52
  • 历史总积分:1301
  • 注册:2006年8月02日
发表于:2020-02-14 19:53:01
楼主

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



无标题.png


使用方法:

将文本复制到记事本里,另存为后缀为“xxx.scl"的文件。

再TIA中 使用:外部源文件 添加 同时生成块文件



楼主最近还看过



xuhui_fox

  • 精华:0帖
  • 求助:1帖
  • 帖子:3帖 | 492回
  • 年度积分:243
  • 历史总积分:617
  • 注册:2007年4月13日
发表于:2021-02-21 19:13:02
21楼

厉害,向楼主学习!

坏孩纸

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 58回
  • 年度积分:0
  • 历史总积分:81
  • 注册:2019年9月13日
发表于:2021-02-21 19:40:27
22楼

收藏了,感谢楼主分享

笨鸟1986

  • 精华:0帖
  • 求助:4帖
  • 帖子:7帖 | 68回
  • 年度积分:270
  • 历史总积分:2123
  • 注册:2015年11月13日
发表于:2021-02-21 21:08:07
23楼

感谢分享

凡尘灬恋

  • 精华:0帖
  • 求助:1帖
  • 帖子:10帖 | 173回
  • 年度积分:53
  • 历史总积分:1262
  • 注册:2018年1月02日
发表于:2021-02-22 16:04:43
24楼

不错,可以借鉴

laohan_123

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 164回
  • 年度积分:1043
  • 历史总积分:3919
  • 注册:2012年1月11日
发表于:2022-05-01 09:04:20
25楼

感谢分享

yangyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 81回
  • 年度积分:975
  • 历史总积分:1027
  • 注册:2005年1月31日
发表于:2022-05-12 22:44:50
26楼

厉害,向楼主学习 

wangxiaowww

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 61回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2022年5月26日
发表于:2022-05-27 09:20:36
27楼

感谢分享


@鹏儿

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 187回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2019年5月29日
发表于:2022-05-27 16:57:41
28楼

学习下,谢谢楼主。

@鹏儿

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 187回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2019年5月29日
发表于:2022-05-27 17:18:46
29楼

学习下,谢谢楼主。

@鹏儿

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 187回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2019年5月29日
发表于:2022-05-27 17:26:32
30楼

谢谢分享

非法少年。。

  • 精华:0帖
  • 求助:2帖
  • 帖子:3帖 | 61回
  • 年度积分:0
  • 历史总积分:178
  • 注册:2017年4月18日
发表于:2022-06-10 15:21:08
31楼

厉害了,这个东西很不错

yunfeilong

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 278回
  • 年度积分:405
  • 历史总积分:510
  • 注册:2008年6月26日
发表于:2022-06-19 08:03:31
32楼

收藏了,感谢楼主

gk2017

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:29
  • 注册:2019年5月15日
发表于:2023-06-12 09:57:50
33楼

很不错,这个对于设备多,程序容量比较大的情况下,很有用


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页