ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

西门子S7-1200伺服控制实战:选型、编程与调试全攻略

西门子S7-1200伺服控制实战:选型、编程与调试全攻略 做自动化这行绕不开S7-1200和伺服电机的组合。PLC负责逻辑和轨迹伺服负责出力两者搭好了一台设备的骨架基本就立住了。我这两年接手的项目里单轴定位、双轴联动、飞剪追切十有八九都是这套组合在跑但真正能把S7-1200的伺服控制玩顺手的工程师其实不多大多数时候卡在参数匹配、调试手法和通信细节上。这篇东西不是教科书是我自己从选型、接线到TIA博途编程、现场调试踩出来的实战笔记适合刚接触运动控制的电气工程师、设备调试人员也适合学校里学完PLC想接真实项目的学生参考。1. 整体设计先搞清楚控制方案再动手1.1 S7-1200控制伺服电机的三种主流方式S7-1200控制伺服电机绕不开三种路径脉冲输出PTO、PROFINET总线通信、Modbus RTU通信。先把这个选型逻辑讲透后面调起来才不会返工。脉冲方式最传统S7-1200通过CPU自带的晶体管高速输出点Q0.0/Q0.1输出脉冲串和方向信号给伺服驱动器。驱动器工作在位置模式PLC发一个脉冲电机转一个最小步距脉冲频率决定速度脉冲总数决定位移。这种方式的好处是逻辑简单、实时性有保障、对伺服驱动器品牌没有强制要求松下、台达、三菱都能带坏处是接线多、高速高精度场景受PLC输出频率限制且没有轴状态反馈丢步了PLC不知道。PROFINET方式是西门子近几年主推的玩法S7-1200通过以太网口直接连西门子V90或者第三方支持PROFINET的伺服驱动器通讯报文走标准报文3或者报文5PLC侧用MC_MoveAbsolute这类运动控制指令直接下发位置、速度驱动器实时回传实际位置、电流、报警码。这种方式接线少、诊断能力强、可以组多轴同步但对工程师的通讯配置能力要求高而且驱动器和PLC要用同一套GSD文件版本对不上就会出现各种奇怪问题。Modbus RTU方式是用RS485串口做读写PLC通过Modbus功能码去改写伺服驱动器的目标位置和控制字。这种方式适合改造老设备对实时性要求不高的点位运动速度场控、位置场控都能做但通讯周期通常在10毫秒以上做不了插补和高速同步。三种方式选哪个主要看设备定位。单机设备、老式机床改数控脉冲最实用立库堆垛机、包装线多轴联动PROFINET是趋势远程IO分散、走线距离长Modbus RTU更省事。我个人做单轴定位项目时默认脉冲方案理由很简单调试快、故障点少、驱动器高端低端都能用。1.2 为什么脉冲方案仍然值得优先考虑很多人一上来就追PROFINET觉得脉冲不够高级但真实项目里脉冲方案的可靠性被严重低估了。S7-1200的PTO输出频率高版本可以到200kHz配合2500线编码器的驱动器电子齿轮比设好每毫米脉冲数能达到几千甚至上万对于常规的丝杆模组、同步带机构来说精度绰绰有余。而且脉冲方案里有一个好处运动控制的实时性由硬件保证不占用PLC循环扫描时间。PLC只需要往输出点里写频率和方向剩下的加减速、多段速伺服驱动器自己可以完成。哪怕PLC程序扫描周期是10ms脉冲依然能平稳输出不会出现走一段顿一下的情况。这一点在实际项目里非常关键因为很多工程师用PROFINET做运动控制时程序一复杂运动指令周期被拉长轴就一卡一卡的排查起来特别痛苦。另外脉冲方案的边界很清晰PLC只管发脉冲驱动器只管执行和闭环。调试时哪边出了问题一目了然。驱动器报警就看驱动器的数码管PLC逻辑有问题就监控梯形图不像总线通讯那样出了问题要先判断是站地址错了、报文长度不对、还是GSD版本冲突。当然脉冲方案也有天花板比如做不了电子凸轮、做不了高精度插补、多轴同步只能靠硬接线做虚轴跟随。所以我的建议是单轴、两轴定位用脉冲超过三轴、有同步要求、需要远程诊断再上PROFINET。选型不是越新越好是越合适越好。1.3 伺服系统闭环原理三环控制究竟是什么聊控制方案必须把伺服的三环闭环搞清楚否则连报警都读不懂。伺服驱动器内部其实有三个PID闭环从外到内分别是位置环、速度环、电流环。位置环在最外层负责比较给定位置和编码器反馈位置输出速度给定速度环在中间负责比较速度给定和实际转速输出电流给定电流环在最内层负责控制电机线圈里的实际电流对应电机的转矩输出。用开车的例子来打比方位置环是你的导航告诉你距离目的地还有多远速度环是你的脚管油门深浅电流环是发动机本身决定真正能输出多大扭矩。这三个环的响应速度依次递增电流环最快通常是微秒级速度环次之毫秒级位置环最慢。所以调伺服时基本规则是从内往外调——先把电流环调稳再调速度环增益最后才调位置环。很多人一上来就乱加位置环增益结果电机抖得像筛糠就是这个原因。在脉冲控制模式下PLC只参与最外层位置给定的下发步进和伺服的区别也在这里步进电机是开环脉冲发了就认为到位了丢步了不知道伺服电机是真正的闭环尽管位置指令是靠脉冲一点一点给的但最终有没有到达目标驱动器通过编码器是门清的哪怕过冲了也会自动往回修正这就是伺服比步进稳的核心原因。2. 硬件接线与参数配置把基础打牢2.1 硬件清单与IO分配项目落地第一步是列硬件清单。我这套单轴定位项目的主角是S7-1200 CPU 1214C DC/DC/DC搭配某国产伺服驱动器和750W伺服电机。CPU选1214C而不是1211C是因为1214C自带14路数字量输入和10路数字量输出单轴运动控制不加扩展模块就能搞定性价比很高。如果选1215C或1217C当然更好但预算和柜内空间都要考虑。信号用途PLC端口说明脉冲输出Q0.0高速输出点接驱动器脉冲输入端方向输出Q0.1高速输出点接驱动器方向输入端伺服使能Q0.2普通输出点控制驱动器使能继电器报警复位Q0.3普通输出点复位驱动器报警原点传感器I0.0接近开关或光电开关回零用正限位I0.1正方向软硬限位负限位I0.2负方向软硬限位驱动器报警输入I0.3接收驱动器报警输出信号急停按钮I0.4常闭触点串入安全回路这里有个细节需要特别注意S7-1200晶体管输出点最多只能输出两组高速脉冲也就是Q0.0和Q0.1。做双轴系统时第二轴要用Q0.4和Q0.5这个要看具体型号的组态和固件版本1214C默认支持两个PTO轴别把普通输出点当高速输出点用否则脉冲发不出去或者频率根本提不上去你会以为是程序问题查半天才发现是硬件不支持。2.2 接线细节差分还是集电极开路脉冲驱动器的信号接口一般有两种差分输入和集电极开路输入。S7-1200的输出点属于源型输出输出的是24V高电平脉冲如果驱动器支持24V集电极开路输入直接接线就行如果驱动器输入要求5V差分信号中间必须加转换板或者用驱动器自带的24V输入接口否则会烧输入口或者信号完全识别不了。这里分享一个我踩过的坑某次用国产驱动器配S7-1200脉冲信号线接了整整一天电机就是不动。万用表量PLC输出端脉冲是有的但驱动器脉冲指示灯就是不闪。后来查手册发现驱动器默认脉冲输入是5V差分模式而我是按24V集电极开路接的拨码开关也没改。把驱动器输入模式拨到24V集电极开路后上电即通电机转得飞起。所以接伺服之前第一件事不是接线是翻手册确认输入信号类型。还有一个老生常谈但特别容易犯的错脉冲负端公共端接错。集电极开路模式下脉冲的正端接PLC的Q0.0负端接PLC的M0V公共同步方向信号同理。如果公共端选错了伺服要么纹丝不动要么脉冲信号只有半波导致方向乱跳。刹车电阻和动力线这块也要提一句750W以上的伺服电机启停频繁、惯性大的场合必须按驱动器手册配置刹车电阻否则母线电压一旦超过阈值驱动器会直接报过压故障现场停工。很多人为了省成本不装结果报警次数比产量都多。2.3 电子齿轮比计算一分钟定位精度怎么算电子齿轮比是伺服控制里的核心参数设不对PLC发的脉冲数和实际位移就对不上。公式为电子齿轮比 (编码器分辨率 × 机械减速比) / 丝杆导程对应的每毫米脉冲数需求举个例子电机编码器是2500线伺服驱动器是4倍频采样也就是10000脉冲/圈丝杆导程10mm我们想要PLC每发1000个脉冲机构走1mm。那么一圈对应10000脉冲走10mm1mm就是1000脉冲电子齿轮比直接用10000/1000 10/1不对这里要反着看。驱动器端的电子齿轮比一般定义是电机需要的脉冲数编码器反馈脉冲比上外部输入指令脉冲数。我们想要的是外部给1000个脉冲电机走一圈的1/10也就是产生1000个编码器脉冲反馈。但编码器一圈是10000脉冲也就是说外部给1000脉冲实际需要电机转10000脉冲那电子齿轮比就应该是10000/1000 10。含义是每输入1个指令脉冲电机内部等效走10个编码器脉冲。这个数值设好后再用PG0或者软件监控验证一次让PLC发10000个脉冲用千分表量机构实际位移应该在10mm左右误差在丝杆精度范围内就行。注意电子齿轮比有分子分母范围限制国产驱动器一般是1到32767之间超了要拆成分子乘上减速比再做一次约分。2.4 伺服驱动器增益与惯量比的调整驱动器参数设置里增益和惯量比是重头戏。现代伺服驱动器都有自动增益调整功能上电后让电机空跑几次驱动器会自动测算负载惯量比然后推荐一组刚性等级参数。我的经验是机械结构比较规矩丝杆、联轴器连接没有严重反向间隙的项目直接用刚性等级3到5就行如果机构悬臂长、皮带传动、负载变化大就要让驱动器做惯量识别后调低刚性和位置增益。怎么判断刚性设高了设备上电后电机静止时能听到嗡嗡电流声用手摸电机外壳有明显振感速度一高就报过载说明增益过大。按驱动器面板键逐步往下调位置环增益、速度环增益调到静止无明显噪声、运行中加减速不丢步、跟随误差在允许范围内这个状态基本就对了。惯量比这个参数容易被忽略但很关键。负载惯量和电机转子惯量之比超过5倍时如果还用默认增益电机动态响应会明显迟钝定位时会冲过头再弹回来也就是过冲。这种情况下要么机械上减重要么在驱动器里把惯量比设到实测值再做一次自动增益调整让速度环根据实际情况重新计算积分系数。3. 程序实现TIA博途里的运动控制3.1 组态一个运动轴打开TIA博途在项目树里先添加CPU然后在“工艺对象”里新增一个运动轴配置时选择“基本运动控制”还是“扩展运动控制”。S7-1200默认支持基本运动控制包含MC_Power、MC_Home、MC_MoveAbsolute、MC_MoveRelative、MC_MoveVelocity等指令对常规点位定位足够了。轴组态里需要设置脉冲输出地址也就是分配Q0.0作为脉冲口、Q0.1作为方向口然后设置每转脉冲数、丝杆导程、旋转方向。注意S7-1200的组态里并不会自动知道你的电子齿轮比你需要在驱动器里设好电子齿轮比PLC这边只关心“每转的脉冲数”和“每转的位移量”两者匹配位置单位才准。还有特别容易被忽略的一点轴的硬件输出使能必须在循环中断OB里调用MC_Power指令而不是在主组织块OB1里调用。因为运动控制的使能信号需要高实时性放OB1里容易被扫描周期波动影响。如果一开始没建循环中断运动轴组态根本编译不过去。这在TIA博途里算是新手第一大坑。3.2 回零逻辑绝对定位前必须先定位原点绝对定位MC_MoveAbsolute虽然用起来方便但前提是轴必须知道自己在哪所以上电后第一件事是回零。S7-1200的回零有两种方式绝对编码器回零和增量式传感器回零。用增量式编码器时必须有原点传感器。回零时序是这样的MC_Home指令配置回零模式为“主动回零”轴先以找原点速度朝原点方向运动碰到原点传感器上升沿后减速再反方向低速脱离原点脱离瞬间找编码器Z相脉冲以Z相位置作为机械原点。这个过程中原点传感器的安装位置特别有讲究。我碰到过好几次原点开关刚好装在机械行程的末端回零时速度稍微快一点机构直接撞硬限位报警才停下来。后来我习惯把原点开关装在离硬限位还有10到20毫米的位置同时回零速度设慢一点低速找零速度最好不超过50mm/sZ相捕捉时才稳。回零完成后把轴的实际坐标用MC_Home的Position参数直接清零或者设为一个固定机械坐标后续所有绝对位移都以这个点为基准。注意顺序先调用MC_Home并等到指令Done信号为TRUE再允许自动模式的MC_MoveAbsolute运行否则程序会出现回零未完成就开始跑位置的竞态问题。3.3 手自动切换与状态机框架手动/自动切换是设备程序里最常见的功能。我的习惯是手动模式下点动指令直接控制伺服的点动运动自动模式则走一个以MC_MoveAbsolute为核心的顺序控制状态机。用SCL写一个简单的自动运行框架省略了具体地址定义重点看思路// 自动状态机0-空闲 1-回零 2-运行 3-完成 4-报警 CASE state OF 0: // 空闲 IF autoStart AND NOT driveAlarm THEN state : 1; // 启动后先回零 END_IF; startMove : FALSE; 1: // 回零 IF homeDone THEN state : 2; END_IF; 2: // 运行 MC_MoveAbsolute( axis : Axis1, position : targetPos, velocity : moveSpeed, execute : startMove, done moveDone, error moveError, errorID moveErrorID ); IF moveDone THEN state : 3; END_IF; 3: // 完成 completeSignal : TRUE; IF NOT autoStart THEN completeSignal : FALSE; state : 0; END_IF; 4: // 报警 IF NOT driveAlarm THEN state : 0; END_IF; END_CASE;这里要注意MC_MoveAbsolute的execute信号的边沿触发特性。execute必须用沿信号触发不能一直保持TRUE否则指令会不断重新执行轴每次扫描周期都会被重新给定目标位置轻则抖动重则根本定位不了。实际项目中我都是用一个“启动移位”的中间变量在按下启动按钮的上升沿给startMove一个短脉冲。另外MC_MoveAbsolute执行期间如果轴被限位信号或者急停打断指令会输出error状态这时候程序里要能识别错误码并清掉否则会自动模式的连锁条件会一直不满足设备像死机一样没反应。3.4 报警与安全逻辑安全逻辑比运动逻辑更重要。我的标准配置是急停按钮的常闭触点直接串入伺服使能回路急停按下伺服掉使能电机立刻抱闸如果电机带抱闸这是硬件的切断PLC程序里再把急停状态作为所有自动模式的启动条件之一双保险。驱动器报警输出也要接到PLC输入点程序里一旦收到报警信号做三件事停发脉冲/停止运动指令、把当前轴状态置为报警态、在人机界面或者面板上显示报警代码。不要做自动清除报警的动作有些报警比如过载、编码器断线必须人工检查原因后再手动复位自动清除会让设备带病运行。还有一个细节限位开关要用常闭信号接法因为这样一旦限位线断了PLC读到的是限位触发状态会立刻停轴故障导向安全如果用的是常开接法线断了等于没限位轴直接冲出去。4. 调试与排障真正的硬仗在现场4.1 上电前的检查清单接完线刷完程序最忌讳直接给电就试运行。我的习惯是先花十五分钟过一遍检查清单比出了故障再排查省时间得多。查接线核对脉冲、方向、使能三根信号线的公共端是否一致动力线U/V/W、编码器线、抱闸线是否牢固查参数驱动器里脉冲模式、电子齿轮比、方向取反、转速限制是否按工艺设好查组态TIA博途里的轴参数和硬件组态编译是否通过循环中断是否配置查安全回路急停是否有效、限位信号能否正常在PLC输入里看到点动测试手动模式给一个很小的速度确认电机旋转方向与程序期望一致。方向反了是个哭笑不得的经典故障程序里写了正方向运动电机实际朝负方向跑。这时不用改程序直接在驱动器参数里把方向设反或者把电机动力线的任意两相对调二选一别两件事都做那样方向又反了。4.2 典型故障现象与处理方法现象可能原因排查方法电机完全不动使能信号没通、脉冲信号极性不对、公共端错先看驱动器状态显示有没有准备就绪再查PLC脉冲输出点有没有电平跳动电机高速抖动增益过高、速度环参数过大、机械共振先把刚性等级降两档再做自动增益看看是否平稳定位不准确电子齿轮比错误、机械间隙、编码器Z相零漂用千分表打一段已知位移反向验证齿轮比检查联轴器和同步带张紧原点位置偶尔偏差回零速度太快、Z相捕捉不稳、原点传感器信号有毛刺降低回零低速段速度给硬件输入加滤波必要时改双信号回零驱动器报警过载负载卡死、增益过大、缺少刹车电阻手动盘一下机构是否顺滑看驱动器额定电流是否超限编码器报警编码器线接触不良、屏蔽层接地不良检查编码器插头规范单端接地排除动力线干扰这里面定位不准的问题我多说一句如果只是每次都偏同一个方向且偏量固定优先检查电子齿轮比是不是约分错了如果每次偏的方向和大小随机优先怀疑编码器Z相没对准、机械有松旷如果偏差和速度正相关那基本是加减速时间太短伺服过冲了把加速时间拉长或者降低最高速度就能解决。4.3 伺服啸叫与共振问题的解决思路伺服啸叫也叫“电流声”或者“蜂鸣声”是现场最让人头疼的问题之一。产生原因通常是速度环增益太高、负载惯量比设置错误或者机械传动部件存在共振模态。我的排查套路是先把驱动器切到速度模式空载电机脱开负载试运行。如果空载不啸叫带上负载才叫基本锁定机械共振或惯量不匹配如果空载也啸叫那就是驱动器参数问题直接把速度环增益减半再试。如果是机械共振优先给速度环增加低通滤波驱动器参数里一般叫“速度检测滤波”或“共振抑制”设到200Hz到500Hz之间啸叫会明显减弱。再者就是降低位置环增益位置环一高速度环就会高频震荡表现为电机停住时电流声很大定位后还有余震。调参的原则是能通过机械改善的不要靠软件硬扛。联轴器打滑、皮带轮旷量、导轨滑块磨损这些问题软件是补不回来的。4.4 虚拟机里跑TIA博途连不上PLC怎么办现在有不少人用笔记本电脑装虚拟机跑TIA博途现场调试时省事但连接问题也不少。我遇到过最典型的是虚拟机里能ping通PLC的IP但TIA就是发现不了设备。这个问题多半出在虚拟机网络模式上。VMware虚拟机默认NAT模式意味着虚拟网卡的IP地址、MAC地址经过一层地址转换而TIA博途在组态访问时会通过西门子的模块发现协议基于UDP广播和DCP协议广播报文经过NAT之后基本全丢了自然发现不了PLC。解决办法很简单把虚拟机的网络连接模式改成“桥接模式”并且勾选“复制物理网络连接状态”。桥接模式下虚拟网卡直接挂在物理网卡上可以获得和物理机同一网段的IPTIA的广播发现机制才能用。如果改了桥接还发现不了手动把PLC的IP和虚拟机设置为同一网段例如PLC是192.168.0.1虚拟机网卡就设192.168.0.10然后再用手动输入IP的方式访问组态在TIA的“在线访问”里填IP绕开自动发现。另外提一句S7-1200的PROFINET口默认允许从MMC卡或者博途上下载IP但如果你之前手动设过IP忘记密码导致无法覆盖需要把CPU拨到STOP状态然后用博途的“在线恢复出厂设置”功能按住CPU上的复位按钮直到RUN/STOP灯快闪就可以重新分配IP了。4.5 Modbus RTU控制伺服有通讯需求时怎么接扩展聊一下Modbus RTU的方式因为现在很多国产伺服比如台达、汇川、伟创都支持Modbus RTU控制S7-1200用CM1241 RS485模块或者CB1241通信板就能做。Modbus RTU控制伺服的基本流程是PLC作为主站伺服驱动器作为从站。PLC先把控制字通常是16位寄存器写入驱动器的控制地址比如写16#0006表示使能然后再写目标速度或者目标位置寄存器最后通过控制字的位来触发运动。这个方案最大的坑是数据格式不同驱动器对Modbus寄存器的定义完全不同尤其是32位位置值有的先发高16位有的先发低16位顺序反过来数据就完全不对了。我的处理方法是先在串口调试助手里用手动读写指令验证寄存器映射确认无误后再在PLC里按相同映射组帧。随便拿网上例程套用大概率是定不准位的。通信参数也要一致波特率、数据位、停止位、校验位任何一项不对驱动器要么不上线要么偶发无响应。S7-1200的Modbus RTU指令自带CRC校验不用自己算校验码但超时时间和重试次数要根据实际波特率设置波特率9600时一帧16个字节大约要17毫秒超时设太短会误判通信故障。5. 从单轴到多轴S7-1200还能这么玩5.1 多轴联动与电子齿轮同步如果项目从单轴升级到双轴联动S7-1200依然是能打的前提是CPU选型要到位。带两个PTO轴时1214C基本是极限再多就得用外扩的高速输出模块或者换S7-1500。两轴联动项目里我踩过最深的坑是两轴脉冲频率不能完全同步的问题。其中一个轴走丝杆另一个轴走同步带机械减速比不同电子齿轮比算出来一个是10一个是12看起来是整数比但实际运行中由于两个轴的机械误差累计位移会慢慢分叉跑久了产品就歪了。这种情况下首选方案是在PLC里做电子齿轮同步用GearIn指令或者通过工艺对象的速度比例关系让从轴跟随主轴的实时速度S7-1200从固件V4.0开始支持MC_GearIn指令可以把一个轴的速度设为另一个轴速度的整数倍。但这个指令对PLC扫描周期很敏感循环中断时间必须固定不能变动。5.2 与上位机对接C#和OPC UA设备联网之后上位机读写S7-1200的需求就来了。C#上位机访问S7-1200常见的方式有两条路一条是用西门子官方的S7.NET通讯库直接读写DB块另一条是走OPC UATIA博途V15以上的S7-1200固件自带OPC UA服务器上位机用UA客户端连接就行。S7.NET这种方式的坑在于PLC侧的DB块必须取消“优化块访问”选项否则外部程序按地址读不到数据。我在项目总结里特意保留了这个点因为新手经常在这里卡住半天DB块一优化数据全读出来是0。OPC UA则没有这个问题它走的是符号寻址上位机直接按变量名读。更妙的是S7-1200的OPC UA不需要额外的授权费用对中小设备来说C# OPC UA S7-1200这套组合做数据采集和远程监控性价比很高。我会在DB块里专门建一个“上位机通信区”把需要交互的数据集中放方便OPC UA浏览和管理。如果项目有飞剪、追切这类需求热词里提到的“电子凸轮”就是S7-1200的高阶玩法了。S7-1200从V4.0固件开始支持基本凸轮功能可以定义凸轮曲线通过MC_MotionInCam表和MC_CamIn指令做位置同步但说实话复杂的凸轮曲线建议还是上S7-15001214C的处理速度在多轴凸轮场景下会有点吃力。最后说个我自己的调试习惯每一个伺服项目做完我都会把驱动器的全套参数导出备份到项目文件夹里然后在参数表上用备注写明每一档参数是调什么用的、当时是怎么试出来的。伺服调试这东西现场状态一紧张脑子会短路有备份参数和历史备注返修或者复制项目的时候能少走很多弯路。你按上面的流程走一遍从硬件到程序再到调试思路理顺了S7-1200配伺服基本就没什么能难住你的了。
返回列表