1. 项目背景与核心挑战
去年接手了一个自动化产线改造项目,需要将西门子S7-1200 PLC通过485通讯控制台达A2系列伺服驱动器。这个看似标准的工业控制方案,在实际开发中却遇到了不少"坑"。今天就把整个开发过程梳理成技术笔记,重点分享博图V15.1环境下的程序架构设计和通讯调试技巧。
在工业现场,Modbus RTU协议因其简单可靠的特点,仍然是中小型设备的主流通讯方案。但不同品牌的设备在协议实现细节上存在差异,特别是当西门子PLC遇到台达伺服时,参数配置和报文交互的细节处理直接决定了项目的成败。本次使用的硬件组合是:
- 控制器:S7-1214C DC/DC/DC(6ES7 214-1AG40-0XB0)
- 通讯模块:CM 1241 RS485(6ES7 241-1CH32-0XB0)
- 伺服系统:台达A2-04-L1(400W伺服套装)
2. 硬件连接与参数配置
2.1 物理层接线规范
RS485接线看似简单,但工业现场的电磁环境复杂,必须严格遵循规范:
- 使用双绞屏蔽线(推荐阻抗120Ω)
- CM1241模块的接线定义:
- 引脚3(T+/A)接伺服端的RS485+
- 引脚8(T-/B)接伺服端的RS485-
- 屏蔽层单端接地(通常在PLC侧)
- 终端电阻配置:
- 在通讯链路最远端的伺服驱动器上拨码SW1-7=ON
- 近端CM1241模块不需要启用终端电阻
特别注意:台达A2伺服的485接口与电源接口间距较近,布线时要避免平行走线,建议保持5cm以上间距。
2.2 伺服参数关键设置
通过台达伺服面板设置以下参数(以位置模式为例):
| 参数号 | 参数名称 | 设定值 | 说明 |
|---|---|---|---|
| P1-00 | 控制模式选择 | 0 | 位置控制模式 |
| P1-01 | 外部脉冲形式 | 2 | Modbus通讯控制 |
| P3-00 | 通讯站号 | 1 | 必须与PLC程序保持一致 |
| P3-01 | 通讯波特率 | 6 | 对应19200bps |
| P3-02 | 通讯数据格式 | 3 | 8数据位/偶校验/1停止位 |
| P3-04 | 通讯应答延迟 | 1 | 1ms响应延迟 |
3. 博图软件组态要点
3.1 硬件配置流程
- 在博图V15.1中新建项目,添加S7-1214C CPU
- 插入CM1241模块:
- 模块属性→常规→接口→端口配置:
- 传输率:19200bps
- 数据位:8
- 校验:偶校验
- 停止位:1
- 流控:无
- 模块属性→常规→接口→端口配置:
- 设置报文间隔时间(关键!):
- 在"传输"标签页将"字符间超时"设为20ms
- "消息间延迟"设为5ms
3.2 创建通讯DB块
建议采用结构化DB块设计,示例数据结构:
pascal复制STRUCT
// 控制命令区
Enable : BOOL; // 伺服使能
Home : BOOL; // 回原点命令
JogForward : BOOL; // 正转点动
JogReverse : BOOL; // 反转点动
// 状态反馈区
Ready : BOOL; // 伺服准备就绪
Alarm : BOOL; // 报警状态
Position : DINT; // 当前位置
Speed : INT; // 当前速度
// 参数设置区
TargetPos : DINT; // 目标位置
MoveSpeed : UINT; // 运行速度
AccelTime : UINT; // 加速时间
END_STRUCT
4. Modbus RTU通讯程序开发
4.1 功能块封装策略
使用西门子标准Modbus库(MB_COMM_LOAD和MB_MASTER)时,需要注意:
- 初始化功能块MB_COMM_LOAD的调用:
pascal复制MB_COMM_LOAD(
REQ := "FirstScan", // 首次扫描触发
PORT := CM1241.port_handle, // 端口句柄
BAUD := 19200, // 波特率
PARITY := 2, // 偶校验
FLOW_CTRL := 0, // 无流控
RTS_ON_DLY := 0, // RTS延迟
RTS_OFF_DLY := 0,
RESP_TO := 1000, // 响应超时1s
DBG_ADDR := 0,
DONE => "Init_Done",
ERROR => "Init_Error",
STATUS => "Init_Status");
- 读写功能块的互锁设计:
pascal复制IF NOT "MB_Busy" THEN
"Last_FC" := "Current_FC";
CASE "Current_FC" OF
1: // 读取输入状态
MB_MASTER(
REQ := TRUE,
MB_ADDR := 1,
MODE := 0,
DATA_ADDR := 16#2000,
DATA_LEN := 8,
DATA_PTR := "Input_Data",
DONE => "Read_Done",
ERROR => "Read_Error");
2: // 写入保持寄存器
MB_MASTER(
REQ := TRUE,
MB_ADDR := 1,
MODE := 1,
DATA_ADDR := 16#3000,
DATA_LEN := 4,
DATA_PTR := "Output_Data",
DONE => "Write_Done",
ERROR => "Write_Error");
END_CASE;
"MB_Busy" := TRUE;
END_IF;
4.2 台达伺服专用功能码映射
台达A2伺服使用Modbus协议的特殊实现:
| 功能 | 地址范围 | 对应参数 | 数据类型 | 访问方式 |
|---|---|---|---|---|
| 控制字 | 16#2000 | 命令寄存器 | 16bit | 读写 |
| 状态字 | 16#3000 | 状态寄存器 | 16bit | 只读 |
| 目标位 | 16#3002 | P1-44/P1-45 | 32bit | 读写 |
| 速度 | 16#3006 | P1-50 | 16bit | 读写 |
控制字位定义(16#2000):
- Bit0:伺服使能
- Bit1:报警复位
- Bit4:正向点动
- Bit5:反向点动
- Bit6:原点回归
- Bit7:紧急停止
5. 调试技巧与故障排查
5.1 典型问题处理方案
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯超时 | 终端电阻未启用 | 检查最远端伺服终端电阻状态 |
| 偶发数据错误 | 电磁干扰 | 检查屏蔽层接地,加磁环 |
| 伺服不响应 | 站地址不匹配 | 核对P3-00与PLC程序设置 |
| 只能读不能写 | 写保护使能 | 检查P3-15参数是否为0 |
| 位置控制异常 | 单位换算错误 | 确认P1-37~P1-39电子齿轮比 |
5.2 在线诊断工具使用
-
博图Trace功能捕获报文:
- 添加CM1241模块的诊断缓冲区为跟踪源
- 设置触发条件为"传输错误"
- 捕获原始报文分析起始位和停止位
-
台达伺服调试技巧:
- 临时设置P3-03=1开启通讯监控模式
- 通过ASDA-Soft软件查看实时通讯日志
- 用万用表测量485线路AB间电压(正常值1-5V)
6. 程序优化建议
- 通讯看门狗设计:
pascal复制// 在OB35中调用(100ms周期)
IF "Last_Comm_Time" < "Current_Time" THEN
"Comm_Timeout" := TRUE;
// 触发安全停机逻辑
"Emergency_Stop";
END_IF;
- 数据校验增强:
- 对关键位置指令采用CRC16校验
- 重要参数写入后执行回读验证
- 运动控制平滑处理:
pascal复制// S曲线加减速算法示例
"Accel_Ramp" := ("Target_Speed" - "Current_Speed") / "Accel_Time";
IF ABS("Accel_Ramp") > "Max_Accel" THEN
"Accel_Ramp" := SIGN("Accel_Ramp") * "Max_Accel";
END_IF;
"Current_Speed" := "Current_Speed" + "Accel_Ramp";
经过三个项目的实际验证,这套控制方案在200ms通讯周期下,位置控制精度可达±1个脉冲。对于需要更高实时性的场合,建议改用PROFINET通讯方案,但成本会显著增加。