智趣黃sir
級(jí)別: 正式會(huì)員
精華主題: 0
發(fā)帖數(shù)量: 60 個(gè)
工控威望: 93 點(diǎn)
下載積分: 1738 分
在線時(shí)間: 26(小時(shí))
注冊(cè)時(shí)間: 2023-07-06
最后登錄: 2024-12-27
查看智趣黃sir的 主題 / 回貼
樓主  發(fā)表于: 19天前
1,采用匯川的EASy521,程序想實(shí)現(xiàn)自動(dòng)切手動(dòng),只動(dòng)氣缸,怕操作者移動(dòng)軸,因?yàn)檩S如果移動(dòng)的話,沒(méi)法監(jiān)測(cè)到是否移動(dòng),再切回自動(dòng)的話,會(huì)導(dǎo)致撞車。
本人的思路是如以下程序,切到手動(dòng)的M3下降沿,記錄當(dāng)前位置,再切回自動(dòng),進(jìn)行差值計(jì)算,只能實(shí)現(xiàn)部分,還請(qǐng)各位大神指點(diǎn)。M3是自動(dòng)模式,M4是自動(dòng)運(yùn)行中。現(xiàn)在的問(wèn)題是可以實(shí)現(xiàn)部分功能,但是拍急停的話,就會(huì)出現(xiàn)報(bào)警,因?yàn)榧蓖E南潞,各個(gè)軸就立即停止。


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

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

    X自動(dòng)前位置差值:=X自動(dòng)前位置new-X自動(dòng)前位置old;
    X自動(dòng)前位置點(diǎn)位差值:=X自動(dòng)前位置new-POSTION_X[X_Axis_AutoAbNum];
    X自動(dòng)前位置差值絕對(duì)值:=ABS(X自動(dòng)前位置差值);
    X自動(dòng)前位置點(diǎn)位差值絕對(duì)值:=ABS(X自動(dòng)前位置點(diǎn)位差值);

    Y自動(dòng)前位置差值:=Y自動(dòng)前位置new-Y自動(dòng)前位置old;
    Y自動(dòng)前位置點(diǎn)位差值:=Y自動(dòng)前位置new-POSTION_Y[Y_Axis_AutoAbNum];
    Y自動(dòng)前位置差值絕對(duì)值:=ABS(Y自動(dòng)前位置差值);
    Y自動(dòng)前位置點(diǎn)位差值絕對(duì)值:=ABS(Y自動(dòng)前位置點(diǎn)位差值);
    
        Z自動(dòng)前位置差值:=Z自動(dòng)前位置new-Z自動(dòng)前位置old;
    Z自動(dòng)前位置點(diǎn)位差值:=Z自動(dòng)前位置new-POSTION_Z[Z_Axis_AutoAbNum];
    Z自動(dòng)前位置差值絕對(duì)值:=ABS(Z自動(dòng)前位置差值);
    Z自動(dòng)前位置點(diǎn)位差值絕對(duì)值:=ABS(Z自動(dòng)前位置點(diǎn)位差值);
    
        L自動(dòng)前位置差值:=L自動(dòng)前位置new-L自動(dòng)前位置old;
    L自動(dòng)前位置差值絕對(duì)值:=ABS(L自動(dòng)前位置差值);

END_IF;

IF M4=true AND X自動(dòng)前位置差值絕對(duì)值>E0.5  AND X自動(dòng)前位置點(diǎn)位差值絕對(duì)值>E0.5 THEN
           Alarm[86]:=TRUE;
END_IF;
IF M4=true AND Y自動(dòng)前位置差值絕對(duì)值>E0.5  AND Y自動(dòng)前位置點(diǎn)位差值絕對(duì)值>E0.5 THEN
           Alarm[87]:=TRUE;
END_IF;
IF M4=true AND Z自動(dòng)前位置差值絕對(duì)值>E0.5  AND Z自動(dòng)前位置點(diǎn)位差值絕對(duì)值>E0.5 THEN
           Alarm[88]:=TRUE;
END_IF;
IF M4=true AND L自動(dòng)前位置差值絕對(duì)值>E0.5  THEN
           Alarm[89]:=TRUE;
END_IF;
payfsl
級(jí)別: 工控俠客
精華主題: 2 篇
發(fā)帖數(shù)量: 2612 個(gè)
工控威望: 2886 點(diǎn)
下載積分: 40033 分
在線時(shí)間: 486(小時(shí))
注冊(cè)時(shí)間: 2010-08-03
最后登錄: 2024-12-31
查看payfsl的 主題 / 回貼
1樓  發(fā)表于: 5天前
您的程序邏輯是在自動(dòng)模式切換到手動(dòng)模式時(shí)記錄軸的位置,然后從手動(dòng)模式切換回自動(dòng)模式時(shí)計(jì)算位置差值,如果差值超過(guò)設(shè)定的閾值,則觸發(fā)報(bào)警。這個(gè)邏輯是合理的,但是您提到的問(wèn)題是在急停情況下會(huì)出現(xiàn)報(bào)警,因?yàn)榧蓖?huì)導(dǎo)致軸立即停止,這可能會(huì)導(dǎo)致位置差值計(jì)算出現(xiàn)異常。

為了解決這個(gè)問(wèn)題,您可以考慮以下幾個(gè)步驟:

1. **增加急停狀態(tài)檢測(cè)**:在您的程序中增加一個(gè)變量來(lái)檢測(cè)急停狀態(tài),當(dāng)急停按鈕被按下時(shí),這個(gè)變量會(huì)被設(shè)置為真。

2. **在急停狀態(tài)下跳過(guò)位置差值計(jì)算**:在您的程序中,當(dāng)檢測(cè)到急停狀態(tài)時(shí),跳過(guò)位置差值的計(jì)算和報(bào)警觸發(fā)。

3. **急停恢復(fù)后重置位置**:當(dāng)急停狀態(tài)被解除后,重置軸的位置記錄,以便下一次從手動(dòng)切換到自動(dòng)時(shí)能夠正確計(jì)算位置差值。

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

```pascal
VAR
    急停狀態(tài): BOOL; (* 急停狀態(tài)標(biāo)志 *)
    X自動(dòng)前位置old: REAL;
    Y自動(dòng)前位置old: REAL;
    Z自動(dòng)前位置old: REAL;
    L自動(dòng)前位置old: REAL;
    X自動(dòng)前位置new: REAL;
    Y自動(dòng)前位置new: REAL;
    Z自動(dòng)前位置new: REAL;
    L自動(dòng)前位置new: REAL;
    X自動(dòng)前位置差值: REAL;
    Y自動(dòng)前位置差值: REAL;
    Z自動(dòng)前位置差值: REAL;
    L自動(dòng)前位置差值: REAL;
    X自動(dòng)前位置點(diǎn)位差值: REAL;
    Y自動(dòng)前位置點(diǎn)位差值: REAL;
    Z自動(dòng)前位置點(diǎn)位差值: REAL;
    X自動(dòng)前位置差值絕對(duì)值: REAL;
    Y自動(dòng)前位置差值絕對(duì)值: REAL;
    Z自動(dòng)前位置差值絕對(duì)值: REAL;
    L自動(dòng)前位置差值絕對(duì)值: REAL;
    X自動(dòng)前位置點(diǎn)位差值絕對(duì)值: REAL;
    Y自動(dòng)前位置點(diǎn)位差值絕對(duì)值: REAL;
    Z自動(dòng)前位置點(diǎn)位差值絕對(duì)值: REAL;
END_VAR

自動(dòng)模式下降沿(CLK := M3, Q => );
IF 自動(dòng)模式下降沿.Q THEN
    IF NOT 急停狀態(tài) THEN
        X自動(dòng)前位置old := X_Axis.fActPosition;
        Y自動(dòng)前位置old := Y_Axis.fActPosition;
        Z自動(dòng)前位置old := Z_Axis.fActPosition;
        L自動(dòng)前位置old := Lift_Axis.fActPosition;
    END_IF;
END_IF;

自動(dòng)模式上升沿(CLK := M4, Q => );
IF 自動(dòng)模式上升沿.Q THEN
    IF NOT 急停狀態(tài) THEN
        X自動(dòng)前位置new := X_Axis.fActPosition;
        Y自動(dòng)前位置new := Y_Axis.fActPosition;
        Z自動(dòng)前位置new := Z_Axis.fActPosition;
        L自動(dòng)前位置new := Lift_Axis.fActPosition;

        X自動(dòng)前位置差值 := X自動(dòng)前位置new - X自動(dòng)前位置old;
        X自動(dòng)前位置點(diǎn)位差值 := X自動(dòng)前位置new - POSTION_X[X_Axis_AutoAbNum];
        X自動(dòng)前位置差值絕對(duì)值 := ABS(X自動(dòng)前位置差值);
        X自動(dòng)前位置點(diǎn)位差值絕對(duì)值 := ABS(X自動(dòng)前位置點(diǎn)位差值);

        Y自動(dòng)前位置差值 := Y自動(dòng)前位置new - Y自動(dòng)前位置old;
        Y自動(dòng)前位置點(diǎn)位差值 := Y自動(dòng)前位置new - POSTION_Y[Y_Axis_AutoAbNum];
        Y自動(dòng)前位置差值絕對(duì)值 := ABS(Y自動(dòng)前位置差值);
        Y自動(dòng)前位置點(diǎn)位差值絕對(duì)值 := ABS(Y自動(dòng)前位置點(diǎn)位差值);

        Z自動(dòng)前位置差值 := Z自動(dòng)前位置new - Z自動(dòng)前位置old;
        Z自動(dòng)前位置點(diǎn)位差值 := Z自動(dòng)前位置new - POSTION_Z[Z_Axis_AutoAbNum];
        Z自動(dòng)前位置差值絕對(duì)值 := ABS(Z自動(dòng)前位置差值);
        Z自動(dòng)前位置點(diǎn)位差值絕對(duì)值 := ABS(Z自動(dòng)前位置點(diǎn)位差值);

        L自動(dòng)前位置差值 := L自動(dòng)前位置new - L自動(dòng)前位置old;
        L自動(dòng)前位置差值絕對(duì)值 := ABS(L自動(dòng)前位置差值);

        IF M4 = TRUE AND X自動(dòng)前位置差值絕對(duì)值 > E0.5 AND X自動(dòng)前位置點(diǎn)位差值絕對(duì)值 > E0.5 THEN
            Alarm[86] := TRUE;
        END_IF;
        IF M4 = TRUE AND Y自動(dòng)前位置差值絕對(duì)值 > E0.5 AND Y自動(dòng)前位置點(diǎn)位差值絕對(duì)值 > E0.5 THEN
            Alarm[87] := TRUE;
        END_IF;
        IF M4 = TRUE AND Z自動(dòng)前位置差值絕對(duì)值 > E0.5 AND Z自動(dòng)前位置點(diǎn)位差值絕對(duì)值 > E0.5 THEN
            Alarm[88] := TRUE;
        END_IF;
        IF M4 = TRUE AND L自動(dòng)前位置差值絕對(duì)值 > E0.5 THEN
            Alarm[89] := TRUE;
        END_IF;
    END_IF;
END_IF;

(* 急停按鈕被按下時(shí)設(shè)置急停狀態(tài) *)
急停按鈕按下(CLK := E-Stop, Q => );
IF 急停按鈕按下.Q THEN
    急停狀態(tài) := TRUE;
END_IF;

(* 急停按鈕釋放后重置急停狀態(tài)和軸位置 *)
急停按鈕釋放(CLK := E-Stop, Q => );
IF 急停按鈕釋放.Q THEN
    急停狀態(tài) := FALSE;
    X自動(dòng)前位置old := X_Axis.fActPosition;
    Y自動(dòng)前位置old := Y_Axis.fActPosition;
    Z自動(dòng)前位置old := Z_Axis.fActPosition;
    L自動(dòng)前位置old := Lift_Axis.fActPosition;
END_IF;
```

請(qǐng)注意,您需要根據(jù)您的實(shí)際硬件和軟件環(huán)境調(diào)整上述代碼。希望這些修改能夠幫助您解決問(wèn)題。
三人行必有我?guī)熝,擇其善者而從?,學(xué)而不思則罔,思而不學(xué)則殆