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

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

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

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

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

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

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

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

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

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

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

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

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

Сообщение torvn77 »

nkp писал(а):самое примитивное - обеспечить срабатывание пина через определенный промежуток времени...
Это типо так в компоненте time брать секунды и посылать их в компоратор comp и к пину comp.N.equal прикруть пины сброса axisui.notifications-clear
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

torvn77 писал(а):Это типо так в компоненте time брать секунды и посылать их в компоратор comp и к пину comp.N.equal прикруть пины сброса axisui
в ладдере это проще (имхо) сделать ...
===========
но всё это не то - так можно удалить сообщение через 0.1с после появления)))
=================
наверно правильно пойти путем програмного удаления сообщений , с возможностью
опцией выбирать время "задержки" , ну и само включение данной функции...
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

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

Сообщение torvn77 »

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

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

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

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

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

Сообщение nkp »

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

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

Сообщение nkp »

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

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

Сообщение torvn77 »

Ворон226 писал(а):Чтобы подобное работало корректно, нужно запускать таймер по событию вывода сообщения (а где его взять? Какой пин?)
Во первых,если уж быть требовательным к состоянию программы,то давай определимся так:
*)Отладочная информация через LOG идёт в файл.
*)Важные сообщения и инструкции пользователю идут через MSG или DEBUG,
таймер сброса при этом отключен,так как ПОЛЬЗОВАТЕЛЬ их должен прочитать ОБЯЗАТЕЛЬНО.
Возможно даже остановка программы на паузу до прочтения пользователем сообщения.
(Ну а после реакции пользователя сообщение можно и почистить,ну или сделать кнопку Clear)
*)Сообщения пользователю типа "я делаю то то и у меня всё в порядке" ему читать не обязательно,
тогда включаем таймер и просто раз в N секунд вычищаем все сообщения,не зависимо от того,прочитаны они или нет.

А можем и не вычищать,так как зачем пользователю во время автоматической работы жать на кнопки?
Удалить их разом в конце цикла.
Для этого и пины подходящие есть: halui.program.is-paused halui.program.is-stop halui.program.is-running
Причём важные индикаторы можно расположить в левой части панели,чтобы сообщения их не закрывали.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

torvn77 писал(а):Это типо так в компоненте time брать секунды и посылать их в компоратор comp и к пину comp.N.equal прикруть пины сброса axisui.notifications-clear
все эти три компонента заменяются простым timedelay или как nkp правильно написал проще сделать через classic ladder.

по сообщениям, раз уж вы все равно axis переписываете, можно использовать системные утилиты, которые выводят сообщения вроде "есть подключение к интернету"
Но может работать не везде. У меня в 10.10 не работает:
http://help.ubuntu.ru/wiki/notify-osd
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

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

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

Сообщение nkp »

Nick писал(а):раз уж вы все равно axis переписываете
по идее - требуется добавить пин , который становится активным при появлении инфо-сообщения...
это вроде бы не сложно:

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

    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"
                comp["notifications-out"]=1
            notifications.add(icon, text)
            error = e.poll()
        self.error_after = self.win.after(200, self.error_task)
        comp["notifications-out"]=0
но вот вопрос - как его оптимальней всего "назад" в ноль ставить???
так как в примере - думаю очень короткий интервал ...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

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

Запустил пользовательский компонент skanform:

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

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

from time import gmtime, strftime


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()

NN = MM = 1

try:
    while 1:
        if h['enable']==1:
            h['skill'] = 0
            if h['photo']==1:
                sCommand = '/usr/bin/fswebcam --save /tmp/webcam_%02d%02d.png -d /dev/video0 -r 640x480 --png 0' % (NN, MM)
                subprocess.Popen( sCommand , shell=True);
                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
                        NN = MM = 1
                    else:
                        h['skill'] = 0
               
except KeyboardInterrupt:
     raise SystemExit
В результате сканирования получаем несколько снимков, которые после сканирования нужно склеить в один файл нужного разрешения.
Остались мелочи и автомат-сканер будет готов ;)

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

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

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

Решил вставить в пользовательский компонент skanform команду обрезания фотографии:

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

convert -crop 200x100+50+150 /home/sun/webcamGrab.jpg /home/sun/webcamCrop.jpg
, которая в терминале успешно работает.
Вставил так:

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

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

from time import gmtime, strftime


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()

NN = MM = 1

try:
    while 1:
        if h['enable']==1:
            h['skill'] = 0
            if h['photo']==1:
                sCommand = '/usr/bin/fswebcam --save /tmp/webcam_%02d%02d.png -d /dev/video0 -r 640x480 --png 0' % (NN, MM)
                subprocess.Popen( sCommand , shell=True);
                sCommand = '/usr/bin/convert /tmp/webcam_%02d%02d.png 100x100+270+190 /home/sun/cropwebcam%02d%02d.png' % (NN, MM)
                subprocess.Popen( sCommand , shell=True);
                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
                        NN = MM = 1
                    else:
                        h['skill'] = 0
               
except KeyboardInterrupt:
     raise SystemExit
В результате сканирования получаем несколько снимков, а вот обрезанных снимков - нет...

Подумал, что первая команда - получения снимка, не успевает выполниться, а Питон уже дает следующую - обрезать снимок, которого ещё нет...
Поставил паузу:

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

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

from time import gmtime, strftime


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()

NN = MM = 1

try:
    while 1:
        if h['enable']==1:
            h['skill'] = 0
            if h['photo']==1:
                sCommand = '/usr/bin/fswebcam --save /tmp/webcam_%02d%02d.png -d /dev/video0 -r 640x480 --png 0' % (NN, MM)
                subprocess.Popen( sCommand , shell=True);
                time.sleep(0.5)
                sCommand = '/usr/bin/convert /tmp/webcam_%02d%02d.png 100x100+270+190 /home/sun/cropwebcam%02d%02d.png' % (NN, MM)
                subprocess.Popen( sCommand , shell=True);
                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
                        NN = MM = 1
                    else:
                        h['skill'] = 0
               
except KeyboardInterrupt:
     raise SystemExit
Не работает...
Наверняка, я не знаю как организовать в Питоне две команды друг за другом. Не подскажете как?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

может тут цикл "проскакивает" нужные MM или NN пока файла нет ещё... :thinking:
пауза здесь не так эффективна - скорей нужна именно проверка на существование файла :

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

import os
path = ' /tmp/webcam_%02d%02d.png ' % (NN, MM)
if os.path.exists(path):
но тут как то разрулить надо с подобным: NN = NN + 1 , то есть не менять ,пока
не отработает команда конвертации...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Для теста вместо convert запускай скрипт, в котором можно всякие проверки сделать и лог писать.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Ворон226 писал(а):subprocess.Popen( sCommand , shell=True);
этот вроде фоновый процесс запускает.
попробуй через
os.system("some_command with args")
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

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

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

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

UAVpilot писал(а):Надо обе команды в один скрипт засунуть и запускать фоновым процессом, чтоб работа компонента не останавливалась на время ожидания конвертации...
Т.е. в компоненте прописать обращение к скрипту. А уже в самом скрипте организовать процедуру обращения к камере и обрезки кадра. Я так понял?
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Да.
По феншую конечно надо породить отдельный асинхронный процесс и в нём последовательно выполнить обе команды, но об этом тебе рано пока... ;)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

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