首页 / 资讯中心 / 文章详情

AB脉冲原理与应用:编码器、PLC与上位机全链路解析

AB脉冲原理与应用:编码器、PLC与上位机全链路解析 ★ FEATURED ARTICLE
搞工控的人尤其是跟运动控制、位置检测打交道比较多的朋友对“AB脉冲”这三个字肯定不陌生。它也叫正交编码信号是增量式编码器最常见的输出形式。别看它原理简单就是两路方波但真要把编码器、PLC、上位机这一整条链路打通中间涉及的细节特别多倍频怎么算、高速计数器怎么配、伺服驱动器里那串动辄十几万的脉冲数到底是什么含义、上位机拿到原始计数之后怎么换成实际位移——这些问题不搞透现场很容易翻车。这篇内容我就按自己实际做项目的经验把AB脉冲从原理到应用完整捋一遍。覆盖增量编码器的输出信号、PLC端的高速计数处理、伺服电机编码器参数解读再到上位机拿数据做显示的完整流程。适合刚接触编码器和运动控制的电气工程师、PLC程序员也适合准备做上位机对接的开发人员参考。1. 编码器输出AB脉冲的逻辑本质1.1 两路方波为什么能同时表达位置和方向增量式编码器内部核心是一个码盘上面刻着一圈均匀的透光栅格。码盘旋转时光电传感器会输出一系列方波脉冲。但只有一路脉冲只能测转速没法判断正反转。AB脉冲的巧妙之处在于多增加了一路检测两路输出在空间上错开90度相位角也就是物理上对应码盘上错开四分之一栅格的两个检测点。所以当码盘正转时A相信号会领先B相90度反转时反过来B相领先A相90度。这个相位关系就是方向判断的依据。实际使用中无论是PLC的高速计数器还是单片机的外部中断判断方向都靠检测两路信号的相对变化。比如常见做法是在A相上升沿时检查B相是高电平还是低电平高电平代表一个方向低电平代表另一个方向。这就是AB脉冲最核心的价值一路信号线加一路方向线合并成了两路正交方波硬件上省了I/O口逻辑上还自带防抖能力。注意AB两路的“正交”特性非常关键调试时如果发现正反转判断反了不用改程序直接把A、B两路接线对调就行这是现场最快最常用的处理方式。1.2 1倍频、2倍频、4倍频到底差在哪这是新手最容易绕晕的地方。编码器标称的“线数”和实际能得到的“计数分辨率”并不是一回事。比如一个1000线编码器意思是码盘一圈有1000个物理栅格对应输出1000个A相脉冲和1000个B相脉冲。但如果我们用更加精细的方式去读取这两路信号单位圈内的计数值完全可以翻倍甚至翻四倍。具体的做法是1倍频只在A相上升沿计数一圈1000个计数。2倍频在A相上升沿和下降沿都计数一圈2000个计数。4倍频在A、B两路的上升沿和下降沿都计数一圈4000个计数。这背后的原理是两路正交信号在一个完整周期里总共有4个跳变沿每个沿都可以作为计数触发点。PLC和大部分计数器芯片都支持4倍频模式这也是运动控制里最常用的配置。因为你花同样的钱买编码器通过4倍频分辨率直接提升4倍相当于白嫖了精度。不过要特别提醒一下倍频工作方式虽然提高了分辨率但对信号质量的要求也更高。如果编码器输出信号抖动大、边沿不够陡或者线缆受到干扰4倍频模式会比1倍频更容易产生误计数。所以高倍频模式下屏蔽线、差分输出、合适的滤波设置一个都不能省。1.3 Z相脉冲的用途和AB脉冲配合使用增量式编码器通常还有第三路输出叫Z相也叫零脉冲或原点脉冲。它的特点是每旋转一圈只输出一个脉冲而且这个脉冲的位置在码盘上是固定的。Z相的作用是和AB脉冲配合解决“断电重启后当前位置丢了”的问题。AB脉冲是增量式的它只记录相对位置变化。一旦断电PLC寄存器的计数值清零重新上电后你不知道机械轴停在哪个位置。如果设备对原点位置有硬性要求就必须在每次上电后做回零操作。常见的做法是让机械轴往限位方向移动碰到原点传感器或Z相脉冲时把当前计数值重置为预设原点值。这里有个实操技巧如果只用Z相做原点可能会遇到停在了Z相脉冲附近、上电后微小的抖动导致误触发的问题所以最好用“原点传感器粗定位Z相精定位”的组合方式。传感器先让轴慢速停下来再开始低速找Z相这样每次停的位置都是一致的。2. 编码器怎么选、怎么接从输出方式说起2.1 推挽、集电极开路、差分输出怎么选编码器的输出电路直接决定了它能不能和你的PLC输入端口匹配。市面上增量编码器常见的输出方式有推挽式、集电极开路式NPN或者PNP和差分式也叫线驱动Line Driver三种。推挽式Push-Pull输出能力比较强既可以输出高电平也可以主动拉低响应速度快适合中等距离传输是通用场合的首选。集电极开路输出需要外部加上拉电阻NPN型或者下拉电阻PNP型电平摆幅和速度相对受限适合短距离、低频率的场景。差分输出则是通过RS422标准输出一对互补信号即A、A-、B、B-抗干扰能力最强适合长距离传输或者电机驱动器附近强干扰环境。选型时有一个基本原则PLC高速计数输入端如果支持差分信号优先选差分编码器如果只是普通24V高速计数输入推挽式或者集电极开路式也够用。但要注意电压匹配5V差分输出和24V推挽输出的接线方式完全不同接错会烧端口。2.2 编码器与PLC输入回路的漏型源型匹配另一个高频坑是漏型NPN和源型PNP不匹配。很多PLC的高速计数输入口是可以通过公共端配置成漏型或源型的但默认状态可能和你手里的编码器输出方式对不上。比如编码器是NPN集电极开路输出电流是从编码器输出端灌入PLC输入端要求PLC输入端内部有上拉公共端接24V正极。如果是PNP输出则要求PLC内部有下拉公共端接0V。我见过不少现场调试卡在“有信号但计数值不动”上最后发现就是漏型源型接反了。现在大部分国产PLC和西门子200 SMART的高速输入口可以通过修改输入滤波和公共端配置来兼容但接线前查一下手册把公共端接对能省去大量排查时间。在接线上还有几个容易忽略的点编码器电源要单独接最好不要和电机驱动器的电源共用一路开关电源否则驱动器高频开关产生的纹波会灌进编码器供电直接影响信号质量。屏蔽层要单端接地一般是接到PLC侧的接地端子不要两头都接避免形成地环路。如果传输距离超过10米敷设线缆要远离动力线尽量避免与电机电缆走同一个线槽至少间隔20厘米以上。2.3 伺服驱动器的编码器输出和PLC侧的分频关系项目热词里提到了汇川伺服MS1H4系列在驱动器里查到的默认编码器线数是262144这个数字很多朋友看到会疑惑我买的电机编码器不是17位、23位吗262144是什么这里要分清楚两个概念。电机尾部内置的绝对值编码器分辨率由硬件决定比如磁编码器可能有17位131072或23位8388608的分辨率但驱动器通过电子接口提供给外部设备的往往是经过内部处理后的分频脉冲。262144这个值等于2的18次方你可以把它理解为驱动器对外输出的编码器反馈脉冲数即电机转一圈驱动器会输出262144个脉冲给上位控制器。如果你配置了电子齿轮比这个值还会按比例缩放。特别要强调的是这个262144本身并不是随便改的软件参数。你可以在驱动器参数里修改的是电子齿轮比比如把“电机每转输出脉冲数”从默认值改成一个更小的数从而匹配PLC高速计数器的最大频率限制。但如果你试图直接改掉编码器物理分辨率对应的那个数值那是不行的改了会导致位置反馈失真伺服系统直接报警。所以正确的做法是在伺服驱动器里设置“每转脉冲数”或“电子齿轮”相关参数把输出给PLC的脉冲频率控制在合理范围内。比如PLC高速计数最大支持200kHz电机额定转速3000转/分也就是每秒50圈如果262144个脉冲/圈直接输出那每秒就是1300万脉冲PLC根本吃不下。这时需要通过电子齿轮降频比如设成每转10000个脉冲那50圈/秒也就是500kHz还是偏高再配合低速运行或进一步降频才能匹配。3. PLC端的高速计数处理和程序实现3.1 为什么普通I/O点不能直接接AB脉冲很多刚接触编码器的人会想编码器输出脉冲PLC用普通输入点读不就行了确实如果转速极慢普通输入点可以勉强读到但只要转速稍微上来一点普通输入点就废了。原因是PLC的普通数字量输入点内部有RC滤波电路典型滤波时间在0.2毫秒到几毫秒这会把高频方波的边沿磨掉导致计数丢失。高速计数器输入点则不同它内部直接连接到底层硬件定时器/计数器电路不经过软件滤波可以捕捉到微秒级的脉冲变化。比如西门子200 SMART的普通输入最大频率只有几十赫兹带滤波后而高速计数输入最高可以到200kHz差别是数量级的。所以只要你的设备转速可能超过每秒几个脉冲就必须走高速计数通道。另外PLC的高速计数通常分为A/B相正交模式、脉冲方向模式、单相计数模式等。AB编码器对应的是“正交计数”模式需要占用两个高速输入点。具体占用哪两个点要看PLC型号的硬件定义不能随意指定。比如200 SMART的HSC0占用I0.0和I0.1HSC1占用I0.2和I0.3选型时必须规划好输入通道。3.2 200 SMART高速计数器配置实例以西门子S7-200 SMART为例配置AB脉冲高速计数最方便的方式是用系统块里的“高速计数器向导”。打开向导后选择你要用的HSC编号计数模式选“正交1倍频”或“正交4倍频”然后设置初始值、预设值、计数方向等。这里详细说一下我常用的参数设置计数模式选正交4倍频最大化利用编码器分辨率。初始值0用于上电清零回原点。预设值根据机械行程算好比如丝杠导程10毫米编码器1000线4倍频后一圈4000计数那1毫米对应400个计数行程200毫米的话预设值80000。预设值通常用于产生中断或触发动作如果只是记录位置不一定要设。计数方向一般用默认的自动方向也就是根据A/B相位关系自动加减。外部复位如果需要硬件回零可以启用外部复位输入但要注意外部复位输入端子会占用一个额外的I/O点而且接线的信号极性必须和电路匹配。向导配置完成后会在程序中自动生成一个HSC初始化的子程序比如HSC0_INIT。你需要在程序启动时调用一次这个子程序之后高速计数器就不需要再写任何扫描性程序了它会自动在后台计数。你可以用HDEF指令和HSC指令手动配置也可以用向导自动生成两者效果一致手动配置更灵活但容易出错新手推荐向导。提示200 SMART的HSC在向导里默认有个选项叫“当前值等于预设值时产生中断”如果你的应用不需要在特定位置触发动作建议把这个中断关掉避免PLC频繁执行中断程序造成扫描周期抖动。3.3 计数溢出、数据长度和工程单位换算高速计数器的计数值在PLC里通常以32位有符号整数存储范围是-2147483648到2147483647。如果设备行程很长、编码器分辨率很高存在计数溢出的风险。比如丝杠导程10毫米编码器分辨率4000计数/圈那2147483647大约等于5368圈对应53米行程一般设备够用。但如果行程更长或者编码器分辨率达到几万甚至几十万就需要考虑用两个32位寄存器组合成64位来存储位置或者在PLC程序里做溢出补偿。单位换算是我在项目里最重视的一环直接决定上位机显示值准不准。换算核心是“脉冲当量”即每个计数对应的机械位移脉冲当量 机械导程 / (编码器每转计数数)举例丝杠导程10毫米编码器1000线4倍频计数每转4000计数则脉冲当量为10/40000.0025毫米也就是2.5微米。上位机显示位置时将PLC传来的原始计数乘以0.0025就得到毫米单位的实际位置。注意这个换算关系里倍频数、编码器线数、机械导程这三个参数任何一个发生变化显示值都会偏所以现场调试时最好用千分表打一下实际位移反推验证脉冲当量有没有设对。4. 上位机如何把原始脉冲变成直观数据4.1 上位机与PLC的通信选型上位机读取AB脉冲的计数值本质上是通过通信协议读取PLC中高速计数器对应的数据寄存器。不管你的上位机是用C#、LabVIEW还是组态软件写的第一步都是确定通信方式。现在主流方案有Modbus RTU串口简单可靠适合点数不多、距离不远的老设备。Modbus TCP以太网速度快、接线方便是目前新项目的主流选择。S7协议西门子专用通过S7.net或HslCommunication等库直接读写DB块和M区效率高。在C#上位机开发里我比较推荐HslCommunication这个开源通信库它封装了Modbus和S7等协议几行代码就能连上PLC。使用时要特别注意数据格式转换PLC里的DINT32位有符号整数在Modbus里是两个字高低字节顺序各个厂家可能不同读出来需要做字节交换。这个坑几乎每个上位机开发都会踩一次排查方法是先给PLC一个已知值比如把计数器手动改成123456看上位机读出来是多少根据结果调整字节顺序。4.2 高实时场景用PC直接采集还是走PLC有些场景对实时性要求很高比如伺服位置跟随、动态测量PLC扫描周期加上通信周期可能会引入几十毫秒延迟这时候上位机直接采集编码器信号可能是更好的方案。市场上有很多USB或PCIe接口的编码器采集卡自带硬件计数和缓冲上位机通过动态库直接读取当前位置延迟可以做到亚毫秒级。如果你的项目就是用PLC做控制器上位机只做显示和参数下发那走PLC的通信读取完全够用。比较推荐的结构是PLC做高速计数和逻辑控制上位机做界面显示和配方管理两者通过Modbus TCP交互。这样做的好处是把实时性要求高的计算放在PLC侧上位机只负责“看”即使上位机卡顿甚至死机设备依然能安全运行。另外热词里提到的VOFA这种上位机调试工具也很实用它支持串口和网络直接接收设备上报的数据用来调试PID参数、看编码器反馈曲线非常方便。和单片机联调时先让单片机通过串口周期上报AB脉冲计数值在VOFA里用波形图观察计数是否平滑再确认方向是否正常能快速定位问题。4.3 C#读取PLC计数值并显示位置的示例下面给一个用C#通过Modbus TCP读取西门子200 SMART高速计数器当前值的简化示例。假设高速计数器的当前值映射到VW区或者你已经在PLC程序里把HSC当前值传送到了VW100DINT类型上位机直接读取这个地址即可。using HslCommunication; using HslCommunication.ModBus; // 建立连接 ModbusTcpClient client new ModbusTcpClient(192.168.0.10, 502); client.ConnectServer(); // 读取VW100开始的4个字节DINT类型字节顺序为 ABCDEFGH OperateResultlong read client.ReadInt32(VW100, 1); if (read.IsSuccess) { int rawCount (int)read.Content; double pulsePerMm 4000.0 / 10.0; // 每毫米脉冲数 double positionMm rawCount / pulsePerMm; textBoxPosition.Text positionMm.ToString(0.000); } else { MessageBox.Show(读取失败 read.Message); }这里有几个细节要说明。第一ReadInt32读出来的是32位有符号整数如果计数超范围会显示成负数所以上位机也要考虑溢出问题。第二如果PLC的V区字节顺序和HslCommunication默认不一致需要调用client.DataFormat HslCommunication.Core.DataFormat.CDAB;之类的属性切换排序这取决于PLC的存储格式。第三单位换算最好写成一个独立的类参数从配置文件读取方便现场根据不同的丝杠导程和编码器线数调整不需要重新编译上位机。5. AB脉冲应用中的常见问题与排查技巧5.1 计数值乱跳或正反方向反了怎么办现场遇到最多的三类问题是计数值完全不动、计数值乱跳、方向反了。计数值完全不动时用万用表量A、B相与公共端之间的电压手动缓慢转动编码器轴正常应该看到高低电平变化。如果一直是同一电平检查编码器供电是否正常、输出电路类型和PLC输入是否匹配。如果测量正常但PLC仍不计数大概率是高速计数通道选错或者硬件接线接错点了。计数值乱跳尤其是静止时也会跳基本都是干扰问题。首先检查编码器屏蔽层是否单端接地其次确认编码器输出到PLC之间是否用了双绞线然后看PLC的输入滤波设置。有的PLC虽然高速计数输入口是专用的但旁边普通输入点的滤波参数会影响同一组端子的采样可以把所有高速输入口的滤波时间改为最小值试试。方向反了是最容易解决的不需要改程序把A、B两相线对调即可。注意对调的是PLC端不是编码器端编码器处对调容易接错电源。如果你用的是D型接头做好A、B线序标记对调时别动电源线。5.2 高速计数丢脉冲的原因分析编码器在低速时计数正常转速提上去后开始丢脉冲这通常有三个原因。第一是PLC高速计数器实际能达到的最大频率低于编码器输出频率这种情况需要重新计算编码器每转脉冲数乘以最高转速再除以60得到的每秒脉冲数就是最大频率要低于PLC的硬件上限。第二是编码器输出电路驱动能力不足集电极开路输出在长线上受线电容影响波形边沿变缓可以改用推挽或差分输出解决。第三是电源电压跌落电机加速时驱动器母线电压波动如果编码器电源用的是同一路电源信号质量也会受影响。排查丢脉冲有一个实用方法把PLC从4倍频改成1倍频模式再跑同样动作如果1倍频下不丢了说明信号质量还能接受只是4倍频下对边沿要求太高。这时候要么换差分输出编码器要么降低电子齿轮比减少输出频率。5.3 维护经验定期检查机械耦合与电气连接最后分享一个很容易被忽视的经验。AB脉冲信号由编码器和机械传动机构共同决定如果编码器与丝杠或电机轴之间的联轴器有松动即使电气线路一切正常也会出现偶发性误差。我处理过一台设备上位机显示的定位精度每隔一段周期性变差查了半天最终发现是编码器安装座的固定螺丝松动导致码盘径向跳动。电气连接方面建议定期检查编码器航空插头的锁紧情况我在车间里见过不少因为振动导致插头半脱落的情况。那种故障非常恶心时好时坏且停机时不一定会暴露一跑高速就显形。如果是长期运行的设备最好在预防性维护计划里加上编码器线缆和接头的检查项目别等报警了再排查。此外编码器线缆不要和伺服动力线绑扎在一起走线时尽量分槽。对干扰特别敏感的场合可以在编码器输出端加磁环或者在PLC输入端口并联小电容滤波但小电容会影响波形边沿只适合低速场景要权衡使用。6. 一条完整链路从编码器到上位机显示到这里AB脉冲的完整数据链路已经非常清晰了编码器把机械位置转换成两路正交方波信号PLC高速计数器对这两路信号进行倍频计数计算出当前原始位置伺服驱动器场景下编码器反馈经过电子齿轮分频后以AB脉冲或总线方式送给PLC上位机再通过Modbus或S7协议周期读取PLC中的计数值结合脉冲当量换算出工程单位并显示。我在实际项目里最深刻的体会是这套系统每个环节都有可能出问题但大多数问题都不是“高深难题”而是接线、参数、换算这些基础环节上不够细致。排查时最好按照物理层、电气层、数据层三层逐层定位。物理层看机械连接和编码器安装电气层看供电、信号和接地数据层看计数模式和单位换算。把这三层分别验证清楚无论编码器、PLC还是上位机问题都能在半小时内定性。最后再分享一个小技巧新项目调试时建议先用上位机或调试软件的波形图模式查看AB脉冲波形确认两路信号相位差是90度方向变化时波形翻转是否正常。这个过程只需要几分钟但能提前发现很多后期很难查的问题。等波形验证通过再配置PLC高速计数和上位机显示调试效率会高很多。
阅读完成 · 觉得有帮助?
咨询建站