jony7788
级别: 论坛先锋
精华主题: 0
发帖数量: 49 个
工控威望: 1813 点
下载积分: 811 分
在线时间: 228(小时)
注册时间: 2023-02-25
最后登录: 2024-12-28
查看jony7788的 主题 / 回贴
楼主  发表于: 7天前
图片:
一圈360度,分为12个段点,每个段点30度,每个段点都有一个开关。
当开关打开的区间,步进电机以正常速度旋转,并在段点停留0.5秒,没有打开段点的区间,以快于正常速度进行旋转,且不做停留。

以下例,1、2,5、6,9,10这几个区间是正常速度,其它区间是快速通过。
偿了下几种方式,效果都不好,大多都是快速时跑过了头,把正常区间都越过了。
PLC是三菱FX3U

希望老师们能指点下思路,感谢。

nightblueblu
道阻且长,穷且益坚。
级别: 论坛先锋
精华主题: 0
发帖数量: 1026 个
工控威望: 1849 点
下载积分: 265 分
在线时间: 1130(小时)
注册时间: 2017-02-09
最后登录: 2024-12-27
查看nightblueblu的 主题 / 回贴
1楼  发表于: 3天前
写了一个,没有测试,实现方式和15楼基本一致,上代码
----------------------------------------------------------------------------分割线-------------------------------------------------------------
FUNCTION_BLOCK FB_启动定位
(*一圈360度,分为12个段点,每个段点30度,每个段点都有一个开关,每个开关可以任意设置ON和OFF状态。
  当开关打开的区间,步进电机以正常速度旋转,并在段点停留0.5秒,
  没有打开段点的区间,以快于正常速度进行旋转,且不做停留*)
VAR_INPUT      
    Sen1  :BOOL;//位置状态设置1
    Sen2  :BOOL;
    Sen3  :BOOL;
    Sen4  :BOOL;
    Sen5  :BOOL;
    Sen6  :BOOL;
    Sen7  :BOOL;
    Sen8  :BOOL;
    Sen9  :BOOL;
    Sen10:BOOL;
    Sen11:BOOL;
    Sen12:BOOL;//位置状态设置12

    Start          :BOOL;//启动
        Stop          :BOOL;//停止
    Auto          :BOOL;//手自,TRUE:自动;FALSE:手动
    Done         :BOOL;//定位完成信号
    Now_Ang  :REAL;//当前角度
    Tim            :REAL;//TRUE位停顿时间,单位:s
END_VAR
VAR_OUTPUT
    rRun_F    :REAL;//快速运行距离(FALSE段角度)
    bRun_F   :BOOL;//快速定位启动(FALSE段)
    rRun_T    :REAL;//正常速度运行距离(TRUE段角度)
    bRun_T   :BOOL;//正常速定位启动(TRUE段)        
END_VAR
VAR    
        Pto                  :BOOL;//定位启动信号
    nums:INT        :=12;//位置个数
    Now_posi        :INT;//转盘当前位置
    StatsAry          :ARRAY[1..12]OF BOOL;//各位置检测传感器状态存储数组
    rtri                   :BOOL;//位置计算触发
    i,j                     :INT;//循环变量
    False_Gap      :INT;//距离下一个FALSE信号需要转动的位置个数
    num                     :INT;//定位中的段记录
    rstr,rsto,rdon    :R_TRIG;//启动,停止,转动一个角度的触发沿
    rton                  :TON;//间隔定时
END_VAR
----------------------------------------------------------------------------分割线-------------------------------------------------------------
(*==============================参数初始化==============================*)
StatsAry[1]:=Sen1;StatsAry[2]:=Sen2;StatsAry[3]:=Sen3;StatsAry[4]:=Sen4;StatsAry[5]:=Sen5;StatsAry[6]:=Sen6;
StatsAry[7]:=Sen7;StatsAry[8]:=Sen8;StatsAry[9]:=Sen9;StatsAry[10]:=Sen10;StatsAry[11]:=Sen11;StatsAry[12]:=Sen12;

rRun_T:=(2*3.14159265)/nums;
Now_posi:=REAL_TO_INT((Now_Ang*nums)/(2*3.14159265))+1;
(*==============================触发沿==============================*)
rstr(CLK:=Start);//启动沿
rsto(CLK:=Stop);//停止沿
rdon(CLK:=Done);//定位完成沿
rton(IN:=num=2,PT:=REAL_TO_TIME(Tim*1000.0));//间隔定时

IF rsto.Q OR (rton.Q AND NOT Auto) THEN//停止或者在手动状态下单次定位结束
    bRun_F:=FALSE;
    bRun_T:=FALSE;
    num:=0;
END_IF
IF rdon.Q THEN//对定位次数进行计数
    num:=num+1;
END_IF
(*==============================寻找下一次转动的TRUE信号的位置==============================*)
IF rstr.Q OR (rton.Q AND Auto)THEN//启动计算
    num:=0;
    rtri:=TRUE;
END_IF
IF rtri THEN
    IF Now_posi<>nums THEN//TRUE位置在当前位置前方
        FOR i:=Now_posi+1 TO nums BY 1 DO
            IF StatsAry THEN
                False_Gap:=i-Now_posi-1;//TRUE位置在当前位置前方
                rRun_F:=rRun_T*False_Gap;    
                Pto:=TRUE;
                rtri:=FALSE;
                EXIT;
            END_IF
        END_FOR
    END_IF
    IF Now_posi<>1 THEN//TRUE位置在当前位置后方
        FOR j:=1 TO Now_posi BY 1 DO
            IF StatsAry[j] THEN
                False_Gap:=nums-j+Now_posi-1;//TRUE位置在当前位置后方
                rRun_F:=rRun_T*False_Gap;
                Pto:=TRUE;
                rtri:=FALSE;
                EXIT;
            END_IF
        END_FOR
    END_IF
END_IF

(*==============================执行逻辑==============================*)
IF Pto THEN//启动定位,或自动状态下定时器达到计时
    bRun_T:=FALSE;
    bRun_F:=TRUE;
END_IF
IF num=1 THEN//完成FALSE段的定位,进行TRUE段定位
    bRun_F:=FALSE;
    bRun_T:=TRUE;
END_IF
本帖最近评分记录:
  • 下载积分:+5(jony7788) 热心助人!
  • Your happiness is everything.