Нужно ли изобретать велосипед или Компоненты реального времени
(часть первая)
Мы уже вполне осознанно начали лазить по файлам настройки и конфигурации CNC - самое время начать усовершенствовать работу нашего станка, придумать всякие удобства, "вкусности" и т.п.
Например, не запускать станок, пока точно не будет ясно, что оператор нажал две кнопки безопасности, разнесенные подальше друг от друга
Пропишем эти две кнопки:
net start1 <= parport.0.pin-10-in
net start2 <= parport.0.pin-11-in
а дальше нужно включать станок только если эти "кнопочки" (start1 и start2) нажаты (= 0). Сделаем это через пины
stepgen.0.enable
stepgen.1.enable
stepgen.2.enable
всех трех координат. Т.е. пока отрабатывается программа - держи руки на кнопках!
Т.е. условием включения станка должно быть:
start1 = 0
start2 = 0
stepgen.0.enable , stepgen.1.enable и stepgen.2.enable имеют уровень сигнала равный 1 или True
Мы, как электронщики, прекрасно знаем, что это легко реализовать через двух-входовый элемент ИЛИ-НЕ и двух-входовый И
(start1 или start2), затем инвертируем и на первый вход элемента И, а на второй вход того же И - axis.0.amp-enable-out
Тогда на выходе, при start1 = 0 и start2 = 0, получим тот же уровень, что и axis.0.amp-enable-out и передаём его на stepgen.0.enable
И так по всем трем осям...
А, если хотя бы один start (хотя бы одна кнопка) равен 1 (отжата), то stepgen.0.enable равен 0 (False) и движение по осям прекращается.
Что нам может предложить CNC из стандартного набора компонентов?
Смотрим мануал:
6.5 Логические компоненты
6.5.3 or2
Компонент "or2" это двух вводовый вентиль "или" ("or").
6.5.2 not
Компонент "not" ("не") это битовый инвертор.
6.5.1 and2
Компонент "and2" это вентиль "и" ("and") с двумя вводами.
Пропишем всё в логике CNC (только одну координату для краткости):
net start1 => or2.0.in0
net start2 => or2.0.in1
net orout <= or2.0.out => not.0.in1
net notout <= not.0.out => and2.0.in0
net andin1 <= axis.0.amp-enable-out => and2.0.in1
net andout <= and2.0.out => stepgen.0.enable
Вроде всё... НЕТ! Опять забыли для начала "включить" компоненты и определить их в нужном потоке... Мы используем один компонент or2, один компонент not и один компонент and2 (для одной оси) или три компонента and2 (для трёх осей). Получается всё вместе:
loadrt or2
loadrt not
loadrt and2 count=3
addf or2.0 servo-thread
addf not.0 servo-thread
addf and2.0 servo-thread
addf and2.1 servo-thread
addf and2.2 servo-thread
net start1 <= parport.0.pin-10-in
net start2 <= parport.0.pin-11-in
net start1 => or2.0.in0
net start2 => or2.0.in1
net orout <= or2.0.out => not.0.in1
net notout <= not.0.out => and2.0.in0 => and2.1.in0 => and2.2.in0
net andin0 <= axis.0.amp-enable-out => and2.0.in1
net andout0 <= and2.0.out => stepgen.0.enable
net andin1 <= axis.1.amp-enable-out => and2.1.in1
net andout1 <= and2.1.out => stepgen.1.enable
net andin2 <= axis.2.amp-enable-out => and2.2.in1
net andout2 <= and2.2.out => stepgen.2.enable
Здесь loadrt and2 count=3 говорит о том, что мы будем использовать компонент 2-И трижды.
Это пример использования готовых компонентов для реализации "цифровой схемы". Но это далеко не все возможности компонентов реального времени.