伺服焊钳机器人做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模式下执行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) 选择按钮的值被发出
;
ENDFCT
/////////////////////////////////////////////////////////////
声明: 3个位置变量 一个实数变量和整数变量
E6AXIS GunPosAct, GunPosOpen, GunPosClose
REAL ActPos
INT co
VerBootfile=$softplcint[22]
while VerBootfile << span=""> 420
VwEmzMessage(7,#QuitMsg)
halt
endwhile
报警信息的产生
repeat
DiNum=SetDlgMsg() 出现提示框 选择返回值 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) 没有选择会发出信息提示
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 循环提示直到机器人工作模式不是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) 获得当前外部轴位置参数
;-----------------------------------------------------------
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位置的表达方式将改变为另外一种。
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时开始循环。
wait sec 0.2
ENDWHILE
ENDIF
$softplcint[20]=DiNum 例: $softplcint[20]=1
FOR co = 1 TO 10 循环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 分配到数组中
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 滞后故障程序状态
$ASYNC_STATE 附加轴状态
因此我们可以得出拉拽故障的两个控制单元1 个是差异值 max_sf=15.0,而另一个差异时间 TotzeitNeu 都是给PLC 的因此拉拽故障在程序方面的条件就产生了。
EMZ中的其他指令函数:
------------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“的状态 如果是初始化的时候
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)
; 状态消息输出
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: 一般信息提示的结构 (发送人、信息号、信息文本)
l Parameter[ ]: 通配符 %1、%2 和 %3 的 3 个可能参数栏。即使不使用通配符,也必须始终代入全部 3 个参数。
l Option (选项): 一般信息提示选项的结构 (预进停止、记录在信息提示数据库中、程序复位或选择语句时连带删除信息提示)
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) 对话框的函数Set_KrlDlg
用函数 Set_KrlDlg( ) 可生成一则对话信息。这意味着,该信息提示被传
递到信息缓存器中并显示在单独的一个带有按键的信息提示窗口中。
handle = Set_KrlDlg(MyQuestion, Parameter[ ], Touchkey[ ], Option)
lMyQuestion: 一般信息提示的结构 (发送人、信息号、问题文本)
lParameter[ ]: 通配符 %1、%2 和 %3 的 3 个可能参数栏。即使不使用通配符,也必须始终代入全部 3 个参数。
lTouchkey[ ] : 7 个可能按键标注结构。即使不使用这些按键,也必须始终代入全部 7 个按键。
lOption (选项):一般信息提示选项的结构 (预进停止、记录在信息提示数据库中、程序复位或选择语句时连带删除信息提示)
If (nHandle>0)Then
While (Exists_KrlDlg(nHandle, nAnswer))
用函数Exists_KrlDlg( ) 可检查一则特定的对话是否还存在。
present = Exists_KrlDlg(handle, Answer)
Answer (回答)现在以按下的按键的值返回写入。有效值为 1 到 7,取决于编程设定的按键号。
Wait sec 0.1
Endwhile
Endif
Return(nAnswer) 反馈选择编号值
ENDFCT
编辑:黄飞
评论
查看更多