西门子S7-200 实现步进电机暂停功能

西门子s7-200 plc不使用库文件,实现步进电机走10000个脉冲后精准停下,期间可能随时暂停。终点没有接近开关,没有编码器。我自己的处理是用高速脉冲计数器hc0计数q0.0发出来的脉冲数,暂停后做四则运算,计算下一次启动还需要走的脉冲数,但是这样计算最后走的脉冲数总是会多于或者少于10000,导致停止的位置不准确。

首先,你可能需要使用中断来实现随时暂停功能。当触发中断时,记录步进电机当前的位置,以便恢复时确定应该从哪里继续走。

接下来,针对计算脉冲数多或少的问题,你可能需要考虑以下几个方面:

  1. 计算误差

在你的四则运算中,你可能需要考虑计算误差,并将其加入到下一次计算中。例如:

  • 如果当前计算脉冲数比10000多10个脉冲,那么下一次计算时,可以将目标脉冲数减少10个脉冲。
  • 如果当前计算脉冲数比10000少10个脉冲,那么下一次计算时,可以将目标脉冲数增加10个脉冲。

通过这种方式,你可以尽可能减小计算误差并逐步调整目标脉冲数。

  1. 步进电机的准确步进

步进电机的步进步长可能会随着时间和使用而发生微小变化。你可能需要测量步进电机确切的步进距离,并将其考虑在内,以便更准确地计算目标脉冲数。

  1. 各种误差的累加

除了计算误差和步进距离误差外,还有其他因素可能会影响目标位置的准确性。例如电机的热膨胀、传动装置的摩擦、零部件的磨损等。你可能需要考虑这些因素,并将其考虑在内,以便更准确地计算目标脉冲数。

总的来说,为了更准确地实现步进电机的精准停止,你需要仔细考虑和优化各种误差因素,并逐步调整目标脉冲数。同时,你可能需要进行一些实验,以验证你的计算结果是否准确,并对其进行调整。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以参考以下步骤来实现步进电机暂停功能:

  1. 使用高速脉冲计数器hc0计数,每计数一次表示步进电机运动了一个脉冲。
  2. 设定一个目标计数值,例如10000个脉冲,表示步进电机需要运动到的位置。
  3. 通过不断检测计数值是否达到目标计数值来判断步进电机是否到达目标位置。如果未到达目标位置,继续运动;如果已到达目标位置,则停止步进电机。
  4. 当需要暂停步进电机时,记录当前计数值,并停止计数器hc0。
  5. 当需要恢复步进电机时,计算出下一次启动还需要走的脉冲数,再重新启动计数器hc0。

以下是参考代码(注:代码仅供参考,具体实现可能需要根据实际情况进行修改):

NETWORK
TITLE Stop and Go for Stepper Motor
// 开始计数
LD I0.0
AND Q0.2
=|   |=
LD HC0
INC
ST HC0
// 暂停计数
LD Q0.3
AND Q0.4
=|   |=
LD HC0
ST M0.0
// 继续计数
LD Q0.5
AND Q0.6
=|   |=
LD M0.2
LD M0.1
SUB // 剩余步数
ST M0.1
LD M0.1
LD HC0
LD // 当前步数
SUB
ST M0.2
ST HC0
再次计数
LD Q0.0
AND Q0.1
=|   |=
LD M0.1
JEQ // 判断是否已到达目标位置
LD HC0
INC
ST HC0
JMP
// 停止计数
LD HC0
ST M0.2
ST M0.1

其中,Q0.2用来触发计数器,Q0.3用来暂停计数器,Q0.4用来判断是否需要暂停计数器,Q0.5用来恢复计数器,Q0.6用来判断是否需要恢复计数器。

M0.0用来表示计数器是否停止,M0.1用来记录剩余步数,M0.2用来记录当前步数。

需要注意的是,当步进电机到达目标位置时,可能会有一定的误差。因此,在设计目标位置时,可以考虑在目标位置周围留有一定的余量,以保证步进电机到达的位置精确。
如果我的回答解决了您的问题,请采纳!

以下内容部分参考ChatGPT模型:


根据提问者的描述,可以采用以下思路来实现步进电机暂停功能:

  1. 使用高速脉冲计数器hc0来计数步进电机走过的脉冲数。

  2. 定义一个变量count来保存当前步进电机走过的脉冲数,每次高速脉冲计数器计数完成后,将计数器的值累加到count中。

  3. 当count达到10000时,停止输出脉冲信号,步进电机停止运动。

  4. 在程序中增加一个暂停功能,当需要暂停时,停止输出脉冲信号,并将当前的count值保存到一个暂停计数器pause_count中。

  5. 当需要恢复运动时,将pause_count值加到count中,再开始输出脉冲信号。

以下是示例代码:

VAR
    count: WORD;    // 记录步进电机走过的脉冲数
    pause_count: WORD;  // 记录暂停时的计数器值
    pause_flag: BOOL;   // 暂停标志
    pulse_out: BOOL;    // 脉冲输出信号
END_VAR

// 定时中断程序,用于输出脉冲信号
// 输出周期为步进电机的正常运动周期
// 当pulse_out为FALSE时,停止输出脉冲信号
// 当pulse_out为TRUE时,输出脉冲信号
// 注意:具体的定时中断程序实现方式需要根据实际硬件环境进行调整
INTERRUPT
    IF pulse_out THEN
        // 输出脉冲信号
    ELSE
        // 停止输出脉冲信号
    END_IF
END_INTERRUPT

// 主程序
// 每次高速脉冲计数器计数完成后,将计数器的值累加到count中
// 当count达到10000时,停止输出脉冲信号,步进电机停止运动
// 当需要暂停时,停止输出脉冲信号,并将当前的count值保存到pause_count中
// 当需要恢复运动时,将pause_count值加到count中,再开始输出脉冲信号
IF NOT pause_flag THEN
    // 正常运动
    count := count + hc0;   // hc0为高速脉冲计数器
    IF count >= 10000 THEN
        pulse_out := FALSE; // 停止输出脉冲信号
    ELSE
        pulse_out := TRUE;  // 输出脉冲信号
    END_IF
ELSE
    // 暂停
    pulse_out := FALSE; // 停止输出脉冲信号
    pause_count := count;   // 保存当前的count值
END_IF

// 恢复运动
IF 恢复运动条件 THEN
    count := count + pause_count;   // 加上暂停时的计数器值
    pulse_out := TRUE;  // 开始输出脉冲信号
    pause_flag := FALSE;    // 清除暂停标志
END_IF

// 暂停
IF 暂停条件 THEN
    pulse_out := FALSE; // 停止输出脉冲信号
    pause_count := count;   // 保存当前的count值
    pause_flag := TRUE; // 设置暂停标志
END_IF

如果我的建议对您有帮助、请点击采纳、祝您生活愉快