高速计数器与编码器
普通计数器 vs 高速计数器
| 项目 | 普通计数器 | 高速计数器(HSC) |
|---|---|---|
| 受扫描周期限制 | 是 | 否(中断机制) |
| 最高频率 | < 1kHz | 10kHz ~ 1MHz |
| 适用信号 | 按钮、人工操作 | 编码器、脉冲 |
| 计数方式 | 扫描采样 | 硬件中断 |
编码器基础
增量式编码器
输出 A/B 相脉冲序列,每个脉冲代表一定角度:
A相 ──► ──▼── ──▼── ──▼── (脉冲序列)
B相 ── ──▼── ──▼── ──▼── ──► (滞后 A 相 90°)
正转:A 超前 B 90°
反转:B 超前 A 90°1
2
3
4
5
2
3
4
5
| 类型 | 说明 | 分辨率 |
|---|---|---|
| 单相 | 只有一个输出,只测速度 | 1~5000 P/R |
| AB 相 | 两路输出,可测速度和方向 | 1~10000 P/R |
| ABZ 相 | 加 Z 相原点脉冲 | 最高 100000 P/R |
测速原理
转速(RPM) = (脉冲频率 × 60) / 编码器线数
例如:编码器 1024 P/R,1秒收到 10240 个脉冲
频率 = 10240 Hz
转速 = 10240 × 60 / 1024 = 600 RPM1
2
3
4
5
2
3
4
5
西门子 HSC(S7-1200)
配置步骤
- CPU 属性 → 高速计数器(HSC) → 启用通道(如 HSC1)
- 设置计数类型:频率 / 周期 / 脉冲计数
- 设置计数方向:增 / 减 / 双向
- 程序中读取计数值
程序读取
txt
// 读取 HSC1 计数值
current_count := "HSC1_DB".cnt[1];
// 测速计算
IF cycle_time > 0 THEN
speed_rpm := (current_count - last_count) * 60 / pulse_per_rev;
END_IF;
last_count := current_count;1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
三菱 HSC(FX5U)
FX5U 内置高速计数器,无需额外模块:
| 计数器 | 输入点 | 最高频率 | 类型 |
|---|---|---|---|
| C235 (HSC0) | X0 | 100kHz | 单相 |
| C236 (HSC1) | X1 | 100kHz | 单相 |
| C237 (HSC2) | X2 | 100kHz | 单相 |
| C238 (HSC3) | X3 | 100kHz | 单相 |
| C239/C240/C241 | X0/X1/X2 | 50kHz | 两相 |
txt
// FX5U HSC 读取
// C235 计数值存入 D8030/D8031(32位)
raw_count := (D8031 << 16) OR D8030;1
2
3
2
3
PTO 脉冲输出(步进/伺服控制)
PTO(Pulse Train Output)通过高速脉冲控制步进电机或伺服驱动器。
关键参数
| 参数 | 说明 |
|---|---|
| 脉冲频率 | 决定转速(Hz) |
| 脉冲数量 | 决定转角(脉冲数) |
| 方向信号 | DIR,决定正反转 |
西门子 PTO 配置(S7-1200)
txt
// 启用 PTO1(Q0.0 输出脉冲)
"Axis_1".MoveAbsolute(
Execute := start_move,
Position := 10000, // 目标位置(脉冲数)
Velocity := 1000, // 速度(脉冲/秒)
Done := move_done
);1
2
3
4
5
6
7
2
3
4
5
6
7
三菱 PLSY 指令(FX5U)
txt
// PLSY: 脉冲输出
// D0 = 脉冲频率,K10000 = 脉冲数量,Y0 = 脉冲输出
PLSY(D0, K10000, Y0);1
2
3
2
3