Страница 12 из 14

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

Добавлено: 15 окт 2014, 11:40
Ворон226
Это обсуждение статьи Конфигурация LCNC для простого автомата с MYGUI
Часто возникает необходимость создания конфигурации простого автомата на LinuxCNC.
Попробую сделать это тут для новичков (к коим и себя отношу).

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

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

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

Продолжу вечером...

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

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

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

Добавлено: 16 ноя 2014, 10:09
Ворон226
Тебе бы создать отдельную тему - Создание конфигурации станка в LinuxCNC и, затем, в ВИКИ. Пока с трудом улавливаю общую структуру.

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

Добавлено: 16 ноя 2014, 16:14
NightV
дабы не засорять, тема про программный PLC - MatPLC ушла отдельной веткой
Программный PLC - MatPLC #1

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

Добавлено: 18 ноя 2014, 00:17
nkp
Ворон226 писал(а):DEBUG работает в Axis, закрывая правую часть окна сообщениями, которые нужно удалять. А именно в правой части экрана (в Axis) обычно располагаются пользовательские органы управления станком. Неудобно. Вот если бы сообщения сами исчезали через несколько секунд. Но тут нужно ещё учиться и учиться.
тут всё просто - есть готовые пины в axisui:
Выделение_088.png (3737 просмотров) <a class='original' href='./download/file.php?id=36804&sid=55004de036573b51d7a76454d9c2ed59&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

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

Добавлено: 18 ноя 2014, 01:11
Ворон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

Теперь конфигурация с этим компонентом запускается. Только вот снимок с камеры не делает. А в терминале делает...

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

Добавлено: 18 ноя 2014, 08:11
nkp
Ворон226 писал(а):Только вот снимок с камеры не делает. А в терминале делает...
можно попробовать subprocess.Popen:
import subprocess
subprocess.Popen( 'sCommand' , shell=True)
или
subprocess.Popen( [sCommand] , shell=True)

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

Добавлено: 18 ноя 2014, 08:37
Ворон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
Где можно почитать про эти пины (в описании не нашел)?

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

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

==========
можно это всё проделать в терминале:
запуск емс
открыть терминал -
halcmd setp axisui.notifications-clear 1
Выделение_090.png (3686 просмотров) <a class='original' href='./download/file.php?id=36823&sid=55004de036573b51d7a76454d9c2ed59&mode=view' target=_blank>Загрузить оригинал (177.48 КБ)</a>
Выделение_091.png (3686 просмотров) <a class='original' href='./download/file.php?id=36824&sid=55004de036573b51d7a76454d9c2ed59&mode=view' target=_blank>Загрузить оригинал (122.15 КБ)</a>
всё работает (только на первом скрине не тот пин выбрал - у нас же "Ошибка" а я выбрал "info")))
===========
ну можно на кнопку повесить для проверки:
net cl_bt button_N => axisui.notifications-clear
ну а в "реальной" работе нужно наверно прикрутить работу пина к таймеру или еще чему нибудь

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

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

P.S. И вообще можно выделить слово1 и запомнить по Ctrl-C (или ПКМ->Копировать), потом выделить слово2, а потом вставлять слово1 по Ctrl-V (или ПКМ->Вставить), а слово2 средней кнопкой мыши. :)

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

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

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

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

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

loadusr halshow ggg.halshow

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

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

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

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

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

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

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

И вообще-то вплотную подошел к теме о системных сообщениях в самодельных конфигурациях. Скоро открою отдельную тему на форуме и в Вики...

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

Добавлено: 19 ноя 2014, 19:45
torvn77
Есть такой компонент message
Сам я его не пробовал,но от одного чтения его описания начинаю испытывать тяжкую тоску,
так как сразу представляю какой ужос будет если сообщения придётся закладывать в большом количестве.

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

Добавлено: 19 ноя 2014, 21:04
nkp
Ворон226 писал(а):не исчезают.
позволю себе повториться:
это в конфиг не пиши setp axisui.notifications-clear-info 1
запусти емс , "вызови" ошибку , и скомандуй setp axisui.notifications-clear 1
из halcmd (#229)
===========
насчет таймера :
самое примитивное - обеспечить срабатывание пина через определенный промежуток времени...
===========
тут конечно все индивидуально , так как в принципе исчезание ошибки с экрана
может произойти до того ,как ее увидит оператор , а это не всегда есть хорошо...

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

Добавлено: 19 ноя 2014, 21:08
torvn77
nkp писал(а):запусти емс , "вызови ошибку , и скомандуй setp axisui.notifications-clear 1
А вот тут у меня возникает вопос,а правильно ли разделять входы на параметры и пины?
может лучше всё в пины преобразовать?

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

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

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

Получается, проще вообще отказаться от DEBUG, чем потом с ним "нянчиться"...

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

Добавлено: 19 ноя 2014, 21:25
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

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

Добавлено: 19 ноя 2014, 21:30
Ворон226
Мне важно понять границы применяемости и удобности инструмента. Есть варианты разные. Но ПОЧЕМУ? не потому же, что не умею...

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

Добавлено: 19 ноя 2014, 21:31
nkp
Ворон226 писал(а):Во-первы
я написал об общем механизме "очистки" в Axis
если внимательней посмотреть - то там три пина , и по их окончаниях легко понять - какой пин какие сообщения вытирает..
наверно "info" вытирает информационные сообщения...
а "error" скорей всего - сообщения об ошибках...
ну и третий пин без приставки может быть вытирает всё...
Ворон226 писал(а):Во-вторых
команду из halcmd конечно рекомендовал не для работы , а чтоб убедиться ,что пин работает в твоей системе...
Ворон226 писал(а):"нянчиться
нянчиться понятное дело не нужно - всё автоматизируется по потребностям (через hal или с помощью ладдера)
самый примитивный способ написал выше...

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

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