回复:4输入1输出1状态程序块

已锁定

askab

  • 帖子

    405
  • 精华

    5
  • 被关注

    34

论坛等级:侠圣

注册时间:2005-07-24

黄金 黄金 如何晋级?

发布于 2022-12-13 15:59:56

8楼

需要多重调用程序,用FC块,还是FB块比较好。就是阀门控制。请大神提供一个思路。这个在DCS很经常用到,都是系统只带的一个块,直接调用的。阀门正常有三个颜色,红(关)绿(开)黄(故障)。

/////////////////////

  1. 取决于你的系统是否要存储针对该对象的状态,模式等等控制和显示的情况,如果有用FB,如果没有,用FC,你这个应该用FB比较合适。

  2. 如果同一个逻辑处理多次使用,可以用数组的方式进行控制,这样比较方面,也好维护。

    例如


FUNCTION_BLOCK FB20


TITLE = 'Block Title'

//

// 4选1 控制 泵的控制与状态显示。

//

VERSION: '1.0'

AUTHOR: baikai

NAME: pump

FAMILY: pump

know_how_protect



CONST

pump_max  :=20;  //泵的总数量

pump_stop :=0;   //泵停止状态

pump_run_s  :=1;   //泵运行状态

pump_fault:=2;   //泵故障状态

time_check :=5; // 泵打开/关闭 检测时间 5 秒


END_CONST


VAR_INPUT

button_start:ARRAY[1..pump_max] OF BOOL:=false;    // 泵的启动按钮

button_stop :ARRAY[1..pump_max] OF BOOL:=false;    // 泵的停止按钮

open_check:  ARRAY[1..pump_max] OF BOOL:=false;    // 泵的打开检测

close_check: ARRAY[1..pump_max] OF BOOL:=false;    // 泵的关闭检测

FP_1Sec:BOOL;     // 计数时基  1秒

reset:ARRAY[1..pump_max] OF BOOL:=false;    // 故障复位


END_VAR




VAR_OUTPUT

pump_run: ARRAY[1..pump_max] OF BOOL;    // 泵的运行控制

pump_status:ARRAY[1..pump_max] OF INT;    // 泵的运行状态

Impls_1Sec:BOOL;

END_VAR


VAR_IN_OUT    

   Impls_1Sec_Aux:BOOL;

END_VAR




VAR

time_enable:ARRAY[1..pump_max] OF BOOL;      // 定时器使能

time_arrival:ARRAY[1..pump_max] OF BOOL;      // 时间到达

Timer_Actual:ARRAY[1..pump_max] OF INT;          // 实际时间

num:INT;

END_VAR

// 1秒脉冲 作为计数时基

Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux); 

Impls_1Sec_Aux:= FP_1Sec;


    FOR num:= 1 TO pump_max BY 1 DO 

           // 按钮启动控制

           pump_run[num]:= ( pump_run[num] OR button_start[num] ) AND NOT button_stop[num];

           // 泵打开/关闭检测故障 定时器使能

           time_enable[num]:= ( pump_run[num] AND NOT open_check[num]) OR ( NOT  pump_run[num] AND NOT close_check[num]);


      IF NOT reset[num] THEN

                        IF (NOT time_enable[num]) THEN 

                           Timer_Actual[num]:= 0; 

                           time_arrival[num]:= 0; 

                        ELSE

                        IF (Impls_1Sec AND NOT time_arrival[num]) THEN

                            Timer_Actual[num]:= Timer_Actual[num] + 1;

                        END_IF;

                        time_arrival[num]:= Timer_Actual[num] >= time_check;

                        END_IF;

      ELSE

          Impls_1Sec:=false;

          Timer_Actual[num]:= 0; 

          time_arrival[num]:= false;             

    END_IF;

    

// 状态显示选择

IF time_arrival[num]  THEN

     pump_status[num]:= pump_fault;

ELSE

    IF  pump_run[num] THEN

       pump_status[num]:= pump_run_s;

    ELSE

        pump_status[num]:= pump_stop;

    END_IF;

END_IF;

     

    END_FOR;


  

END_FUNCTION_BLOCK


DATA_BLOCK DB111  FB20

//

// Block Comment...

//

BEGIN


END_DATA_BLOCK

一个很简单的逻辑控制,其中 采用一维数组可以对同样逻辑的处理可以进行扩展,这里为20个, 其次采用自己制作ODT 定时器。 这里唯一不足,是没有区分故障是开关站还是关故障。因为采用了一个定时器,状态不是开就是关。

这样做的目的 1.  减少复制,以及赋值过程书写错误。

                      2. 如果采用上位机 例如WINCC 方便的导入变量。

以上仅供参考

大家同行,you ok ? me !
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54705条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。