Написание скриптов. Ликбез.

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

Написание скриптов. Ликбез.

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

Пришел момент разборок со скриптами. Пора!

Что же это такое? Чем отличается скрипт от пользовательского компонента?

Проверим, правильно ли я это понимаю?

Компонент LinuxCNC - это подпрограмма, состоящая из входных и выходных пинов, параметров и набора функций над этими элементами компонента.
Например, компонент and2. Подпрограмма, которая имеет два входных пина: in0 и in1, один выходной пин - out, и функция логического"И".

А вот скрипт (по моим нынешним понятиям, которые ни в коей мере на претендуют на истинность) - это программа, которая выполняется при обращении к ней, и содержит набор команд, в том числе и системных, для выполнения некоторой процедуры (вывода текста на принтер, отображения картинки на мониторе, процедуры закрытия программы или системы и т.п.).

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

Re: Написание скриптов. Ликбез.

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

Есть более-менее понятное описание процесса написания скриптов - здесь и здесь.

Попробую, следуя описаниям написать свой скрипт, а затем "внедрить" его в структуру .hal станка...
Тут и повод подвернулся: нужен скрипт, который будет воспроизводить нужные звуки при определенных событиях.

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

Re: Написание скриптов. Ликбез.

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

Воспользуемся стандартным способом воспроизведения звуковых файлов - командой
aplay

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

aplay /usr/share/sounds/alsa/Noise.wav
Здесь Noise.wav - звук,который я нашел в системной папке.
В терминале при этом пишется следующее:

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

printer@printer-desktop:~$ aplay /usr/share/sounds/alsa/Noise.wav
Воспроизведение WAVE '/usr/share/sounds/alsa/Noise.wav' : Signed 16 bit Little Endian, Частота 48000 Гц, Моно
Если команда пишется с применением --quiet, то в терминале всё выглядит так:

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

printer@printer-desktop:~$ aplay --quiet /usr/share/sounds/alsa/Noise.wav
Никакой информации о проигрываемом файле...
Хочешь быть счастливым? Будь им!
Аватара пользователя
Ворон226
Мастер
Сообщения: 1923
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Написание скриптов. Ликбез.

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

Усложним задачу.
Нужно воспроизвести звуковой файл три раза.

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

U="0"; while [ $U != 3 ]; do aplay --quiet '/usr/share/sounds/alsa/Noise.wav' && U=$[$U+1]; done
Разберём что к чему:
U="0" - обьявляется переменная со значением 0
while [ $U != 3 ] - проверяется не равна ли она трем, где 3 - требуемое число воспроизведений ( != - это НЕ РАВНО)
do aplay --quiet '/usr/share/sounds/alsa/Noise.wav' - это уже понятно - команда воспроизвести звуковой файл
&& U=$[$U+1] - после воспроизведения значение переменной увеличить на единицу
done - завершение

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

Re: Написание скриптов. Ликбез.

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

Попробуем на базе однострочного скрипта-команды написать сам скрипт.
Зачем нужен скрипт?
Например, чтобы во время работы станка сам linuxcnc выполнял некоторые команды.
Итак.
Скрипт - это текстовый файл с атрибутами выполнения.
Что же мы делали до этого момента и ЗАЧЕМ???
Мы просто проверили - будет ли на практике работать то, что мы напишем сейчас в скрипте. Можно было и сразу написать текстовый файл, сохранить его с расширением скрипта (или без оного), присвоить ему права на выполнение, запустить, посмотреть ошибки, исправить его, сохранить, опять запустить и т.п.

Скрипты можно писать на внутреннем языке BASH.
Выглядит это так:

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

#!/bin/bash
U=0
until [ $U -eq 3 ]; do
echo `aplay --quiet /usr/share/sounds/alsa/Noise.wav`
let U=U+1
done
где
#!/bin/bash - обязательная первая строка для скрипта, написанного на BASH, которая показывает путь к интерпретатору скрипта.
U=0 - создание переменной и присвоение ей значения "0"
until [ $U -eq 3 ]; do - цикл по сравнению значения переменной U с числом "3"
если U меньше "3", то выполняется команда
echo `do aplay --quiet /usr/share/sounds/alsa/Noise.wav` (обратите внимание на ОБРАТНЫЕ КАВЫЧКИ!!!)
echo - команда вывода на экран, но, если за ней стоит сообщение в обратных кавычках `сообщение`, то это означает - выполнить команду.
Далее
let U=U+1 - увеличим значение переменной на единицу
done - окончание скрипта
Последний раз редактировалось Ворон226 28 май 2013, 00:00, всего редактировалось 4 раза.
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Написание скриптов. Ликбез.

Сообщение Serg »

Ворон226 писал(а):U="0"; while [ $U != 3 ]; do aplay --quiet '/usr/share/sounds/alsa/Noise.wav' && U=$[$U+1]; done
Если итераций немного, то можно покороче:

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

for n in 1 two 100500 ; do aplay --quiet /usr/share/sounds/alsa/Noise.wav; done
Ворон226 писал(а):while [ $U != 3 ] - проверяется не равна ли она трем, где 3 - требуемое число воспроизведений ( != - это НЕ РАВНО)
Это ошибка! Выражение "!=" сравнивает две строки. Для чисел правильнее писать так:

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

while [ $U -ne 3 ]
Ворон226 писал(а):echo `do aplay --quiet /usr/share/sounds/alsa/Noise.wav'
Подробнее:
echo - команда вывода на экран, но, если за ней стоит сообщение в апострофах 'сообщение', то это означает - выполнить команду.
В конце апостроф неправильный - должен быть тоже обратный.
Это не просто "выполнить команду", а "выполнить команду и подставить вместо неё результат".
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1923
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Написание скриптов. Ликбез.

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

Дык я тут же и проверяю и корректирую ;)

Далее.

Сохраняем этот файл под именем, например
audio-script.sh

Теперь заходим из терминала в папку с сохраненным скриптом и выполняем:

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

chmod +x audio-script.sh
Так мы сделали наш скрипт исполняемым.
Теперь его можно запустить из командной строки терминала или консоли:

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

./audio-script.sh
И мы услышим трижды звуковой сигнал.
Ура!

Осталось встроить скрипт в linuxcnc.
Например, чтобы звуковой файл начинал воспроизводиться при срабатывании E-STOP.

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

Re: Написание скриптов. Ликбез.

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

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

Re: Написание скриптов. Ликбез.

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

Первый вариант:
Скрипт сохранить как M-команду (чуть подробнее написано тут).
В .INI прописать:

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

[HALUI] 
MDI_COMMAND = M102
(MDI-команда с пользовательской M-командой)

А в .HAL привязать к нужному пину, например, E-STOP-IN исполнение MDI-команды.
Например:

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

 net estop <= parport.0.pin-10-in

...

net estop halui.command-mdi-00
Тогда при появлении на 10 входном пине сигнала - начнет выполняться M102 - зазвучит!!!

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

Re: Написание скриптов. Ликбез.

Сообщение Serg »

Есть конечно. Но для этого надо будет сначала этот скрипт запустить, а при выключении прибить.

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

#!/bin/sh

while : ; do
  if Res=`halcmd gets estop 2>/dev/null`; then
    if [ "$Res" = "TRUE" ]; then
      play /sound/file
    fi
  else
    exit 0
  fi
  sleep 3
done
Запускть где-нибудь в стартовых файлах командой

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

/path/script &
Последний раз редактировалось Serg 30 май 2013, 06:59, всего редактировалось 1 раз.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1923
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Написание скриптов. Ликбез.

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

А убивать?

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

Re: Написание скриптов. Ликбез.

Сообщение Serg »

Всё уже сделано: при закрытии софтины перестанет существовать сигнал estop и оно само тихо сдохнет.

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

Re: Написание скриптов. Ликбез.

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

Попробую разобрать скрипт "по полочкам"...

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

#!/bin/sh

while : ; do
  if Res=`halcmd gets estop 2>/dev/null`; then
    if [ "$Res" = "TRUE" ]; then
      play /sound/file
    fi
  else
    exit 0
  fi
  sleep 3
done
Первая строка - понятна - уже выше разбирался.
while : ; do - это создание цикла
if Res=`halcmd gets estop 2>/dev/null`; then - более сложная команда.
1. Исполняем команду halcmd gets estop 2>/dev/null, что означает, что-то вроде, взять пин estop из hal-а и сравнить его с нулем.
2. Значение этой команды присваиваем переменной Res
if [ "$Res" = "TRUE" ]; then
play /sound/file
- вложенный if. Если значение Res - True, то запускаем звук (сам запуск звука нужно взять из скрипта выше (я так понимаю, что эта строчка прописана условно).
sleep 3 - а это задержка ;)

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

Re: Написание скриптов. Ликбез.

Сообщение Serg »

Ворон226 писал(а):1. Исполняем команду halcmd gets estop 2>/dev/null, что означает, что-то вроде, взять пин estop из hal-а и сравнить его с нулем.
2. Значение этой команды присваиваем переменной Res
Это просто означает выполнить halcmd и её результат присвоить Res.
При этом проверяется код завершения halcmd: если 0, то всё хорошо, иначе сигнал не нашли и все умерли.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1923
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Написание скриптов. Ликбез.

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

Скрипт подправил и проверил - при включенном LCNC - работает. При включении кнопки Е_СТОП - звучит!
При выключении LCNC - скрипт сам закрывается.

Осталось его запустить при включении LCNC.
LinuxCNC с моей визуальной панелью запускается стартовым файлом start:

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

#!/bin/bash
cd /home/printer/linuxcnc-dev
. scripts/rip-environment
cd /home/printer/linuxcnc-dev/configs/MyGUI
linuxcnc MyGUI.ini
Стал дописывать его самостоятельно:

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

#!/bin/bash
cd /home/printer/linuxcnc-dev
. scripts/rip-environment
cd /home/printer/linuxcnc-dev/configs/MyGUI
linuxcnc MyGUI.ini
cd /home/printer/linuxcnc-dev/scripts
. /audio-script.sh
Не запускается... Что не так? Может последние строки должны быть

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

cd /home/printer/linuxcnc-dev/scripts
echo `./audio-script.sh`
Ведь, судя по первой строке, стартовый файл и есть стартовый скрипт на языке bash...
Но оба варианта не работают...
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Написание скриптов. Ликбез.

Сообщение Serg »

У тебя в стартовом скрипте последние две строчки выполняются только после завершения работы "linuxcnc MyGUI.ini".
Надо примерно так:

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

#!/bin/bash
Base=/home/printer/linuxcnc-dev
. $Base/scripts/rip-environment
$Base/scripts/audio-script.sh &
$Base/scripts/linuxcnc $Base/configs/MyGUI/MyGUI.ini
а в звуковом скрипте перед while вставить "sleep 10", чтоб он перед началом опроса дождался запуска linuxcnc.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1923
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Написание скриптов. Ликбез.

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

А чем отличается:

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

#!/bin/bash
cd /home/printer/linuxcnc-dev
. scripts/rip-environment
scripts/audio-script.sh
cd /home/printer/linuxcnc-dev/configs/MyGUI
linuxcnc MyGUI.ini
от:

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

Base=/home/printer/linuxcnc-dev
. $Base/scripts/rip-environment
$Base/scripts/audio-script.sh &
$Base/scripts/linuxcnc $Base/configs/MyGUI/MyGUI.ini
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Написание скриптов. Ликбез.

Сообщение Serg »

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

Re: Написание скриптов. Ликбез.

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

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

Base=/home/printer/linuxcnc-dev
. $Base/scripts/rip-environment
$Base/scripts/audio-script.sh &
$Base/scripts/linuxcnc $Base/configs/MyGUI/MyGUI.ini
Интересуют подробности:
1. Почему запуск скрипта rip-environment начинается с точки, а запуск скрипта audio-script.sh - нет, но заканчивается &?
2. Последняя строчка непонятна.
3. В где можно о подобном почитать на русском языке? Хотя бы сочетание терминов для поиска (а то даже не соображу как искать)?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Написание скриптов. Ликбез.

Сообщение nkp »

Ворон226 писал(а):Хотя бы сочетание терминов для поиска
ну bash наверно
или примерно - командная оболочка sh
Ответить

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