伺服焊鉗機器人做EMZ的 程序分析
$softp_end 是由軟件安裝時設置的
生成EMZ的選擇框,選擇幾號焊鉗
DEFFCT INT SetDlgMsg()
DECL?KrlMsg_T?Msg
DECL?KrlMsgPar_T?Par[3]
DECL?KrlMsgOpt_T?Opt
DECL?KrlMsgDlgSK_T?SK[7]
INT?nHandle,?nAnswer
T 2模式下執(zhí)行EMZ
Msg?=?{ Modul[]?"vw_emz",?Nr 10,?Msg_txt[]?"Antriebsschnittstelle selektieren"}?提示信息條 “EMZ使用幾號工具用來測量”
SK[1]={ Sk_Type #VALUE,?Sk_txt[]?"1"}?生成的選項按鈕
SK[2]={ Sk_Type #VALUE,?Sk_txt[]?"2"}
SK[3]={ Sk_Type #VALUE,?Sk_txt[]?"3"}
SK[4]={ Sk_Type #VALUE,?Sk_txt[]?"4"}
SK[5]={ Sk_Type #VALUE,?Sk_txt[]?"5"}
SK[6]={ Sk_Type #VALUE,?Sk_txt[]?"6"}
SK[7]={ Sk_Type #VALUE,?Sk_txt[]?"7"}
選擇幾號焊鉗
Opt?=?{ VL_Stop True,?Clear_P_Reset True,?Log_To_DB FALSE }?信息屬性設置
nHandle?=?Set_KrlDlg?(Msg,?Par[],SK[],?Opt)?激活信息提示
If?(nHandle>0)Then
While?(Exists_KrlDlg(nHandle,?nAnswer))?關閉對話窗口
Wait?sec?0.1
Endwhile
Endif
Return(nAnswer)?選擇按鈕的值被發(fā)出
;
ENDFCT
/////////////////////////////////////////////////////////////
聲明:?3個位置變量 一個實數(shù)變量和整數(shù)變量
E6AXIS?GunPosAct,?GunPosOpen,?GunPosClose
REAL?ActPos
INT?co
VerBootfile=$softplcint[22]
while?VerBootfile?<< span="">?420
VwEmzMessage(7,#QuitMsg)
halt
endwhile
報警信息的產(chǎn)生
repeat
DiNum=SetDlgMsg()?出現(xiàn)提示框 選擇返回值?1-7
EaxNum?=?$softplcint[DiNum]?-?6?焊鉗號的計算:$softplcint[1]=7
if?(($softplcint[DiNum]?>?6)?AND?($softplcint[DiNum]<< span="">?13))?then
EaxNum?=?$softplcint[DiNum]?-?6
else
VwEmzMessage(6,#NotifyMsg)?沒有選擇會發(fā)出信息提示
halt
endif
until?EaxNum>0?帶1把焊鉗EaxNum=1
GunPosAct=$axis_act保存當前軸的信息給當前位置變量
GunPosOpen=$axis_act保存當前軸的信息給當前焊鉗開口位置變量
GunPosClose=$axis_act?保存當前軸的信息給當前焊鉗關閉位置變量
SWITCH?EaxNum?選擇幾號鉗對應的幾號軸
CASE?0如果給入的鉗號是0
HALT? 就停止
CASE?1鉗號1
GunPosOpen.E1=$softp_end[7]-20?計算焊鉗打開位置E1軸的開度$SOFTP_END[7]=120.0?-20
GunPosClose.E1=10?計算焊鉗關閉位置E1軸的關度?10 mm
CASE?2鉗號2
GunPosOpen.E2=$softp_end[8]-20? ? 最大口位置的獲得
GunPosClose.E2=10? ?關閉位置
CASE?3鉗號3
GunPosOpen.E3=$softp_end[9]-20
GunPosClose.E3=10
CASE?4鉗號4
GunPosOpen.E4=$softp_end[10]-20
GunPosClose.E4=10
CASE?5鉗號5
GunPosOpen.E5=$softp_end[11]-20
GunPosClose.E5=10
CASE?6鉗號6
GunPosOpen.E6=$softp_end[12]-20
GunPosClose.E6=10
DEFAULT 超出給入的鉗號6后就停止程序
HALT
ENDSWITCH? 結束選擇控制
IF?$MODE_OP==#T1?THEN?當機器人工作模式轉為T1模式
VwEmzMessage(3,#NotifyMsg)?提示信息:錯誤的工作方式,用T2或外部自動
Repeat? 循環(huán)提示直到機器人工作模式不是T1
wait?sec?0.1
until?($mode_op<>#t1)直到語句
ENDIF
IF?$MODE_OP==#EX?THEN?外部自動模式
IF?$OV_PRO<>100?THEN?機器人不在100%速度
MerkOvPro?=?$OV_PRO
$OV_PRO=100?恢復到100%速度
ENDIF?
ELSE?不是外部自動模式
IF?$OV_PRO<>100?THEN?機器人不在100%速度
VwEmzMessage(4,#NotifyMsg)提示信息:機器人速度必須100%
repeat
wait?sec?0.1
until?($ov_pro==100)?直到機器人速度100%
ENDIF
ENDIF
PTP?$AXIS_ACT?運行到當前位置
PTP?GunPosClose?焊鉗關閉位置
ActPos=GetActPos(DiNum)?獲得當前外部軸位置參數(shù)
;-----------------------------------------------------------
DEFFCT?REAL?GetActPos(di:in)
INT?di
REAL?RetGunPos
REAL?GunPos[7];
GunPos[1]=sig1_istpos?取出1號焊槍的實際位置
GunPos[2]=sig2_istpos
GunPos[3]=sig3_istpos
GunPos[4]=sig4_istpos
GunPos[5]=sig5_istpos
GunPos[6]=sig6_istpos
GunPos[7]=sig7_istpos
SIGNAL?sig1_sollpos $out[737] TO $out[751]
SIGNAL?sig1_istpos $in[737] TO $in[751]
RetGunPos=GunPos[di]?/?10?位置反饋值的表達方式
IF?$IN[Sign[di]]?THEN?如果有E752位置的表達方式將改變?yōu)榱硗庖环N。
RetGunPos=RetGunPos?*?(-1)
ENDIF
;
RETURN(RetGunPos)
ENDFCT
---------------------------ENDFCT-----------------------
IF?ABS(10-ActPos)?>?1?THEN?
外部軸的反饋值的偏差范圍不得小于5?ABS取絕對值,因此我們可以認定,焊鉗在進行關閉時開口是10mm,不能使理論值和實際值偏差超過1mm 。
VwEmzMessage(5,#QuitMsg,EaxNum)?提示信息:外部軸信息不正確
WHILE?(ABS(10-ActPos)?>?1) 當這個開口偏差值大于1時開始循環(huán)。
wait?sec?0.2
ENDWHILE
ENDIF
$softplcint[20]=DiNum?例:?$softplcint[20]=1
FOR?co?=?1?TO?10?循環(huán)10次 打開關到小口
PTP?GunPosOpen------------運行焊鉗開口位置
PTP?GunPosClose?C_PTP ---------運行焊鉗閉口位置
ENDFOR
$softplcint[20]=-10?改變$softplcint[20]的值
PTP?GunPosAct?回到一開始的位置
WAIT?SEC?0.2?等待0.2?秒
$softplcint[20]=0
TotzeitAlt?=?SysBusDelay[EaxNum]?保存上一次時間值
TotzeitNeu?=?$softplcint[31]?取出本次計算的時間值
SysBusDelay[EaxNum]?=?TotzeitNeu?保存本次的時間值到?SysBusDelay[]
$softplcint[EaxNum+7]=TotzeitNeu?保存本次的時間值到 軟PLC
FOR?co?=?1?TO?20
IpoVerteilung[co]=$softplcint[99+co]
ENDFOR?分配到數(shù)組中
TraceTime.YEAR=$Date.YEAR?記錄年 月 日 小時 分 秒
TraceTime.MONTH=$Date.MONTH
TraceTime.DAY=$Date.DAY
TraceTime.HOUR=$Date.HOUR
TraceTime.MIN=$Date.MIN
TraceTime.SEC=$Date.SEC
RobSn=$KR_SERIALNO?$KR_SERIALNO?:機器人的序列號保存在RDC卡里
TraceLength=$softplcint[34]
IF?$mode_op?<>?#EX?THEN?機器人不是外部自動模式
VwEmzMessage(1,#NotifyMsg,DiNum)?提示信息:上次調試的時間為TotzeitAlt倍的?12 ms之類
VwEmzMessage(2,#NotifyMsg,DiNum)?提示信息:本次調試的時間為TotzeitNeu倍的12 ms之類
ENDIF
算出差異時間給軟PLC
拉拽超程故障:
GLOBAL?REAL?max_sf=15.0?最大偏差值
$softplcreal[20]=max_sf
sf_prog_status?滯后故障程序狀態(tài)
$ASYNC_STATE?附加軸狀態(tài)
因此我們可以得出拉拽故障的兩個控制單元1 個是差異值 max_sf=15.0,而另一個差異時間 TotzeitNeu 都是給PLC 的因此拉拽故障在程序方面的條件就產(chǎn)生了。
EMZ中的其他指令函數(shù):
------------VwEmzMessage----------大眾EMZ信息-
DEF VwEmzMessage(msg_nr :IN, MsgTyp :IN, Param :IN )
INT msg_nr, msgtypnr, Param
DECL _MsgType MsgTyp
DECL KrlMsg_T USER_MSG
DECL KrlMsgPar_T Par[3]
DECL KrlMsgOpt_T Opt
DECL State_T st_ausg
INT nHandle, Answer, offset
USER_MSG = { Modul[] "vw_emz", Nr -1, Msg_txt[] " "}? 提示信息格式
Opt = { VL_Stop False, Clear_P_Reset False, Log_To_DB TRUE }
IF Varstate("Param")==#initialized then
獲取給入變量“Param“的狀態(tài) 如果是初始化的時候
SWITCH Param
CASE 1?
Par[1]?= { Par_type #Value, Par_int 1 }
CASE 2
Par[1]?= { Par_type #Value, Par_int 2 }
CASE 3
Par[1]?= { Par_type #Value, Par_int 3 }
CASE 4
Par[1]?= { Par_type #Value, Par_int 4 }
CASE 5
Par[1]?= { Par_type #Value, Par_int 5 }
CASE 6
Par[1]?= { Par_type #Value, Par_int 6 }
CASE 7
Par[1]?= { Par_type #Value, Par_int 7 }
DEFAULT
Par[1]?= { Par_type #Value, Par_txt[] " " }
ENDSWITCH
ELSE
Par[1] = { Par_type #Value, Par_txt[] " " }
ENDIF
IF NOT MsgIsSet(msg_nr) THEN 如果沒有MsgIsSe設置信息類別的反饋值
USER_MSG.Nr?= msg_nr? 信息號
SWITCH msg_nr
CASE 1? 信息提示號1
OFFSET=0
SWRITE(USER_MSG.MSG_TXT[],ST_AUSG,OFFSET,"Totzeit Achse%d vor Testlauf= %d? *12ms",(EaxNum+6), TotzeitAlt) 測試運行前的時間軸
CASE 2? 信息提示號2
OFFSET=0
SWRITE(user_msg.msg_TXT[],ST_AUSG,OFFSET,"Totzeit Achse%d nach Testlauf= %d *12ms ",(EaxNum+6), TotzeitNeu) 測試運行后的時間軸
CASE 3? 信息提示號3
USER_MSG.MSG_TXT[]="falsche Betriebsart - T2 oder EXT erforderlich"? 錯誤的操作模式 - 需要 T2 或 EXT
CASE 4? 信息提示號4
USER_MSG.MSG_TXT[]="Override auf 100% erforderlich"需要覆蓋到 100%
CASE 5? 信息提示號5
USER_MSG.MSG_TXT[]="Externe Achse%1 folgt nicht"外軸%1不跟隨
CASE 6? 信息提示號6
USER_MSG.MSG_TXT[]="keine Zuordnung Antriebsschnittstelle - Zusatzachse"未分配驅動接口 - 附加軸
CASE 7? 信息提示號7
USER_MSG.MSG_TXT[]="Version bootfile wird nicht unterstuetzt"
不支持版本啟動文件
DEFAULT
USER_MSG.MSG_TXT[]="unbekannte Meldung"未知信息
ENDSWITCH
SWITCH MsgTyp? 開始顯示信息
CASE #StateMsg
nMsgHandle[msg_nr] = Set_KrlMsg (#State, USER_MSG, Par[], Opt)
; 狀態(tài)消息輸出
CASE #QuitMsg
nMsgHandle[msg_nr] = Set_KrlMsg (#Quit, USER_MSG, Par[], Opt)
; 輸出確認消息
CASE #NotifyMsg
nMsgHandle[msg_nr] = Set_KrlMsg (#Notify, USER_MSG, Par[], Opt)
; 輸出通知消息
DEFAULT
nMsgHandle[msg_nr] = Set_KrlMsg (#Quit, USER_MSG, Par[], Opt)
; 輸出確認消息
ENDSWITCH???
ENDIF
Set_KrlMsg設置信息
handle = Set_KrlMsg(Type, MyMessage, Parameter[ ], Option)
l? Type (類型): 信息提示的種類 (#Notify, #State, #Quit, #Waiting)
l? MyMessage: 一般信息提示的結構 (發(fā)送人、信息號、信息文本)
l? Parameter[ ]: 通配符 %1、%2 和 %3 的 3 個可能參數(shù)欄。即使不使用通配符,也必須始終代入全部 3 個參數(shù)。
l? Option (選項): 一般信息提示選項的結構 (預進停止、記錄在信息提示數(shù)據(jù)庫中、程序復位或選擇語句時連帶刪除信息提示)
END
-----------------------------
MsgIsSe設置信息類別
DEFFCT BOOL MsgIsSet(MsgNr :IN)
DECL MsgBuf_T Buffer[100]
INT N,MsgNr,MeldCnt
BOOL bRetVal
MeldCnt = Get_MsgBuffer(Buffer[])
bRetVal=FALSE
FOR N=1 TO MeldCnt
IF (Buffer[N].Nr==MsgNr) THEN?
IF Buffer[N].Type==#Usr_State THEN? 如果是用戶信息
bRetVal=TRUE
ENDIF
IF Buffer[N].Type==#Usr_Quit THEN 如果是復位信息
bRetVal=TRUE
ENDIF
IF Buffer[N].Type==#Usr_Wait THEN? 如果是等待信息
bRetVal=TRUE
ENDIF
IF Buffer[N].Type==#Usr_Dlg THEN? 如果是診斷信息
bRetVal=TRUE
ENDIF
ENDIF
ENDFOR
RETURN(bRetVal)
ENDFCT
---------------
DEFFCT INT SetDlgMsg()? 設置對話提示選擇信息
DECL KrlMsg_T Msg
DECL KrlMsgPar_T Par[3]
DECL KrlMsgOpt_T Opt
DECL KrlMsgDlgSK_T SK[7]
INT nHandle, nAnswer
Msg = { Modul[] "vw_emz", Nr 10, Msg_txt[] "Antriebsschnittstelle selektieren"}? 選擇驅動接口
按鈕1---到7
SK[1]={ Sk_Type #VALUE, Sk_txt[] "1"}
SK[2]={ Sk_Type #VALUE, Sk_txt[] "2"}
SK[3]={ Sk_Type #VALUE, Sk_txt[] "3"}
SK[4]={ Sk_Type #VALUE, Sk_txt[] "4"}
SK[5]={ Sk_Type #VALUE, Sk_txt[] "5"}
SK[6]={ Sk_Type #VALUE, Sk_txt[] "6"}
SK[7]={ Sk_Type #VALUE, Sk_txt[] "7"}
Opt = { VL_Stop True, Clear_P_Reset True, Log_To_DB FALSE }
nHandle = Set_KrlDlg (Msg, Par[],SK[], Opt) 對話框的函數(shù)Set_KrlDlg
用函數(shù) Set_KrlDlg( )? 可生成一則對話信息。這意味著,該信息提示被傳
遞到信息緩存器中并顯示在單獨的一個帶有按鍵的信息提示窗口中。
handle = Set_KrlDlg(MyQuestion, Parameter[ ], Touchkey[ ], Option)
lMyQuestion: 一般信息提示的結構 (發(fā)送人、信息號、問題文本)
lParameter[ ]: 通配符 %1、%2 和 %3 的 3 個可能參數(shù)欄。即使不使用通配符,也必須始終代入全部 3 個參數(shù)。
lTouchkey[ ] : 7? 個可能按鍵標注結構。即使不使用這些按鍵,也必須始終代入全部 7 個按鍵。
lOption (選項):一般信息提示選項的結構 (預進停止、記錄在信息提示數(shù)據(jù)庫中、程序復位或選擇語句時連帶刪除信息提示)
If (nHandle>0)Then
While (Exists_KrlDlg(nHandle, nAnswer))
? 用函數(shù)Exists_KrlDlg( ) 可檢查一則特定的對話是否還存在。
present = Exists_KrlDlg(handle, Answer)
Answer (回答)現(xiàn)在以按下的按鍵的值返回寫入。有效值為 1 到 7,取決于編程設定的按鍵號。
Wait sec 0.1
Endwhile?
Endif
Return(nAnswer)? 反饋選擇編號值
ENDFCT
編輯:黃飛
?
評論
查看更多