在工业自动化领域,精确捕捉高频脉冲信号是实现精准定位、速度测量和高速同步的关键。汇川H5U/Easy系列PLC内置的高速计数器(High-Speed Counter, HSC)模块,正是为此类需求而设计的利器。与传统计数器不同,高速计数器通过独立的硬件通道处理信号,不受PLC程序扫描周期限制,能够实现微秒级的快速响应。
高速计数器与编码器轴概述
在汇川H5U/Easy系列PLC中,高速计数器被抽象为“编码器轴”进行统一管理。一旦一个高速计数器与一个轴关联,它便成为编码器轴,可以像伺服轴一样进行位置监控和运动控制指令的调用,这大大简化了基于位置反馈的应用编程。
H5U/Easy系列高速计数器核心规格如下:
| 规格项 |
H5U系列 |
Easy系列 |
| 高速计数器数量 |
4轴 |
4轴(部分机型) |
| 计数器位数 |
32位 |
32位 |
| 计数范围 |
-2,147,483,648 ~ +2,147,483,647 |
同左 |
| 最高计数频率 |
200kHz(部分机型支持更高) |
根据机型不同 |
支持的计数模式:
| 模式 |
描述 |
输入端子要求 |
| AB相1倍频 |
A、B相信号,每周期计数1次 |
X0/A相,X1/B相 |
| AB相2倍频 |
A、B相信号,每周期计数2次 |
X0/A相,X1/B相 |
| AB相4倍频 |
A、B相信号,每周期计数4次 |
X0/A相,X1/B相 |
| CW/CCW模式 |
正转脉冲/反转脉冲 |
X0/CW,X1/CCW |
| 脉冲+方向模式 |
脉冲信号+方向信号 |
X0/脉冲,X1/方向 |
| 单相计数 |
单脉冲输入,可加方向 |
X0/脉冲(X1可选方向) |
计数信号的来源可以选择为外部脉冲输入(通过X0~X7端子)或内部时钟(如1ms时钟),后者常用于仿真或低速测试场景。
编码器轴的创建与配置
配置高速计数器功能,核心是创建一个“本地编码器轴”。
创建步骤
在编程软件中,通常在工程管理区右键“运动控制轴”并选择“添加轴”。
- 基本设置:在弹出的轴配置窗口中,于“基本设置”选项卡下,选择轴类型为“本地编码器轴”。需要指定轴号(例如轴3),并在“输入设备”下拉菜单中选择要关联的高速计数器,如“高速计数器0”。“输出设备”通常选择“未分配”。此外,还可以根据需求勾选“虚轴模式”、“轮询模式”等选项。
- 单位换算设置:切换到“单位换算设置”选项卡,这是将脉冲数转换为工程单位(如毫米、度)的关键。需要设置“电机/编码器旋转一圈的脉冲数”(例如16#2710,即十进制10000),以及“工作台旋转一圈的移动量”(例如1.0度)。软件会自动根据这两个参数计算脉冲当量。若传动系统中有减速机,可启用“变速装置”并设置齿轮比。
- 模式/参数设置:最后在“模式/参数设置”选项卡中,完成核心功能配置。这包括:
- 模式选择:线性模式(计数值在正负范围内累加)或旋转模式(计数值在0到设定周期内循环)。
- 软件限位:设置轴的负向和正向软限位值(例如0.00度和1000.00度)。
- 计数器模式设置:选择具体的计数模式,如“A/B相1倍频”,并指定信号源端子(如X0-A相, X1-B相)。
- 复位与探针设置:可以启用硬件复位功能,指定复位输入端子(如X4)及其触发边沿。同样,可以配置探针(触发锁存)功能的输入端子。
配置完成后,将工程下载至PLC即可。
单位换算参数示例与公式:
| 参数 |
说明 |
示例 |
| 每转脉冲数 |
编码器每圈输出的脉冲数 |
10000 |
| 每转移动量 |
工作台每旋转一圈的移动距离 |
10.0 mm |
| 用户单位 |
最终使用的单位 |
mm |
| 变速比 |
如有减速机,设置分子/分母 |
1:1 |
计算公式为:
用户单位值 = 脉冲数 × (每转移动量 ÷ 每转脉冲数)
核心应用指令详解 (以H5U为例)
创建好编码器轴后,便可通过一系列专用功能块进行控制和数据读取。
1. 位置与速度读取:HC_Counter
此指令用于实时获取编码器轴的当前位置和速度。
HC_Counter(
Axis:= EncoderAxis1, // 编码器轴名称
Position=> rPosition, // 输出:当前计数值(用户单位)
Velocity=> rVelocity // 输出:当前速度(用户单位/秒)
);
2. 位置预置(清零):HC_Preset
常用于将当前计数值设为一个特定值,最典型的应用是清零。
HC_Preset(
Execute:= bPresetCmd, // 触发信号(上升沿有效)
Axis:= EncoderAxis1, // 编码器轴
EdgeMode:= 0, // 0=上升沿触发,1=外部X上升沿,2=X下降沿,3=双边沿
Position:= 0.0, // 预置的目标位置(设为0即为清零)
Done=> bPresetDone, // 输出:预置完成
Error=> bPresetError, // 输出:错误标志
ErrorID=> iPresetErrID // 输出:错误代码
);
3. 探针锁存:HC_Probe
当外部传感器(探针)信号触发时,高速锁存当前的精确位置。每个轴支持2路独立的探针。
HC_Probe(
Execute:= bProbeCmd, // 触发使能
Axis:= EncoderAxis1, // 编码器轴
ProbeID:= 1, // 探针编号(1或2)
Mode:= 0, // 0=单次触发,1=连续触发,2=双边沿触发
Done=> bProbeDone, // 输出:锁存完成
ProbePos=> rProbePosition, // 输出:锁存的位置值
Error=> bProbeError, // 输出:错误标志
ErrorID=> iProbeErrID // 输出:错误代码
);
4. 位置比较与输出
这是实现高速响应的核心功能,分为单点、多点数组和等间距比较。
-
单位置比较 HC_Compare:当轴位置到达设定值时,可触发硬件输出或中断。
HC_Compare(
Execute:= bCompareCmd,
Axis:= EncoderAxis1,
Position:= 100.0, // 比较位置
OutputEnable:= 1, // 1=使能硬件输出
OutputPin:= 0, // 输出端子号(对应Y0~Y7)
InterruptMap:= 1, // 关联的中断事件号(1~16)
Done=> bCompareDone,
Match=> bMatch, // 输出:比较匹配标志
Error=> bCompareError,
ErrorID=> iCompareErrID
);
重要限制:同一个编码器轴同一时间只能激活一个HC_Compare指令,否则会产生类似“双线圈”的冲突。
-
多位置数组比较 HC_ArrayCompare:适用于需要依次触发多个位置点的场景。
VAR
aComparePos: ARRAY[1..10] OF REAL := [50.0, 100.0, 150.0, 200.0, 250.0];
END_VAR
HC_ArrayCompare(
Execute:= bArrayCmd,
Axis:= EncoderAxis1,
pArray:= ADR(aComparePos), // 比较位置数组首地址
iArrayLen:= 5, // 数组有效长度
OutputEnable:= 1,
OutputPin:= Y0,
InterruptMap:= 2,
NextIndex=> iNextIdx, // 输出:已完成比较的数组索引
Done=> bArrayDone,
Match=> bArrayMatch,
Error=> bArrayError
);
-
等间距比较 HC_StepCompare:适用于角度分割、等距触发等场合。
HC_StepCompare(
Execute:= bStepCmd,
Axis:= EncoderAxis1,
StartPos:= 0.0, // 起始位置
EndPos:= 360.0, // 结束位置
Step:= 30.0, // 步长(间距)
OutputEnable:= 1,
OutputPin:= Y1,
InterruptMap:= 3,
NextIndex=> iStepIdx,
Done=> bStepDone,
Match=> bStepMatch
);
高速比较中断的应用
为了实现微秒级的快速响应,必须启用硬件比较输出并配合中断使用。其稳定性和低延迟特性,是保障复杂 工业自动化 系统可靠运行的关键一环。
配置步骤:
- 在主程序开始处使用
EI指令打开全局中断使能。
- 在编码器轴的“模式/参数设置”中勾选“比较输出”功能,并指定输出端子及脉冲宽度。
- 在软件中新建中断程序,并关联到对应的比较中断事件(编号1~16,需与指令中
InterruptMap参数一致)。
- 在比较指令(如
HC_Compare)中设置InterruptMap参数,将其与中断程序绑定。
中断程序示例:
// 中断程序 INT_CMP1(对应比较中断1)
IF _EncAxis[0].Match[0].Position > 1000.0 THEN
// 位置超过1000时的紧急处理逻辑
bOverLimit := TRUE;
// ... 执行其他高速响应操作
END_IF;
典型应用场景与代码片段
1. 飞拍(运动中拍照)
将伺服电机的编码器反馈信号接入PLC高速计数口,在运动到预设位置时精确触发相机。
HC_Compare(
Execute:= bFlyShot,
Axis:= EncoderAxis_FB, // 关联伺服编码器反馈的编码器轴
Position:= rCameraPos, // 预设的拍照位置
OutputEnable:= 1, // 启用硬件输出
OutputPin:= Y2, // Y2端子输出信号至相机触发器
InterruptMap:= 5,
Done=> ,
Match=> bShotTrig // 拍照触发信号
);
2. 圆盘多工位控制
对于旋转圆盘需要多个位置同步比较输出的场景,可以采用HC_ArrayCompare指令顺序触发,或者通过将一个编码器信号绑定到多个不同的高速计数器编号上,实现多个输出点的独立、并行比较。
3. 传送带产品长度测量
利用两个传感器和探针功能测量产品长度。
HC_Counter(Axis:= EncoderAxis_Length, Position=> rCurrentPos, Velocity=> );
// 产品前沿遮挡传感器时,锁存开始位置
IF bProductDetect AND NOT bDetectOld THEN
HC_Probe(
Execute:= TRUE,
Axis:= EncoderAxis_Length,
ProbeID:= 1,
Mode:= 0,
Done=> ,
ProbePos=> rStartPos
);
END_IF;
// 产品后沿离开传感器时,锁存结束位置并计算长度
IF NOT bProductDetect AND bDetectOld THEN
HC_Probe(
Execute:= TRUE,
Axis:= EncoderAxis_Length,
ProbeID:= 2,
Mode:= 0,
Done=> ,
ProbePos=> rEndPos
);
rLength := ABS(rEndPos - rStartPos); // 计算产品长度
END_IF;
常见问题与优化建议
| 问题 |
可能原因 |
解决方法 |
| 计数不准确 |
1. 计数模式(AB相/脉冲方向)配置错误<br>2. 输入脉冲频率超过硬件上限<br>3. 信号线干扰 |
1. 检查并更正计数模式设置<br>2. 确认信号频率在规格范围内<br>3. 使用双绞屏蔽线,并确保屏蔽层单端接地 |
多个HC_Compare指令冲突 |
同一编码器轴同时激活了多个比较指令 |
1. 改用HC_ArrayCompare实现多点比较<br>2. 将同一编码器信号绑定到不同的高速计数器,复用信号<br>3. 使用外部硬件比较模块 |
| 比较输出响应慢 |
未启用硬件比较输出功能 |
在比较指令中务必设置OutputEnable:=1,并关联正确的硬件输出端子 |
| 中断不触发 |
1. 程序中未执行EI指令<br>2. 中断事件号映射错误 |
1. 在程序初始化段添加EI指令<br>2. 检查指令中InterruptMap参数与中断程序关联的事件号是否一致 |
| 探针锁存失败 |
探针触发模式或输入端子设置错误 |
检查探针的触发边沿(上升沿/下降沿)和模式(单次/连续)设置 |
硬件与性能优化建议:
- 接线:务必使用双绞屏蔽线连接编码器,屏蔽层在PLC侧单端接地。长距离传输时,在末端添加合适的终端电阻。
- 电源:建议编码器电源与PLC电源进行隔离,以减少干扰。
- 响应速度:优先使用硬件比较输出,其响应时间可达微秒级,远快于软件扫描。
- 中断使用:合理规划中断程序,避免过于复杂或频繁的中断影响主程序性能。
- 指令选择:对于多点比较,使用
HC_ArrayCompare时,数组长度不宜过大,以平衡性能与灵活性。
结语
汇川H5U/Easy系列PLC的高速计数器功能,通过编码器轴的概念提供了高度集成和易用的开发体验。从基础的脉冲计数、速度测量,到高级的探针锁存、硬件比较输出与中断联动,它能够覆盖从简单计量到复杂飞拍同步的广泛工业应用。深入理解其配置逻辑和指令特性,是构建高精度、高响应自动化系统的坚实基础。更多工控技术实践与深度讨论,欢迎访问 yunpan.plus 与其他开发者交流。
参考资料
[1] 汇川PLC的高速计数器功能, 微信公众号:mp.weixin.qq.com/s/wdOPjy7m7rv28sIN2BOkuA
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。