智趣黃sir
級(jí)別: 正式會(huì)員
|
1,采用匯川的EASy521,程序想實(shí)現(xiàn)自動(dòng)切手動(dòng),只動(dòng)氣缸,怕操作者移動(dòng)軸,因?yàn)檩S如果移動(dòng)的話,沒法監(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)在的問題是可以實(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; |
---|---|
|
hezhen880924
級(jí)別: 略有小成
|
搞這么復(fù)雜干嘛,看下別人怎么寫的,多吸收點(diǎn)經(jīng)驗(yàn)。太復(fù)雜了 多看別人的程序,少走很多彎路,很多人碰到過這個(gè)問題,相信人外有人。 [ 此帖被hezhen880924在2024-12-31 09:08重新編輯 ] |
---|---|
|
刺猬果果
級(jí)別: 探索解密
|
在M3下降沿給個(gè)變量賦值TRUE;切換回M3上升沿的時(shí)候和這個(gè)變量做個(gè)&運(yùn)算 |
---|---|
|
cooovl
向大佬學(xué)習(xí) 向大佬致敬。
級(jí)別: 家園常客
|
你這搞得好復(fù)雜 |
|
---|---|---|
|
nightblueblu
道阻且長(zhǎng),窮且益堅(jiān)。
級(jí)別: 論壇先鋒
|
常規(guī)思路,沒啥問題,這么寫雖然復(fù)雜卻沒有任何問題。 還有一種就是,軸定位全部使用絕對(duì)位置,移動(dòng)也就移動(dòng)了,只要恢復(fù)后檢測(cè)軸移動(dòng)過程中有沒有干涉就可以了,一般軸移動(dòng)過程中的干涉大致就是些氣缸動(dòng)作不到位,你把氣缸的位置檢測(cè)作為軸移動(dòng)的條件就可以 至于急停,急停了就重新復(fù)位再來,急停式緊急情況下使用,不是當(dāng)作普通的停止使用,急停最大程度的保護(hù)人員、設(shè)備、產(chǎn)品,不是隨意使用的玩意兒 |
|
---|---|---|
|
中文就中文
級(jí)別: 探索解密
|
要么給氣缸手動(dòng)寫個(gè)權(quán)限,要么給軸寫個(gè)手動(dòng)權(quán)限。不要瞎動(dòng)。 |
---|---|
|
zq123666
級(jí)別: 工控俠客
|
這是常規(guī)寫法啊!觸發(fā)暫停時(shí)一個(gè)上升沿保存氣缸狀態(tài)與軸位置,再切自動(dòng)繼續(xù)時(shí)比較狀態(tài)!不一致則提示對(duì)應(yīng)的軸或氣缸與暫停前狀態(tài)位置不同,并提示人工操作返回暫停前狀態(tài)位置后方可再自動(dòng),否則則需要對(duì)模塊初始化。 我會(huì)寫個(gè)界面,指示燈顯示各氣缸/軸位置與暫停前比較,并做按鈕可手動(dòng)恢復(fù)回暫停前狀態(tài),這樣就不必整機(jī)初始化或模塊初始化操作了。 急停拍下后設(shè)備必須整機(jī)初始化啊,要不還分什么急停按鈕與暫停按鈕呢 |
---|---|
|
bruce2020
級(jí)別: 論壇先鋒
|
又討論世紀(jì)難題。切換,還是要記住狀態(tài)。是否到位。在什么位置。 急停就是遇到緊急情況按下的,是為了保證人安全,其次是設(shè)備安全。使用者,經(jīng)常按的話。報(bào)廢物料就算他的操作了。 氣缸狀態(tài)的話,用異或來比較。 [ 此帖被bruce2020在2024-12-25 22:02重新編輯 ] |
---|---|
|
卓發(fā)智能
相互學(xué)習(xí),共同進(jìn)步。
級(jí)別: 工控俠客
|
軸移動(dòng)有什么問題啊,手動(dòng)時(shí)做好防撞條件限制,軸定位用絕對(duì)位置指令,就算軸在手動(dòng)時(shí)走過了位置也沒有關(guān)系,再次啟動(dòng)絕對(duì)定位時(shí)會(huì)自已找到指令給定的座標(biāo)位置。 |
|
---|---|---|
|
payfsl
級(jí)別: 工控俠客
|
您的程序邏輯是在自動(dòng)模式切換到手動(dòng)模式時(shí)記錄軸的位置,然后從手動(dòng)模式切換回自動(dòng)模式時(shí)計(jì)算位置差值,如果差值超過設(shè)定的閾值,則觸發(fā)報(bào)警。這個(gè)邏輯是合理的,但是您提到的問題是在急停情況下會(huì)出現(xiàn)報(bào)警,因?yàn)榧蓖?huì)導(dǎo)致軸立即停止,這可能會(huì)導(dǎo)致位置差值計(jì)算出現(xiàn)異常。 為了解決這個(gè)問題,您可以考慮以下幾個(gè)步驟: 1. **增加急停狀態(tài)檢測(cè)**:在您的程序中增加一個(gè)變量來檢測(cè)急停狀態(tài),當(dāng)急停按鈕被按下時(shí),這個(gè)變量會(huì)被設(shè)置為真。 2. **在急停狀態(tài)下跳過位置差值計(jì)算**:在您的程序中,當(dāng)檢測(cè)到急停狀態(tài)時(shí),跳過位置差值的計(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)整上述代碼。希望這些修改能夠幫助您解決問題。 |
|
---|---|---|
|