首页 上一页 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中 使用:外部源文件 添加 同时生成块文件



楼主最近还看过



l726039

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 375回
  • 年度积分:25
  • 历史总积分:972
  • 注册:2008年12月12日
发表于:2020-02-14 20:39:42
1楼

收藏了。谢谢

sjz861203

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 44回
  • 年度积分:0
  • 历史总积分:74
  • 注册:2009年12月09日
发表于:2020-02-15 11:47:48
2楼

谢谢楼主  分享   学习学习

2016022009381700001

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 62回
  • 年度积分:0
  • 历史总积分:100
  • 注册:2016年2月20日
发表于:2020-02-15 16:46:27
3楼

楼主霸气,好好学额

SanPort

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 22回
  • 年度积分:0
  • 历史总积分:542
  • 注册:2020年2月15日
发表于:2020-02-15 20:12:22
4楼

楼主霸气!

panljm71682223

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 208回
  • 年度积分:0
  • 历史总积分:251
  • 注册:2018年11月20日
发表于:2020-03-30 21:23:09
5楼

收藏了,感谢

Litex TD

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 43回
  • 年度积分:0
  • 历史总积分:57
  • 注册:2018年10月26日
发表于:2020-04-09 00:06:11
6楼

学习了!谢谢!

HAPPYmw

  • 精华:0帖
  • 求助:0帖
  • 帖子:28帖 | 711回
  • 年度积分:0
  • 历史总积分:64
  • 注册:2003年9月27日
发表于:2020-08-13 16:43:25
7楼

厉害,向楼主学习                                

ppzhang

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 563回
  • 年度积分:0
  • 历史总积分:250
  • 注册:2007年4月11日
发表于:2020-09-07 20:24:34
8楼

引用 "HAPPYmw" 的回复,发表在7楼
        内容: 厉害,向楼主学习

罗有添

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:65
  • 注册:2020年9月07日
发表于:2020-09-08 11:00:59
9楼

我是谁?我在哪里?我在干啥

Niseu

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 18回
  • 年度积分:0
  • 历史总积分:53
  • 注册:2011年4月16日
发表于:2020-09-08 13:22:20
10楼

谢谢分享

未语可知心。

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2020年9月08日
发表于:2020-09-08 13:32:03
11楼

谢谢楼主  分享   学习学习

miluo_liao

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 87回
  • 年度积分:2
  • 历史总积分:122
  • 注册:2013年10月10日
发表于:2020-09-09 08:48:40
12楼

不错,可以借鉴

ppzhang

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 563回
  • 年度积分:0
  • 历史总积分:250
  • 注册:2007年4月11日
发表于:2021-01-18 19:59:05
13楼

引用 "Litex TD" 的回复,发表在6楼
        内容: 学习了!谢谢!

TNTtnt

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 380回
  • 年度积分:0
  • 历史总积分:183
  • 注册:2008年1月16日
发表于:2021-01-21 15:59:45
14楼

厉害了,这个东西很不错

huoshi

  • 精华:0帖
  • 求助:22帖
  • 帖子:347帖 | 2576回
  • 年度积分:561
  • 历史总积分:23189
  • 注册:2020年3月27日
发表于:2021-01-21 16:09:52
15楼

厉害高手谢谢分享

对酒当歌

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 255回
  • 年度积分:3
  • 历史总积分:160
  • 注册:2020年4月07日
发表于:2021-02-10 14:56:52
16楼

谢谢楼主分享,学习了

推宝马

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 28回
  • 年度积分:10
  • 历史总积分:77
  • 注册:2019年3月27日
发表于:2021-02-17 22:04:21
17楼

暂时看不懂,收下。谢谢。

争当技术宅

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 145回
  • 年度积分:2
  • 历史总积分:57
  • 注册:2014年8月14日
发表于:2021-02-20 10:31:35
18楼

感谢楼主分享功能块的使用

zhou8441

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 194回
  • 年度积分:0
  • 历史总积分:565
  • 注册:2009年8月15日
发表于:2021-02-20 10:54:04
19楼

收藏了!非常感谢楼主!

qunqun135

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 26回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2016年5月04日
发表于:2021-02-20 16:58:33
20楼

收藏了,谢谢分享,正需要,楼主好人啊!!


热门招聘
相关主题

官方公众号

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