在工业自动化领域,PLC与伺服系统的协同控制一直是工程师们关注的重点。最近我在一个包装机械项目中,成功实现了西门子S7-1200 PLC通过RS485通讯控制台达A2系列伺服驱动器的方案。这个方案不仅成本比传统的脉冲控制方式更低,而且布线简单,抗干扰能力强,特别适合中长距离的控制场景。
在实际接线时,我使用的是西门子CM 1241 RS485通讯模块与台达A2伺服的RS485接口连接。这里有几个关键细节需要注意:
提示:台达A2伺服的RS485接口位于CN3插头上,具体引脚定义需要参考手册。我在第一次调试时就因为看错了引脚定义浪费了半天时间。
在TIA Portal V15.1中配置通讯参数时,必须确保PLC和伺服驱动器的参数完全匹配:
| 参数项 | PLC设置值 | 台达A2默认值 | 说明 |
|---|---|---|---|
| 波特率 | 9600 | 9600 | 建议不超过19200 |
| 数据位 | 8 | 8 | 固定为8位 |
| 停止位 | 1 | 1 | |
| 奇偶校验 | 无 | 无 | 也可选偶校验或奇校验 |
| 站地址 | - | 1 | 每个设备需唯一 |
在博图中配置硬件时,我通常这样操作:
我的项目通常采用以下结构:
code复制OB1 (主循环)
├── FC1 (通讯初始化)
├── FC2 (伺服控制逻辑)
├── FC3 (异常处理)
└── FC4 (状态监控)
这个功能块用于初始化通讯端口,我的典型配置如下:
stl复制MB_COMM_LOAD_DB(
REQ := TRUE, // 持续使能
PORT := 1, // 通讯端口号
BAUD := 16#09C4, // 9600波特率
PARITY := 2, // 无校验
FLOW_CTRL := 0, // 无流控
RTS_ON_DLY := 0, // RTS无延迟
RTS_OFF_DLY := 0,
RESP_TO := 1000, // 1秒超时
DB_POINTER := P#DB1.DBX0.0, // 数据块指针
DONE => #Init_Done,
ERROR => #Init_Error,
STATUS => #Init_Status);
注意:波特率参数16#09C4对应9600,这个转换经常容易出错。我整理了一份常用波特率对应表:
- 4800 → 16#04E2
- 9600 → 16#09C4
- 19200 → 16#1388
这是实现Modbus通讯的核心功能块,我的经验配置:
stl复制MB_MASTER_DB(
REQ := #Send_Request, // 上升沿触发
MB_ADDR := 1, // 伺服站地址
MODE := 1, // 0-读,1-写单个,2-写多个
DATA_ADDR := 16#0200, // 台达参数地址
DATA_LEN := 8, // 数据长度
DATA_PTR := P#DB2.DBX0.0, // 数据块指针
DONE => #Send_Done,
ERROR => #Send_Error,
STATUS => #Send_Status);
台达A2伺服通过Modbus RTU协议控制,主要使用以下功能码:
| 功能码 | 名称 | 用途 |
|---|---|---|
| 03H | 读保持寄存器 | 读取伺服状态和参数 |
| 06H | 写单个寄存器 | 修改单个参数 |
| 10H | 写多个寄存器 | 同时修改多个参数 |
要实现伺服的位置控制,需要设置以下参数:
stl复制// DB2数据块内容
DB2.DBB0 := 16#06; // 功能码06H
DB2.DBB1 := 16#00; // 参数地址高字节
DB2.DBB2 := 16#72; // 参数地址低字节(P5-72目标位置)
DB2.DBB3 := 16#00; // 数据高字节
DB2.DBB4 := 16#00;
DB2.DBB5 := 16#27; // 数据低字节
DB2.DBB6 := 16#10; // 10000脉冲(16#2710)
速度模式下的典型参数设置:
stl复制// 设置运行模式为速度模式(P1-01=2)
DB2.DBB0 := 16#06; // 功能码06H
DB2.DBB1 := 16#00; // 参数地址高字节
DB2.DBB2 := 16#01; // 参数地址低字节(P1-01)
DB2.DBB3 := 16#00; // 数据高字节
DB2.DBB4 := 16#02; // 数据低字节(速度模式)
// 设置目标速度(P1-10)
DB2.DBB0 := 16#06;
DB2.DBB1 := 16#00;
DB2.DBB2 := 16#0A; // P1-10
DB2.DBB3 := 16#13; // 5000rpm(16#1388)
DB2.DBB4 := 16#88;
基础通讯测试
PLC端测试
运动控制测试
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯完全无响应 | 接线错误 | 检查A+/B-极性 |
| 站地址不匹配 | 确认PLC和伺服地址设置 | |
| 偶发性通讯中断 | 终端电阻未配置 | 在总线两端加120Ω电阻 |
| 波特率不匹配 | 使用示波器检查实际波特率 | |
| 伺服不执行运动指令 | 伺服未使能 | 检查SON信号 |
| 运行模式设置错误 | 确认P1-01参数 | |
| 位置控制精度差 | 电子齿轮比设置不当 | 重新计算并设置P1-44/P1-45 |
| 加减速时间过短 | 调整P1-09/P1-10参数 |
通讯优化
运动控制优化
安全保护
在实际项目中,我发现几个特别值得注意的点:
参数保存问题
台达A2伺服修改参数后需要发送特殊指令(写入P0-00=1)才能保存到EEPROM,否则断电后会丢失设置。这个细节在手册中不太显眼,我第一次调试时就因此重复设置了好几次参数。
多轴同步控制
当需要控制多个伺服时,建议:
异常处理机制
完善的异常处理应包括:
stl复制IF #Send_Error THEN
#Error_Code := #Send_Status;
// 根据错误代码执行相应处理
// 如重试、报警、安全停机等
END_IF;
实际应用技巧
通过这个项目,我发现485通讯控制伺服虽然开发难度比脉冲控制略高,但在多轴、长距离应用中优势明显。特别是在需要频繁修改运动参数的场合,通过通讯方式可以实时调整,而无需停机修改硬件参数。