智趣黄sir
级别: 正式会员
精华主题: 0
发帖数量: 60 个
工控威望: 93 点
下载积分: 1738 分
在线时间: 26(小时)
注册时间: 2023-07-06
最后登录: 2024-12-27
查看智趣黄sir的 主题 / 回贴
楼主  发表于: 23天前
1,采用汇川的EASy521,程序想实现自动切手动,只动气缸,怕操作者移动轴,因为轴如果移动的话,没法监测到是否移动,再切回自动的话,会导致撞车。
本人的思路是如以下程序,切到手动的M3下降沿,记录当前位置,再切回自动,进行差值计算,只能实现部分,还请各位大神指点。M3是自动模式,M4是自动运行中。现在的问题是可以实现部分功能,但是拍急停的话,就会出现报警,因为急停拍下后,各个轴就立即停止。


自动模式下降沿(CLK := M3,Q => );
IF 自动模式下降沿.Q THEN
    X自动前位置old:=X_Axis.fActPosition;
    Y自动前位置old:=Y_Axis.fActPosition;
    Z自动前位置old:=Z_Axis.fActPosition;
    L自动前位置old:=Lift_Axis.fActPosition;
END_IF;

自动模式上升沿(CLK := M4 ,Q => );
IF 自动模式上升沿.Q then
    X自动前位置new:=X_Axis.fActPosition;
    Y自动前位置new:=Y_Axis.fActPosition;
    Z自动前位置new:=Z_Axis.fActPosition;
    L自动前位置new:=Lift_Axis.fActPosition;

    X自动前位置差值:=X自动前位置new-X自动前位置old;
    X自动前位置点位差值:=X自动前位置new-POSTION_X[X_Axis_AutoAbNum];
    X自动前位置差值绝对值:=ABS(X自动前位置差值);
    X自动前位置点位差值绝对值:=ABS(X自动前位置点位差值);

    Y自动前位置差值:=Y自动前位置new-Y自动前位置old;
    Y自动前位置点位差值:=Y自动前位置new-POSTION_Y[Y_Axis_AutoAbNum];
    Y自动前位置差值绝对值:=ABS(Y自动前位置差值);
    Y自动前位置点位差值绝对值:=ABS(Y自动前位置点位差值);
    
        Z自动前位置差值:=Z自动前位置new-Z自动前位置old;
    Z自动前位置点位差值:=Z自动前位置new-POSTION_Z[Z_Axis_AutoAbNum];
    Z自动前位置差值绝对值:=ABS(Z自动前位置差值);
    Z自动前位置点位差值绝对值:=ABS(Z自动前位置点位差值);
    
        L自动前位置差值:=L自动前位置new-L自动前位置old;
    L自动前位置差值绝对值:=ABS(L自动前位置差值);

END_IF;

IF M4=true AND X自动前位置差值绝对值>E0.5  AND X自动前位置点位差值绝对值>E0.5 THEN
           Alarm[86]:=TRUE;
END_IF;
IF M4=true AND Y自动前位置差值绝对值>E0.5  AND Y自动前位置点位差值绝对值>E0.5 THEN
           Alarm[87]:=TRUE;
END_IF;
IF M4=true AND Z自动前位置差值绝对值>E0.5  AND Z自动前位置点位差值绝对值>E0.5 THEN
           Alarm[88]:=TRUE;
END_IF;
IF M4=true AND L自动前位置差值绝对值>E0.5  THEN
           Alarm[89]:=TRUE;
END_IF;
hezhen880924
级别: 略有小成
精华主题: 0
发帖数量: 160 个
工控威望: 286 点
下载积分: 862 分
在线时间: 597(小时)
注册时间: 2013-01-08
最后登录: 2025-01-07
查看hezhen880924的 主题 / 回贴
1楼  发表于: 23天前
搞这么复杂干嘛,看下别人怎么写的,多吸收点经验。太复杂了
多看别人的程序,少走很多弯路,很多人碰到过这个问题,相信人外有人。
[ 此帖被hezhen880924在2024-12-31 09:08重新编辑 ]
刺猬果果
级别: 探索解密
精华主题: 0
发帖数量: 94 个
工控威望: 173 点
下载积分: 3137 分
在线时间: 89(小时)
注册时间: 2022-04-18
最后登录: 2025-01-07
查看刺猬果果的 主题 / 回贴
2楼  发表于: 23天前
在M3下降沿给个变量赋值TRUE;切换回M3上升沿的时候和这个变量做个&运算
cooovl
向大佬学习   向大佬致敬。
级别: 家园常客
精华主题: 0
发帖数量: 296 个
工控威望: 817 点
下载积分: 396 分
在线时间: 73(小时)
注册时间: 2016-05-14
最后登录: 2025-01-06
查看cooovl的 主题 / 回贴
3楼  发表于: 22天前
你这搞得好复杂
人生是没有捷径只能一步一个脚印往前行.....................
nightblueblu
道阻且长,穷且益坚。
级别: 论坛先锋
精华主题: 0
发帖数量: 1029 个
工控威望: 1852 点
下载积分: 271 分
在线时间: 1132(小时)
注册时间: 2017-02-09
最后登录: 2025-01-07
查看nightblueblu的 主题 / 回贴
4楼  发表于: 22天前
常规思路,没啥问题,这么写虽然复杂却没有任何问题。
还有一种就是,轴定位全部使用绝对位置,移动也就移动了,只要恢复后检测轴移动过程中有没有干涉就可以了,一般轴移动过程中的干涉大致就是些气缸动作不到位,你把气缸的位置检测作为轴移动的条件就可以
至于急停,急停了就重新复位再来,急停式紧急情况下使用,不是当作普通的停止使用,急停最大程度的保护人员、设备、产品,不是随意使用的玩意儿
Your happiness is everything.
中文就中文
级别: 探索解密
精华主题: 0
发帖数量: 85 个
工控威望: 112 点
下载积分: 1513 分
在线时间: 60(小时)
注册时间: 2024-11-13
最后登录: 2025-01-05
查看中文就中文的 主题 / 回贴
5楼  发表于: 22天前
要么给气缸手动写个权限,要么给轴写个手动权限。不要瞎动。
zq123666
级别: 工控侠客
精华主题: 0
发帖数量: 509 个
工控威望: 2172 点
下载积分: 23685 分
在线时间: 1100(小时)
注册时间: 2021-03-24
最后登录: 2025-01-07
查看zq123666的 主题 / 回贴
6楼  发表于: 13天前
这是常规写法啊!触发暂停时一个上升沿保存气缸状态与轴位置,再切自动继续时比较状态!不一致则提示对应的轴或气缸与暂停前状态位置不同,并提示人工操作返回暂停前状态位置后方可再自动,否则则需要对模块初始化。
我会写个界面,指示灯显示各气缸/轴位置与暂停前比较,并做按钮可手动恢复回暂停前状态,这样就不必整机初始化或模块初始化操作了。
急停拍下后设备必须整机初始化啊,要不还分什么急停按钮与暂停按钮呢
bruce2020
级别: 论坛先锋
精华主题: 1 篇
发帖数量: 1113 个
工控威望: 1374 点
下载积分: 3481 分
在线时间: 750(小时)
注册时间: 2017-11-25
最后登录: 2025-01-07
查看bruce2020的 主题 / 回贴
7楼  发表于: 13天前
又讨论世纪难题。切换,还是要记住状态。是否到位。在什么位置。
急停就是遇到紧急情况按下的,是为了保证人安全,其次是设备安全。使用者,经常按的话。报废物料就算他的操作了。
气缸状态的话,用异或来比较。
[ 此帖被bruce2020在2024-12-25 22:02重新编辑 ]
卓发智能
相互学习,共同进步。
级别: 工控侠客
精华主题: 0
发帖数量: 2458 个
工控威望: 3067 点
下载积分: 11543 分
在线时间: 661(小时)
注册时间: 2008-08-03
最后登录: 2025-01-02
查看卓发智能的 主题 / 回贴
8楼  发表于: 13天前
轴移动有什么问题啊,手动时做好防撞条件限制,轴定位用绝对位置指令,就算轴在手动时走过了位置也没有关系,再次启动绝对定位时会自已找到指令给定的座标位置。
相信自我!
payfsl
级别: 工控侠客
精华主题: 2 篇
发帖数量: 2612 个
工控威望: 2886 点
下载积分: 40033 分
在线时间: 486(小时)
注册时间: 2010-08-03
最后登录: 2025-01-05
查看payfsl的 主题 / 回贴
9楼  发表于: 8天前
您的程序逻辑是在自动模式切换到手动模式时记录轴的位置,然后从手动模式切换回自动模式时计算位置差值,如果差值超过设定的阈值,则触发报警。这个逻辑是合理的,但是您提到的问题是在急停情况下会出现报警,因为急停会导致轴立即停止,这可能会导致位置差值计算出现异常。

为了解决这个问题,您可以考虑以下几个步骤:

1. **增加急停状态检测**:在您的程序中增加一个变量来检测急停状态,当急停按钮被按下时,这个变量会被设置为真。

2. **在急停状态下跳过位置差值计算**:在您的程序中,当检测到急停状态时,跳过位置差值的计算和报警触发。

3. **急停恢复后重置位置**:当急停状态被解除后,重置轴的位置记录,以便下一次从手动切换到自动时能够正确计算位置差值。

以下是修改后的程序示例:

```pascal
VAR
    急停状态: BOOL; (* 急停状态标志 *)
    X自动前位置old: REAL;
    Y自动前位置old: REAL;
    Z自动前位置old: REAL;
    L自动前位置old: REAL;
    X自动前位置new: REAL;
    Y自动前位置new: REAL;
    Z自动前位置new: REAL;
    L自动前位置new: REAL;
    X自动前位置差值: REAL;
    Y自动前位置差值: REAL;
    Z自动前位置差值: REAL;
    L自动前位置差值: REAL;
    X自动前位置点位差值: REAL;
    Y自动前位置点位差值: REAL;
    Z自动前位置点位差值: REAL;
    X自动前位置差值绝对值: REAL;
    Y自动前位置差值绝对值: REAL;
    Z自动前位置差值绝对值: REAL;
    L自动前位置差值绝对值: REAL;
    X自动前位置点位差值绝对值: REAL;
    Y自动前位置点位差值绝对值: REAL;
    Z自动前位置点位差值绝对值: REAL;
END_VAR

自动模式下降沿(CLK := M3, Q => );
IF 自动模式下降沿.Q THEN
    IF NOT 急停状态 THEN
        X自动前位置old := X_Axis.fActPosition;
        Y自动前位置old := Y_Axis.fActPosition;
        Z自动前位置old := Z_Axis.fActPosition;
        L自动前位置old := Lift_Axis.fActPosition;
    END_IF;
END_IF;

自动模式上升沿(CLK := M4, Q => );
IF 自动模式上升沿.Q THEN
    IF NOT 急停状态 THEN
        X自动前位置new := X_Axis.fActPosition;
        Y自动前位置new := Y_Axis.fActPosition;
        Z自动前位置new := Z_Axis.fActPosition;
        L自动前位置new := Lift_Axis.fActPosition;

        X自动前位置差值 := X自动前位置new - X自动前位置old;
        X自动前位置点位差值 := X自动前位置new - POSTION_X[X_Axis_AutoAbNum];
        X自动前位置差值绝对值 := ABS(X自动前位置差值);
        X自动前位置点位差值绝对值 := ABS(X自动前位置点位差值);

        Y自动前位置差值 := Y自动前位置new - Y自动前位置old;
        Y自动前位置点位差值 := Y自动前位置new - POSTION_Y[Y_Axis_AutoAbNum];
        Y自动前位置差值绝对值 := ABS(Y自动前位置差值);
        Y自动前位置点位差值绝对值 := ABS(Y自动前位置点位差值);

        Z自动前位置差值 := Z自动前位置new - Z自动前位置old;
        Z自动前位置点位差值 := Z自动前位置new - POSTION_Z[Z_Axis_AutoAbNum];
        Z自动前位置差值绝对值 := ABS(Z自动前位置差值);
        Z自动前位置点位差值绝对值 := ABS(Z自动前位置点位差值);

        L自动前位置差值 := L自动前位置new - L自动前位置old;
        L自动前位置差值绝对值 := ABS(L自动前位置差值);

        IF M4 = TRUE AND X自动前位置差值绝对值 > E0.5 AND X自动前位置点位差值绝对值 > E0.5 THEN
            Alarm[86] := TRUE;
        END_IF;
        IF M4 = TRUE AND Y自动前位置差值绝对值 > E0.5 AND Y自动前位置点位差值绝对值 > E0.5 THEN
            Alarm[87] := TRUE;
        END_IF;
        IF M4 = TRUE AND Z自动前位置差值绝对值 > E0.5 AND Z自动前位置点位差值绝对值 > E0.5 THEN
            Alarm[88] := TRUE;
        END_IF;
        IF M4 = TRUE AND L自动前位置差值绝对值 > E0.5 THEN
            Alarm[89] := TRUE;
        END_IF;
    END_IF;
END_IF;

(* 急停按钮被按下时设置急停状态 *)
急停按钮按下(CLK := E-Stop, Q => );
IF 急停按钮按下.Q THEN
    急停状态 := TRUE;
END_IF;

(* 急停按钮释放后重置急停状态和轴位置 *)
急停按钮释放(CLK := E-Stop, Q => );
IF 急停按钮释放.Q THEN
    急停状态 := FALSE;
    X自动前位置old := X_Axis.fActPosition;
    Y自动前位置old := Y_Axis.fActPosition;
    Z自动前位置old := Z_Axis.fActPosition;
    L自动前位置old := Lift_Axis.fActPosition;
END_IF;
```

请注意,您需要根据您的实际硬件和软件环境调整上述代码。希望这些修改能够帮助您解决问题。
三人行必有我师焉,择其善者而从之 ,学而不思则罔,思而不学则殆
铁锹庄稼汉
级别: 正式会员
精华主题: 0
发帖数量: 43 个
工控威望: 79 点
下载积分: 399 分
在线时间: 6(小时)
注册时间: 2024-09-01
最后登录: 2025-01-07
查看铁锹庄稼汉的 主题 / 回贴
10楼  发表于: 8天前
表示看不懂,梯形图还行,我一直用的就是梯形图