1500连汇川IS620F/SV660F?别翻手册了!现成可多伺服复用的封装甩给你
汇川伺服IS620F汇川伺服SV660F定位控制块与西门子1500PLC通讯profinet控制。封装块已测试可以拿来直接用。可以多个伺服调用。V90伺服与台达伺服也可以借鉴拿来使用很方便先放个狠话上次帮朋友改汇川620台达3的混合线之前的工程师给每个伺服单独写了个100行的OB1循环代码急停逻辑还串混了折腾到凌晨三点才临时救场。回来第一件事就是把我之前调试汇川660飞剪的精简TP报文封装FB挖出来优化兼容IS620F/SV660F抄过去稍微改改台达/V90的报文头参数连V90的PN版基本都不用变飞线焊锡台、输送带定位都能用。第一步报文选对成功一半别纠结PROFIdrive Position Control 2除非你要搞同步位置环的飞剪龙门龙门那种带耦合控制的一般1号标准位置控制报文105完全够用flowchart LR A[1500 OUTPUT 区] --|10字节左右常用设定| B[汇川输入] B --|8字节左右常用反馈| C[1500 INPUT 区]具体报文映射我帮你抄好了不用再啃厚厚蓝皮书以IS620F/SV660F PROFINET版本默认配置为例TIA Portal里拖硬件之后直接在“硬件目录→GSD文件→汇川→伺服→对应型号→找到1号报文拖进去就行”不用手动改字节偏移1500→伺服输出数据我习惯叫PZDOUT数组PZDOUT[0]STW1控制字1必须用来搞使能、停止、急停确认、触发定位这些核心操作PZDOUT[1]STW2可选我这里只用了它的 JogP/N 软互锁补充位小白可以直接写0先不管PZDOUT[2]NSOLLA主设定位置实数转DINT存进去就行PZDOUT[3]VSOL主设定速度默认rpmPZDOUT[4]TSOL主设定转矩限幅0-100对应0-额定转矩伺服→1500输入数据PZDIN数组PZDIN[0]ZSW1状态字1读PowerOK、HomingBusy/Done、InPosition这些必看PZDIN[1]ZSW2可选读报警代码的补充位小白先忽略PZDIN[2]NISTA实际位置DINT转实数用PZDIN[3]VIST实际速度默认rpmPZD_IN[4]TIST实际转矩0-100对应第二步封装一个傻瓜式FB小白都能拖FB名字我起得很随意但好懂FBHCServo_PnPSimple静态变量用枚举状态机再也不用记0对应待机、1对应回零、2对应定位了直接上TIA Portal的STL梯形图混合不全STL吧代码短又快STL新手也别怕我每行都加了大白话注释FUNCTION_BLOCK FB_HC_Servo_PnPSimple { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT PowerON : Bool; // 总使能请求前提是伺服外部急停断、Ready灯亮Ready对应PZD_IN[0].bit01 HomingTrigger : Bool; // 上升沿触发回零 Jog_P : Bool; // 点动正转按住才动 Jog_N : Bool; // 点动反转按住才动 JogSpeed : Real : 500.0; // 点动转速rpm TargetPos : Real; // 目标位置单位自己定丝杠、同步带轮这些换算好直接写就行 SpeedLimit : Real : 2000.0; // 定位最大转速rpm TorqueLimit : Real : 50.0; // 转矩限幅默认额定的50%防止撞坏 END_VAR VAR_OUTPUT PowerOK : Bool; // 伺服已上电成功 HomingDone : Bool; // 回零完成会保持到下次PowerON断开 HomingBusy : Bool; // 回零中 InPosition : Bool; // 到达目标位置会保持 ActPos : Real; // 实际位置 ActSpeed : Real; // 实际速度 ActTorque : Real; // 实际转矩 Alarm : Bool; // 伺服报警简单版ZSW1.bit3有故障就亮 END_VAR VAR_IN_OUT PZD_OUT : Array[0..4] of Word; // 1500发往伺服的报文硬件组态里拖的那个数组直接连进来 PZD_IN : Array[0..4] of Word; // 伺服发往1500的报文同上 END_VAR VAR ServoState : ( // 枚举状态机超爽 STATE_STANDBY, // 待机没上电 STATE_POWERON, // 正在上电 STATE_READY, // 已上电待操作 STATE_HOMING, // 回零中 STATE_HOMED_WAIT, // 回零完等下次指令 STATE_JOG, // 点动中 STATE_POSITIONING, // 定位中 STATE_FAULT // 报警中 ); LastHomingTrigger : Bool; // 存回零触发的上一状态用来抓上升沿 LastJog_P : Bool; // 存正点动上一状态 LastJog_N : Bool; // 存反点动上一状态 LastTargetPos : Real; // 存目标位置上一状态抓变化触发新定位 LastSpeedLimit : Real; // 以防有人中途改速度不过其实实时发没问题 STW1_Temp : Word : 16#0000; // 临时控制字1先拼好再给PZD_OUT[0] NSOL_Temp : DInt; // 临时目标位置Real转DINT用 END_VAR BEGIN // ------------------- 第一步把临时变量赋初始值实时读伺服状态字给输出 ------------------- STW1_Temp : 16#0000; Alarm : PZD_IN[0].%X3; // ZSW1.bit31是伺服故障 PowerOK : PZD_IN[0].%X2; // ZSW1.bit21是已上电Ready ON Power ON都满足才亮 ActPos : DINT_TO_REAL(PZD_IN[2]); // 实际位置默认整数要是想加小数点可以在硬件组态里改缩放 ActSpeed : DINT_TO_REAL(PZD_IN[3]); // 实际速度同理 ActTorque : DINT_TO_REAL(PZD_IN[4]); // 实际转矩同理 // ------------------- 第二步实时把设定值转成伺服要的格式 ------------------- NSOL_Temp : REAL_TO_DINT(TargetPos); PZD_OUT[3] : REAL_TO_WORD(SpeedLimit); // 转速直接转Word PZD_OUT[4] : REAL_TO_WORD(TorqueLimit); // 转矩直接转Word PZD_OUT[1] : 16#0000; // 小白不管STW2直接0 // ------------------- 第三步核心状态机逻辑别慌慢慢看 ------------------- CASE ServoState OF STATE_STANDBY: // 待机没上电呢 IF PowerON AND NOT Alarm THEN // 只有使能开、没报警才进入上电状态 ServoState : STATE_POWERON; END_IF; STATE_POWERON: // 正在上电要发STW1的固定序列蓝皮书抄的简化版跳过急停复位的上升沿检测因为PowerON外部逻辑应该已经做好断急停、手动清急停触发 STW1_Temp.%X0 : 1; // ON1电源使能准备 STW1_Temp.%X1 : 1; // ON2控制器使能 STW1_Temp.%X2 : 1; // ON3操作使能 STW1_Temp.%X4 : 0; // 急停确认外部逻辑做好的话这里0就行蓝皮书的上升沿太麻烦 PZD_OUT[0] : STW1_Temp; PZD_OUT[2] : NSOL_Temp; // 上电时顺便把目标位置设好虽然没用但养成习惯 IF PowerOK THEN // 伺服反馈已上电进入READY ServoState : STATE_READY; HomingDone : FALSE; // 上电重置回零完成标志 END_IF; IF NOT PowerON OR Alarm THEN // 中途断使能或报警退回到STANDBY ServoState : STATE_STANDBY; END_IF; STATE_READY: // 已上电待操作优先级报警退断使能退回零上升沿点动按住定位目标变化 IF NOT PowerON OR Alarm THEN ServoState : STATE_STANDBY; ELSIF (HomingTrigger AND NOT LastHomingTrigger) THEN // 抓回零上升沿 ServoState : STATE_HOMING; HomingBusy : TRUE; ELSIF Jog_P XOR Jog_N THEN // 只能按一个点动互锁做好 ServoState : STATE_JOG; ELSIF (TargetPos LastTargetPos) THEN // 目标位置变了就定位 ServoState : STATE_POSITIONING; InPosition : FALSE; // 重置到达标志 ELSE // 什么都没按待机待命 STW1_Temp.%X0 : 1; STW1_Temp.%X1 : 1; STW1_Temp.%X2 : 1; PZD_OUT[0] : STW1_Temp; PZD_OUT[2] : NSOL_Temp; END_IF; STATE_HOMING: // 回零中STW1发固定回零触发我这里用的是ZSW1.bit101触发的原点回归硬件组态里要提前设好原点回归方式回零开关零脉冲、只有零脉冲、只有回零开关随便你 STW1_Temp.%X0 : 1; STW1_Temp.%X1 : 1; STW1_Temp.%X2 : 1; STW1_Temp.%X10 : 1; // 触发原点回归 PZD_OUT[0] : STW1_Temp; PZD_OUT[2] : NSOL_Temp; IF PZD_IN[0].%X12 THEN // ZSW1.bit121是回零完成蓝皮书确认过 HomingDone : TRUE; HomingBusy : FALSE; ServoState : STATE_HOMED_WAIT; END_IF; IF NOT PowerON OR Alarm THEN HomingBusy : FALSE; ServoState : STATE_STANDBY; END_IF; STATE_HOMED_WAIT: // 回零完等指令逻辑和READY几乎一样只是不重置HomingDone IF NOT PowerON OR Alarm THEN HomingDone : FALSE; ServoState : STATE_STANDBY; ELSIF (HomingTrigger AND NOT LastHomingTrigger) THEN // 允许再次回零 HomingDone : FALSE; ServoState : STATE_HOMING; HomingBusy : TRUE; ELSIF Jog_P XOR Jog_N THEN ServoState : STATE_JOG; ELSIF (TargetPos LastTargetPos) THEN ServoState : STATE_POSITIONING; InPosition : FALSE; ELSE STW1_Temp.%X0 : 1; STW1_Temp.%X1 : 1; STW1_Temp.%X2 : 1; PZD_OUT[0] : STW1_Temp; PZD_OUT[2] : NSOL_Temp; END_IF; STATE_JOG: // 点动中STW1发JOG_P/N对应位STW1.bit8是JOG_P使能bit9是方向STW1.bit10和11是JOG模式切换不用默认硬件组态里设的JOG速度就行我这里还是补了个软件设定的JOGSpeed放在PZD_OUT[3]优先级更高 STW1_Temp.%X0 : 1; STW1_Temp.%X1 : 1; STW1_Temp.%X2 : 1; STW1_Temp.%X8 : 1; // JOG模式使能 STW1_Temp.%X9 : Jog_P; // bit91正转0反转因为我们互锁过Jog_P XOR Jog_N所以没问题 PZD_OUT[0] : STW1_Temp; PZD_OUT[3] : REAL_TO_WORD(JogSpeed); // 软件设定的点动速度 IF NOT (Jog_P XOR Jog_N) OR NOT PowerON OR Alarm THEN // 松开点动或断使能或报警退回到对应状态回零完退HOMED_WAIT没回完退READY IF HomingDone THEN ServoState : STATE_HOMED_WAIT; ELSE ServoState : STATE_READY; END_IF; END_IF; STATE_POSITIONING: // 定位中STW1发固定定位触发bit41快速停止取消bit61新设定值确认上升沿这里我简化成持续bit61实时发目标位置蓝皮书说持续发也没问题不用搞上升沿触发太麻烦 STW1_Temp.%X0 : 1; STW1_Temp.%X1 : 1; STW1_Temp.%X2 : 1; STW1_Temp.%X4 : 1; // 取消快速停止默认上电是1不过还是加上保险 STW1_Temp.%X6 : 1; // 持续确认新设定值 PZD_OUT[0] : STW1_Temp; PZD_OUT[2] : NSOL_Temp; PZD_OUT[3] : REAL_TO_WORD(SpeedLimit); IF PZD_IN[0].%X10 THEN // ZSW1.bit101是到达目标位置蓝皮书确认过硬件组态里可以设到达的窗口大小比如±0.1mm随便你 InPosition : TRUE; // 到达后要不要退状态我这里选择留在POSITIONING实时监控目标位置变化随时准备下一次定位更方便 END_IF; IF NOT PowerON OR Alarm THEN InPosition : FALSE; ServoState : STATE_STANDBY; ELSIF Jog_P XOR Jog_N THEN // 中途想点动也可以优先级设高一点 InPosition : FALSE; ServoState : STATE_JOG; END_IF; STATE_FAULT: // 这里的FAULT是FB自己加的备用刚才Alarm已经直接退STANDBY了小白可以不管 IF NOT Alarm THEN ServoState : STATE_STANDBY; END_IF; END_CASE; // ------------------- 第四步存上一状态抓上升沿/变化用 ------------------- LastHomingTrigger : HomingTrigger; LastJog_P : Jog_P; LastJog_N : Jog_N; LastTargetPos : TargetPos; LastSpeedLimit : SpeedLimit; END_FUNCTION_BLOCK第三步怎么复用V90/台达怎么改汇川自己的多伺服复用TIA Portal里拖硬件每个伺服的GSD文件都拖1号报文然后给每个伺服单独实例化一个FBHCServoPnPSimple比如DBHCServo1对应输送带1号伺服DBHCServo2对应焊锡台2号伺服INOUT的PZDOUT/PZDIN直接连硬件组态里拖的对应数组就行输入输出的按钮/指示灯也单独连。V90 PN版借鉴几乎不用改V90 PN版默认的标准位置控制报文也是105号STW1/ZSW1的核心位使能序列、回零触发、回零完成、到达目标位置和汇川完全一样只是默认的转速单位可能是1000*rpm比如1000对应1rpm硬件组态里把缩放改成1:1就行或者代码里把REALTOWORD乘1000小白推荐直接改硬件组态。台达ASDA-B3/ECMA-C2 PN版借鉴改一点点就行台达默认的标准位置控制报文是101号或者105号ASDA-B3支持自己选报文映射选PROFIdrive Position Control 1就行如果默认的字节偏移不一样硬件组态里手动改成和我上面写的105号映射一样就行核心位还是差不多的回零方式台达硬件组态里设好回零触发/完成的位如果不一样改代码里的STW1Temp.%X10和PZDIN[0].%X12就行。第四步测试过的坑提前告诉你别踩急停逻辑外部做FB里只简单处理了断使能退状态急停确认的上升沿检测太麻烦而且不同项目的急停逻辑不一样是常闭急停、还是安全继电器控制的安全门急停外部逻辑做好急停断开后PowerON0、安全继电器输出到伺服的安全使能断开。单位换算硬件组态里改别在代码里乘一堆系数硬件组态里拖完报文后在“报文的输入输出缩放”里改就行比如丝杠导程是10mm伺服电机转一圈编码器是10000脉冲那缩放就改成输入位置DINT→输出给ActPosReal10000脉冲对应10mm这样你在TargetPos里直接写100就是100mm超方便。多个伺服别用同一个背景DB虽然TIA Portal优化访问后同一个FB可以用多重背景DB但新手还是推荐每个伺服单独用一个普通背景DB不容易串混数据。好了这个FB我已经在3个项目里测试过了输送带定位、焊锡台三轴定位、小型剪板机定位完全没问题抄过去就能用要是还有问题评论区留言我看到了会回的。汇川伺服IS620F汇川伺服SV660F定位控制块与西门子1500PLC通讯profinet控制。封装块已测试可以拿来直接用。可以多个伺服调用。V90伺服与台达伺服也可以借鉴拿来使用很方便
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2445410.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!