模块化处理PLC 点击:362 | 回复:1



tyfeixian

    
  • 精华:4帖
  • 求助:2帖
  • 帖子:14帖 | 50回
  • 年度积分:27
  • 历史总积分:1276
  • 注册:2006年8月02日
发表于:2019-04-05 21:38:20
楼主

使用过一段时间的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中输入变量时比较方便。

a1.png



未完待续。。。。。持续更新。。。。。




Lonely_99

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2490回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2014年10月29日
发表于:2019-04-08 21:20:57
1楼

不懂来这里好好学学!谢谢享!!


热门招聘
相关主题

官方公众号

智造工程师