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