
做运动控制的工程师多半都碰过这么个场景伺服电机带着丝杠走到固定位置屏幕上显示的脉冲数和机械实际位置差了接近一圈查了半天发现是PLC高速计数器的倍频设置不对或者是编码器反馈数值跳变上位机画出来的曲线像锯齿最后发现是屏蔽层没接好。AB脉冲也叫A/B相正交脉冲是编码器输出信号的基础形态也是编码器、PLC、上位机三者之间最关键的“连接语言”。这篇文章就把这一整条链路拆开讲——从AB脉冲的波形原理到编码器分辨率怎么换算再到PLC高速计数器的配置方式最后讲上位机怎么把这些脉冲变成能看的坐标值和速度值。适合刚接触编码器和PLC的现场维护人员也适合写上位机软件但一直没把底层信号逻辑搞清楚的开发者。1. AB脉冲的底层逻辑两个方波如何表达方向和位置很多人一听到“AB脉冲”就觉得是个很玄的东西其实它本质上就是两路方波信号。编码器每转过一个固定的角度就会在A相或B相上输出一个脉冲这两个脉冲之间的相位关系藏着方向和位置的全部秘密。1.1 正交信号到底是什么AB脉冲的全称是“A/B相正交脉冲”所谓“正交”说白了就是A相和B相两个方波之间相差90度相位角。电机转起来的时候A相输出一串方波B相也输出一串方波但B相比A相晚了四分之一个周期。举个例子电机正转时A相先变成高电平然后B相跟着变成高电平反转时顺序反过来B相先变高A相再变高。PLC或者计数器芯片就是靠判断“谁先跳变”来确定旋转方向的。这里有个细节值得注意A相和B相都是周期性的方波单看任何一路都只能知道“在转”只有同时看两路的跳变顺序才能知道“往哪转”。这个设计最早是从旋转变压器和伺服系统的需求里演化过来的后来成了增量式编码器的标准接口。它的好处非常明显抗干扰能力强而且方向判断不需要额外的方向信号线两根线就能搞定位置和方向两件事。1.2 1倍频、2倍频、4倍频精度是怎么翻上去的同一个编码器用不同的计数方式分辨率可能差出好几倍。这是AB脉冲最容易让人迷糊的地方。最基础的计数方式叫1倍频只在A相的上升沿计数一次电机转一圈计数的次数等于编码器线数。比如一个2500线的编码器1倍频模式下一圈就是2500个脉冲。2倍频稍微聪明一点A相的上升沿和下降沿都计数这样一圈就是5000个脉冲。4倍频最常用A相和B相的上升沿、下降沿统统计数一圈变成10000个脉冲。为什么4倍频能达到4倍精度这是因为A相和B相一个完整周期里总共有4个跳变沿A升、B升、A降、B降每个跳变沿都表示编码器转过了四分之一格。用生活化的比喻来说就像一把尺子原来只能读毫米刻度现在把每个毫米刻度之间又细分了三格精度自然就上去了。实际项目里PLC高速计数器一般都可以配置计数模式4倍频是运动控制中最常用的模式因为它能让现有的编码器发挥出最大精度不需要换更贵的硬件。1.3 从线数到分辨率换算公式要弄清楚“线数”和“分辨率”是两个经常被混用的概念但它们的含义完全不同。编码器的线数PPRPulse Per Revolution指的是编码器码盘上一圈有多少个物理刻度也就是1倍频下每圈的脉冲数。而分辨率指的是系统实际能识别的最小角度增量它等于360度除以“每圈总脉冲数”。每圈总脉冲数 线数 × 倍频系数。举两个实际例子2500线编码器 4倍频 10000脉冲/圈每个脉冲对应0.036度。1000线编码器 4倍频 4000脉冲/圈每个脉冲对应0.09度。还有个常见的坑绝对值编码器一般不用“线数”来描述而是用“位”来表示比如17位、23位。17位就是2的17次方等于131072意味着编码器一圈能区分出131072个位置。读写这种编码器通常走SSI、BiSS或Modbus协议输出的是二进制位置值不再是AB脉冲。所以严格说“AB脉冲”主要对应增量式编码器绝对值编码器即便内部也分A/B相最终用户拿到的数据格式也是两回事。2. 编码器分辨率与伺服驱动的隐藏逻辑262144这个数字能不能改热搜词里那条“汇川伺服MS1H4在驱动器里查看到默认编码器线数是262144这个数值可以改吗”问到了点子上。这个问题不搞明白后面做PLC和上位机都会踩坑。2.1 262144是怎么来的262144这个数字看起来很怪但写成2的18次方就顺眼了。汇川MS1H4系列伺服电机的编码器是23位增量式编码器中间经过内部细分处理之后驱动器每转一圈能输出的位置分辨率就是262144脉冲。这个数字不是随便定的它和伺服驱动器内部的电流环、速度环、位置环计算精度强相关——编码器反馈越细电机低速运行的平稳性越好位置重复精度也越高。这里要特别强调一下262144是驱动器内部“看到”的编码器分辨率不是直接输出给PLC的AB脉冲数。驱动器通常会再经过电子齿轮比换算把输出给PLC的AB脉冲数调整到一个“用户友好”的值。比如把电子齿轮比设成110那电机转一圈PLC收到的脉冲数可能就只有26214.4或者你通过设定把它变成10000、2500等整数值方便程序运算。2.2 直接改这个数值会有什么后果如果试图把262144强行改成别的值比如改成10000会出现什么情况伺服驱动器的位置反馈接口、速度计算、电流前馈全部以这个内部编码器分辨率为基准。你把它改小了相当于告诉驱动器“电机一圈只有10000个反馈点”但实际编码器硬件还是23位的。这会导致速度环的反馈分辨率不足低速时电机会出现一顿一顿的爬行现象位置环的稳定精度也会下降。更严重的情况下驱动器会直接报警编码器参数错误因为内部固件校验发现参数和硬件不匹配。所以对这个问题的直接回答是不建议改也没必要改。如果真的觉得262144这个数值在PLC里不好换算正确做法是调整驱动器的电子齿轮比或者在上位机和PLC里做比例缩放而不是动编码器分辨率这个底层参数。2.3 电子齿轮比才是真正该调的东西电子齿轮比一般表示为“电机每转输出脉冲数”的分子分母配置典型形式是[ 输出脉冲数 编码器分辨率 \times \frac{分子}{分母} ]假设你希望电机转一圈PLC正好收到10000个脉冲驱动器内部分辨率是262144那么就把电子齿轮比设成10000/262144化简后约为126.2144。不同驱动器品牌里这个设置不太一样有的直接填整数比例有的填小数但逻辑是同一个。我实际调过几台汇川和台达的伺服经验是电子齿轮比尽量化成比较整的比例比如110、1100这种方便后期维护人员理解。如果实在化不成整数也没关系PLC和上位机里做一次浮点除法换算就行但一定要在程序注释里写清楚换算关系不然三个月后你自己都会忘。2.4 要注意增量式编码器掉电丢失位置的痛点这里顺便说一个选型层面的问题。增量式编码器输出AB脉冲优点是接口简单、响应快、成本低但有一个天生缺陷掉电之后位置信息全部丢失。设备重新上电时PLC高速计数器的当前值是0可机械位置不一定在零点所以必须做原点回归操作——通常配合编码器的Z相零位脉冲或者外部的原点开关来完成。绝对值编码器没有这个问题它靠电池或者多圈计数机制记住断电前的位置上电不用回归。热搜词里那类“磁电绝对值多圈编码器拆解”的帖子讲的就是这种技术。选择哪种编码器要看现场工艺是否允许每次开机都回一次原点。如果设备要求断电恢复后立即知道当前位置那就咬咬牙上绝对值。3. PLC侧的高速计数为什么普通输入点读不了AB脉冲把AB脉冲接到PLC上最容易犯的错误就是用普通数字量输入点去读。这样做不是完全不行而是几乎必然丢脉冲。3.1 普通DI和高速计数器的本质区别普通数字量输入点的扫描逻辑是CPU在每个扫描周期里采样一次输入映像区两次扫描之间发生的脉冲变化会被直接忽略。PLC的扫描周期通常在几毫秒到几十毫秒之间而AB脉冲的频率动辄几十千赫兹甚至上百千赫兹一个扫描周期里可能过去了几百几千个脉冲普通DI只能看到“电平有变化”根本数不过来。高速计数器HSC则不同它依靠CPU内部的硬件计数逻辑或专用的中断处理机制不依赖扫描周期。脉冲一到达就立刻计数CPU只在需要读取当前值时才去访问计数器寄存器。所以只要脉冲频率不超过HSC的硬件上限理论上一个脉冲都不会丢。3.2 配置AB相计数模式的关键参数以西门子S7-200 SMART为例配置高速计数器AB相模式的一般流程是这样的在系统块里把对应的数字量输入点分配给高速计数器功能通常是I0.0和I0.1一组I0.2和I0.3一组。在向导里选择计数模式AB相正交计数对应模式9或模式10区别在于是否启用4倍频。模式9是1倍频模式10是4倍频。设置初始当前值、预设值以及中断事件——如“当前值等于预设值”中断、“计数方向改变”中断。在程序中调用CTRL_HSC指令激活配置。这里有个细节模式选择直接决定了倍频系数选错了位置读数就是成倍的偏差。之前我接手过一个设备机械上明明标定好了1毫米对应100个脉冲实际走出来的距离总是差4倍就是把4倍频模式选成了1倍频这种低级错误在调试现场真的很常见。三菱PLC的配置思路类似但用的是DHSCS、DHSCR这类高速比较指令配合D字头软元件的当前值寄存器。换品牌不换逻辑核心都是“专用输入点专用计数指令中断事件处理”。3.3 输入滤波时间是个高频坑高速计数器虽然用硬件计数但输入引脚上还是有一层滤波器的。这个滤波器的作用是滤除高频噪声防止干扰信号被当成有效脉冲。可如果滤波时间设置得太长会把真正的AB脉冲也滤掉。比如某些PLC的HSC输入引脚默认滤波时间是6.4毫秒这个值对低速信号没问题但对几十千赫兹的AB脉冲就是灾难——脉冲宽度可能只有几微秒滤波器还没反应过来就被吞了。很多现场人员发现“低速正常、高速丢脉冲”第一个想到的就是屏蔽和接地其实先检查一下滤波时间和脉冲频率是否匹配往往能找到直接原因。一般处理方式是把HSC对应的输入滤波时间调到最小档比如0.2微秒或者直接禁用滤波。但这样做同时也会让噪声更容易进来所以高频应用里编码器输出信号的电气形式变得非常重要这就引出了下一个问题。3.4 推挽、集电极开路、差分输出怎么选编码器的输出接口形式直接决定了能接多远、抗干扰能力多强。推挽输出信号电平稳定驱动能力强适合3米以内的短距离传输。集电极开路输出需要外部上拉电阻电平摆幅和响应速度受限适合近距离和低速场合。差分输出RS422用两根线传一路信号一根正一根反接收端通过比较两者差值判断电平抗共模干扰能力非常强适合长距离和高速场合。在工业现场编码器到PLC的距离超过5米或者环境里有变频器、伺服驱动器这类强干扰源我都建议直接上差分输出的编码器配合带屏蔽的双绞线。信号线用普通单芯线在干扰环境里跑AB脉冲属于给自己埋雷排查起来极其痛苦。4. 上位机读取与数据换算从PLC寄存器到界面上的坐标上位机这边的工作核心就一句话把PLC高速计数器里的脉冲值读上来换算成用户看得懂的位置或者速度。听起来简单里面的细节坑多到能撑起一整篇博客。4.1 数据通路和寄存器映射典型的链路是编码器AB脉冲进PLC的HSCPLC把当前计数值存进一个保持寄存器上位机通过Modbus TCP、Modbus RTU、OPC UA或S7协议去读这个寄存器然后做比例换算显示在界面上。第一件要搞清楚的就是哪个寄存器地址对应哪个HSC。西门子200 SMART的HSC0对应编号0的计数器S7-1200/1500访问IEC计数器要用ID1000这种直接地址三菱则是C235、C251这一类的计数器编号。上位机读不到数八成是地址表没对上。第二件是数据格式。高速计数器的当前值有正有负方向翻转时计数值会在正负之间跳变所以数据类型要选有符号双整数DInt长度32位。如果你把它当成无符号数来解析编码器一反转界面上就会出现一个巨大的正数怎么看都不对劲。第三件是最高位溢出问题。32位有符号数的上限约是21.4亿高速脉冲数其实很容易达到这个量级。举个例子一个10000脉冲/圈的编码器转速3000转/分钟每秒就是50万脉冲两个小时就超过32位上限。所以设计上位机时要想清楚是否需要64位累加是否需要在PLC里做“圈数溢出翻转”处理很多项目上线半年后出现莫名其妙的坐标跳变就是这个原因。4.2 C#上位机开发里的两个实际问题热搜词里有一条问“VS2019开发的C#上位机源码程序能用VS2015打开吗”这是个经典兼容性问题。能不能打开取决于两件事项目文件格式和框架版本。VS2019默认创建的是SDK风格的项目文件后缀还是.csproj但内部结构变成了简化XMLVS2015对它完全不认识。如果源程序用了.NET Core或者.NET 5VS2015肯定打不开。就算改成.NET Framework也没用因为VS2015的编译器不认识SDK风格项目。解决办法有两个一个是让VS2019创建项目时选择“旧版.NET Framework”模板生成传统格式的.csproj这样VS2015能打开另一个是直接用文本编辑器把.csproj手动降级但涉及NuGet包和语言特性过程相当麻烦。我个人的建议是如果团队里有人必须用VS2015新建项目时统一选.NET Framework 4.6.1或4.7.2代码里别用C# 7.0以上的语法比如字符串插值和模式匹配就不能用这样两边都能编译。4.3 实际写代码时的轮询策略上位机读取PLC的计数值最简单的做法是用一个定时器每100毫秒读一次寄存器刷新界面。这个方案在小项目里没问题但要注意轮询频率和PLC扫描周期的配合。假设PLC扫描周期是10毫秒HSC当前值在PLC程序中被复制到Modbus保持寄存器时可能恰好在复制过程中发生计数更新上位机读到的是新旧数据混合的瞬间值。虽然这种误差通常只有几个脉冲对位置显示影响不大但用在PID调节或速度监控这种对实时性敏感的场合就可能引发抖动。更稳的做法是连续读两次间隔几十毫秒如果两次值相同再使用或者让PLC在中断服务程序里原子地更新通信缓冲区确保上位机拿到的始终是某个时间点上的完整快照。至于读出来的数据怎么显示把脉冲值除以每毫米对应脉冲数就能得到毫米坐标把单位时间内的脉冲增量除以脉冲当量就是实时速度。这些换算公式一定要写到代码注释里最好再看一遍机械设计图纸确认减速比和丝杠导程现场跑一遍用激光干涉仪或者千分表标定过再固化到程序里。4.4 从编码器到上位机的完整链路里的“时间戳思维”做上位机时还有一个容易被忽略的问题数据到达上位机是有延时的。编码器产生脉冲PLC计数上位机轮询整个过程累积起来的延迟可能达到几十毫秒甚至上百毫秒。做位置监控时这个影响不大但如果上位机把位置值直接当作PID反馈量去控制执行器就有相位滞后的风险。所以我会把链路里各个环节的延迟估算一下HSC计数本身接近零延迟PLC内复制和通信指令可能占一个扫描周期Modbus TCP轮询间隔是自定义的串口通信的波特率也会影响读取时间。把这些延迟加在一起就能大概知道反馈数据的“新鲜度”上限这对接下来的PID调参很有帮助。热搜词里提到的vofa这类示波器上位机之所以适合调PID就是因为它能高频率地把目标值和实际值画在一起让我直观看到反馈滞后程度。5. 现场干扰与疑难排查这几个案例我每个都踩过最后聊点实战经验。AB脉冲的排查比编码器选型和PLC配置更考验经验因为问题往往是隐性的——不是完全不好用而是“偶尔不对”。5.1 案例一转速一快读数就丢脉冲有一台绕线机编码器装在主轴上转速在500转/分以内时计数正常一超过800转就丢脉冲误差越来越大。排查过程是这样的先把示波器挂到A相和B相上发现800转时方波已经开始变形上升沿不再陡峭有圆角化的趋势。这说明信号线缆的分布电容太大驱动能力不足以在高速下继续保持干净的跳变沿。再查输出类型发现用的是集电极开路输出外部上拉电阻偏大上升沿时间被拉长PLC侧的整形电路没办法准确识别。解决办法是把上拉电阻从10K降到1K并且把PLC输入滤波时间调到最小。之后高速段的波形恢复正常计数误差消失了。这个案例的教训是不要只看脉冲频率还要看信号边缘质量输出类型和线缆长度必须和传输频率配套。5.2 案例二方向反了设备调试时发现电机正转上位机显示的位置却在减小。原因分两类一类是A/B两相接反了对调一下就行另一类是PLC或上位机软件里做了反向计数处理需要在参数里改计数方向。判断哪一类的方法很简单看PLC高速计数器的当前值变化方向如果PLC里的值随电机正转而增加但上位机显示减小那问题出在上位机的符号处理上如果PLC里的值一开始就是减小的那才是接线或HSC方向配置的问题。很多人在上位机里加了一个“取反”参数掩盖了真正的问题这种做法我见过太多次短期能用长期必出幺蛾子因为机械限位判断、软限位报警全部依赖同一个位置值方向搞错了报警逻辑也会跟着乱。5.3 案例三上电就有莫名其妙的偏移增量式编码器上电后位置值从零开始累积这个“零”并不代表机械原点。很多设备装上编码器后不做原点回归直接让PLC把当前值当作绝对位置使用导致每次开机的位置基准都不一样。正确做法是设备上电后必须走一遍原点回归程序要么找Z相脉冲作为零位参考要么找原点开关要么靠软件强制当前值为已知坐标。对精度要求高的设备每次开机都回一次原点最可靠如果工艺不允许开机回零那就得换绝对值编码器没有第三条路可走。5.4 实操排查清单把这些年积累下来的排查顺序整理成清单按从易到难排排查项操作方式优先级接线定义核对A/B/Z相是否按说明书接入确认无虚接先做供电电压编码器供电是否为标准值排除供电跌落先做信号波形示波器观察A/B相上升沿质量确认波形完整快速定位滤波时间确认PLC的HSC输入滤波参数匹配脉冲频率高频问题重点接地与屏蔽确认屏蔽层单端接地信号线远离动力线干扰严重时检查上位机符号处理确认读取寄存器时无符号/有符号类型匹配方向异常时检查原点回归逻辑确认上电后有初始化坐标的机制每次开机都偏位时必查这套顺序总结起来就一句话先硬件后软件先低速后高速先静态后动态。按这个顺序排查AB脉冲问题大多数情况都能在半小时内定位到根因。我在实际调试中还有一个习惯所有与AB脉冲相关的参数无论编码器线数、倍频系数、电子齿轮比、脉冲当量还是原点坐标全部做成可配置项存在PLC的掉电保持区里界面上也留一个参数设置页面。这样做的好处是现场改参数不用改程序重编译设备调试的时候能省下大把时间。编码器和PLC组合起来是一套下限很低、上限也很高的技术栈——应付一下可能糊弄过去也行但真正要把设备调稳定、调精准每个环节都值得较真。希望这篇能把整条链路讲明白让你在下次面对AB脉冲问题时少走几步弯路。