最近在手头一个小型自动化设备上做了S7-1500与V90 PN的PROFINET通讯控制,任务是驱动一个滚珠丝杠工作台完成往复定位。项目本身不算复杂,但如果你第一次把这两个设备拉到一起,中间涉及的博途组态、V90驱动器参数设置、工艺对象轴配置、程序联调这些环节,还是有不少弯子要绕。这篇文章就当是我的一次完整记录,从硬件方案到程序调试,包括现场踩过的坑,都摊开讲一遍,希望能给后面接类似项目的朋友省点时间。
1. 项目背景与需求拆解
1.1 项目在解决什么问题
设备现场需要一套伺服定位系统:工作台由伺服电机带动,经联轴器和滚珠丝杠驱动,要求定位精度在正负0.05毫米以内,最高移动速度约120毫米每秒,加速时间控制在0.3秒左右。而且现场对走线要求很高,电控柜空间也不宽裕,传统的一堆线缆接法让人头疼。控制核心已经定了用S7-1500系列PLC,伺服驱动器这边则考虑用西门子V90 PN。
这类需求放到几年前,大家第一反应多半是“PLC发脉冲给伺服驱动器”。步进电机发脉冲很常见,伺服也有脉冲型接口。但真正做起来就会发现,脉冲方案在高频定位场景里有几个先天短板:一是脉冲频率上限决定了电机速度上限,想要高速就得提高脉冲频率,容易受输出模块性能限制;二是脉冲信号在长距离传输时容易受干扰,丢脉冲就意味着丢位置;三是诊断信息太少,驱动器报警了,PLC这边只能靠硬接线去读几个开关量,根本看不到实际位置、实际速度、电流这些内部数据,排查问题全靠猜。
所以这个项目从一开始就倾向于走总线通讯控制,而不是脉冲控制。总线方案除了接线少、诊断全之外,最大的好处是PLC可以直接读到伺服当前的状态字、实际位置、实际速度、报警代码,调试时能直接监控内部数据,这个优势在设备量产后的维护阶段非常明显。
1.2 为什么选S7-1500加V90 PN这套方案
S7-1500和V90 PN都是西门子自家产品,它们之间走PROFINET可以说是“原生搭配”。PROFINET是西门子主推的工业以太网协议,实时性、稳定性、生态成熟度都经过了大量的现场验证。PLC作为PROFINET IO控制器,V90作为IO设备,两者通过标准报文交换数据,选型、组态、调试都有现成的流程参考,出了问题也容易查资料。
如果说用S7-1200搭配V90 PN也能完成这个项目,那确实可以,小型定位控制S7-1200也够用。但在这个项目里选用S7-1500,主要考虑了三个原因:一是后续还要挂更多伺服轴和远程IO站,S7-1500的PN接口和运动控制性能更有余量;二是S7-1500的工艺对象轴功能更完整,程序结构也更清晰;三是项目方统一设备平台,希望所有新设备都用S7-1500,方便他们维护备件和标准化程序。
V90 PN选的是配套1FL6伺服电机的那款,原配电机、原配驱动,省去了第三方电机匹配的麻烦。这里我要多说一句:如果你也准备用V90,最好直接用西门子的1FL6系列电机,否则驱动器识别电机、编码器反馈、抱闸逻辑这些都要额外折腾,不是说绝对不行,但没必要给自己挖坑。
2. 组态与通讯链路搭建
2.1 在TIA Portal里把V90挂上总线
项目用TIA Portal做组态和编程。打开博途之后,新建项目,添加S7-1500 CPU,然后就要在网络视图里把V90添加进来。
如果你的博途版本比较新,硬件目录里通常能直接找到SINAMICS V90 PN。路径大概是“其他现场设备”或“分布式IO”下面的驱动分类里。如果找不到,去西门子工业支持网站下载对应的GSDML文件,在博途里通过“安装GSD文件”功能导入。这里要注意版本匹配,GSDML版本和博途版本差太多的话,即使装上了,后续分配设备名称时也可能出问题。我习惯的做法是:无论能不能直接搜到,都先检查一下GSD版本和当前博途版本的兼容性说明再动手。
把V90拖到网络视图之后,把PLC的PROFINET接口和V90的PROFINET接口用一条“网络连接线”连起来。然后双击V90设备,进入设备视图,在“常规”选项卡里能看到PROFINET接口的属性,IP地址和设备名称就在这里设置。
我实际用的配置是:PLC的PN接口IP设为192.168.0.1,V90设为192.168.0.2,子网掩码都是255.255.255.0。设备名称给的是“v90_axis_01”这种简单纯小写加下划线的格式,后面我会单独讲为什么设备名称这么敏感。
设好组态后,先编译再下载到PLC。注意,刚下载完程序时,PLC和V90之间其实还没有建立PROFINET IO通信,因为V90侧的设备名称可能还没分配,或者与组态不一致。这个时候需要在博途的“在线访问”面板里找到V90,用“分配设备名称”功能把组态好的设备名写进V90。
2.2 IP地址和设备名称的问题
很多第一次做PROFINET的人会在这里卡住。明明IP地址能ping通,博途里也能看到设备,但PLC和V90就是建立不了IO通信。问题多半出在设备名称上。
PROFINET IO通信建立之前,IO控制器会通过设备名称去寻找对应的IO设备,而不是直接通过IP地址找。IP地址是逻辑寻址,设备名称才是PROFINET机制里的“身份标识”。打个比方,IP地址相当于门牌号,设备名称相当于公司名。IO控制器要先按公司名找到你这家公司,才能按门牌号去敲你的门。如果你设备名称不对,门牌号再对,人家也认不出你是谁。
在给V90分配设备名称的时候,要注意几个细节。第一,设备名称不能随便让人改,它必须和博途组态里的名称完全一致,大小写、下划线、数字都不能差。第二,设备名称里尽量不要带“-”这种特殊字符,实际遇到过因为名称里有非法字符导致分配失败的情况,改成类似“v90_axis_01”这样的名字就一切正常。第三,如果现场有多个V90,名称不能重复,每个都必须唯一。
另外一个容易忽略的点是:分配设备名称前,先确认V90的IP地址和PLC在同一网段。如果IP不在同一网段,虽然分配名称可能成功,但IO通信建立不了。现场最常见的问题是有人把V90的IP设成了192.168.0.2,PLC的IP设成了192.168.1.1,子网不同,怎么调都不通。
2.3 通讯报文怎么选
设备名称分配好了,通信基础算是有了,但要让PLC和V90之间交换有用的数据,还得选对报文。
报文说白了就是两台设备之间数据交换格式的约定。PROFINET IO通信里,PLC作为控制器按固定周期把一组数据发给V90,V90也按固定周期把一组数据发回PLC。两边数据的长度、每个字的意义都必须一致,否则要么通信报警,要么数据错位,看到的状态字根本不是你要的那个。
V90位置控制最常用的报文是标准报文3。这个报文里,PLC发往V90的数据包括控制字和速度设定值,V90发回PLC的数据包括状态字和实际速度。对于基本的定位控制,这个报文已经够用了。如果你想获得更多诊断信息,比如实际电流、报警代码、电机温度之类的,可以选择扩展报文,比如西门子报文111或者其他附加诊断报文。
我项目里用的就是标准报文3,原因很简单:工艺对象轴和MC_Power、MC_MoveAbsolute这些运动控制指令,默认就是按标准报文3来对接的,学习成本低,出问题也容易排查。
这里强调一下,PLC侧选的报文类型和V90侧设置的报文类型必须一致。V90在出厂的默认参数里不一定就是标准报文3,如果你只改了PLC侧的组态,忘了改V90侧参数,通信一样建立不了。后面我会在排查记录里专门说这个坑。
3. 轴工艺对象与驱动器参数配置
3.1 在PLC侧建立轴
PROFINET通信组态好了,V90也作为IO设备挂到PLC下面了,接下来就要在PLC侧建一个“轴”工艺对象。这一步也是很多新手容易糊涂的地方:驱动器和轴不是一回事。驱动器是硬件设备,轴是PLC程序里的逻辑对象,它把机械传动链的参数、运动控制指令、驱动器报文全部封装在一起。
在TIA Portal左侧项目树里,找到PLC的“工艺对象”,右键新增对象,选择“轴”。创建之后要把这个轴和已经组态的V90驱动关联起来,驱动连接选择V90,通讯报文选择你在组态里配的那个标准报文3。
控制模式这里我选的是“基本定位”,也就是通常说的EPOS模式。这个模式的好处是位置环在驱动器内部完成,PLC只需要给出目标位置、速度、加速度这些设定值,剩下的位置闭环、动态特性优化,都由V90自己处理。对程序员来说,程序量小,调试直观。另一种模式是把位置控制放在PLC侧,驱动器只做速度环,这种模式对PLC运动控制程序的要求更高,不太适合首次做这种项目的人。
轴建好之后,还需要在“基本参数”里设机械参数、位置单位、速度单位、加减速限制、软限位监视这些东西。我习惯把软限位监视打开,并且把软限位范围设得比机械硬限位稍微靠内一点,这样即使程序里误写了超限位置,轴也会在到达机械极限之前停下来,多一道保护。
3.2 V90驱动器侧的参数
PLC侧把轴建好,只是事情的一半,V90驱动器侧也要把参数改到位。
如果V90配了BOP操作面板,改起参数来还算方便。如果没配面板,就得通过博途在线访问或者在电脑上装调试软件来操作。拿到一台全新的V90,我习惯先做一次恢复出厂设置,把所有参数清零,避免上一个项目残留的参数干扰判断。
恢复出厂后,第一个要设的是运行模式。V90里有很多运行模式,比如速度控制、位置控制、内部设定值控制等。我们要做EPOS定位控制,就要把运行模式切到对应的位置控制模式。这个参数具体号我记不太清了,调试手册里通讯参数那几个页签有明确说明,以你手上固件版本对应的手册为准。
第二个要设的就是通讯报文类型,要和PLC侧组态一致,选标准报文3。第三个是IP地址和设备名称,这两个参数通过BOP面板也能改,改完后一定要保存参数并重新上电,不然有些参数不会生效。很多人在这一步栽跟头,参数改了,面板上显示也变了,但没保存重启,通讯就是起不来。
另外还要核对电机参数,电机铭牌上的额定电流、额定转速、编码器类型这些信息,V90通常会通过电机识别自动匹配,但如果报“电机识别错误”之类的报警,就说明电机参数和实际硬件对不上,要手动确认一遍。
3.3 机械换算和动态参数
轴工艺对象里有个烦人但又最关键的部分:机械单位换算。
伺服电机的控制单位是“转”,但工艺人员关心的是“毫米”。电机每转一圈,负载走多远,取决于丝杠导程和减速机减速比。比如我这个项目,丝杠导程是10毫米,电机通过联轴器直连丝杠,减速比是1比1,也就是电机转一圈,工作台移动10毫米。那么在工艺对象的机械参数里,电机端转数和负载端位移的对应关系就填这个数。
如果中间加了减速机,比如减速比是5比1,那电机转5圈,丝杠才转一圈,负载才移动10毫米。也就是说,电机每转一圈,负载只移动2毫米。这个比值填反或者算错,最直接的结果就是定位距离差5倍、10倍,对于没经验的人,现场看到这个现象很容易懵。
还有一个参数叫负载惯量比。惯量比如果设置得和实际相差太大,伺服运行时会振动,或者动态响应很差。V90有自动惯量识别功能,我建议先让它自动识别一次,然后手动微调。调试起步阶段,惯量比往小里调一点,稳定性会好很多,后续再根据实际运行情况慢慢加上来。
动态参数方面,轴工艺对象里要设置速度限制和加速度限制。加速度设太大,启动瞬间扭矩超过驱动器能力,会触发过载报警;设太小,设备节拍跟不上。我一般先按工艺要求的60%到70%来跑,等机械运行稳定了再逐步提高。
4. 程序框架与调试过程
4.1 运动控制程序的基本骨架
轴工艺对象配置完成之后,就可以开始写程序了。S7-1500里运动控制指令是符合PLCopen标准的,常用的几个指令是MC_Power、MC_Home、MC_MoveAbsolute、MC_Halt、MC_Stop、MC_Reset。
先看一下MC_Power的调用,这是整条轴程序的前置条件。
"MC_Power_Instance"( Enable := "Tag_Axis_Enable", StopMode := 0, Axis := "Axis_1", Status => "Tag_Power_Status", Error => "Tag_Power_Error", ErrorID => "Tag_Power_ErrorID" );程序逻辑上,启停顺序我反复调整过几次,最后定下来的流程是:上电后先给驱动器供电,等通讯建立稳定,V90面板不再显示通讯报警,再置位MC_Power的Enable。使能之后不要立刻发定位指令,延时几百毫秒,给驱动器内部完成准备。生产过程中,每次定位之前先判断轴状态,是使能并且无报警,然后才调用运动指令。
回零逻辑也很关键。我用的方式是主动回零,通过MC_Home指令配合参考点挡块和编码器零脉冲,每台上电后先回一次零,确保后续绝对定位坐标一致。这里要注意,如果参考点挡块信号有干扰,回零位置会偏移,现场排查时我会在程序里对参考点信号做滤波,或者改用重复精度更好的回零模式。
程序里还有一个容易被忽略的细节:报警复位。伺服驱动器报警后,MC_Power的Enable不能直接把它复位,需要先用MC_Reset清除运动错误。有些报警来自驱动内部,MC_Reset只能复位PLC侧工艺对象的错误状态,驱动器自身的报警还要通过发送控制字去清除。这部分要在程序里根据具体报警代码处理。
4.2 我用轴控制面板做的事
在写正式程序之前,我强烈建议先用博途自带的“轴控制面板”把机械参数和单位换算验证一遍。
轴控制面板是工艺对象调试功能的一部分,打开之后可以连线做手动操作:点动、回零、绝对定位都直接在面板上点按钮完成,不需要写任何PLC程序。这个功能在项目初期非常有用,我拿它做了两件事。
第一件事是验证齿轮比和单位换算。在轴控制面板里给一个100毫米的位置设定值,看工作台实际走多少。如果实际走了100毫米,说明机械参数没问题。如果走了10毫米或1000毫米,那就是电机转数与负载位移的对应关系填错了。这一步如果放到写完整程序之后再发现问题,排查成本会高很多。
第二件事是看实际速度曲线。通过面板给定一个速度,监控实际速度反馈,看看加减速过程有没有抖动,有没有出现过冲。如果有抖动,大概率是V90的增益太高,或者负载惯量比不对,先把机械参数这边弄平稳,再去写生产工艺里的定位流程。
轴控制面板有时会提示“无法激活”,最常见的原因是PLC程序里已经在调用运动控制指令,轴被程序占用。遇到这种情况,可以先把CPU切到STOP,激活面板调试完,再切回RUN。我在项目里就是这么干的,调试流程很流畅。
4.3 抱闸和安全停机逻辑
伺服电机的抱闸逻辑,是这个项目里花时间最多的地方之一,不能只当普通输出处理。
如果电机带抱闸,抱闸的打开和闭合必须和轴使能状态严格互锁。复位后,程序流程应该是:先给抱闸松开信号,等抱闸真正打开,再使能电机;停机时,先减速停止,等电机实际停下来,再闭合抱闸。顺序搞反了,轻则电机顿挫,重则机构下滑或撞机。
V90可以自己控制抱闸,通过驱动器内部的抱闸继电器输出,也可以把抱闸控制交给PLC。这个项目里选的是PLC控制抱闸回路,因为现场还有其他安全逻辑需要统一处理。程序里做互锁时要注意,MC_Power的Enable断开不等于电机立刻抱死,因为驱动器还有一个减速停止的过程,如果抱着“只要断使能就等于刹车”的思路去写程序,很容易出事。
急停逻辑要单独说一下。急停信号触发后,我程序的处理顺序是:立即调用MC_Stop,让轴按工艺对象里配置的停车斜坡减速停止,然后断开MC_Power使能,最后才闭合抱闸。MC_Halt和MC_Stop不一样,MC_Halt是正常暂停,MC_Stop是紧急停止,两者的减速度和停止方式都可以分别配置。项目里急停用的MC_Stop,减速参数按机械能承受的最大安全减速度来设,保证急停时不会撞坏丝杠和联轴器。
5. 现场问题排查记录
5.1 快速定位问题的速查表
整个项目联调下来,遇到过的问题五花八门,我整理了一个排查表格,后面再做同类项目时可以直接对照。
| 故障现象 | 可能原因 | 排查步骤 | 解决方法 |
|---|---|---|---|
| V90面板显示通讯报警,PLC与V90无法建立IO通信 | IP地址不在同一网段,或设备名称未分配 | ping一下V90的IP;在博途在线访问里查看设备名称 | 改成同一网段IP;重新分配设备名称 |
| 通讯报文不匹配 | PLC侧报文类型和V90侧参数不一致 | 查看V90报文参数和PLC组态报文 | 两边改成同一种报文,保存重启 |
| MC_Power使能后Error置位 | 驱动器未就绪或通讯未建立 | 查看ErrorID,对照手册;查看V90当前报警代码 | 先处理驱动报警,再重新使能 |
| 定位距离与设定值相差固定倍数 | 机械参数里转数与位移对应关系填错 | 用轴控制面板走一个已知距离 | 按电机每转对应负载位移重新计算填写 |
| 电机振动或啸叫 | 增益太高,或负载惯量比不匹配 | 用趋势图观察实际速度曲线 | 降低增益或调整惯量比 |
| 回零位置漂移 | 参考点挡块信号干扰 | 检查参考点信号接线和干扰源 | 对参考点信号做滤波,可考虑增加零脉冲判断 |
| 轴控制面板无法激活 | PLC程序占用轴 | 查看CPU运行状态 | 切到STOP再调试,或暂停调用运动指令的程序 |
| 电机过载报警 | 加减速设定过大,负载超限 | 看报警代码和实际电流曲线 | 降低加速度和速度,改善机械润滑 |
这个表不能解决所有问题,但大部分通讯和定位初期的疑难杂症,照着这个顺序去查,基本都能找到方向。
5.2 几个印象深刻的排查经过
过程里印象最深的是设备名称分配失败的问题。V90的IP地址能ping通,博途在线也能看到设备,但点“分配设备名称”时总是失败。折腾了很久才发现,V90之前被某个旧工程分配过一个设备名称,那个名称里带了一个特殊字符,导致新工程在分配时一直不成功。后来我进到在线设备信息里,手动把设备名称清掉,改成一个纯下划线的小写名称,再重新分配,一次就过了。从那之后,我在所有项目里对设备名称的要求就一条:字母、数字、下划线,其他符号一律不要用。
第二个印象深的坑是标准报文3对应不上。现场V90已经能正常和PLC通信了,轴的使能指令也发了,但MC_Power就是报错。查看V90面板,发现有通讯类报警。后来查来查去,发现PLC侧组态里选的是标准报文3,但V90侧参数还停留在出厂默认的标准报文1。两个设备居然还能勉强建立连接,但数据字长度对不上,导致控制字没有正确写入。这个问题在手册里其实写得很清楚,但人一着急就是容易忽略,我现在每次组态完都会专门核对两边报文类型。
第三个是定位差十倍。工作台实际移动距离和设定值差了整整十倍,当时第一反应是脉冲当量或机械参数填错了。打开轴工艺对象的机械参数一看,电机端转数填的是10,负载端位移填的是1,跟实际的导程10毫米正好算反了。改过来之后重新走一遍100毫米定位,实测值就完全正确了。从那以后,每次做新项目我都会在轴控制面板里先走一个固定距离,用实际位移反推参数对不对,这成了我的固定操作习惯。
结尾
项目收尾的时候自己复盘了一下,这套S7-1500加V90 PN的组合,技术上并不复杂,但涉及的知识面一点都不少:PROFINET通讯原理、TIA组态、V90驱动器参数、PLCopen运动控制指令、机械传动换算、安全逻辑设计,每一块都需要踩过才知道坑在哪里。如果你在做的项目跟这个类似,我的建议是:把通讯组态和工艺对象参数当回事,先耐心把设备和参数理顺,再写程序;轴控制面板是你最好的调试工具,不要一上来就埋头写代码。这套流程走通一次之后,再遇到同类设备,基本就是复制工程、改参数、验证、交付的事。