2015-02-20 3 views
0

Я программист ПЛК, который в настоящее время использует вариант VB для управления двигателем.Последовательность выполнения кода

Я хочу вызвать функцию, которая будет выполнять ходы и не возвращаться к основному коду до тех пор, пока перемещение не будет завершено. В настоящее время здесь то, что у меня есть:

Program 'Main Program 
    While 1 
     If move_req = 1 
     Function MoveMotor 
     End If 
    Wend 
End Program 

Function MoveMotor 
    MoveABS 10 ' Move to encoder position 10mm 
    move_complete = 1 
    While move_req = 1 
     'Do Nothing 
    Wend 
End Function 

По какой-то причине этот код не работает и команда перемещения посылается снова и снова. Может ли это быть из-за того, что основная программа продолжает работать, когда функция работает? Так работает VB? Я привык думать о последовательности кода в терминах PLC, где они просматривают все многократно с определенной частотой.

+0

Программа запускается из-за инструкции While. И нет, где я могу увидеть, что 'move_reg' изменен, поэтому функция продолжает называться. – OneFineDay

+0

Его как бесконечный цикл здесь. –

+0

Вот что происходит: программа запускается и начинается бесконечный цикл (пока 1), сначала вызывается MoveMotor, который, в свою очередь, вызывает MoveABS. MoveMotor будет ждать, пока весь код в MoveABS не будет выполнен, вернитесь в MoveMotor, а затем запустите другой цикл (бесконечный?), Ожидая, что переменная с именем move_req станет 1. Вопрос. Что изменяет значение move_req? В этом примере ничего не делается, поэтому программа бесконечно остается в цикле While move_req. – Jeremy

ответ

0

Всякий раз, когда перемещение завершено, должен быть обнаружен программой программой. Похоже, вы хотите, чтобы move_req был установлен на ноль, когда это произойдет, но я не вижу, что это может вызвать. Как машина сигнализирует программе, что она закончила движение?

Второй момент заключается в том, что когда у вас есть цикл, который ждет, пока он проверяет изменение переменной, он может вызвать всплеск CPU. Вы можете поставить паузу в цикле с чем-то вроде System.Threading.Thread.Sleep(100), где 100 - миллисекунды для паузы.

Смежные вопросы