做转盘定位这类小项目,我最早踩过不少坑。把欧姆龙编码器接到西门子200 Smart上做角度定位,听起来就是把高速计数器的值换算成角度,可真做起来,编码器选型、接线极性、滤波时间、高速计数器配置,哪一环松了,设备转起来就是一场灾难。这篇文章我按实际做过的方案完整走一遍:从硬件选型、HSC配置、角度换算逻辑到现场调试,把我踩过的坑和最后固化的参数都写出来,给正准备做旋转定位的朋友一个能抄作业的参考。
1. 项目拆解:你要定位的是角度,而不是脉冲
1.1 实际设备里的旋转定位需求长什么样
这类需求在设备改造里特别常见:一台旋转换刀台、一个四工位夹具、一台卷绕设备,或者是一部自动灌装机上的转盘。控制要求往往就一句话:“按设定的角度转到目标位置,停稳,然后执行下一步动作。”听起来简单,但落在PLC里就变成了三件事:实时读出旋转体的当前位置,和目标角度做差值判断,最后在合适的时机输出离合器、刹车或电机启停信号。
有的设备要求多角度随机定位,比如0°、37.5°、90°、270°随意切换;有的设备则是固定分度,比如一圈4等分、8等分、12等分。固定分度可以只做等分计数,随机角度定位则必须把计数值换算成角度再处理。我给某台设备改造时,原方案是接近开关走一圈来确认零位,再用时间控制旋转时长,结果是定位误差越累计越大,几次之后转盘就偏到根本对不齐工位。后来换成编码器之后,终于把位置反馈这件事做扎实了。
核心思路是用增量式编码器检测轴的实际旋转量,PLC的高速计数器把这些脉冲累加为位置值,再在程序里完成角度换算和动作判断。
1.2 精度指标怎么定才不过度设计
接触这类项目的朋友最容易问:用多少线的编码器合适?200线的够不够?1000线的会不会浪费?这需要先算清楚精度账,而不是拍脑袋。
编码器线数(脉冲数/圈)决定的是单圈分辨率。如果直接用A/B相四倍频方式读,那一圈产生的计数等于“线数×4”。以常见的欧姆龙E6B2-CWZ6C 1000线编码器为例,四倍频后单圈计数4000,每个计数对应0.09°。如果只是把转盘分为4个工位,0.09°的重复定位精度已经很富裕。用360线编码器,四倍频后每计数1°,对大部分粗定位设备也够。
我习惯先算“机械上需要什么精度”,再倒推编码器线数。比如轴承座回转间隙本身有0.2°,那么选1000线再配合软件滤波和到位区间,就能覆盖机械误差;而如果设备内部有减速齿轮,编码器装在电机端而不在负载端,那么负载侧每1°对应电机侧可能就是几十个脉冲,这种情况下中等线数也就够用。
另一个要明确的问题:这里说的“角度定位”更多指半闭环的位置反馈,而不是伺服驱动器那种精准闭环。PLC根据编码器反馈判断到位并停掉电机,属于带反馈的定位控制,足够应付大多数转盘、夹具、摆动机构。
1.3 为什么我习惯用200 Smart配欧姆龙增量编码器
选择S7-200 Smart,核心原因是它内置了高速计数器,不需要另外配高速计数模块。一台ST40或SR40,自带6路高速计数器,单相最高200kHz,A/B相正交模式下也能跑到100kHz以上,绝大多数中低速转盘项目都够用。编程环境也是STEP 7-MicroWIN SMART,梯形图写完直接下载,调试比模块化PLC更顺手。
欧姆龙编码器在这个组合里属于“皮实型选手”。增量式编码器价格低、响应可靠,E6B2系列是经典款,轴径、分辨率选择多,输出方式也有NPN集电极开路、PNP集电极开路、电压输出和线性驱动输出可选。项目里我用的就是最常见的1000线NPN集电极开路型,配200 Smart的常规数字输入点,跑起来很稳定。
选型有一条是要特别提醒的:编码器的输出类型必须和PLC输入接线方式匹配,否则不是接不拢,就是信号反相、漏电流过大导致计数异常。这个话题在下一节展开说。
2. 硬件选型和接线:编码器输出类型决定了一半成败
2.1 欧姆龙编码器的输出类型别只看型号
欧姆龙增量编码器型号后缀不同,输出电路完全不同。最常用的是带字母C的NPN集电极开路输出,例如E6B2-CWZ6C;而带字母B的往往代表PNP输出,带D、F后缀的可能是电压输出或线性驱动输出。NPN集电极开路输出,编码器内部输出管的发射极接到编码器电源负极,导通时把输出线拉到低电平,所以它适合接“把信号低电平作为有效沿”的输入电路。
S7-200 Smart的数字量输入公共端可以做两种接法:公共端接电源正极、输入点接收低电平信号,或公共端接电源负极、输入点接收高电平信号。具体公共端怎么接,要看你手上CPU型号的硬件手册里的DI等效电路图,不能想当然。
我调试时遇到过一次奇怪现象:编码器A相脉冲在万用表上量出来正常,但PLC计数数值每隔一小段时间就多跳一个数。后来查到是NPN编码器和PLC输入公共端极性接反了,导致输出管截止时输入点悬空,被干扰信号反复触发。重新按手册接好公共端后,计数立刻稳定。
2.2 200 Smart的高速输入点与编码器怎么连
200 Smart的高速计数器并不是每个输入点都能用。以ST40为例,HSC0对应I0.0、I0.1,HSC1对应I0.2、I0.3,HSC2对应I0.4、I0.5,剩下HSC3、HSC4、HSC5还有各自固定的输入点。项目接线前,一定要翻开你所用CPU型号的高速计数器端子分配表核对一遍,接错通道会导致高速计数根本启动不起来。
A/B相正交模式接线是最常见的。把编码器的A相输出接到高速输入端,B相输出接到另一路高速输入端。Z相(零脉冲)可以按需接普通输入,也可以接到专门的外部复位输入通道,用来做“每转一圈清零”的回零功能。
接线还有个容易忽略的小问题:编码器输出线和PLC输入点最好直连,中间不要串什么中间继电器。高速脉冲用继电器中转基本等于自杀,继电器触点抖动会直接变成计数毛刺。如果现场必须延长线,用屏蔽双绞线,并考虑使用线性驱动输出的编码器走差分信号。
2.3 电源、屏蔽、共地:三条降低干扰的命脉
工业现场的干扰源很多:变频器、接触器线圈、伺服驱动器。编码器是弱信号设备,最怕电源不干净。我给编码器供电从来不用开关电源的同一路输出再拖电机控制回路,而是单独用一个24V DC电源,或者至少保证编码器电源和电机主回路完全隔离。
共地问题比想象中更频繁。PLC高速计数输入和编码器必须共参考地,即PLC的M端和编码器电源的0V之间要有可靠连接。如果两边各自浮空,编码器输出的低电平相对PLC来说可能是悬空的,计数就会变成一个随机的“飘移值”。
屏蔽层接法我在项目里通常采用单端接地,在PLC侧或编码器侧任选一端接地,避免屏蔽层两端同时接地形成地环路。走线也和动力电缆分开,尽量不穿同一根线管。这些看起来基础,但实际排查时,十有八九的计数跳动都是这几点没做好引起的。
2.4 算清楚一圈计数,才知道角度分辨率够不够
选好编码器、定了计数模式后,第一件事是把角度分辨率算清楚。
假设编码器是1000线,HSC使用A/B相四倍频计数。那么转轴每转一圈,PLC内部计数值增加4000。角度值计算公式是:
角度 = 当前计数值 × 360 / 4000在PLC里如果直接算浮点,扫描周期内反复计算没有问题,但要注意32位整数乘法的溢出。一般可以先取“当前计数值对4000取余”,再乘360除以4000,这样数值范围小,整数运算也安全。
如果现场使用的是四倍频但编码器只有200线,那一圈计数是800,角度分辨率0.45°;如果使用1000线但只是单相计数,没有四倍频,一圈计数1000,分辨率0.36°。可见同样的编码器,计数模式直接决定最终精度。
转速方面也要验算一遍。编码器输出频率等于“线数×转速/60”。1000线编码器在600转/分钟下,输出频率10kHz,远低于200 Smart的200kHz上限;但如果转速3000转/分钟,输出频率就是50kHz,仍然可以。只有转速特别高或者编码器线数特别大的场合,才需要考虑频率超限问题。
3. 高速计数器的配置:寄存器、中断和初始值
3.1 配置一把抓:用HDEF指令还是用向导
S7-200 Smart的高速计数器配置,和S7-200时代很像。初始化流程固定是三步:给某个特殊寄存器写入控制字节,然后执行HDEF指令规定计数模式和计数器编号,再设置初始值、预设值,最后执行HSC指令启动计数器。
有些固件版本和软件版本里也有HSC向导,能自动生成初始化代码,省去手动记控制字节的麻烦。我的建议是:新手先用向导生成,再看生成出来的程序,理解它动了哪些寄存器;老手可以直接在梯形图里写HDEF和HSC,但完整功能块必须核对控制字的每一位定义。
最重要的一条心得:不要只写HSC指令而漏掉HDEF,也不要反复执行HDEF。HDEF是“定义”指令,必须在计数器第一次启用前执行一次,之后如果重复定义,高速计数器会直接进入错误状态。我见过有同事把HDEF放在每个扫描周期都执行,结果计数器完全不工作,查了半天才找到这个低级但隐蔽的问题。
3.2 控制字节、当前值和预设值的分配
以HSC0为例,它的控制字节、当前值寄存器、预设值寄存器有固定地址。控制字节里每一位代表启用计数器、是否可写方向、是否允许更新当前值、是否允许更新预设值、计数方向、计数模式等。初始化程序一般这样写:
// 首次扫描脉冲执行 // HSC0控制字节:使能计数器,更新预设值,A/B相四倍频模式 // 具体数值请以CPU手册HSC寄存器表为准 MOVB 16#FC, SMB47 // HSC0控制字 MOVD +0, SMD48 // HSC0当前值 = 0 MOVD +4000, SMD52 // HSC0预置值 = 一圈计数 HDEF 0, 4 // HSC0,模式4:A/B相四倍频 HSC 0 // 启动高速计数器预设值不是必须和一圈计数相等,它可以是任意整数。我的习惯是把它设为“到位目标值”,这样当计数器到达预设值时,PLC可以触发中断,不需要在扫描周期里去比较当前值是否等于目标。如果某个项目里目标角度经常变化,就先把预设值更新成新的目标,再一次次调用HSC指令刷新预设值。
这里要再次强调:不同CPU型号下控制字节地址和模式号可能有差异,写代码前必须翻一下对应机型的高速计数器寄存器表,不要直接照抄。
3.3 中断事件选择:计数到预设值不是唯一的做法
让PLC知道“到位了”有很多办法,用中断是最及时的一种。S7-200 Smart的中断事件里,和高速计数器相关的有“当前值等于预设值”、“外部复位”、“方向改变”等事件。
项目里我做旋转定位,通常把“当前值等于预设值”作为定位完成信号来源之一。做法是先在初始化程序里用ATCH指令,把中断子程序挂到这个事件上,然后用ENI开启全局中断。当计数器到达预设值时,CPU立即进入中断程序,在里面置位到位标志,或者直接输出停止信号。
只靠中断置位标志还不够,主程序里也需要一个扫描保护逻辑,避免重复触发到位动作。例如到位标志置位后,要等操作人员按下启动按钮或设备进入下一工位时才复位。否则一个到位事件会在同一个位置反复触发多轮动作。这一点容易被忽略,尤其是有多个工位连续动作的设备。
3.4 从高速计数器里读出当前角度
高速计数器的当前值存放在特殊寄存器中。用HSC0的话,当前值就在SMD38这样的双字地址里。但要注意:SMB38的读操作必须按照双字访问,程序里直接做数值比较时用双字比较指令,不要拆成单字去读,更不要写成浮点数运算,否则数值会错得离谱。
读取当前值后,角度换算放到主循环里做。典型梯形图逻辑是:
- 读取当前计数值(双字整数);
- 对“每圈计数”取余,得到单圈内计数;
- 把余数换算成0~360度的角度值,存到变量里供触摸屏显示或逻辑比较。
换算时最稳妥的写法是分两步:先取余,再乘除。例如先得到单圈计数N(0~3999),然后角度 = N * 360 / 4000。这里的乘除结果用双整数运算,并且注意乘法的中间值不会超过双字范围,4000以内的数乘360完全没问题。
4. 角度定位逻辑:从脉冲到角度再到动作的换算
4.1 单走角度:脉冲计数的取模换算
如果设备只是连续旋转、不停在固定角度,那么计数器累计值会越来越大。做角度显示或角度判断前,先对单圈计数取模。举个例子,每圈计数4000,当前累计值82000,取模后是2000,对应180°。这样即使累计值很大,也能准确得到当前单圈角度。
取模操作在PLC里可以用“除法取余数”指令实现。S7-200 Smart的整数除法和双整数除法都支持求余数,把累计值作为被除数,把“每圈计数”作为除数,余数就是当前圈内的计数位置。
这个取模逻辑有一个前提:编码器的零点对应机械角度0°。如果设备安装时编码器零点没有对准目标零位,那么直接用余数算出的角度会有一个固定的初始偏移。解决办法是在程序里增加一个角度偏移量,上电时通过手动或自动方式标定一次偏移值。
4.2 目标位置判断与到位区间
到位判断并不是“当前角度等于目标角度”那么理想。机械有惯性,电机有停止延时,编码器本身也有量化误差,所以实际工程里都必须做一个到位区间。
比如目标角度90°,到位区间设为±1°,那么只要当前角度在89°~91°之间,就认为已经到位。这个区间大小需要现场试。区间设置太小,设备会反复启停抖动;区间太大,定位精度满足不了工艺要求。我当时是先设±0.5°测试,发现每次停止位置都偏一点,再把区间扩大到±1°,配合两级减速逻辑,最终稳定在目标角度±0.7°范围内。
如果你控制的是变频器驱动异步电机,建议分两级处理:距离目标角度还差5°时先减速,进入到位区间后再停止。这样过冲量小,重复定位精度也高。如果只用单速电机,没有减速控制,那就只能靠机械刹车或离合器来保证停止位置,机械结构上的刹车响应时间非常关键。
4.3 正反转与跨零点的最短路径处理
旋转机构经常遇到一个麻烦:当前位置350°,目标位置20°,如果只做正向旋转,要走330°而不是跨过0°转30°。工程上的解决思路是计算两个方向的路径长度,选择较短的那个方向运动,或者根据工艺要求强制指定方向。
最简单的判定方法是先算出“正向差值”和“反向差值”:
正向差值 = (目标角度 - 当前角度 + 360) % 360 反向差值 = 360 - 正向差值如果正向差值小于等于反向差值,正向走;否则反向走。这个逻辑用整数运算实现很方便,注意浮点取模在PLC里更容易出错,尽量用整数。
跨零点之后,当前位置可能出现跳变。例如从350°转到20°,角度要先越过359°再到0°,再到20°,PLC里从359°到0°是“突然变小”,如果直接用“目标角度大于当前角度就继续走”的判断,就会误判为已经走过位置。用上面计算正向差值的方式就不会出问题,因为它在数学上天然处理了跨零点。
4.4 断电再上电:回零和软限位
增量式编码器最大的软肋是断电后位置丢失。它不是绝对式编码器,上电后PLC不知道该转轴停在哪一度。所以,所有用增量式编码器做角度定位的设备,必然要设计回零流程。
对于单圈旋转设备,回零的做法通常是:设备先把轴转到机械零位(或接近开关位),然后执行“当前位置清零”或“当前位置设定为某个角度”。在200 Smart里,可以直接把高速计数器的当前值设为0,也可以用向导生成“当前值写入”功能块来刷新。上电后我一般让程序先进入“未就绪”状态,操作员按住回零按钮,设备低速找零位,找到后清零计数,设备才算可以投入自动运行。
还可以用Z相脉冲做每个圈内的硬零位。编码器每转一圈会输出一个Z脉冲,把它接到HSC的外部复位输入,可以让高速计数器在每圈同一个物理位置自动清零。这样做的好处是单圈角度永远以Z脉冲为基准,断电后即使当前位置不清零,下个Z脉冲到来也会重新校正。适合那些旋转体不要求“跨圈”定位、只在单圈内运动的设备。
另外要加软限位。程序里定义最大允许角度,比如只允许0°~360°内运动,超出就报警并禁止输出。否则一旦编码器读数异常或程序判断错误,转盘可能一直朝一个方向转,机械限位挡块都挡不住。
5. 上电调试:计数乱跳、丢脉冲和溢出都是怎么解决的
5.1 第一步:确认编码器信号质量
每次调试新设备,我第一件事不是写控制逻辑,而是先验证编码器和高速计数器的信号链路。方法很土但有效:把电机脱开,用手慢慢转动编码器轴,在触摸屏或监控表里看计数值变化。匀速转动时,计数值应该是稳定递增或递减;突然跳动、倒退、跳变几十个计数的,信号链路一定有问题。
如果条件允许,用示波器或带频率测量的万用表,直接量编码器A、B两相输出。正常信号应该高低电平分明、无毛刺、占空比接近50%。现场没有示波器时,有一个简单的替代验证法:把A相接到PLC普通输入点,点动旋转,用PLC的“强制/诊断”面板看输入点闪烁,如果闪烁规律和手动旋转一致,说明编码器机械部分正常;如果输入点不规律乱闪,那就要怀疑编码器内部或接线问题。
5.2 第二步:排查干扰源
我遇到最典型的“计数乱跳”现场,是设备主电机用变频器驱动,编码器线从变频器旁边走过,结果导致PLC显示角度值像疯了一样来回摆动。排查过程是:先断开电机主回路,手动盘轴,计数正常;一开变频器,计数立刻乱跳,这就能基本锁定电磁干扰。
干扰的解决手段有顺序:先看屏蔽层和共地,再看编码器电源,最后才考虑动程序。把编码器线换成屏蔽双绞线,屏蔽层单端接地;编码器电源单独用隔离DC-DC;输入线的滤波参数刻意调小。做完这三件事,大部分干扰都能压下来。
这里还要提一下200 Smart的数字量输入滤波。输入滤波默认值可能比较大,比如6.4ms甚至12.8ms。对普通按钮、接近开关来说,滤波大一点更抗干扰;但对高速脉冲来说,滤波等于把脉冲削掉了。项目里必须到系统块里把高速输入点对应的数字量滤波时间调到最小值(通常是0.2us或0.4us这一档),否则计数会严重丢脉冲。这个点常被忽略,我见过不少项目是“程序没问题但计数比别人少一圈”,最后就查到这个滤波配置上。
5.3 第三步:处理计数溢出和长期累计误差
高速计数器是32位整数,最大值大约21.47亿。如果设备转速很高,计数器最终会溢出。对于角度定位应用,我通常不让累计值无限制增长,而是周期性做“位置校准”。最简单的方法是每到一圈零点(Z脉冲或回到0°)时,强制把当前值写成0或某个固定值。
在程序里做归零有一个地方要注意:归零动作必须短暂且不可重入。如果主程序每个扫描周期都判断一次“当前值超过4000就减4000”,那么在你修改当前值的过程中,编码器可能又转过了几个脉冲,导致位置出现跳跃。更好的做法是用中断事件捕获计数器增长到某个阈值,例如在计数计到4000时进入中断,直接把当前值清零。中断处理几乎不耗时,位置跳跃最小。
长期运行的设备还会有机械磨损、联轴器打滑造成的累计误差。这类误差靠程序无法完全消除,只能靠定期回零或者Z脉冲校正来兜底。我写这类程序时会在触摸屏上开放一个“回零周期提醒”,让现场人员按计划维护。
5.4 最后固化的一套参数表
调通之后,我会把最终参数记录成表格,方便后面复制到同类设备。下面是我某台旋转台项目的最终参数,仅供参考:
| 项目 | 实际参数 |
|---|---|
| 编码器型号 | 欧姆龙E6B2-CWZ6C,1000线,NPN开路集电极输出 |
| 编码器供电 | 独立24V DC,与电机主回路隔离 |
| PLC型号 | S7-200 Smart ST40 |
| 高速计数通道 | HSC0(I0.0接A相,I0.1接B相) |
| 计数模式 | A/B相正交四倍频 |
| 单圈计数 | 4000个计数 |
| 角度分辨率 | 0.09° |
| 输入滤波设置 | 0.4us(高速输入通道) |
| 到位区间 | ±1° |
| 回零方式 | 外部接近开关找零位,清零计数 |
这套参数适用于一台直径约1.2米的四工位转盘,电机是单速减速电机,配上变频器做两级减速。设备连续运行两个月,重复定位波动范围在±0.8°以内,对工艺来说完全够用。
6. 从角度定位到多工位旋转台:扩展思路
6.1 多工位分度控制状态机
单角度定位做通之后,很多朋友会想扩展到多工位分度台。我的建议是不要用一堆“当前角度等于目标角度”的比较挤满梯形图,而是搭一个简单的状态机:空闲、旋转中、到位保持、工位完成。每个状态用布尔标志管理,转盘启动后进入“旋转中”,到达目标工位角度后进入“到位保持”,到位保持期间允许其他机构执行动作,动作完成后再回到空闲,等待下一个启动命令。
多工位分度时的目标角度可以用配方数组存储。在200 Smart里,把4个工位的目标角度放在连续V存储区,通过索引号读取。触摸屏上可以随时修改每个工位的目标角度。这样比每写一个工位就复制一段比较逻辑要整洁得多,也方便后续增加工位数。
6.2 与触摸屏、变频器的联动
200 Smart通过Modbus RTU和触摸屏通信是非常成熟的做法。把当前角度、目标角度、设备状态、报警信息都映射到V区,触摸屏就能实时显示。操作员设定好目标角度后,PLC读到设定值变化,自动启动旋转定位流程。
如果转盘电机由变频器驱动,200 Smart还可以用Modbus RTU直接控制变频器的频率和启停,实现“远距离快速转,接近目标慢速爬行”。这种组合成本低、编程简单,适合不需要高动态响应的设备。要注意的是Modbus通信有轮询周期,如果对实时性要求特别高,建议用PLC本体高速输出做启停点动控制,而不要依赖通讯调速。
6.3 PLC做定位和伺服做定位的分界线
最后说一句务实的话。用“200 Smart + 编码器”做角度定位,解决的是一类中等精度、中低频响应的设备。定位精度能到0.1°量级,响应时间在几百毫秒量级,对于转盘、夹具、切割角度调整足够。
但如果设备要做连续轮廓运动、高速高精度插补,或者频繁启停且有严格同步要求,那已经超出了普通PLC高速计数定位的能力边界。这种情况应该考虑步进或伺服系统,或者带运动控制功能的专用控制器,让编码器反馈和驱动器形成闭环,PLC只做调度。角度定位项目里,选对工具和控制层次,比盲目堆精度更重要。
我在实际项目中的体会是:S7-200 Smart配合欧姆龙编码器的方案,胜在成本可控、调试门槛低、稳定性高,特别适合传统设备改造和小型自动化专机。只要把接线和高速计数器配置这条主线抓稳,剩下的角度换算和定位逻辑都不难。后面做多工位扩展时,状态机和配方数组的思路直接复用即可。