在工业自动化领域,涂布收卷机的速度同步控制一直是个技术难点。传统方案采用机械传动或模拟量控制,存在响应慢、精度低、维护困难等问题。这次我们基于EtherCAT总线技术,构建了一套六轴伺服+变频器+编码器的混合控制系统,通过动态频率测量与实时数据交换,实现了200ms级的同步响应提升。
这套系统的核心创新点在于:
系统硬件配置如下表所示:
| 组件类型 | 型号规格 | 数量 | 通信方式 |
|---|---|---|---|
| 伺服驱动器 | 松下A6B系列 | 6台 | EtherCAT |
| 变频器 | 三菱FR-A800 | 1台 | Modbus RTU |
| 编码器 | 海德汉ERN1387 | 2套 | 脉冲输出 |
| 主控制器 | Beckhoff CX9020 | 1台 | EtherCAT主站 |
| 安全模块 | 倍福EL6900 | 1套 | FSoE |
拓扑结构采用星型+菊花链混合布局:
关键设计要点:EtherCAT总线必须形成闭环,最后一个从站的OUT端口需回连到主站,否则无法建立通信。
系统控制流程可分为三个层级:
实时层(1ms周期):
协调层(10ms周期):
管理层(100ms周期):
原始代码中使用的0.5ms采样窗口是经过多次测试得出的最优值。我们通过改变量实验验证了不同时间窗口的影响:
| 采样窗口 | 响应延迟 | 抗干扰性 | 适用场景 |
|---|---|---|---|
| 0.1ms | 20ms | 差 | 高速精密定位 |
| 0.5ms | 50ms | 良 | 常规速度控制 |
| 1.0ms | 100ms | 优 | 低速大惯性负载 |
在STM32实现中,需要注意:
改进后的中断服务例程:
c复制void TIM4_IRQHandler(void) {
if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) {
static uint32_t last_count = 0;
uint32_t current_count = encoder_counter;
// 防溢出处理
if(current_count < last_count) {
pulse_diff = (0xFFFFFFFF - last_count) + current_count;
} else {
pulse_diff = current_count - last_count;
}
current_rpm = (pulse_diff * 60) / (0.0005 * PPR);
last_count = current_count;
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
}
}
变频器参数配置需要特别注意以下关键点:
基本参数:
通信参数:
高级参数:
频率设置函数的改进版本增加了异常处理:
python复制def set_inverter_freq(com_port, freq):
if freq < 0 or freq > 655.35:
raise ValueError("Frequency out of range")
scaled_freq = int(freq * 100)
cmd = build_modbus_frame(0x01, 0x06, 0x0001, scaled_freq)
try:
with serial.Serial(com_port, 19200, timeout=0.1) as ser:
ser.write(cmd)
start_time = time.time()
while ser.in_waiting < 8:
if time.time() - start_time > 0.2:
raise TimeoutError("No response from inverter")
time.sleep(0.01)
response = ser.read_all()
if not check_crc(response):
raise ValueError("CRC check failed")
except serial.SerialException as e:
logging.error(f"COM port error: {str(e)}")
raise
在TwinCAT环境中配置PDO时,我们总结出以下经验:
输入PDO(0x7000系列):
输出PDO(0x6000系列):
配置示例代码:
iec61131-3复制// 驱动器1输出映射
Device1.Outputs
AT %Q* : ARRAY [0..3] OF DWORD
Type: DWORD
Address: 0x6020:01
Comment: '速度命令+控制字'
// 驱动器2输入映射
Device2.Inputs
AT %I* : ARRAY [0..3] OF DWORD
Type: DWORD
Address: 0x7020:01
Comment: '实际转速+状态字'
EtherCAT的分布式时钟(DC)同步是关键性能保障。我们的配置参数:
在TwinCAT中的配置路径:
调试技巧:用Wireshark抓取EtherCAT帧,检查Sync0信号的周期性是否稳定。
原始代码中的滑动平均滤波器可以进一步优化:
cpp复制class EnhancedMovingAverage {
public:
EnhancedMovingAverage(int size=5) :
window_size(size),
buffer(size, 0),
sum(0),
pointer(0) {}
float update(float new_val) {
// 异常值过滤
if(abs(new_val - buffer[pointer]) > 3*stddev && stddev > 0) {
new_val = buffer[pointer]; // 保持前值
}
sum += new_val - buffer[pointer];
buffer[pointer] = new_val;
pointer = (pointer + 1) % window_size;
// 计算标准差
float mean = sum / window_size;
float var_sum = 0;
for(auto v : buffer) {
var_sum += pow(v - mean, 2);
}
stddev = sqrt(var_sum / window_size);
return mean;
}
private:
std::vector<float> buffer;
int pointer;
float sum;
int window_size;
float stddev = 0;
};
通过FFT分析速度信号,我们发现主要干扰源:
滤波参数选择依据:
安全系统采用双通道设计:
通道A:
通道B:
接线要点:
安全系统通过SIL2认证的关键措施:
| 故障现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 伺服抖动 | PDO映射错误 | 检查TwinCAT配置 | 重新生成ENI文件 |
| 速度不同步 | 编码器信号干扰 | 示波器检查波形 | 加磁环/屏蔽线 |
| 通信中断 | 终端电阻未接 | 测量总线阻抗 | 补接120Ω电阻 |
| 变频器不响应 | 站号不匹配 | 读取Modbus异常码 | 修改站号参数 |
案例1:伺服偶尔飞车
案例2:速度波动大
案例3:急停响应慢
这套系统经过三个月连续运行测试,同步精度保持在±0.1%以内,故障间隔时间(MTBF)达到4500小时,相比传统方案提升显著。实际应用中需要注意定期检查总线连接器和编码器电缆状态,建议每500小时做一次预防性维护。