西门子s7-200 plc不使用库文件,实现步进电机走10000个脉冲后精准停下,期间可能随时暂停。终点没有接近开关,没有编码器。我自己的处理是用高速脉冲计数器hc0计数q0.0发出来的脉冲数,暂停后做四则运算,计算下一次启动还需要走的脉冲数,但是这样计算最后走的脉冲数总是会多于或者少于10000,导致停止的位置不准确。
首先,你可能需要使用中断来实现随时暂停功能。当触发中断时,记录步进电机当前的位置,以便恢复时确定应该从哪里继续走。
接下来,针对计算脉冲数多或少的问题,你可能需要考虑以下几个方面:
在你的四则运算中,你可能需要考虑计算误差,并将其加入到下一次计算中。例如:
通过这种方式,你可以尽可能减小计算误差并逐步调整目标脉冲数。
步进电机的步进步长可能会随着时间和使用而发生微小变化。你可能需要测量步进电机确切的步进距离,并将其考虑在内,以便更准确地计算目标脉冲数。
除了计算误差和步进距离误差外,还有其他因素可能会影响目标位置的准确性。例如电机的热膨胀、传动装置的摩擦、零部件的磨损等。你可能需要考虑这些因素,并将其考虑在内,以便更准确地计算目标脉冲数。
总的来说,为了更准确地实现步进电机的精准停止,你需要仔细考虑和优化各种误差因素,并逐步调整目标脉冲数。同时,你可能需要进行一些实验,以验证你的计算结果是否准确,并对其进行调整。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以参考以下步骤来实现步进电机暂停功能:
以下是参考代码(注:代码仅供参考,具体实现可能需要根据实际情况进行修改):
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用来记录当前步数。
需要注意的是,当步进电机到达目标位置时,可能会有一定的误差。因此,在设计目标位置时,可以考虑在目标位置周围留有一定的余量,以保证步进电机到达的位置精确。
如果我的回答解决了您的问题,请采纳!
根据提问者的描述,可以采用以下思路来实现步进电机暂停功能:
使用高速脉冲计数器hc0来计数步进电机走过的脉冲数。
定义一个变量count来保存当前步进电机走过的脉冲数,每次高速脉冲计数器计数完成后,将计数器的值累加到count中。
当count达到10000时,停止输出脉冲信号,步进电机停止运动。
在程序中增加一个暂停功能,当需要暂停时,停止输出脉冲信号,并将当前的count值保存到一个暂停计数器pause_count中。
当需要恢复运动时,将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