Интернет-журнал "Домашняя лаборатория", 2007 №5 - Федорочев
Шрифт:
Интервал:
Закладка:
То, что нам нужно будет в переменной $num, но это будет текст, не число. Превратить текст в число можно, например, с помощью функции dec(), которая работает только с десятичной записью числа (для октальных и шестнадцатеричных записей есть другие функции).
Полученное число добавляется в массив переменных @data с помощью команды push.
Осталось отсортировать массив @data и записать отсортированный в массив @sdata, что и было сделано с помощью команды sort.
Переходим к печати на принтере. Для этого должен быть открыт как файл, параллельный порт, к которому подключен принтер. Надеюсь, у вас тоже такой есть. Если принтер у вас сетевой, то этот пример вы не сможете использовать и можете смело переходить к следующему разделу, который посвящен средствам системы SOROS, включающим и возможность работы с сетевыми принтерами. Собственно говоря, QSL знает только последовательные порты, например СОМ1, COM2 и параллельные, например LPT1, но управлять он ими не умеет, это является функцией операционной системы. Для полного доступа к этим портам QSL должен использовать внешние программы, например средства системы SOROS.
Если бы мы использовали для вывода конструкцию print @sdata, то получили бы все числа напечатанные подряд. Чтобы вывести числа в столбик, в данном примере, был использован оператор повторения блока foreach. Этот оператор выполняет блок для каждой переменной массива, содержимое которой присваивается какой-либо, упоминаемой после имени оператора, но по умолчанию, как в нашем примере, присваивается системной переменной $_. Остается только вывести ее на принтер, снабдив символом перевода строки.
Взаимодействие с внешними программами
В первую очередь речь идет о взаимодействии со средствами пакета SOROS. Основу пакета составляют несколько мини-серверов осуществляющих операции чтения-записи устройств компьютера (параллельные и последовательные порты, все звуковые устройства) и обменивающихся данными с другими модулями пакета SOROS (soros.exe).
Запуск мини-серверов осуществляется нажатием кнопок на модуле DEVICE. Для каждого номера порта или звуковой карты запускается своя копия мини-сервера. Одновременно может быть запущено несколько мини-серверов. На рисунке для примера запущен сервер, оперирующий первым параллельным портом. Контрольно-измерительные модули PARALLEL (параллельный порт), SERIAL (последовательный порт) и INPUT (звуковая карта) могут подключаться к нужной копии минисервера. Для этого они имеют переключатель номера порта/карты (над кнопкой Read). На рисунке модуль PARALLEL подключен к серверу LPT1. Чтение устройства осуществляется кнопкой Read. Для каждого доступного бита есть своя кнопка установки, но запись установленных битов в порт осуществляется кнопкой Set.
На рисунке можно видеть, после чтения, что в порте LPT1, на 1, 5, 8, 10, 13 и 15 выводах разъема установлена логическая единица, а на остальных, соответственно, ноль.
Для запуска осциллографа INPUT нужно не только выбрать номер карты (соответствующий мини-сервер должен быть запущен), но и длительность развертки (время чтения) по оси X. Соответствующие переключатели выбирают усиление и положение на оси Y. Кнопка Stat на модуле INPUT переключает осциллограф в режим показа гистограммы входного сигнала.
Сброс системы SOROS в исходное состояние осуществляется кнопкой Init на контроллере крейта CRATE. Кнопка Printer, там же, позволяет запустить минисервер для принтера. На окне этого сервера можно выбрать нужный принтер, подключится к нему, и выбрать имя для сервера. Подразумевается, что будет использован сетевой принтер, поскольку параллельный порт (порты) необходимы для подключения контрольно-измерительных устройств. Переключатель Strob запускает режим циклического чтения (когда не 0 и кликнута кнопка Read). Чем больше значение на переключателе, тем реже производится чтение (делитель частоты стробового импульса).
При нажатой кнопке Setup можно подшить какой-либо скрипт, написанный на языке QSL, к кнопке на модуле PROGRAM, при ее нажатии конечно. Когда Setup отжата, кнопки модуля PROGRAM могут запускать скрипты на выполнение. Любой QSL скрипт можно также выбрать и выполнить с помощью кнопки Run.
К мини-серверам пакета SOROS может подключаться и интерпретатор QSL. Для взаимодействия с серверами используется «клиент-сервер» модель и DDE. QSL всегда является клиентом с именем «QSL». Сервер может быть открыт как файл, командой open. Имена внешних программ (драйверов) должны предваряться символом #. Сами имена мини-серверов уже заложены внутри их программ, но входящий в них номер порта/карты выбирается при запуске с панели системы SOROS. К некоторым устройствам, таким как аудио и видео периферия, командные последовательности могут быть посланы через MCI (смотрите документацию на QSL и MCI). К настоящему моменту в пакет входит всего 4 сервера: принтер, параллельный порт, последовательный порт и звуковая карта, но каждый желающий может изменить их или добавить другие. Все источники предоставляются.
Далее следуют примеры программирования скриптов для работы с минисерверами.
Урок 4. И снова принтер
# Lesson 4
open (PRN, ">#printer) || die "";
print PRN "Nice weather today, isn't it?n";
close PRN;
Надо полагать, что в этом примере все уже знакомо. Следует учесть только, что до его выполнения соответствующий сервер должен быть запущен и настроен. Тоже самое относится и к последующим примерам.
Урок 5. Параллельный порт
В действительности QSL не имеет каких-либо специальных команд для контроля драйверов. Одним из возможных решений этой проблемы может являться использование управляющих символов в выводимых данных и использование отрицательного размера буфера для ввода в стандартных командах ввода-вывода QSL.
# Lesson 5
open(LPT, "+#LPT1") || die "";
$reg = " ";
read(LPT, $reg, — 2); # read status and control registers
($sr, $cr) = unpack("CC", $reg);
printf "%xn%x", $sr, $cr;
$cr |= 0x20; # bi-direct
$reg = pack("CC", 0x01, $cr); # SOH + control byte
print LPT $reg;
print LPT "Hello, world!r";
sleep 3000;
close LPT;
warn " ";
Обратите внимание, что в команде чтения read размер буфера дан отрицательным, это является просьбой к серверу вернуть значения контрольного регистра и регистра чтения (два байта). Естественно, что сервер понимает это (смотрите программу этого сервера). Поскольку с сервера будет получена текстовая строка, переменная $reg была сделана текстовой, путем записи в нее пары пробелов.
Для передачи значения регистров упаковываются в текстовую строку, команда unpack распаковывает ее ($reg) на два байта без знака (код С) и помещает, в соответствующие названиям регистров, переменные. Последующий printf, просто для наглядности, выводит значения этих регистров на консоль, в шестнадцатеричном формате. Далее, после нужного изменения содержимого регистров, они снова упаковываются в текстовую строку командой pack и отсылаются на сервер командой print. Параллельный порт готов к работе, если там имеется принтер, то можно отпечатать что-нибудь, но