SCL 写的这个逻辑对不对......

已锁定

xy.z.

  • 帖子

    17
  • 精华

    0
  • 被关注

    0

论坛等级:游民

注册时间:2015-05-02

普通 普通 如何晋级?

SCL 写的这个逻辑对不对......

842

3

2018-08-13 23:23:27

程序需要的逻辑是.


INR1 - INR7 8个信号输入.  

从 1 => 0 => 1    变化至少一次后

且同时全为1    输出 OUTR = true


INL1 => INL7 8个信号输入.

从 1 => 0 => 1    变化至少一次后

且同时全为1 且S1 S2为1 且INR 为1 后输出 OUTL为true


程序有个总开关key.

当key=1 时 开始执行逻辑.

当key=0时, 复位所有.


硬件接线如下图.

1,2,3,4 是一个常闭的传感器信号,正常一直有24v电压.

Pilz检测到有断开即报警.

已经测试过.继电器切换的瞬间掉电Pilz检测不出来.

现在的问题是.

调用块直接输出到Q点驱动继电器时.

1,强制Q点....功能正常.

2,monitorQ点... 功能正常.

3,如果本来在强制状态,再次点强制,就会有一个提示.这种情况...功能不正常.

4,手动按中间继电器[我这个是有手动按的那种继电器]...手速不够.失败.

5,按照上面做的逻辑.从IN1-IN7一个个的动一遍输入...程序输出Q点.功能正常.

   重点来了.

6,程序自动运行的时候.....大约10次有2次左右正常....其余全挂.....


在经过了一番折腾之后.

把输出自锁一下居然解决了这个问题.

所以.我怀疑是scl程序是不是哪里出了问题.

但是看了N遍也没看出来啥花儿来.....

各位大大帮忙看看.


成功的调用方法.

OB1-Network30 31.pdf



失败的调用方法.

6366977123601601046566368.pdf

下面是程序.

SCL Source(FB1200) -- ABB.pdf


我再直接贴个代码.



FUNCTION_BLOCK FB1200



TITLE = '提升门屏蔽光栅子程序'

// INR0-INR7 右侧P1-P5提升门

// INL0-INL7 左侧卷帘门

// S1,S2 是静态门 不检测是否打开.只要是关闭状态即可.

// 其余门必须完成东走 [关闭-打开-关闭] 之后才有输出.

// OUTR 右侧状态输出.

// OUTL 左侧状态输出.

// OUTR 在 INR 完成动作后 即输出 OUTR=TRUE.

// OUTL 必须要S1,S2,OUTR都为真且INL完成动作后才输出 OUTL=TRUE.


// KEY为假时: 复位所有信号.

VERSION: '1.0'

AUTHOR: xy_z

NAME: SZHONG6

FAMILY: VOLVO



VAR

    INR : STRUCT        //右侧

        IN00 : BOOL;

        IN01 : BOOL;

        IN02 : BOOL;

        IN03 : BOOL;

        IN04 : BOOL;

        IN05 : BOOL;

        IN06 : BOOL;

        IN07 : BOOL;

    END_STRUCT;

    

    INL : STRUCT        //左侧

        IN00 : BOOL;

        IN01 : BOOL;

        IN02 : BOOL;

        IN03 : BOOL;

        IN04 : BOOL;

        IN05 : BOOL;

        IN06 : BOOL;

        IN07 : BOOL;

    END_STRUCT;

    R AT INR : BYTE;

    L AT INL : BYTE;

    

    RC : BYTE;

    LC : BYTE;

    

    StepR : INT;

    StepL : INT;

END_VAR


VAR_INPUT

    INR00 : BOOL;

    INR01 : BOOL;

    INR02 : BOOL;

    INR03 : BOOL;

    INR04 : BOOL;

    INR05 : BOOL;

    INR06 : BOOL;

    INR07 : BOOL;

    

    INL00 : BOOL;

    INL01 : BOOL;

    INL02 : BOOL;

    INL03 : BOOL;

    INL04 : BOOL;

    INL05 : BOOL;

    INL06 : BOOL;

    INL07 : BOOL; 

    

    S1 : BOOL;

    S2 : BOOL;

    

    Key : BOOL;

END_VAR


VAR_OUTPUT

    OUTR : BOOL;

    OUTL : BOOL;

END_VAR


BEGIN

    INR.IN00 := INR00;

    INR.IN01 := INR01;

    INR.IN02 := INR02;

    INR.IN03 := INR03;

    INR.IN04 := INR04;

    INR.IN05 := INR05;

    INR.IN06 := INR06;

    INR.IN07 := INR07;


    INL.IN00 := INL00;

    INL.IN01 := INL01;

    INL.IN02 := INL02;

    INL.IN03 := INL03;

    INL.IN04 := INL04;

    INL.IN05 := INL05;

    INL.IN06 := INL06;

    INL.IN07 := INL07;

    

    IF KEY  THEN

        // 右侧安全门,全部 关闭-打开-关闭返回true

        CASE StepR OF

            0 :         //判断全部信号true

                IF R = 16#FF THEN

                    StepR :=1;

                END_IF;

            1 :         //判断全部信号false一次

                R := R XOR 16#FF;      //取反

                RC := R OR RC;            //存储到LR

                IF RC = 16#FF THEN        //全为0时下一步

                    StepR := 2;

                END_IF;

            2 :          //再次判断全部信号true

                IF R = 16#FF THEN

                    StepR :=3;


                END_IF;

            3 :

                    OUTR := TRUE;

                ;

        END_CASE;

        

        // 左侧安全门,全部 关闭-打开-关闭 且 右侧完成动作 且 S1,S2全部关闭

        CASE StepL OF

            0 :         //判断全部信号true

                IF L = 16#FF THEN

                    StepL :=1;

                END_IF;

            1 :         //判断全部信号false一次

                L := L XOR 16#FF;      //取反

                LC := L OR LC;            //存储到LC

                IF LC = 16#FF THEN        //全为0时下一步

                    StepL := 2;

                END_IF;

            2 :          //再次判断全部信号true

                IF L = 16#FF AND OUTR AND S1 AND S2 THEN

                    StepL :=3;

                    

                END_IF;

            3 :

                OUTL := TRUE;

                ;

        END_CASE;

    ELSE

        // RESET

        STEPR := 0;

        STEPL := 0;

        OUTR := 0;

        OUTL := 0;

        RC := 16#0;

        LC := 16#0;

    END_IF;

END_FUNCTION_BLOCK


SCL 写的这个逻辑对不对...... 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54716条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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