伺服焊钳机器人做EMZ的程序分析

发布时间:2024-05-13  

$softp_end 是由软件安装时设置的

c6926462-4807-11ee-97a6-92fbcf53809c.png

c6a2fba6-4807-11ee-97a6-92fbcf53809c.png

c6c9aeea-4807-11ee-97a6-92fbcf53809c.png

生成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

c70bb4c0-4807-11ee-97a6-92fbcf53809c.png

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"}

c731d6a0-4807-11ee-97a6-92fbcf53809c.png

选择几号焊钳

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

c74bdc62-4807-11ee-97a6-92fbcf53809c.png

算出差异时间给软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"}  选择驱动接口

c731d6a0-4807-11ee-97a6-92fbcf53809c.png

按钮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)  反馈选择编号值

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>