total := total + WORD_TO_DWORD(newValue - prevValue); дает не верный результат.
total := total + WORD_TO_INT(newValue - prevValue); дает верный результат.
Вид для печати
Откуда такой вывод?
WORD_TO_DWORD нужно когда считаем "общее количество проделанных импульсов" (именно такая задача у автора темы) -- тут в prevValue/nextValue нужно брать счётчик.
WORD_TO_INT это когда пытаемся определить "абсолютное положение энкодера", но тогда и в prevValue/nextValue нужно брать не "счётчик", а реально "значение энкодера"
Вложение 26881
Зачем мне Ваши глупости повторят?
Я же сказал, что т.к. WORD - без знаковое целое число, то результат арифметической операции "вычитание" всегда будет правильным, не смотря не то, что после 65535 счетчик начнет считать с 0.
Т.е. именно для без знаковых целых переменных
0 - 65530=6
А Вы мне подсовываете КОНСТАНТЫ
Откуда компилятору знать, что эти константы надо рассматривать как без знаковые целые формата WORD, а не REAL или INT?
По этому только так
A: WORD;
С: WORD := 65530;
A:=0-C;
Получится "6"
Господа программисты, малость облегчу задачу для моего случая. Время работы двигателя транспорта программно ограничено по времени (1 сек) при любом состоянии счетчика и любой ситуации. Это сделано для предотвращения недопустимых ситуаций из за поломки энкодера и\или ошибки оператора станка при его настройке. По расчетам у меня получается примерно следующее: частота вращения двигателя транспорта 3000об\мин = 50 об\с, при разрешении энкодера 500 имп\об имеем 25000 импульсов. При среднем фактическом времени работы 0.4 сек имеем 10000 импульсов. Типы DWORD и DINT в моей задаче не актуальны.
Добрый день, немного оффтоп
Пришел плк110-220.60-K-М цвета корпуса такие же как на плк 160, это значит старая линейка?
М02 обновленный стиль корпуса ведь?
А кто вас спрашивает? Шутка.
Держите программу: Вложение 26911
Порядок пользования:
"online -> write file to plc -> PRU0.prg"
перезагружаем ПЛК
ФБ PRU_ABZ и PRU_CUTTER.
Через PRU_ABZ.ZERO_DETECTED можно узнать "обнаружен ли уже ноль"
Через PRU_CUTTER управляем мотором (указываем нужное количество импульсов и говорим "поехали!").
Энкодер подключать к 1-ым трём входам.
На какие именно фронты сигнала энкодера реагировать это, похоже, тот ещё вопрос, поэтому я сделал первое что пришло в голову: блок реагирует на вообще все фронты A и B сигналов. Фильтрации от дребезга нет. Возможно, стоит добавить.
Код:FUNCTION_BLOCK PRU_ABZ
VAR_INPUT
(*
A -- in1
B -- in2
Z -- in3
*)
END_VAR
VAR_OUTPUT
VALUE : WORD; (* increases or decreases depending on encoder direction *)
COUNTER : WORD; (* always increases *)
ZERO_DETECTED: BOOL; (* true when Z was detected at least once *)
END_VAR
FUNCTION_BLOCK PRU_CUTTER
(*
When ENABLE=TRUE, the block activates out1 until RUN_LENGTH encoder pulses observed.
RUN_LENGTH can be changed at any time.
*)
VAR_INPUT
ENABLE: BOOL;
RUN_LENGTH: DWORD; (* pulses *)
END_VAR
VAR_OUTPUT
STATE : PRU_CUTTER_STATE; (* INIT -> RUN -> STOP *)
OFFSET: DWORD; (* actual offset *)
END_VAR
TYPE PRU_CUTTER_STATE : (
INIT_CUTTER, (* CUTTER is waiting for new configuration and activation ENABLE=TRUE signal *)
RUN_CUTTER, (* CUTTER is moving *)
STOP_CUTTER (* CUTTER is stopped and it is waiting for ENABLE=FALSE to switch to INIT state *)
);
END_TYPE
Собственно, программа:
Вложение 26908
PRU_ABZ:
Вложение 26909
PRU_CUTTER:
Вложение 26910
Что значит "тот еще вопрос". Все должно быть однозначно.
Вложение 26912
http://www.owen.ru/forum/showthread....l=1#post187362