十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

S7-1500读取V90伺服电流扭矩:自由报文与RDREC两种方法详解

S7-1500读取V90伺服电流扭矩:自由报文与RDREC两种方法详解 简介在西门子S7-1500系列PLC与V90伺服驱动器的集成应用中如何读取电流、扭矩等运行参数是电气工程师常遇到的实际问题。这份DOCX文档系统梳理了两种实现方法一是当V90配置为EPOS控制模式并使用标准报文111时通过修改参数P29151自定义PZD12字段即可读取实际扭矩、实际绝对电流或DI状态二是利用基于非周期通讯的FB286与FB287功能块分别实现多参数和单参数的灵活读写文中详细说明了sxParameter参数设置、整型与实型数据存放规则以及通过BUSY、DONE标志位判断任务完成的操作要点。资源为单个DOCX文件大小约978KB内容包含接口设置示例和具体配置步骤方便对照实操。目前已有1499人学习下载适合自动化调试工程师、PLC编程人员及伺服维护者参考有助于快速掌握V90伺服参数的精细读取与监控方法。 干过S7-1500带V90伺服的项目应该都有过类似的经历速度控制、位置控制都调试得顺顺当当结果客户在验收前甩过来一张需求表上面写着“触摸屏需要显示伺服当前扭矩和电流”。你翻遍V90的默认报文发现控制字、状态字、速度设定值、速度实际值都在就是没有电流和扭矩这两项。这不是V90抠门而是西门子把这两类参数放在了不同的数据通道里一类走周期性IO报文PZD另一类走非周期参数访问。你要读电流扭矩本质上是选择走哪条路的问题。这篇文章我就把S7-1500读取V90伺服驱动器电流、扭矩等参数的两套具体方法讲透第一种是通过自由报文映射把r参数塞进周期IO数据第二种是用RDREC指令做非周期参数访问。两种我都实际跑过会把配置步骤、报文结构、程序示例和踩坑经验一起放出来适合正在做设备调试的电气工程师、做非标设备OEM的程序员以及需要把伺服状态数据采集到上位机的朋友参考。1. V90的数据访问逻辑为什么默认报文里看不到电流扭矩1.1 报文与PZD的边界V90通过PROFINET与S7-1500通讯时默认走的都是标准报文最常见的是标准报文1和标准报文3。标准报文1里有控制字STW1、状态字ZSW1、速度设定值NSOLL和速度实际值NIST一共4个字标准报文3再多加几个扩展字但核心还是围绕速度控制。问题就出在这里无论标准报文1还是3PZD区只承载与速度、状态相关的过程数据。电流和扭矩在驱动器的参数组织里属于诊断和监控类数据西门子默认不会把这种数据放进周期报文因为周期报文的刷新时间和数据长度都是固定的塞进去会影响通讯效率和兼容性。你要读这些值要么扩展报文的字段要么走另一条更灵活的非周期通道。1.2 r参数与p参数的区别V90内部参数沿用了西门子驱动器的惯例p参数是可写的设定参数比如p1121是斜坡上升时间p2003是扭矩单位选择r参数是只读的实际值比如r31是实际扭矩r60是实际转速r68是实际电流。这几个只读参数就是我们要监控的对象它们一直在驱动器内部实时更新。我们要做的工作本质上是决定用什么方式把r参数的值搬运到PLC里。搬运方式就对应了下面这两种方法周期IO映射驱动器主动把r参数的值放到某个IO字里非周期参数访问PLC发请求驱动器把参数值放进响应帧里。1.3 两条读取路径的底层区别周期IO读取的本质是驱动器在每一个通讯周期里持续刷新PZD数据PLC只要从IO地址读就行实时性最好一个扫描周期就能拿到最新值适合做趋势监控。但前提是你要在V90的通讯报文配置里把r68、r31映射到报文的某个字位置。非周期参数访问类似“一问一答”的查询方式。PLC构造一个读参数请求数据记录通过PROFINET的非周期通道发到V90V90处理后返回一个包含参数值的数据记录。这种方式灵活性高可以读任意参数而且不需要改动V90的报文配置但实时性有限你总不能让PLC每个扫描周期都发请求去“问”电流值通讯负担太大。实际项目中非周期读取通常会放在循环中断里100ms甚至200ms更新一次。2. 第一种读法自由报文映射把电流扭矩塞进周期IO数据2.1 配置前置性条件GSD文件与V90报文类型周期IO方式的第一步不是写PLC程序而是先在V90侧把报文类型改掉。V90支持通过面板或V-ASSISTANT调试软件设置通讯报文在“通讯”相关菜单里把报文类型从标准报文切换为“自由报文”或“扩展报文”然后在数据对象列表里勾选需要周期性传输的参数。这一步很多人会漏掉。如果你在TIA Portal里组态了V90但V90本体还停留在标准报文模式你在PLC里建再多的数据块也没用IO数据根本对不上。所以先打开V-ASSISTANT连接驱动器进入通讯报文配置页面找到自由报文配置项把r31实际扭矩、r68实际电流、R60实际转速等目标参数添加到发送给PLC的周期数据对象列表中。保存并下载参数可能需要给驱动器重新上电。2.2 在TIA Portal里组态V90从站PLC侧的操作相对标准。打开TIA Portal在项目树里进入设备和网络视图从硬件目录中拖入V90的GSD文件对应设备型号或者使用HSP硬件支持包安装后的设备描述文件。连接到S7-1500的PROFINET网络后双击V90设备进入设备视图分配IO地址。这里有个细节如果你用的是GSD文件方式组态V90会以标准从站的形式出现报文类型和子模块结构需要手动核对如果使用HSP方式且版本合适TIA会自动识别V90的报文配置。无论哪种方式组态完成后记下V90子模块对应的IO起始地址这个地址是后面写程序时的LADDR参数参考。2.3 PLC程序端的处理与换算组态完成后你在PLC程序里可以直接用地址访问这些IO数据。例如组态时输入起始地址为256IW256那PLC从IW256开始读到的就是V90周期上报的数据帧。周期IO里传输的电流、扭矩值通常是16位整数且遵循西门子驱动的标定规则十六进制4000即十进制16384对应100%。举个例子如果IW300通道被映射为r68实际电流PLC读到的原始值是8192那实际电流百分比就是8192/16384*100% 50%。如果r68对应的标定值是额定电流那当前电流就是额定电流的50%。扭矩值的处理需要额外注意符号。V90的扭矩方向有正负周期报文里用的是16位有符号整数负值以补码形式存储最大负向扭矩对应的原始值是-16384。PLC里用Int类型读取后再除以163.84就能得到带符号的百分比值。有些项目的触摸屏要求显示实际扭矩值Nm那还需要结合驱动器的额定扭矩做一次换算。2.4 实测验证方法程序写完后验证方式很简单。给伺服使能手动给一个小的速度给定让电机带动负载运行然后在TIA Portal的监控表里同时监控速度设定值和扭矩、电流通道的IO地址。正常情况下你会看到电流通道的数值随负载波动明显堵转瞬间能冲到很高的百分比扭矩通道也会随负载方向出现正负变化。如果所有值都纹丝不动立刻回V-ASSISTANT检查数据对象列表是否真的加上了r参数很多“程序没问题但读不到数据”的情况都出在报文配置这一步。2.5 周期IO方式的适用边界周期IO方式最大的好处是实时性通讯周期内数据自动刷新不需要PLC发送任何请求非常适合需要连续趋势曲线的场景比如在触摸屏上做伺服负载率曲线、电流波动监控。缺点也有自由报文是自定义结构换人维护时如果不看配置文档根本不知道哪个字对应哪个参数而且你勾选的r参数越多报文长度越长PROFINET带宽占用也越大伺服轴数多时要注意网络负载不要过低IO更新时间可以适当调大。3. 第二种读法非周期参数请求用RDREC按需捞数据3.1 RDREC指令从哪里找不想改动V90的报文结构或者需要读取的参数数量很多、很杂那就走非周期参数访问。S7-1500可以通过RDREC指令Read Record读数据记录向PROFINET从站发起非周期读写请求指令在TIA Portal的“扩展指令”-“分布式I/O”-“其他”里能找到。这个指令的用途很明确读从站的某个数据记录。对于V90来说它的参数区被组织成数据记录的形式你构造一个读参数请求数据记录发给它指定的数据记录号它就会把参数值放在响应数据记录里返回来。3.2 构造读参数请求帧V90的PROFINET参数访问遵循PROFIdrive规范。要读取一个参数PLC需要先构造一个16字节的请求头再通过RDREC写入指定的记录号。16字节请求头各字节含义如下字节偏移含义示例值0请求任务ID读参数为0x010x011参数请求个数一次读1个0x012请求引用号可设1用于应答匹配0x013轴号V90单轴为10x014属性读数值为0x100x105元素个数参数为数组时用0x016-7参数号高低字节r31对应0x001Fr68对应0x00440x00 0x1F8-9子索引非数组参数为00x00 0x0010-13请求值区读时为00x0000000014-15保留0x0000r参数号可以自己算r31就是参数号31十六进制0x1Fr68就是参数号68十六进制0x44。如果你想读r60转速那就是0x3C。索引这块不用纠结V90的常用r参数都是标量子索引固定为0。3.3 响应帧的数据解析RDREC读回来的数据记录通常是22字节结构如下字节偏移含义0响应任务ID固定0x021响应参数个数等于请求值2请求引用号与请求帧一致3轴号镜像4错误码0表示无错误5元素个数6-7参数号镜像8-9子索引镜像10-13值区的一部分空闲14-17值区空闲区18-21参数值4字节整数或浮点最关键的是最后4个字节也就是偏移18到21。V90返回的r68、r31等数值在这里是32位的值可能是整数也可能是浮点数具体要看参数类型。比如r68默认以百分比形式返回时是整数类型而有些固件版本会以浮点形式返回。稳妥的做法是先在V-ASSISTANT的参数表里确认参数数据类型再决定用DINT还是REAL去解析。我自己的习惯是统一按32位方式读取然后在PLC里根据参数类型做一次MOV转换。3.4 在TIA Portal里的完整实现过程我把这套逻辑封装成一个FC在OB1里调用用定时器或者OB32循环中断做周期性触发间隔设为200ms比较合适。具体步骤先建两个全局DB一个做发送缓冲区SendBuffer一个做接收缓冲区ReceiveBuffer都定义成字节数组。发送缓冲区16个字节接收缓冲区22个字节。在OB32里写一段SCLSEND_BUFFER[0] : 16#01; // 读参数请求 SEND_BUFFER[1] : 16#01; // 参数个数 SEND_BUFFER[2] : 16#01; // 请求引用 SEND_BUFFER[3] : 16#01; // 轴号 SEND_BUFFER[4] : 16#10; // 属性读数值 SEND_BUFFER[5] : 16#01; // 元素个数 SEND_BUFFER[6] : 16#00; // 参数号高字节 SEND_BUFFER[7] : 16#44; // 参数号低字节此处为68r68电流 SEND_BUFFER[8] : 16#00; // 子索引高字节 SEND_BUFFER[9] : 16#00; // 子索引低字节 SEND_BUFFER[10] : 16#00; SEND_BUFFER[11] : 16#00; SEND_BUFFER[12] : 16#00; SEND_BUFFER[13] : 16#00; SEND_BUFFER[14] : 16#00; SEND_BUFFER[15] : 16#00;调用RDRECRDREC(LADDR : 16#0100, // V90子模块硬件地址注意是十六进制 RECNUM : 1, // 记录号V90参数访问通常为1 MLEN : 22, VALID : FALSE, BUSY : FALSE, ERROR #Err, STATUS #Status, LEN #Len, RECORD ReceiveBuffer);LADDR这个参数经常有人填错。它不是你在设备视图里看到的IO地址字比如256而是V90子模块的硬件标识符在TIA的“设备概览”里每个PROFINET子模块都会有一个十六进制地址比如0x0100。填错的话RDREC会一直报地址类错误。3.5 单位换算与P2003、P2004的关系不管你用哪种方法读回了r68、r31的原始数据都会遇到单位问题。V90里r68电流和r31扭矩的显示单位分别受参数p2004和p2003控制。这两个参数可以设置成百分比%或者实际物理单位A、Nm。非周期读取时如果你读取的是r68且p2004设为百分比那返回的值直接就是百分比值比如5000表示50%如果把p2004设为安培返回的就是实际电流值。扭矩同理p2003设为Nm时r31返回的是实际扭矩值自带的符号代表了方向。我个人建议如果只是做监控把p2003和p2004都设成百分比这样后续的触摸屏显示和报警阈值设置都直观如果客户要求显示真实物理量比如“当前扭矩35.2Nm”那就把单位参数改成Nm然后把r31的返回值除以100在触摸屏上处理一下小数位就行。4. 两种方案怎么选以及我踩过的那些坑4.1 对比总结表对比维度周期IO自由报文非周期RDREC参数访问实时性高随PN通讯周期刷新中取决于请求周期建议200ms以上PLC编程量小直接读IO地址大需要构造请求帧、解析响应帧V90侧配置需要改报文类型和映射不需要改动可读参数范围仅限映射的那几个任意可用参数对通讯负载影响报文变长持续占带宽只在请求时占用但频繁请求也占适用场景趋势监控、曲线显示、连续记录按需诊断、参数查看、批量读取4.2 踩坑实录一报文类型没改导致数据全零曾经在一个项目里PLC程序逻辑检查了好几遍IO地址也没问题但监控表里电流扭矩通道永远是0。折腾了两个小时最后进V-ASSISTANT才发现V90的报文类型还是标准报文1我在PLC里读的那个字根本不存在于周期数据中。改完报文类型下载参数断电重启数据瞬间就出来了。这个坑非常典型遇到周期IO读不到数据的情况第一步永远先去V90侧确认报文配置。4.3 踩坑实录二RDREC的LADDR填成IO字地址RDREC指令的参数比想象中容易出错。LADDR不是你在设备视图里分配的那个十进制IO地址比如256而是V90子模块的十六进制设备标识符。你需要在TIA的“设备和网络”视图里点击V90切到“设备概览”页签找到子模块对应的PROFINET地址通常是0x0100、0x0080这种形式。这个地址填错之后RDREC会返回类似0x80A2的状态码。后来我把这个地址的定义做成了常量放在DB里统一管理换项目时只改一处。4.4 踩坑实录三非周期读太频繁导致通讯报警最开始我做非周期读取时抱着“数据要新鲜”的想法把读取周期放在OB32里设成50ms一次。跑了不到半小时V90状态字上出现了通讯相关的报警。原因是PROFINET非周期通道不适合高频请求每个读请求都要经过驱动器的协议栈处理太频繁会拖累驱动器的控制性能。西门子的建议是非周期访问不要过频实际项目里我放到150到200ms一次完全够触摸屏显示用了系统也稳定了。4.5 踩坑实录四扭矩负值换算与补码处理周期IO里的扭矩值是16位有符号整数负扭矩对应的是补码。如果PLC里用Word类型读你得到的会是一个巨大的正数比如-100%扭矩对应的0xC000用Word读出来是49152。很多人第一次做监控界面发现反向运行时扭矩数值猛增到好几万其实就是符号位没处理。正确做法是用Int类型去读或者对Word先做一次类型转换。另外触摸屏里要把Int值再除以163.84才能显示出百分比这里的小数位数要提前约定好不然显示出来要么是0要么是满量程。4.6 周期IO方式下别忘了控制字使能还有一个很容易被忽略的操作顺序。当你改用自由报文之后控制字和速度给定也在同一个报文里。V90对控制字的使能逻辑有严格要求STW1的bit0要置1On/Offbit1要置1允许运行同时还要满足运行使能条件电机才会转。有些工程师改完报文类型后发现电机不动了以为是通讯断了其实是控制字没有按新报文格式重新写对位置。控制字在PZD里的位置变化了你原来写标准报文1的程序换成自由报文后字段偏移可能不同需要逐字核对。实际项目里我的习惯做了几个1500带V90的项目之后我现在的做法很固定如果项目里伺服轴数不超过4台且客户明确要监控电流和扭矩的变化趋势我会用周期IO自由报文方案因为实时性好触摸屏画曲线不卡顿如果项目里需要读取大量参数比如做设备诊断、统计报警信息、需支持远程查看驱动器状态我就用RDREC非周期方案配合V90的参数表做成一个参数读取通用块想读哪个参数就填参数号。两者也可以混用周期IO监控关键数据非周期读扩展参数各司其职。顺带分享一个维护上的经验无论用哪种方法都要把V90侧自由报文的参数映射表、RDREC请求帧的字节定义这些信息写到项目文档里。这类自定义报文是“看不见的接口”PLC程序里读的是地址但地址背后对应的是哪个参数换了人根本无从查起。我第一次做自由报文时没留文档三个月后客户要加监控一个报警字我对着程序看了半天才想起来当时映射在哪个字上。从那以后我的每个伺服项目都会附一张报文映射表这个习惯在后续维护中帮了大忙。本文还有配套的精品资源点击获取
返回列表