在ST(Structured Text)编程中配置汇川SV630伺服驱动器的速度模式时,常见问题为:**脉冲/模拟量指令源与运行使能逻辑未严格同步,导致上电后无响应或启停异常**。具体表现为:即使PLC输出AO模拟电压(如0–10V)或发送脉冲(PUL/DIR),伺服仍报Err20(指令超限)或Err15(使能未就绪);或RUN信号置位后电机不转,实测发现DI端子INP(脉冲输入使能)、SRV-ON(伺服使能)、EMG(急停)等硬件信号未在ST中与软件使能(如MC_Power)联动校验。此外,SV630需通过Modbus RTU或CANopen写入Pr0.017(速度指令源)、Pr0.018(使能方式)等参数,但ST代码常遗漏参数预设及状态反馈(如StatusWord.10=Ready、.12=Enabled)的循环监测,造成“伪使能”。如何在ST中实现指令源切换安全互锁、使能软硬双校验及故障自恢复逻辑,是工程落地的关键难点。
1条回答 默认 最新
fafa阿花 2026-02-11 18:45关注```html一、现象层:典型故障表征与硬件信号映射对齐
Err15(使能未就绪)与Err20(指令超限)在SV630中并非孤立报错,而是状态链断裂的终端体现。需首先建立PLC侧ST变量与驱动器DI/DO物理端子的严格映射:
DI_INP→ 脉冲输入使能(Pr0.018=1时强制有效)DI_SRVON→ 伺服使能(硬线SRV-ON,必须与MC_Power.Q同步)DI_EMG→ 急停常闭回路(低电平有效,ST中取反后参与AND逻辑)DO_ALM_RST→ 报警复位输出(需脉冲宽度≥100ms)
二、机理层:SV630状态机与ST控制周期的时序冲突分析
SV630内部状态迁移依赖连续3个控制周期内StatusWord满足条件(IEC 61800-7)。若ST中仅单次读取
StatusWord.12(Enabled),而未做边沿保持与持续校验,则MC_Power可能返回TRUE但驱动器实际处于“Ready→Operation Enable”过渡态,造成伪使能。关键约束如下:状态位 含义 使能必要条件 StatusWord.10 Ready to Switch On EMG=1, SRVON=1, INP=1(模拟量模式下可忽略INP) StatusWord.12 Operation Enabled 前一周期已为Ready,且SpeedRef≥Pr0.020(最小指令值) 三、架构层:ST中实现“软硬双校验+指令源安全互锁”的模块化设计
采用分层状态机(HSM)解耦配置、使能、运行三阶段,核心结构如下:
TYPE T_SV630_Controller : STRUCT // 配置阶段:Modbus写入Pr0.017/Pr0.018后等待响应 ConfigState : (IDLE, WRITING, WAIT_ACK, CONFIG_DONE); // 使能阶段:硬件信号AND + 状态字循环验证 EnableState : (DISABLED, ENABLING, ENABLED, FAULT_RECOVER); // 运行阶段:指令源切换需满足"先禁用、再切源、后重使能" RunMode : (STOP, SPEED_ANALOG, SPEED_PULSE); END_STRUCT END_TYPE四、实现层:关键ST代码片段与安全互锁逻辑
以下为使能校验核心逻辑(含100ms去抖与3周期确认):
// 硬件使能信号预处理(带滤波) bSRVON_Filtered := R_TRIG(CLK:= bDI_SRVON, Q=> , QN=> ); bSRVON_Valid := bSRVON_Filtered.Q AND NOT bDI_EMG; // EMG为常闭,低有效 // StatusWord状态字循环监测(使用移位寄存器) stStatusShift := SHL(IN:= stStatusShift, N:= 1); // 左移1位 stStatusShift[0] := WORD_TO_BOOL(StatusWord AND 16#0400); // .10 = Ready stStatusShift[1] := WORD_TO_BOOL(StatusWord AND 16#1000); // .12 = Enabled // 3周期连续为1才判定真使能 bEnabled_3Cycle := (stStatusShift[0] AND stStatusShift[1] AND stStatusShift[2]); // 软硬双校验最终使能输出 bDrive_Enabled := bSRVON_Valid AND bEnabled_3Cycle AND bConfig_Done;五、诊断层:故障自恢复的闭环反馈机制
当检测到Err15或Err20时,触发分级响应流程:
graph TD A[Alarm Detected] --> B{Err15?} B -->|Yes| C[检查DI_SRVON/DI_EMG电平] B -->|No| D{Err20?} D -->|Yes| E[读取ActualSpeed与SpeedRef差值] C --> F[执行MC_Power(Enable:=FALSE)] E --> G[判断是否超Pr0.021设定值] F --> H[延时200ms后重发MC_Power(Enable:=TRUE)] G --> H H --> I[循环监测StatusWord.12连续3次]六、工程层:参数预设与通信健壮性增强策略
针对Modbus RTU写入Pr0.017失败问题,ST中需嵌入:
- 写操作超时计数器(>500ms未收到响应则重试,上限3次)
- 参数写入后立即读回校验(Compare Value)
- 将Pr0.017/Pr0.018固化为全局常量,避免ST中硬编码
- CANopen场景下启用SDO abort code解析(如0x06010002=Object does not exist)
七、验证层:上电启动时序的黄金10秒测试清单
在ST中植入启动自检程序,强制执行以下步骤并记录各阶段耗时:
- PLC上电 → 检测DI_EMG上升沿(急停释放)
- 启动Modbus配置序列(写Pr0.017=2表示模拟量速度模式)
- 等待StatusWord.10连续3周期为1
- 置位MC_Power.Enable
- 检测StatusWord.12连续3周期为1
- 输出AO=1V(对应10%额定转速)
- 读取ActualSpeed确认非零
- 触发DI_INP(脉冲模式下)或保持AO输出(模拟量模式)
- 执行MC_MoveVelocity指令
- 监控ErrCode寄存器连续10秒无变化
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报