伺服焊钳机器人做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
编辑:黄飞
?
评论