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

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

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

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

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

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

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

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

Добавлено: 19 ноя 2014, 22:13
Ворон226
Вот потому и хотел почитать об этом, чтобы не гадать...

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

Добавлено: 19 ноя 2014, 22:27
torvn77
nkp писал(а):самое примитивное - обеспечить срабатывание пина через определенный промежуток времени...
Это типо так в компоненте time брать секунды и посылать их в компоратор comp и к пину comp.N.equal прикруть пины сброса axisui.notifications-clear

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

Добавлено: 19 ноя 2014, 22:31
nkp
torvn77 писал(а):Это типо так в компоненте time брать секунды и посылать их в компоратор comp и к пину comp.N.equal прикруть пины сброса axisui
в ладдере это проще (имхо) сделать ...
===========
но всё это не то - так можно удалить сообщение через 0.1с после появления)))
=================
наверно правильно пойти путем програмного удаления сообщений , с возможностью
опцией выбирать время "задержки" , ну и само включение данной функции...

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

Добавлено: 19 ноя 2014, 22:35
torvn77
Лично я в хале могу прямо сейчас,а вот lider я освою не раньше чем через пол года.

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

Добавлено: 19 ноя 2014, 22:37
Ворон226
Чтобы подобное работало корректно, нужно запускать таймер по событию вывода сообщения (а где его взять? Какой пин?)

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

Добавлено: 19 ноя 2014, 22:42
nkp
Ворон226 писал(а):Чтобы подобное работало корректно, нужно запускать таймер по событию вывода сообщения (а где его взять? Какой пин?)
такой пин можно добавить в саму функцию (в файл axis.py)
но это работать будет только в Axis
если подходит такое решение - добавим...

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

Добавлено: 19 ноя 2014, 22:48
nkp
torvn77 писал(а):Лично я в хале могу прямо сейчас,а вот lider я освою не раньше чем через пол года.
не думаю))
если под линуксом - то нужно скачать ладдер без привязки к емс и потртить полчаса-час на ознакомление...
ты удивишся - насколько это просто)

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

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

А можем и не вычищать,так как зачем пользователю во время автоматической работы жать на кнопки?
Удалить их разом в конце цикла.
Для этого и пины подходящие есть: halui.program.is-paused halui.program.is-stop halui.program.is-running
Причём важные индикаторы можно расположить в левой части панели,чтобы сообщения их не закрывали.

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

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

по сообщениям, раз уж вы все равно axis переписываете, можно использовать системные утилиты, которые выводят сообщения вроде "есть подключение к интернету"
Но может работать не везде. У меня в 10.10 не работает:
http://help.ubuntu.ru/wiki/notify-osd

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

Добавлено: 20 ноя 2014, 10:18
nkp
Nick писал(а):можно использовать системные утилиты,
да - вспомнить давнюю темку
только сайт у psha не работает...

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

Добавлено: 20 ноя 2014, 10:22
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
но вот вопрос - как его оптимальней всего "назад" в ноль ставить???
так как в примере - думаю очень короткий интервал ...

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

Добавлено: 20 ноя 2014, 11:30
Nick
можно сделать пин unit и пихать туда unixtime последнего сообщения...

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

Добавлено: 03 дек 2014, 20:37
Ворон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
В результате сканирования получаем несколько снимков, которые после сканирования нужно склеить в один файл нужного разрешения.
Остались мелочи и автомат-сканер будет готов ;)

Мелочи:
- подобрать камеру приличного качества
- разобраться с подсветкой
- довести до ума кнопку ПУСК в визуальной панели (так и не пропёр с ней, но уже пора)

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

Добавлено: 06 дек 2014, 20:57
Ворон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
Не работает...
Наверняка, я не знаю как организовать в Питоне две команды друг за другом. Не подскажете как?

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

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

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

import os
path = ' /tmp/webcam_%02d%02d.png ' % (NN, MM)
if os.path.exists(path):
но тут как то разрулить надо с подобным: NN = NN + 1 , то есть не менять ,пока
не отработает команда конвертации...

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

Добавлено: 07 дек 2014, 00:43
Serg
Для теста вместо convert запускай скрипт, в котором можно всякие проверки сделать и лог писать.

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

Добавлено: 08 дек 2014, 11:44
Nick
Ворон226 писал(а):subprocess.Popen( sCommand , shell=True);
этот вроде фоновый процесс запускает.
попробуй через
os.system("some_command with args")

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

Добавлено: 08 дек 2014, 12:27
Serg
Надо обе команды в один скрипт засунуть и запускать фоновым процессом, чтоб работа компонента не останавливалась на время ожидания конвертации...

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

Добавлено: 08 дек 2014, 18:43
Ворон226
UAVpilot писал(а):Надо обе команды в один скрипт засунуть и запускать фоновым процессом, чтоб работа компонента не останавливалась на время ожидания конвертации...
Т.е. в компоненте прописать обращение к скрипту. А уже в самом скрипте организовать процедуру обращения к камере и обрезки кадра. Я так понял?

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

Добавлено: 08 дек 2014, 19:37
Serg
Да.
По феншую конечно надо породить отдельный асинхронный процесс и в нём последовательно выполнить обе команды, но об этом тебе рано пока... ;)