查看: 1876|回复: 10
收起左侧

[应用问题] 关于ST语言中 IF中使用TON问题

jiaxf 2022-6-11 18:05:56 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 jiaxf 于 2022-6-11 19:14 编辑

1 ST语言中 IF,CASE中使用 TON

以星三角启动正反转为例

1.1 变量定义部分

PROGRAM PLC_PRG
VAR
        iB_Hot :BOOL;  // 热继电器常闭
        iB_Forward :BOOL;        //正转按钮
        iB_Reverse :BOOL;        //反转按钮
        iB_stop :BOOL;                //停止按钮

        oB_Forward :BOOL;        //KM 正转接触器吸合;
        oB_Reverse :BOOL;        //KM 反转接触器吸合;
        oB_Y_run :BOOL;                //电动机 Y启动;
        oB_I_run :BOOL;                //电动机 ▲启动;        

        t1 :TIME := T#3S;        //默认转化时间 3s;
        t10 :TIME;        //
        TON_0: TON;
        TON_1: TON;        

        step :INT := 0; //0, 停止或待机;  11,正转Y;  21,正转Y;  31,正转/反转▲;
        tmpBit :ARRAY[0..1]OF BOOL; //临时变量
END_VAR

1.2 程序部分

//正转
IF NOT iB_Hot AND NOT iB_Reverse AND NOT oB_Forward AND NOT oB_Reverse AND NOT oB_I_run AND NOT oB_Y_run  AND  iB_Forward THEN
        step := 11;
END_IF

//反转
IF NOT iB_Hot AND NOT iB_Forward AND NOT oB_Forward AND NOT oB_Reverse AND NOT oB_I_run AND NOT oB_Y_run  AND iB_Reverse THEN
        step := 21;        
END_IF

//停止
IF iB_stop OR iB_Hot THEN
        step := 0;
END_IF

CASE step OF
        0:                //停止
                oB_Reverse := FALSE;        oB_Forward := FALSE;        oB_I_run := FALSE;                oB_Y_run := FALSE;
                tmpBit[0] := FALSE;                tmpBit[1] := FALSE;
        11 :        //正转Y
                oB_Reverse := FALSE;        oB_Forward := TRUE;                oB_Y_run := TRUE;
                TON_0(IN:=oB_Y_run, PT:= t1 , Q=> tmpBit[0] , ET=>t10);        //正转Y->▲过渡延时
                IF tmpBit[0]  THEN
                        step := 31;
                        oB_Y_run := FALSE;
                END_IF
        21 :        //反转Y
                oB_Forward := FALSE;        oB_Reverse := TRUE;                oB_Y_run := TRUE;
                TON_1(IN:=oB_Y_run, PT:= t1 , Q=> tmpBit[1] , ET=>t10);        //反转Y->▲过渡延时
                IF tmpBit[1]  THEN
                        step := 31;
                        oB_Y_run := FALSE;
                END_IF
        31 :        //正转或反转 ▲
                IF NOT oB_Y_run THEN
                        oB_I_run := TRUE;
                ELSE
                        oB_I_run := FALSE;
                END_IF

END_CASE

1.3 运行程序

运行程序发现,第一次启停没有问题,重复运行是直接跳过  Y,监控发现,iB_stop后, TON_0  TON_1t10没有变为 0,而是 T#3s;

1.4 代码优化

<mark>把 TON_0 TON_1 从IF ,CASE 移出<mark>后正常;

//正转
IF NOT iB_Hot AND NOT iB_Reverse AND NOT oB_Forward AND NOT oB_Reverse AND NOT oB_I_run AND NOT oB_Y_run  AND  iB_Forward THEN
        step := 11;
END_IF

//反转
IF NOT iB_Hot AND NOT iB_Forward AND NOT oB_Forward AND NOT oB_Reverse AND NOT oB_I_run AND NOT oB_Y_run  AND iB_Reverse THEN
        step := 21;        
END_IF

//停止
IF iB_stop OR iB_Hot THEN
        step := 0;
END_IF

TON_0(IN:=oB_Y_run, PT:= t1 , Q=&gt; tmpBit[0] , ET=&gt;t10);        //正转Y-&gt;▲过渡延时
TON_1(IN:=oB_Y_run, PT:= t1 , Q=&gt; tmpBit[1] , ET=&gt;t10);        //反转Y-&gt;▲过渡延时

CASE step OF
        0:                //停止
                oB_Reverse := FALSE;        oB_Forward := FALSE;        oB_I_run := FALSE;                oB_Y_run := FALSE;
                tmpBit[0] := FALSE;                tmpBit[1] := FALSE;
        11 :        //正转Y
                oB_Reverse := FALSE;        oB_Forward := TRUE;                oB_Y_run := TRUE;
                IF tmpBit[0]  THEN
                        step := 31;
                        oB_Y_run := FALSE;
                END_IF
        21 :        //反转Y
                oB_Forward := FALSE;        oB_Reverse := TRUE;                oB_Y_run := TRUE;
                IF tmpBit[1]  THEN
                        step := 31;
                        oB_Y_run := FALSE;
                END_IF
        31 :        //正转或反转 ▲
                IF NOT oB_Y_run THEN
                        oB_I_run := TRUE;
                ELSE
                        oB_I_run := FALSE;
                END_IF

END_CASE

2 反思

  • 关于这种异常,应该是程序在下个扫描周期, 当TON_0(IN := false...)时,TON_0应该被复位时, 即TON_0(...ET =&gt; T#0S) ,但是因为此时条件判断不为真,所以无法复位,第一次是没有问题的,第二次以后就有问题;
  • 基于这种测试,是不是官方封装好的函数,如<mark>上升沿检测,计时器,计数器都不能用在 if、 for、 case 、while 中使用 <mark>
  • 基于这种测试,是不是官方封装好的函数,如<mark>运动控制,通讯指令不能用在 if、 for、 case 、while中使用 <mark>
  • 基于这种测试,是不是自己封装的函数,如<mark>FB,FC 不能用在 if、 for、 case 、while中使用<mark>




上一篇:关于AM400 脉冲轴MC_Power_P、MC_MoveAbsolute_P问题
下一篇:中型控制器的轴绝对定位指令,运动中怎么改变速度?

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

jiaxf 2022-6-11 18:49:01 | 显示全部楼层
有没有通过程序手动复位类似于 TON计时器的方法
回复 送花

使用道具 举报

TON R_trig  F_trig写道case步里好像不会重置,我之前也是写道case步里面的,后来我就丢case最上面了,条件里加一个case=**步的限制条件就可以了
回复 送花

使用道具 举报

sax408399856 2022-6-14 22:53:39 来自手机 | 显示全部楼层
西门子和施耐德的Ton一样不能在IF和CASE中使用,因为在ST语言中,IF和CASE条件为FALSE就会直接跳过那段代码,不扫描,不要说不会复位了,跳过TON代码不运行,定时器里的时间都会出错,TON最好每个扫描周期都能扫描到,坚决不等放IF和CASE
回复 送花

使用道具 举报

jiaxf 2022-6-15 09:24:57 | 显示全部楼层
zw2021summer 发表于 2022-6-13 15:58
TON R_trig  F_trig写道case步里好像不会重置,我之前也是写道case步里面的,后来我就丢case最上面了,条件 ...

是的,目前看来是这样
回复 送花

使用道具 举报

清明 2022-6-27 14:42:17 | 显示全部楼层
你在程序里加一句试试,比如第一步的计时器:
IF Step<>1 then
T1(in:=0,pt:=t#1s,q=>,et=>);
end_if
回复 送花

使用道具 举报

Patrical 2022-7-16 17:11:31 | 显示全部楼层
感谢分享,很好的资料
回复 送花

使用道具 举报

依然爱你生活 2022-7-16 17:16:34 | 显示全部楼层
我一般过程控制都是梯形图,不搞这些乱七八糟的。
回复 送花

使用道具 举报

finiiy 2022-7-16 17:24:34 | 显示全部楼层
感谢分享,内容丰富。
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部