圆山中庸 2026-02-11 18:45 采纳率: 98.3%
浏览 0
已采纳

ST代码中如何正确配置SV630速度模式的脉冲/模拟量输入与运行使能逻辑?

在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.10Ready to Switch OnEMG=1, SRVON=1, INP=1(模拟量模式下可忽略INP)
    StatusWord.12Operation 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中植入启动自检程序,强制执行以下步骤并记录各阶段耗时:

    1. PLC上电 → 检测DI_EMG上升沿(急停释放)
    2. 启动Modbus配置序列(写Pr0.017=2表示模拟量速度模式)
    3. 等待StatusWord.10连续3周期为1
    4. 置位MC_Power.Enable
    5. 检测StatusWord.12连续3周期为1
    6. 输出AO=1V(对应10%额定转速)
    7. 读取ActualSpeed确认非零
    8. 触发DI_INP(脉冲模式下)或保持AO输出(模拟量模式)
    9. 执行MC_MoveVelocity指令
    10. 监控ErrCode寄存器连续10秒无变化
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 今天
  • 创建了问题 2月11日