Страница 1 из 3
Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 21:49
Ворон226
Пришел момент разборок со скриптами. Пора!
Что же это такое? Чем отличается скрипт от пользовательского компонента?
Проверим, правильно ли я это понимаю?
Компонент LinuxCNC - это подпрограмма, состоящая из входных и выходных пинов, параметров и набора функций над этими элементами компонента.
Например, компонент and2. Подпрограмма, которая имеет два входных пина: in0 и in1, один выходной пин - out, и функция логического"И".
А вот скрипт (по моим нынешним понятиям, которые ни в коей мере на претендуют на истинность) - это программа, которая выполняется при обращении к ней, и содержит набор команд, в том числе и системных, для выполнения некоторой процедуры (вывода текста на принтер, отображения картинки на мониторе, процедуры закрытия программы или системы и т.п.).
Очень буду рад получить "по сусалам" или дружескую критику на мою писанину.

Re: Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 22:03
Ворон226
Есть более-менее понятное описание процесса написания скриптов -
здесь и
здесь.
Попробую, следуя описаниям написать свой скрипт, а затем "внедрить" его в структуру .hal станка...
Тут и повод подвернулся: нужен скрипт, который будет воспроизводить нужные звуки при определенных событиях.
Итак...
Re: Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 22:29
Ворон226
Воспользуемся стандартным способом воспроизведения звуковых файлов - командой
aplay
Здесь 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
Никакой информации о проигрываемом файле...
Re: Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 22:45
Ворон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 - завершение
Т.е. такую однострочную скрипт-команду вполне можно выполнить в терминале за раз.
Re: Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 23:19
Ворон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 - окончание скрипта
Re: Написание скриптов. Ликбез.
Добавлено: 27 май 2013, 23:44
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 - требуемое число воспроизведений ( != - это НЕ РАВНО)
Это ошибка! Выражение "!=" сравнивает две строки. Для чисел правильнее писать так:
Ворон226 писал(а):echo `do aplay --quiet /usr/share/sounds/alsa/Noise.wav'
Подробнее:
echo - команда вывода на экран, но, если за ней стоит сообщение в апострофах 'сообщение', то это означает - выполнить команду.
В конце апостроф неправильный - должен быть тоже обратный.
Это не просто "выполнить команду", а "выполнить команду и подставить вместо неё результат".
Re: Написание скриптов. Ликбез.
Добавлено: 28 май 2013, 00:09
Ворон226
Дык я тут же и проверяю и корректирую
Далее.
Сохраняем этот файл под именем, например
audio-script.sh
Теперь заходим из терминала в папку с сохраненным скриптом и выполняем:
Так мы сделали наш скрипт исполняемым.
Теперь его можно запустить из командной строки терминала или консоли:
И мы услышим трижды звуковой сигнал.
Ура!
Осталось встроить скрипт в linuxcnc.
Например, чтобы звуковой файл начинал воспроизводиться при срабатывании E-STOP.
Но это уже утром

Re: Написание скриптов. Ликбез.
Добавлено: 28 май 2013, 00:17
Ворон226
А действительно - КАК заставить исполняться скрипт по срабатыванию E-STOP?
Re: Написание скриптов. Ликбез.
Добавлено: 29 май 2013, 23:05
Ворон226
Первый вариант:
Скрипт сохранить как M-команду (чуть подробнее написано
тут).
В .INI прописать:
(MDI-команда с пользовательской M-командой)
А в .HAL привязать к нужному пину, например, E-STOP-IN исполнение MDI-команды.
Например:
Код: Выделить всё
net estop <= parport.0.pin-10-in
...
net estop halui.command-mdi-00
Тогда при появлении на 10 входном пине сигнала - начнет выполняться M102 - зазвучит!!!
ВОПРОС: А нет ли варианта проще запускать скрипт по событию? Может в самом скрипте прописать слежение за пином linuxcnc? И следить постоянно... Но как?
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 00:26
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
Запускть где-нибудь в стартовых файлах командой
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 06:50
Ворон226
А убивать?
Команду на закрытие скрипта можно поместить в М-код для выключения станка.
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 06:58
Serg
Всё уже сделано: при закрытии софтины перестанет существовать сигнал estop и оно само тихо сдохнет.
P.S. поправил скрипт - забыл задержку сделать, чтоб проц не жрало.
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 07:34
Ворон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 - а это задержка
Если всё так, то сегодня опробую...
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 10:26
Serg
Ворон226 писал(а):1. Исполняем команду halcmd gets estop 2>/dev/null, что означает, что-то вроде, взять пин estop из hal-а и сравнить его с нулем.
2. Значение этой команды присваиваем переменной Res
Это просто означает выполнить halcmd и её результат присвоить Res.
При этом проверяется код завершения halcmd: если 0, то всё хорошо, иначе сигнал не нашли и все умерли.
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 22:16
Ворон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...
Но оба варианта не работают...
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 22:30
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.
Re: Написание скриптов. Ликбез.
Добавлено: 30 май 2013, 22:53
Ворон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
Re: Написание скриптов. Ликбез.
Добавлено: 31 май 2013, 01:11
Serg
Отсутствием бессмысленного скакания по каталогам.

Да и просто компактнее и базовый каталог при необходимости меняется в одном месте, а не ищется по всему скрипту.
Re: Написание скриптов. Ликбез.
Добавлено: 31 май 2013, 06:44
Ворон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. В где можно о подобном почитать на русском языке? Хотя бы сочетание терминов для поиска (а то даже не соображу как искать)?
Re: Написание скриптов. Ликбез.
Добавлено: 31 май 2013, 07:34
nkp
Ворон226 писал(а):Хотя бы сочетание терминов для поиска
ну
bash наверно
или примерно -
командная оболочка sh