[WIKI] Создание конфигурации простого автомата от чайника

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

[WIKI] Создание конфигурации простого автомата от чайника

Сообщение Ворон226 »

Часто возникает необходимость создания конфигурации простого автомата на LinuxCNC.
Попробую сделать это тут для новичков (к коим и себя отношу).

А начнем с постановки задачи.

Задача.
Сконфигурировать простой автомат "Планшетный широкоформатный сканер" на базе LinuxCNC со своей панелью управления и встроенной перепрограммируемой программой обработки заготовки.

Для начала определим необходимые направления работы:
1. Описание логики работы сканера
2. Создание файла INI
3. Создание визуальной панели
4. Создание связей между HAL, визуальной панелью и программами/подпрограммами
5. Создание HAL
6. Написание программы сканирования
7. Способы проверки и тестирования конфигурации

Продолжу вечером...
Хочешь быть счастливым? Будь им!
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение torvn77 »

Ворон226 писал(а): Не вижу я явной причины к его использованию.Суброутинус для меня пока экзотичен. Пока в сторону...
Ничего сложного в этом нет,скорее удобство.
Рано или поздно ты придёшь к написанию "простыни" и держать весь код в одном файле не выйдет.
По этой же причине следует давать максимально индивидуализированные имена,а не led1.
Ворон226 писал(а): Более того, пока вижу больше "мусора" в наличии ОГРОМНОГО количества переменных, которые я и использовать-то буду раз-два за включение станка.
Так я не предлагаю тебе использовать эту подпрограмму в своём проекте,я её привёл именно как пример кода.
Эта подпрограмма часть постпроцессора к фрезеру и делает начальную инициализацию машины.
(Это я к тому,что хранить переменные в var не обязательно)
Ну ещё я её даю как пример того,как надо называть переменные,чтобы потом "самому не заблудится",
так как помнишь ты сейчас,а через год всё забудешь и будешь смотреть на свой код как код другого человека.
Ворон226 писал(а):Чтобы самому не заблудиться?
Зачем использовать strace если можно просто создать лог вызова подпрограмм в котором просматривать пересылаемые переменные и порядок вызова функций?
Или как раз отсутствие вызова функций.
Место обрыва такого лога показывает место проявления проблем и дело как правило оказывается в какой нибудь опечатке.
Ещё можно отслеживать состояние переменной.
Ну или если ошибка хитрее,то анализ пересылаемых значений позволяет найти источник странного поведения.
Ворон226 писал(а):DEBUG работает в Axis, закрывая правую часть окна сообщениями, которые нужно удалять. А именно в правой части экрана (в Axis) обычно располагаются пользовательские органы управления станком. Неудобно. Вот если бы сообщения сами исчезали через несколько секунд. Но тут нужно ещё учиться и учиться.
Так используй LOGOPEN и выводи всё в файл.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

Тебе бы создать отдельную тему - Создание конфигурации станка в LinuxCNC и, затем, в ВИКИ. Пока с трудом улавливаю общую структуру.
Хочешь быть счастливым? Будь им!
Аватара пользователя
NightV
Почётный участник
Почётный участник
Сообщения: 6599
Зарегистрирован: 30 дек 2011, 09:14
Репутация: 2279
Настоящее имя: Владимир Айрапетян
Откуда: Israel
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение NightV »

дабы не засорять, тема про программный PLC - MatPLC ушла отдельной веткой
Программный PLC - MatPLC #1
Всё просто! если знаешь КАК!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

Ворон226 писал(а):DEBUG работает в Axis, закрывая правую часть окна сообщениями, которые нужно удалять. А именно в правой части экрана (в Axis) обычно располагаются пользовательские органы управления станком. Неудобно. Вот если бы сообщения сами исчезали через несколько секунд. Но тут нужно ещё учиться и учиться.
тут всё просто - есть готовые пины в axisui:
Выделение_088.png (3676 просмотров) <a class='original' href='./download/file.php?id=36804&sid=0bb243968ed42ccb07a0fe3e6034ed7d&mode=view' target=_blank>Загрузить оригинал (39.25 КБ)</a>
с ними ты можешь настроить поведение вывода ошибок и информации на свой лад...
конкретно для удаления debug - пин notifications-clear-info
по умолчанию он 0
делаешь его 1 и сообщения вытираются
+ таймер или другие отмашки...
===================
интерфейсы самиздат ,даже самые примитивные требуют механизма вывода ошибок и сообщений ...
в Axis это "привязано" к Tkinter
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

class Notification(Tkinter.Frame):
    def __init__(self, master):
        self.widgets = []
        self.cache = []
        Tkinter.Frame.__init__(self, master)

    def clear(self,iconname=None):
        if iconname:
            cpy = self.widgets[:]
            for i, item in enumerate(cpy):
                frame,icon,text,button,iname = item
                if iname == "icon_std_" + iconname:
                    self.remove(cpy[i])
        else:
            while self.widgets:
                self.remove(self.widgets[0])

    def clear_one(self):
        if self.widgets:
            self.remove(self.widgets[0])


    def add(self, iconname, message):
        self.place(relx=1, rely=1, y=-20, anchor="se")
        iconname = self.tk.call("load_image", "std_" + iconname)
        close = self.tk.call("load_image", "close", "notification-close")
        if len(self.widgets) > 10:
            self.remove(self.widgets[0])
        if self.cache:
            frame, icon, text, button, discard = self.cache.pop()
            icon.configure(image=iconname)
            text.configure(text=message)
            widgets = frame, icon, text, button, iconname
        else:
            frame = Tkinter.Frame(self)
            icon = Tkinter.Label(frame, image=iconname)
            text = Tkinter.Label(frame, text=message, wraplength=300, justify="left")
            button = Tkinter.Button(frame, image=close)
            widgets = frame, icon, text, button, iconname
            text.pack(side="left")
            icon.pack(side="left")
            button.pack(side="left")
        button.configure(command=lambda: self.remove(widgets))
        frame.pack(side="top", anchor="e")
        self.widgets.append(widgets)

    def remove(self, widgets):
        self.widgets.remove(widgets)
        if len(self.cache) < 10:
            widgets[0].pack_forget()
            self.cache.append(widgets)
        else:
            widgets[0].destroy()
        if len(self.widgets) == 0:
            self.place_forget()
                        
notifications = Notification(root_window)            
                            
            
ну и сама функция:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

def error_task(self):
        error = e.poll()
        while error: 
            kind, text = error
            if kind in (linuxcnc.NML_ERROR, linuxcnc.OPERATOR_ERROR):
                icon = "error"
            else:
                icon = "info"
            notifications.add(icon, text)
            error = e.poll()
        self.error_after = self.win.after(200, self.error_task)
надо бы выковырять этот механизм ну хоть из Gmoccи , или сделать отдельным модулем питона ,
чтоб можно было удобно и быстро прикручивать к любому GUI
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

nkp писал(а):тут всё просто - есть готовые пины в axisui:
Я так понял, что эти пины устанавливаем в HAL так как нам нужно через
setp <пин> <параметр>
Так?

Завтра поковыряю...

А пока разобрался как зациклить работу пользовательского компонента:

Код: Выделить всё

#!/usr/bin/python
import hal
from subprocess import call
import time

h=hal.component("skanform")
h.newpin("photo", hal.HAL_BIT, hal.HAL_IN)
h.newpin("line", hal.HAL_BIT, hal.HAL_IN)
h.newpin("end", hal.HAL_BIT, hal.HAL_IN)
h.newpin("pdi1", hal.HAL_BIT, hal.HAL_IN)
h.newpin("pdi2", hal.HAL_BIT, hal.HAL_IN)
h.newpin("pdi3", hal.HAL_BIT, hal.HAL_IN)
h.newpin("rem1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("rem2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("skill", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("enable", hal.HAL_BIT, hal.HAL_IN)
h.ready()

try:
    while 1:
        if h['enable']==1:
            h['skill'] = 0
            NN = MM = 1
            if h['photo']==1:
                sCommand = '/usr/bin/fswebcam --save /home/sun/webcam%02d%02d.png -d /dev/video0 -r 640x480 --png 0' % (NN, MM)
                rc = call(sCommand)
                sCommand = '/usr/bin/convert /home/sun/webcam%02d%02d.png 100x100+270+190 /home/sun/cropwebcam%02d%02d.png' % (NN, MM, NN, MM)
                rc = call(sCommand)
                MM = MM + 1
                h['rem1'] = 1
                time.sleep(1.5)
            else:
                h['rem1'] = 0
                if h['line']==1:
                    NN = NN + 1
                    MM = 1
                    h['rem2']=1
                    time.sleep(1.5)
                else:
                    h['rem2'] = 0
                    if h['end']==1:
                        h['skill'] = 1
                    else:
                        h['skill'] = 0
               
except KeyboardInterrupt:
     raise SystemExit

Теперь конфигурация с этим компонентом запускается. Только вот снимок с камеры не делает. А в терминале делает...
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

Ворон226 писал(а):Только вот снимок с камеры не делает. А в терминале делает...
можно попробовать subprocess.Popen:
import subprocess
subprocess.Popen( 'sCommand' , shell=True)
или
subprocess.Popen( [sCommand] , shell=True)
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

Открыл конфигурацию. Зашел в УСТАНОВКИ HAL: на пине axisui.notifications-clear-info выставил TRUE командой

Код: Выделить всё

setp     axisui.notifications-clear-info 1
(в окошечке есть там такое)
Запустил автомат, но информационные сообщения не исчезают)

Тогда прописал эту строчку в HAL:

Код: Выделить всё

setp     axisui.notifications-clear-info 1
Перезапустил конфигурацию и получил сообщение:

Код: Выделить всё

Debug file information:
Can not find -sec DISPLAY -var INTRO_GRAPHIC -num 1 
Can not find -sec DISPLAY -var INTRO_TIME -num 1 
skaner.hal:82: parameter or pin 'axisui.notifications-clear-info' not found
1595
  PID TTY      STAT   TIME COMMAND
Stopping realtime threads
Unloading hal components
Где можно почитать про эти пины (в описании не нашел)?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

проверить работу пина можно так:
после загрузки емс открыть halshow...
там есть своя командная строка( halcmd) - можно команды писать в ней ...
чем это удобно?
просто не приходится набирать имена пинов - выделяешь - курсор в комстроку - и Shift+Insert

==========
можно это всё проделать в терминале:
запуск емс
открыть терминал -
halcmd setp axisui.notifications-clear 1
Выделение_090.png (3625 просмотров) <a class='original' href='./download/file.php?id=36823&sid=0bb243968ed42ccb07a0fe3e6034ed7d&mode=view' target=_blank>Загрузить оригинал (177.48 КБ)</a>
Выделение_091.png (3625 просмотров) <a class='original' href='./download/file.php?id=36824&sid=0bb243968ed42ccb07a0fe3e6034ed7d&mode=view' target=_blank>Загрузить оригинал (122.15 КБ)</a>
всё работает (только на первом скрине не тот пин выбрал - у нас же "Ошибка" а я выбрал "info")))
===========
ну можно на кнопку повесить для проверки:
net cl_bt button_N => axisui.notifications-clear
ну а в "реальной" работе нужно наверно прикрутить работу пина к таймеру или еще чему нибудь
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Serg »

nkp писал(а):просто не приходится набирать имена пинов - выделяешь - курсор в комстроку - и Shift+Insert
В линуксах/юниксах можно просто выделить и сразу вставлять средней кнопкой мыши.

P.S. И вообще можно выделить слово1 и запомнить по Ctrl-C (или ПКМ->Копировать), потом выделить слово2, а потом вставлять слово1 по Ctrl-V (или ПКМ->Вставить), а слово2 средней кнопкой мыши. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение torvn77 »

nkp писал(а):проверить работу пина можно так:
после загрузки емс открыть halshow...
А можно сделать ещё так:
прямо в хал файле написать для пина pin_name

Код: Выделить всё

loadusr halmeter pin pin_name 
(Для сигналов и параметров аналогично parm и sig)
или сохранив список набранных для мониторинга в halshow пинов,сигналов и параметров в файле ggg.halshow

Код: Выделить всё

loadusr halshow ggg.halshow
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Nick »

Ворон226 писал(а):Где можно почитать про эти пины (в описании не нашел)?
Их наверное в postgui надо, это же пин axis - значит gui, значит привязывать его надо после того как gui загрузится.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

Nick писал(а):
Ворон226 писал(а):Где можно почитать про эти пины (в описании не нашел)?
Их наверное в postgui надо, это же пин axis - значит gui, значит привязывать его надо после того как gui загрузится.
Спасибо!
На строку

Код: Выделить всё

setp axisui.notifications-clear-info 1
в postgui.hal LinuxCNC не ругнулся. Конфигурация запустилась.
Но вот ИНФОРМАЦИОННЫЕ сообщения (не сообщения об ошибках, о которых писалось выше) после появления не исчезают.

Я почему писал о том, где почитать? Потому что намеки на привязку таймера я бы реализовал, если бы знал к чему привязывать таймер, и как снимаются сообщения? Почитать бы...

И вообще-то вплотную подошел к теме о системных сообщениях в самодельных конфигурациях. Скоро открою отдельную тему на форуме и в Вики...
Хочешь быть счастливым? Будь им!
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение torvn77 »

Есть такой компонент message
Сам я его не пробовал,но от одного чтения его описания начинаю испытывать тяжкую тоску,
так как сразу представляю какой ужос будет если сообщения придётся закладывать в большом количестве.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

Ворон226 писал(а):не исчезают.
позволю себе повториться:
это в конфиг не пиши setp axisui.notifications-clear-info 1
запусти емс , "вызови" ошибку , и скомандуй setp axisui.notifications-clear 1
из halcmd (#229)
===========
насчет таймера :
самое примитивное - обеспечить срабатывание пина через определенный промежуток времени...
===========
тут конечно все индивидуально , так как в принципе исчезание ошибки с экрана
может произойти до того ,как ее увидит оператор , а это не всегда есть хорошо...
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение torvn77 »

nkp писал(а):запусти емс , "вызови ошибку , и скомандуй setp axisui.notifications-clear 1
А вот тут у меня возникает вопос,а правильно ли разделять входы на параметры и пины?
может лучше всё в пины преобразовать?
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

Во-первых, разговор НЕ ОБ ОШИБКАХ. Ошибки просто необходимо сохранять на экране, пока их не увидит оператор и не снимет их ручками.
Вопрос о сообщениях о событиях. Например: "Переменная X_MAX равна 1000.0"
Это сообщение появилось и должно исчезнуть через пару секунд, а не засорять экран.

Во-вторых, нажать на "крестик" в сообщении ГОРАЗДО проще, чем дать команду из halcmd

Получается, проще вообще отказаться от DEBUG, чем потом с ним "нянчиться"...
Хочешь быть счастливым? Будь им!
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение torvn77 »

Так писал уже раньше,используй (LOG, ....)
пример MDI history

Код: Выделить всё

(LOGOPEN,/tmp/ggg.txt)
(LOG,1 = #1)
#<hh>=3.14
(LOG,hh = #<hh>)
#<_hh>=3.14
(LOG,_hh = #<_hh>)
(logclose)
результат:

Код: Выделить всё

1 = 0.000000
hh = 3.140000
_hh = 3.140000
Последний раз редактировалось torvn77 19 ноя 2014, 21:35, всего редактировалось 1 раз.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение Ворон226 »

Мне важно понять границы применяемости и удобности инструмента. Есть варианты разные. Но ПОЧЕМУ? не потому же, что не умею...
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

Ворон226 писал(а):Во-первы
я написал об общем механизме "очистки" в Axis
если внимательней посмотреть - то там три пина , и по их окончаниях легко понять - какой пин какие сообщения вытирает..
наверно "info" вытирает информационные сообщения...
а "error" скорей всего - сообщения об ошибках...
ну и третий пин без приставки может быть вытирает всё...
Ворон226 писал(а):Во-вторых
команду из halcmd конечно рекомендовал не для работы , а чтоб убедиться ,что пин работает в твоей системе...
Ворон226 писал(а):"нянчиться
нянчиться понятное дело не нужно - всё автоматизируется по потребностям (через hal или с помощью ладдера)
самый примитивный способ написал выше...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Создание конфигурации простого автомата от чайник

Сообщение nkp »

Ворон226 писал(а):Но вот ИНФОРМАЦИОННЫЕ сообщения (не сообщения об ошибках, о которых писалось выше) после появления не исчезают.
здесь скорей всего не работал механизм очистки - так как он работает при переходе значения пина с 0 на 1
-----------
Ответить

Вернуться в «LinuxCNC»