Поэтому разработана универсальная специальная DLL –библиотека, которая написана на языке Dеlphi 3. Dll выполняет функцию расширения языка для различных языков программирования.


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

НАЦИОНАЛЬНЫЙ ИССЛЕДО
ВАТЕЛЬСКИЙ

ТОМСКИЙ ГОСУДАРСТВЕН
НЫЙ УНИВЕРСИТЕТ

ФИЗИЧЕСКИЙ ФАКУЛЬТЕТ








Курс лекций п
о дисциплине


АВТОМАТИЗАЦИЯ ЛОКАЛЬ
НОГО ФИЗИЧЕСКОГО
ЭКСПЕРИМЕНТА




Горчаков Л.В
.















Томск

2013
2


Оглавление


1

Сопряжение устройств с компьютером

1
.1 Последовательный интерфейс

1
.2 Параллельный порт Centronics

1
.3 Вывод данных через принтерный порт

1
.4 Управление шаговым двигателем через принтерный порт

2 Управление эксперментом с помощ
ью микроконтроллера

3

Использование пакета
Office

для управления физическим экспериментом

Литература



1

Сопряжение устройств с компьютером


При автоматизации физических исследований необходимым элементом
автоматизированных систем являются устройства сопря
жения, связывающие управляющий
компьютер с исследуемым физическим объектом. В настоящее время наметилось два
подхода к созданию таких устройств
:
1) использование готовых модулей универсального
типа, разработанных специализированными фирмами (устройства С
-
C
ontrol, National
Instruments, Agilent Technology совместно с прилагаемым к ним программным обеспечением)
и 2) самостоятельная разработка устройств сопряжения на основе электронных компонентов.
Каждый из них имеет свои достоинства и недостатки. Стандартные
устройства сопряжения
проектируются исходя из максимальной универсальности, что означает высокую стоимость
прибора. Созданные самостоятельно устройства решают, как правило, узкую задачу. К
персональному компьютеру устройство сопряжения может быть подключен
о в настоящее
вре
мя 7 способами, соответствующим

7 типам стандартных внешних интерфейсов, средства
которых входят в базовую конфигурацию компьютера:

-

через системную магистраль или шину (ISA или другого типа)
;

-

через параллельный интерфейс Centronics
;

-

через
последовательный интерфейс RS
-
232C
;

-

через инфракрасный порт IrDA
;

-

через универсальную системную шину USB
;

-

через игровой порт
;

-

через скоростную шину Fire Wire.

Приведем в таблице
1

сравнение характеристик для первых трех способов подключения

Таблица 1


Систе
мная шина ISA

Интерфейс Centronics

Интерфейс RS323C

Длина и тип линии связи

До 5 Мб
\
с

До 100 Кб
\
с

До 10 Кб
\
с

Допустимая сложность УС

Малая
-
средняя

Любая

Любая

Дополнительный
конструктив

Не нужен

Нужен

Нужен

Внешний источник питания

Не нужен

Нужен

Нужен

Формат и разрядность
данных

Параллельный

8 или 16 разрядов

Параллельный

8 разрядов

Последовательный

1 разряд

Количество одновременно
подключаемых УСО

До 6

1

1

Из таблицы видно, что выбор системной магистрали обеспечивает наибольшую
скорость обмена ср
еди трех приведенных. При этом не требуется ни отдельного
конструктива, ни дополнительного источника питания. В то же время одноплатное
3


использование ограничивает сложность УСО, а соседство с быстродействующими и
мощными цифровыми узлами компьютера приводи
т к высокому уровню электромагнитных
помех и наводок по цепям питания. Выбор Centronics или RS232 позволяет расположить
сложные УСО на большом расстоянии от компьютера, но при этом достигается гораздо
меньшая скорость обмена, а также требуется внешний конс
труктив и дополнительный
источник питания, что существенно увеличивает стоимость системы. Без специальных
ухищрений через эти интерфейсы можно подключить только одно УСО. Обмен в
парал
лельном формате гораздо проще,
чем в последовательном.


1
.1 Последовател
ьный интерфейс


При последовательной передаче данных биты, составляющие код символа,
пересылаются по очереди друг за другом по одному проводнику, возвратным проводом
служит провод заземления. ПК имеет два коммуникационных порта COM , которые
используются
для асинхронной последовательной передачи данных путем посылки и
получения ASCII кода в стандарте RS232C, который еще известен под названием EIA
-
232
-
D.

СОМ порт представлен снаружи компьютера в виде 25 контактного разъема Д
-
типа,
назначение контактов кото
рого показано на рисунке
1
.1.




Рисунок
1
.1 Назначение контактов


Этот стандарт поддерживает ряд протоколов CCITT, V.24,V.28 и ISO2110. В стандарте
RS232 соглашение относительно представления логической 1 и 0 не совпадает с
представлением в TTL логике, г
де 1
-

это уровень от +2.4 до 5 в, а 0
-

от 0 до 0.8 в. Схемы на
TTL элементах не являются помехоустойчивыми при работе на длинных кабелях в среде с
4


высокой интенсивностью шумов. В случае стандарта RS232 уровень напряжения в пределах
+5+15
В

считается высоким

и представляет логический 0.У
ровень напряжений от
-
5 до
-
15В

считается низким и соответствует логической 1. Уровни, соответствующие ненагруженному
формирователю могут меняться

еще в большем диапазоне до 25В
. Широкий диапазон
изменения сигнальных уровней и

неопределенная зона в пределах 3
В

выбраны с целью
минимизации электрических шумов при работе с длинным кабелем (до 15 метров при
расстоянии от терминала до модема). Таким образом, становится понятным, что интерфейс
для последовательной передачи данных дол
жен быть сложным, так как необходимо
выполнять преобразования из параллельного кода в последовательный, да еще и
согласовывать различные стандарты. Дело усложняется еще и тем, что передача должна быть
асинхронной, поскольку минимальное число символов, пере
даваемых в секунду,
определяется скоростью работы передатчика, а передатчик может сделать паузу любой
длительности между символами. Поэтому необходимо использовать квитирование
установления связи. Квитирование
-
это процедура обмена сигналами для установлени
я связи,
осуществляемой только при определенных условиях. Чтобы установить надежную связь
устройства выдают в сеть сигналы, с помощью которых они информируют друг друга о том,
имеются ли у них данные для передачи или готовы ли они к приему данных. Если одн
о
устройство направляет какой
-
либо символ другому устройству, которое в этот момент занято
выполнением какой
-
либо задачи, то переданный символ будет потерян. Чтобы
информировать приемник о наличии данных для передачи, передатчик направляет сигнал
©запроса
передатчикаª (RTS). Этот сигнал либо прерывает текущую операцию, либо
приемник фиксирует его поступление в процессе циклического опроса. Обнаружив такой
сигнал, приемник заканчивает текущую операцию и отвечает передатчику сигналом ©сброс
передатчикаª (CTS)
, указывающим, что приемник готов к приему символов. Передатчик не
передает никаких данных до тех пор, пока на его вход не поступит сигнал CTS. Для систем с
односторонней передачей данных, например, в системе сбора информации от датчиков, где
компьютер тол
ько принимает информацию, а датчик только передает, достаточно
использовать лишь два сигнала квитирования

-

один входной и один выходной. Таким
образом, кроме информационной линии для передачи данных необходимо по крайней мере
еще две линии для квитировани
я. Рассмотрим теперь процесс передачи символа, например
буквы r латинского алфавита. Пример тако
й передачи приведен на рисунке 1
.2.




Рис
унок

1
.2 Вид кода


В 7

битной кодировке это соответствует следующему двоичному числу 1010010. Для
того, чтобы схемы
могли вычленить из сплошного потока 7
-
битные последовательности,
5


приходится окружать их служебными битами. Обычно линия в состоянии покоя имеет
логический уровень 1 и соответственно
-
15
В
. Поэтому стартовым битом будет являться
перевод линии в состояние лог
ического нуля, после которого дается интервал длительностью
равной половине длительности бита для избежания ошибок. После окончания передачи 7
-
битовой последовательности передается обычно бит четности и стоповой бит в виде
логической единицы. Биты символа
передаются, начиная с самого младшего разряда. Таким
образом, передача символа R сведется в этом случае к передаче 10 бит, показанной на
рисунке. Контрольный бит четности служит для обнаружения ошибок при передаче данных.
Одиночная ошибка изменения числа е
диниц или нулей с четного на нечетный будет таким
образом обнаружена. Длина стопового бита может составлять 1, 1.5, 2 длины обычного бита.
Число изменений состояния канала передачи данных в секунду называется скоростью
передачи в бодах. В системе с двумя в
озможными состояниями скорость передачи в бодах
равна числу битов, передаваемых за секунду.

Каждый ПК обладает одним или несколькими последовательными
RS
232
-
интерфейсами, которые или уже интегрированы жестко на материнской плате или
вставляются через слот
ы. Каждый сериальный интерфейс состоит в сущности из
UART

8250
(или 16450(
Universal

Asynchronous

Receiver
/
Transmitter
)

и последующих драйверов
приемника и передатчика для преобразования между
TTL
-

уровнем и
RS
23
2

уровнем (+/
-
12
вольт).
Рисунок

2.3

показыв
ает принц
ипиальное строение интерфейса.



Рисунок 1.
3

Вид кода


Порты с первого по четвертый СОМ1
-
СОМ4 отличаются своими адресами в области
ввода
-
вывода и номерами прерывания (
IRQ
). Первый адрес
UART

обозначается как базовый
адрес (ВА)
.

Базовые адреса и
I
RQ

могут быть установлены через джамперы на карте или
через программы инициализации.

Т
аблица

2

дает обычное приписание

СОМ 1 и СОМ3, как и
СОМ2 и СОМ4 разделяют один общий канал прерывания. Это означает, что программа
может использовать только один из этих

интерфейсов. Более чем два интерфейса
6


одновременно можно использовать лишь тогда, когда используется

программа без
употребления прерывания
.

Таблица 2


Это возможно по
DOS
-

программам

в Турбо
-
Паскале. Обработка последовательных
символов под
Windows
,

однак
о
,

всегда использует прерывания. Функции интерфейса
управляются полностью через 10 регистров
UART
. Так как только имеется 8 адресов,
используется внутреннее переключение через
DLAB
-
бит (
бит 7 в регистре управления
проводниками)
.

Адреса отдельных регистров
заданы тут со своими смещениями, т.е. с их
расстоянием относительно базового регистра.


Перед переносом данных необходимо сначала инициализировать
UART
, программируя
отдельный управляющий регистр соответственно желаемым параметрам передачи.
Собственно пос
ледовательный перенос следует маленькими блоками из 8 бит, т.е.
отдельными байтами. Чтобы послать один байт, записывают его в регистр передачи


7


При приеме сериально посланного байта достигает он параллельно в приемный регистр


Для передачи необходимо выб
рать скорость передачи, которая задается в битах в секунду (
бодах). При 1200 бод совместно с одним стартовым и одним стоповым битами в секунду
передается до 120 символов с длиной в 8 бит.
UART

8250 применяет кварцевый генератор с
частотой 1.8432 МгГц. Эта

частота внутри делится на устанавливаемый делитель до 16
-
кратной бодовой скорости., т.е.

Делитель=1843200/(16*бодовая скорость)=115200/бодовая скорость

Делитель должен быть разложен в старший и младший байты и записан в соответствующий
регистр (адрес смещ
ения 0 и 1 при установленном
DLAB
-

бите.



Следующая таблица показывает установки для важнейших бодовых скоростей


От последовательного интерф
е
йса могут быть разрешены прерывания. Для этого нужно
программировать регистр освобождения прерываний. Чтобы о
дно или несколько
прерываний активировать, нужно установить соответствующие биты.

8



Освобождение прерываний для

SINP
: изменение состояния проводника рукопожатий

ERBK
: распознавание ошибки или
BREAK

TBE
: буфер остановки посылки пуст

R
Х
RD
: принят символ

Ошиб
ка может быть распознана при приеме, если например не сохраняется общая длина
символа или число стоповых бит. Если установлен на входе
RXD

фиксированный высокий
уровень, тогда соответствует это состоянию
BREAK
, Это состояние оценивает ход
нормального врем
ени передачи объединенных битовых данных как ошибку приема.


Чтобы прерывания разрешить, должны быть выполнены еще два условия: во
-
первых должен
быть запрограммирован соответственно контроллер прерываний, во вторых должен быть
установлен проводник
OUT
2 (би
т 3 в регистре управления модемом.) Если встречается одно
из многих возможных прерываний, можно в регистре распознавания прерываний узнать его
источник


ID
1,
ID
0: биты идентификации

00: изменение состояния проводника рукопожатия

01: буфер остановки посылки

пуст

10: принят символ

11: распознана ошибка или
BREAK
-
условие

PND
: встретилось прерывание

Зависимое прерывание после изменения состояния проводника рукопожатия снова
разрешается через чтение регистра статуса модема. Точно также разрешается чтение
регистр
а остановки приема прерывания приема и чтение регистра статуса проводника при
ошибке или
BREAK

состоянии. Прерывание через пустой регистр остановки посылки может
быть очищено или через чтение регистра распознавания прерывания или через запись в
регистр ос
тановки посылки.

Регистр управления проводниками в нормальном случае следует записывать только для
инициализации последовательного интерфейса. Он содержит 8 управляющих бит для
установки параметров передачи:


DLAB
: освобождение доступа к регистру бодовой
скорости

BRK
: установка
BREAK
-

состояния у
TXD

PAR
2 …
PAR
0: установка битов четности

000: нет

9


001:нечетный

011:четный

101:пометка

111:пробел

STOP
: установка двух стоповых бит

DAB
1…
DAB
0: число бит данных

00:5 бит

01:6

10:7

11:8 бит

DLAB


бит влияет на внутре
ннее переключение регистра с адресами смещения 0 и 1. Он
должен быть установлен, чтобы устанавливать бодовую скорость, в нормальном режиме
должен быть очищен.

BRK

бит может применяться , чтобы управлять состоянием
TXD

полностью независимо как вывод в отли
чии от нормальной функции
UART
.

Остальные биты регистра устанавливают для передатчика и приемника
UART

соответствующую четность, число стоповых бит и число бит данных. Обычный формат 8
бит данных, без четности и один стоповый бит. Для этой настройки нужно

лишь установить
оба бита
DAB
1 и
DAB
0 ( содержимое регистра=3). Вместе со стартовым битом тогда
передается всего 10 бит, так что при скорости передачи в 19200 бод точно 1920 символов в
секунду передается.

Регистр управления проводниками служит в сущности
для управления дополнительными
выходами
UART
. Тогда как
DTR

и
RTS

можно использовать,
OUT
2 и
OUT
1 не доступны
снаружи как дополнительные выходы.
OUT
2 выполняет однако важную функцию при
активировании прерываний. Это проводник должен быть установлен, чтобы
вообще
передавать прерывание.


LOOP
: внутренняя обратная связь для целей тестирования

OUT
2: установить
OUT
2¸чтобы были возможны прерывания

OUT
1: внутренний проводник
OUT
1 установить

RTS
: установить проводник
RTS

DTR
: установить проводник
DTR

LOOP

бит целе
сообразно устанавливать, чтобы тестировать собственную программу.
Посылаемые символы принимаются без необходимости установления внешнего соединения
между
TXD

и
RXD
.

Регистр статуса проводников содержит 7 статусных бит, через которые можно прочитать
действи
тельное состояние последовательного передатчика и приемника


TXE
: последний символ полностью послан

TBE
: регистр остановки посылки пуст

10


BREK
: распознано состояние
BREAK

FRMF
: распознана ошибка формата

RARF
: распознана ошибка четности

UBLF
: распознана ошиб
ка переполнения

RXRD
: принят символ

Как только установлен
TBE
-

бит можно записывать новый символ в регистр остановки
посылки. Эти символы однако сначала передаются в регистр сдвига, если не должно бол
ь
ше
обрабатываться других знаков. Как только последний з
аписанный символ в регистр защелки
посылки передается, устанавливает
UART

свой
TBE
-

бит.
TXE
-
бит напротив только тогда
устанавливается, когда последний символ полностью передан.

Для направления приема показывает
RXRD
-
бит, что имеются символы в распоряжении
.
Следует своевременно прочитать регистр защелку приема, чтобы не быть переписанным
следующим символом. В последнем случае было бы указано
UBLF

переполнение.
Переполнения можно предотвратить или наблюдая в работе за достаточно быстрым
изменением
RXRD

-
бит
а, или используя процедуру прерывания, которая обрабатывает
приходящий символ.

Состояния входов
DCD
,
RI
,
DSR
,
CTS

можно прочитать через регистр состояния модема.
Тогда как верхние 4 бита прямо отражают состояния 4 проводников, показывают нижние 4
бита, случил
ось ли с последнего доступа к чтению у регистра статуса модема изменение
состояния у проводника.


DCD
: проводник
DCD

установлен

RI
: проводник
RI

установлен

DSR
: проводник
DSR

установлен

CTS
: проводник
CTS

установлен

DDCD
: изменение состояния у
DCD

DRI
: из
менение состояния у
RI

DDSR
: изменение состояния у
DSR

DCTS
: изменение состояния у
CTS


UART

8250 и его последующий тип 16450 обрабатывают только один символ. Если принят
новый символ до того как старый прочитан, происходит потеря данных. Чтобы при высоких

скоростях передачи было возможно проводить выполнение других задач, обладают новые
16550 схемы двумя 16
-
байтовыми промежуточными областями памяти для направлений
приема и передачи. Дополнительная память организована по так называемому
FIFO

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

FIFO

память после сброса сначала неактивна и должна быть инсталлирована для работы
через
FIFO

регистр контроллера. Этот регистр доступен только в направле
нии записи через
адрес смещения 2, при чтении здесь находится регистр распознавания прерывания, который
также имеет расширенную функцию

11



TL
1,
TL
0: уровень триггера после прерывания

00:1 байт

01:4 байта

10:8 байт

11:14 байт

FRT
:
FIFO
-
сброс для передатчика

F
RR
:
FIFO

сброс для приемника

FEN
:
FIFO

установка

Если работают без
FIFO

и для совместимости с 8050, тогда нужно записать 6 в регистр.
Через это следует одновременно сброс и отключение
FIFO
. Включен ли
FIFO

можно
выяснить

по дополнительному статусному биту р
егистра распознавания прерываний


FON
:
FIFO

установлен

FON
2:
FIFO

установлен ( только для 16550А)

ID
2: бит идентификации: таймаут

ID
1,
ID
0: биты идентификации

00: изменение состояния проводника рукопожатия

01: буфер
-
защелка посылки пуст

10: принят символ

1
1: распознана ошибка или
BREAK

условие

PND
: случилось прерывание

Выход с микросхемы выводится на заднюю панель компьютера в виде разъема 25
-

или 9
штырькового Д
-

типа
.

Соответствие, расположение штырьков и их назначение приведены на рисунке
1
.3.

12



Рис.
1
.
3 Назначение контактов пос
л
едовательного порта

Для сопряжении двух устройств, обменивающихся сигналами квитирования необходимо
подключить вывод передаваемых данных (TD) передающего устройства к выводу
принимаемых данных (RD) принимающего устройства, соедин
ить между собой сигнальные
заземления обоих устройств,соединить между собой требуемые выводы
квитирования,соединить остальные действующие входы квитирования к точке с
напряжением положительной полярности все прочие выводы оставить неподключенными.

Часто в
качестве линий квитирования используются только линии, подключенные к выводам
RTS и CTS.

В случае, если передача и прием ведется без сигналов квитирования простейшее
подключение состоит из соединения линий TD и RD друг с другом и соединения земли.
Тако
й кабель, который будет иметь всего три линии, называется нуль
-
модемным.

Смещение 00 указывает на буферный регистр чтения приемника и регистр записи
передатчика, который доступен, когда бит DLAB в регистре формата данных (смещение 03 )
равен нулю.

По смещ
ению 03 находится регистр формата данных, который определяет параметры
передаваемых данных
-

скорость, количество битов данных, количество стоповых битов и
настройка проверочного бита. Назначение битов регистра приведено ниже:

DLAB BRK PAR2 PAR1 PAR0 STOP D
AB1 DAB0

DLAB 1=доступ к установке скорости

13



0=доступ к регистру приемопередатчика

BRK 1=остановка включена


0=остановка выключена

PAR2,1,0 000=нет проверки


001=нечетная


011=четная



101=всегда 1


111=всегда 0

STOP 1=2 стоповых бита


0=1 стоповый бит

DAB1,0 00=5 бит данных


01=6 бит данных


10=7 бит данных


11=8 бит данных

Когда бит DLAB рав
ен 1 , регистры приемопередатчика (00) и разрешения прерываний (01)
используются для загрузки делителя скорости обмена. В первый записывается младший , во
второй
-

старший байт делителя. Они формируют шестнадцатибитный делитель, значение
которого вычисляетс
я по следующей формуле

Делитель=байт(регистр 00)+256*байт(регистр 01).


В компьютере тактовая частота, подаваемая в UART составляет 1.8432 МГц. Внутри UART
эталонная частота образуется как тактовая, деленная на 16 и равна 115

200 Гц. Соотношение
между знач
ениями делителя и скоростью, поэтому можно представить в виде формулы
Скорость=115200/Делитель. Следовательно, чтобы получить скорость 9600 бод необходимо,
чтобы делитель был равен 12. Значит, в буферный регистр приемопередатчика (00h) нужно
записать число

12, а в регистр разрешения прерываний (01h)
-

ноль.

Базовые адреса СОМ
-
портов по умолчанию равны СОМ1:3F8h, COM2:2F8h, COM3:3E8h,
COM4:2E8h.

При включении или перезагрузке компьютера BIOS проверяет адреса всех установленных
последовательных портов. Если он
а находит такой порт, то заносит базовый адрес
(двухбайтное число) в определенную ячейку памяти. Для СОМ1 это ячейки 0000:0400h и
0000:0401h . Базовый адрес можно получить, считав их содержимое. Информация о базовых
адресах остальных установленных последов
ательных портов хранится в следующих ячейках

СОМ2: 0000:0402
-
0000:0403

СОМ 3:0000:0404
-
0000:0405

СОМ4 :0000:0406
-
0000:0407.

Однобайтовая ячейка памяти 0000:0411 в первом, втором и третьем битах содержит общее
количество установленных СОМ
-
портов:

000
-
СОМ
-
по
рты не установлены

001
-

установлен один СОМ

порт

010
-
установлено два СОМ
-
порта

011
-
установлено три СОМ
-
порта

100
-

установлено четыре СОМ
-
порта.

Для получения числа портов и их базовых адресов можно написать программу на каком
-
либо
языке программирования.
На

языке

BASIC
она

будет

иметь

вид

10 DEF SEG=0

20 PRINT “Number of RS232 ports:”,(PEEK(&H411)AND (1+2+4))

30 PRINT “Address of COM1:”,PEEK(&H400)+256*PEEK(&H401)

40 PRINT “Address of COM2:”,PEEK(&H402)+256*PEEK(&H403)

14


50 PRINT “Address of COM3:”,PEEK(&H
404)+256*PEEK(&H405)

60 PRINT “Address of COM4:”,PEEK(&H406)+256*PEEK(&H407)

70 INPUT A

На языке ТурбоПаскаль это будет выглядеть так

Procedure COM_address;

Var COM:array[1..4] of integer;

number_of_COM:integer;

Begin

Number_of_COM:=mem[$0000:$0411];

Numbe
r_of_COM:=(Number_of_COM and (4+2+1));

COM[1]:=memw[$0000:$0400];

COM[2]:=memw[$0000:$0402];

COM[1]:=memw[$0000:$0404];

COM[1]:=memw[$0000:$0406];

Writeln(‘Number of COM installed:’,Number_of_COM:2);

Writeln(‘Addresses for COM1 to COM4:’,COM[1]:3,COM[2}:3,
COM[3]:3,COM[4]:3);

End;

Прежде чем использовать СОМ

порт, его необходимо настроить на определенный формат
передачи данных, то есть установить скорость, количество битов данных, количество
стоповых битов и бит проверки. Существует три метода настройки. Первый заключается в
исполь
зовании команды MODE операционной системы MS DOS. Синтаксис команды можно
представить так:

MODE COMm: baud=b,parity=p,data=d,stop=s,retry=r

MODE COMm:b,p,d,s,r

MODE COM1:96,n,8,1 настраивает СОМ1 со следующими параметрами: скорость9600 бод,
без проверки че
тности, 8 бит данных,1 стоповый бит. Указанная команда может быть
включена в файл autoexec.bat. Недостаток такого метода
-

невозможность изменить формат
передачи данных в пользовательских программах.

Второй метод использует прерывание BIOS int 14h , которое

позволяет выполнять настройку
порта из программы пользователя. Для этого необходимо в регистр АН загрузить 0, а в DX


число от 0 до 3, указывающее на соответствующий порт (СОМ1
-
СОМ4). В регистр AL
загружается байт инициализационных данных, значения битов

которого приведены ниже

BD2 BD1 BD0 PAR1 PAR0 STOP DA1 DA0

BD2
-
BD0 ( скорость) 111
-
9600





011=600





110=4800





010=300





101=2400





001=150





100=1200





000=110

PAR1,0 (проверка на четность) 00или 10=нет проверки






01=нечетная






11
=четная

STOP (количество стоповых бит) 0=1







1=2

DA1,0 (длина блока данных) 10=7 бит






11=8 бит

15



Следующая команда на языке Паскаль делает то же , что и команда DOS MODE
COM1:96,n,8,1.

Procedure initialize;

Var register:registers;

Begin

W
ith register do begin

Ah:=0;al:=128+64+32+0+0+0+2+1;dx:=0;intr($14,register); end;end;


Ограничение описанного метода состоит в том, что можно задать скорость только 9600 бод.
UART 16450 способен работать со скоростью 115200 бод, что достигается
непосредс
твенным обращением к регистру.

Третий, наиболее гибкий метод настраивает порт посредством записи данных в регистр
формата данных UART (смещение 03). Следующая

программа

выполняет

это

Procedure write_data_format( RS232_addres,Baud, Parity,Data_bit,Stop_bit:
integer);

Var byte1,byte2,output_byte:byte;

Divisor:integer;

Begin divisor:=115200 div Baud;

If divisor=256 then begin byte1:=divisor;byte2:=0;end;

If divi�sor 256 then begin byte1:=divisor mod 256;byte2:=divisor div 256;end;

Output_byte:=(data_bit
-
5)+4*(
stop_byte
-
1)+8*(parity);

Port[RS232_Address+3]:=128;

Port[RS232_Address+0]:=byte1;

Port[RS232_Address+1]:=byte2;

Port[RS232_Address+3]:=output_byte;

End;


Для передачи и приема последовательных данных существует несколько способов: с
помощью команд операционной системы, прерываний BIOS или непосредственного доступа
к порту. Последний способ наиболее удобен при проведении операций ввода/вывода общего
назначе
ния. Рассмотрим пример для порта COM1. Чтобы передать данные, можно записать
их непосредственно в буферный регистр передатчика 3F8h, используя следующий оператор
языка Бейсик:

OUT 3F8h,X, где Х
-

данные в десятичном формате. Для получения данных из порта С
ОМ1
считываются данные из буферного регистра приемника 3F8h. С этой целью используется
другой оператор языка Бейсик (Y
-
входные данные в десятичном формате):


Y=INP(3F8h);

Следующие две процедуры на языке ТурбоПаскаль делают то же самое.

Procedure write_tra
nsmit_buffer(RS232address,output_byte:integer);

Begin

Port[RS232address]:=output_byte;

End;

Function read_buffer(RS232address,output_byte:intteger):integer;

Begin read_buffer:=port[RS232address];

End;


Применение
RS232
в ТурбоПаскале


Листинг показывает вс
е необходимые процедуры для применения последовательного порта
COM
1 в ТурбоПаскале под
DOS

вместе с маленькой главной программой. Программа
применяет прямое программирование
UART

через команды портам. Этот способ может быть
16


использован только для старых
DO
S
-
систем, но не может быть применен в
DOS
-

окне
начиная с
Windows

98, так как здесь прямой доступ к портам запрещен. Процедура
Offnen

соответсвует по своей манере действия команде
OPEN

в Бейсике. Сначала необходимо
передать скорость передачи в
UART
. Она до
лжна здесь соответствовать 1200 бод. После того
как старший бит (
DLAB
) установлен в 3
FB
, можно загрузить оба регистра бодовой
скорости. Одновременно с установкой других параметров интерфейса бодовые регстры
освобождаются путем сброса
DLAB
. Биты 0 и 1 в ре
гистре проводника определяют ширину
данных в 8 бит, бит 2
-
одиночный стоповый бит. Совместно передается значение 3. Через это
при открывании инферфейса проводники
RTS

и
DTR

автоматически устанавливаются в
высокий уровень.Для гарантии вычитывется управляющи
й регистр приема, чтобы
опустошить его.

Процедура
Schlisen

служит для окончания передачи данных. Все установленные параметры
UART

осовобождаются. Особенно важно установить управляющий регстр модема на нуль.
Этим сбрасываются проводники
RTS


и
DTR
, чтобы по
казать подключенному прибору
,

что
обмен данными завершен.

Процедура
Senden

получает посылаемый байт в переменной
Wert
. Чтобы его передать
,

достаточно записать его в управляющий регистр передачи. Процесс записи собственно
старт
у
ет процесс посылки в
UART
.Что
бы однако затем передать байт, когда регистр пуст, и
т.о. обработать последний байт,

управляющий регист
р

проводника до тех пор опрашивается,
пока бит 5 (
TBE
) не сигнализирует о готовности для нового приема данных.

Процедура
Empfangen

считывает принятый бай
т и передает его в глобальное значение
Wert
.
Однако прежде бит 0 (
RXDR
) до тех пор опрашивается, пока не будет принят символ.
Следует учесть, что здесь не предусмотрено никакого таймаута. При отсутствии байта
остается процесс приема висеть в бесконечном ци
кле.

Главная про
гра
мма демонстрирует применение процедур
Offnen
,
Senden

,
Schlisen
.
Отдельный символ читается с клавиатуры и посылается.

PROGRAM Ausgabe;


uses CRT;

var


Wert : Byte;


Ch : Char;


procedure Oeffnen;


var Wert : Byte;



begin


Port

[$3
FB
]:=128; {
инициализация СОМ порта

}


Port

[$3
F
8]:= 96; {
бодовая скорость

-

LSB
, 1200
Baud

}


Port

[$3
F
9]:= 0; {
бодовая скорость

-

MSB

}


Port [$3FB]:= 3; { 8 Bits, No P
arity, 1 Stop }


Port [$3FC]:= 3; { DTR = 1, RTS = 1 }


Wert

:=
Port

[$3
F
8] {
опустошение приемного регистра

}


end;


procedure Schliessen;


begin


Port [$3FC]:= 0; { DTR = 0, CTS = 0 }


end;

17



procedure Senden ( Wert : Byte );


begin


repeat


until

Port

[$3
FD
]
and

32 = 32; {
опрос пуст ли буфер передачи

}


Port

[$3
F
8]:= (
Wert
); {
передача байта в буфер передачи

}


end;


procedure Empfangen ( var Wert : Byte
);


begin


repeat until (Keypressed or


((
Port

[$3
FD
]
and

1) = 1)); {
опрос принят ли байт

}


Wert

:=
Port

[$3
F
8];
считывание байта из буфера приема

}


end;


begin


Oeffnen;


Ch := ReadKey;


Wert := Integer (Ch);


Senden (Wert);


Schliessen

end.



Следующий общий модуль
COM
2_96 применяет улучшенную функцию приема
Empfang

с
простым таймаутом через числовой цикл. Этот цикл должен подбираться конечно
соотвествующим скорости применяемого процессора. Модуль содержит

дополнительно
процедуры для прямого вывода

на
DTR

и
RTS
. Инициализация следует уже в
TPU
.



UNIT COM1_96; {COM1_96.PAS}


Interface

uses DOS, CRT;

const BA : Integer = $03F8; { $03F8=COM1, $02F8=COM2}


procedure Sende (Zeichen :Byte);

function Empfa
ng :Byte;

procedure Init;

procedure DTR (An : Boolean);

procedure RTS (An : Boolean);


Implementation


procedure Sende (Zeichen :Byte);

begin


while (Port[BA+5] AND 32) = 0 do; {
регистр

посылки

пуст
? }


Port[BA]:=Zeichen;

18


end;


function Empfang :Byte;

var i :Word;

begin


i:=0;


while ((Port[BA+5] AND 1)=0) AND (i10000) DO Inc(i);


if i 10000 { Timeout
достигнут
? }


then Empfang := Port[BA]


else Empfang := 0;

end;


procedure Init;

var i, Dummy :Byte;

begin


Port[BA+3]:=1
28;


Port[BA+0]:=12; { 12: 9600 Baud, 6 :19200 Baud }


Port[BA+1]:=0;


Port[BA+3]:=7; { 8
-
Bit, n
-
Parity, 2 Stopbits }


Port[BA+1]:=0; {
нет прерываний

}


Port[BA+4]:=0; { DTR = 0, RTS = 0}


for i:= 1 to 3 do


Dummy:=Port[BA]; { UART
опустошен

}

end;


procedure DTR (An : Boolean);

begin


If An then Port[BA+4] := (Port[BA+4] OR 1) else


Port[BA+4] := (Port[BA+4] AND 254);

end;


procedure RTS (An : Boolean);

begin


If An then Port[BA+4] := (Port[BA+4] OR 2) else


Port[BA+4] := (Port[BA+
4] AND 253);

end;


begin


Init

end.

Листинг показывает применение в простой тестовой программе. Здесь сначала
DTR
-
проводник кратко включается один раз. Этим можно
,

например произвести сигнал
reset

для микроконтроллерной системы. Затем в бесконечном цикле 255 байт посылаются в
нарастающей пос
ледовательности и принятые байты показывается на экране.

Program TestCom;

Uses CRT,COM2_96;

Var n:Byte;

Begin

19


DTR(1);

Delay(100);

DTR(0);

Delay(100);

Repeat

For n:=0 to 255 do begin

Sende(n);

Write(Empfang),’ ‘);

End
;

Until

KeyPressed
;

End
.


Доступ к порта
м для


операционных систем Windows


Каждая попытка управлять с помощью компьютера реальными процессами или наблюдать за
ними, требует в первую очередь подходящей связи компьютера с внешним миром.
Программа должна быть в состоянии получать информацию извне

и передавать управление
на внешние приборы. Обрабатываемая информация может представляться в двоичном виде
(т.е как нули и единицы) или в аналоговом виде ( больше/меньше).

Требуемая дверь во внешний мир открывается через интерфейс. Для РС по индустриальн
ым
стандартам разработаны следующие формы интерфейса:

карты расширения вставляются в материнскую плату и позволяют высокие скорости работы,
что связано конечно с высокой ценой, стандартные порты связывают РС с внешними
интерфейсными схемами. Обычно таковым
и являются интерфейсы через последовательный
RS
232 порт, которые можно относительно дешево построить.

Интерфейсы с собственным процессором выполняют задачи без обмена данными с ОС.
Пользователь должен при этом дополнительно знакомиться с программированием
этой
системы.

Имеющиеся порты, последовательный порт, параллельный порт печати и часто порт
джойстика можно использовать прямо как интерфейс. Для этого используют дополнительное
аппаратное обеспечение для разных приложений.

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

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


Особую трудность под операционной системой Windows предоставляет доступ к портам РС.
Поэтому разработана универсальная спец
иальная DLL

библиотека, которая написана на
языке Dе
lph
i 3. Dll выполняет функцию расширения языка для различных языков
программирования. PORT.DLL необходимо скопировать в системный каталог Windows,
чтобы она могла быть использована любой программой. Одно
временно можно ее поместить
также в каталог, где находится соответствующая EXE
-

программа. PORT.DLL выполняет
следующие задачи:

открытие портов

20


последовательный перенос данных

доступ к проводникам порта

общие ввод
-
вывод порта

функция выдачи точного времени

в милисекундах

функция выдачи времени в микросекундном диапазоне

ввод с джойстика

DLL

могут применяться под совершенно различными системами программирования и кроме
того использоваться в макросах Word, Excel.

Развитие общей DLL для доступа к любому ап
паратному обеспечению идет в разрез с
обычной Widows
-
философией управления всем доступом к оборудованию через драйверы.
Драйвер относится всегда к одному определенному прибору. Для малых экспериментов с
аппаратурой здесь собственно нет места. Правильный пу
ть развития драйвера однако
настолько затратен, что он доступен только для больших фирм. Под DOS имелась в каждом
языке программирования команда для порта (GWBASIC: INP и OUT, TurboPascal: PORT[..]),
с которыми можно было достичь прямо общего аппаратного о
беспечения. Под Windows 3.1
ограничения еще были относительно малы, так что легко можно было их преодолеть. Даже
Delphi 1 еще обладало старой PORT
-
командой.

Под Windows 95 уже стало труднее. В Visual Basic 5 не имеется прямой возможности для
доступа к порт
ам. Начиная с Delphi 3 , удается прямой доступ к адресам портов только с
помощью ассемблерных вставок Inline кодов. Последние применяются в DLL, чтобы
осуществить общий доступ снова в Visual Basic. Операционная система однако больше не
позволяет пройти дал
ьше, так что необходимо сначала настроить соответствующий порт
(открыть его ), прежде чем можно совершать какие либо действия с соответствующим
оборудованием.

Под Windows NT наконец путь для любительского развития оказался окончательно закрыт.
Система так

развита на защиту безопасности, что никто больше не может прямо достигать
оборудования. Что остается
-

соответствующий путь через драйвер. Общее оборудование
должно при этом опрашиваться через последовательный порт. Здесь широко возможны все
доступы, так к
ак применяется не доступ к порту, а соответствующие системные процедуры.

DLL

расширения задаются как обычные процедуры и функции в собственном модуле и
содержат вместо программного кода ссылку на внешние
DLL
. Ключевые слова stdcall и
e
xternal регулируют пе
редачу параметров к DLL и необходимы для правильного вызова. В
Delphi нельзя сам модуль (*.pas) называть тем же именем, что и проект (*.dpr). Поэтому
буква Р добавляется к имени проекта. Все объявления DLL собраны в одном модуле под
именем PORTINC.PAS ( в
скомпилированном виде PORTINC.DCU). Модуль PORTINC.PAS
тогда можно подсоединять в каждый новый проект, так чтобы больше не заботиться об
отдельных объявлениях.

Рассмотрим в качестве первого примера прямое управление светодиодом через DTR. Смотри
схему на р
ис.



21


Можно LED подключить без сопротивления в данном случае, так как все выходы
последовательного порта ограничены по току и не могут выдавать токи более 10
-
20 mA.
Программы DELPHI подходят для вермякритичных задач. Исходный текст сначала
компилируется
в двоичный код, т.е. машинный, так что получается очень быстрая
программа. Прежде чем можно достичь выходного проводника, необходимо открыть порт.
Важным является правильный номер порта, тогда как другие параметры, такие как бодовая
скорость, четность и т.
д. могут быть любыми. Строка Open должна передаваться в С
-
соглашении как оканчивающаяся на нуль строка в DLL. Это происходит в объявлении
функции OPENCOM через паскалевский тип PCHAR. Все объявления сделаны уже в модуле
PORTINC.PAS , который подключается

через USES
-

директиву. Программа BLINKER
управляет проводником DTR с помощью симметричных прямоугольных импульсов. Длина
импульса устанавливается через ползунок и контролируется через таймер. Измерения
показали, что таймер дает подходящие интервалы, начи
ная со значения 50 ms. Область
работы, поэтому ограничивается свойствами Min и Max для ScrollBar1 областью от 50 до
250 ms.


Лабораторная работа по курсу ©Автоматизация локального экспериментаª

Использование
API

функций для написания драйверов


Операцио
нная система
Windows

ограничивает прямой доступ к портам во избежание
конфликта. Для реализации доступа к оборудованию сначала необходимо открыть
коммуникационный канал к используемому прибору с помощью соответствующего
драйвера. Для каждого прибора типа п
оследовательного интерфейса, параллельного
интерфейса, дисковода или звуковой карты имеется один общий драйвер, через который
следуето организовывать обмен данных.

Для прямого вызова
Windows


функций определен
Win
32
-
API
-
интерфейс (
API
-

Application

Programm
ing

Interface
).
Windows

предоставляет для использования ряд
DLL
, чьи функции
могут быть вызваны любой программой. Важнейшей из них является
KERNEL
32.
DLL
.
Основную информацию об отдельных вызовах содержит файл
Win
32.
hlp
. Для
Delphi

все
важнейшие вызовы собр
аны в файле
RSCOM
.
PAS
, который может быть подключен к любой
программе. Дополнительно на основе его создана библиотека
RSCOM
.
DLL
, которая может
быть использована и в других языках программирования.

Все доступы к последовательному интерфейсу следуют через не
большое количество
API
-
вызовов, которые в сущности ориентированы на обработку файлов. Оборудование типа
параллельный , последовательный или
USB
-

интерфейс обслуживаются как файлы, т.е. для
работы с ними используются функции

CreateFile
()
-

открытие файла ил
и прибора

CloseHandle
()
-

закрытие файла или прибора

22


ReadFile
()
-
чтение или прием данных

WriteFile
()
-
запись или передача данных

DeviceIoControl
()
-

выполнение специальных функций драйвера.

Для пояснения основополагающих понятий доступа к последовательному по
рту следует
показать очень простой пример. Интерфейс
COM
2 открывается с помощью
CreateFile
, чтобы
затем передать один байт с помощью
WriteFile
.
CloseHandle

снова закрывает
коммуникационный канал. При открытии используется дескриптор , т.е. число целого тип
а,
которе служит для однозначного приписания применяемого
IO
-

канала. Дескриптор
передается системой соотвественно последовательности вызовов
CreateFile
. Так как
WriteFile

может быть использован для очень различных действий и приборов, различает
операцион
ная система их с помощью дескрипторов. Соответственно освобождает
CloseHandle

соответствующий интерфейс.

Procedure

TForm
1.
Button
2
Click
(
Sender
:
TObject
);

Var Handle: THandle;

Byt:Byte;

Count:DWORD;

Begin

Handle:=CreateFile(Pchar(‘COM2’),GENERIC_WRITE,0,NIL,
OPEN_EXISTING,0,0);

Byt:=85;

WriteFile(Handle,Byt,1,Count,NIL);

CloseHandle
(
Handle
);

End

Листинг 3.6 посылка одного байта


Этот первый пример показывает основополагающий доступ к интерфейсу и посылает
данные, как можно легко установить с помощью осциллогра
фа на проводник
TXD
.

Конечно,он не имеет практического применения, так как явно не определены такие
параметры интерфейса как бодовая скорость или число бит в данных.

Просто используются последние примененные параметры.

В следующем объясняются все необходим
ые
Windows
-
вызовы для последовательного
интерфейса и применяются в Дельфи
-
функциях. Представленные процедуры и функции
находятся в модуле
RSCOM
.
PAS
, который может быть загружен с
CD
.


CreateFile

и
CloseHandle


Функция
CreateFile

имеет много параметров, кот
орые здесь должны в отдельности быть
объяснены. Дальнейшая информация находится в файле справке
WIN
32.
HLP
, который тоже
находится на
CD
. Объявление здесь следует в С
-
соглашении.В Дельфи 4 оно соответственно
преобразуется в модуле
WINDOWS
.
PAS
.

HANDLE

Creat
eFile
(

LPCTSTR

lpFileName
, //указатель на имя файла

DWORD dwDesireAccess, //
режим

доступа

(read
-
write)

DWORD dwShareMode, //
режим

шаринга

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //
указатель

на

атрибуты

защиты

DWORD dwCreationDistribution, //
как

открыв
ать

DWORD dwFlagsAndAttributes, //
атрибуты

файла

HANDLE

hTemplateFile

//
l

дескриптор на файл с атрибутами для копирования

);

23


Таблица 1.5

lpFileName

Указатель на нультерминированную строку с именем прибора или файла

dwDesiredAccess

константа для описания

доступа записи или чтения, 0
-
нет доступа,
GENERIC
_
RERAD
=$80000000:доступ на чтение,
GENERIC
_
WRITE
=$40000000:доступ на
запись

dwShareMode

задает, может ли файл быть разделен, для
COM
-
интефрейса всегда 0, так кА он
не может быть разделен между несколькими пр
иложениями

lpSeqirityAttributes

указатель на структуру с атрибутами защиты, для СОМ

порта не
поддерживается, поэтому всегда
NIL

dwCreationDistribution

задает для файла должен ли он быть создан или только открыт, когда
он уже существует. Для СОМ
-
порта един
ственно возможное значение
OPEN
_
EXISTING
.

dwFlagsAndAttributes

передает атрибуты для файла, для сом
-
порта обычно 0 или
FILE
_
FLAG
_
OVERLAPPED

hTemplateFile

передает дескриптор на вспомогательный файл с расширенными атрибутами.
Для сом
-
порта должен быть всегд
а 0.

CreateFile

возвращает при успехе законный дескриптор. В случае если открытие невозможно,
так как интерфейс не существует или уже занят, возвращаемое значение константы
INVALID
_
HANDLE
_
VALUE
=
-
1;

В Дельфи должен указатель
lpFileName

на строку с именем фа
йла или интерфейса
передаваться с типом
PChar
. Функция
PChar

преобразует паскалевскую строку в указатель на
нуль
-
терминированную строку соответственно С
-
конвенции. При передаче доступа на
чтение или запись в общем передаются в нормальном случае
GENERIC
_
REA
D

и
GENERIC
_
WRITE
, связывая обе константы с
OR

или с сложением.

PortHandle:=CreateFile(PChar(‘COM2’),GENERIC_READ or GENERIC_WRITE
,0,NIL,OPEN_EXISTING,0,0);

Вме
c
то имен констант можно передавать прямо константы, что конечно рассматривается как
плохой стил
ь программирования, так как при нем больше нельзя увидеть функции. Здесь
следует один раз показать этот вид вызова, чтобы пояснить, что он передает определенные
числовые значения операционной системе.

Handle:=CreateFile(Pchar(‘COM’),$C0000000,0,NIL,3,0,0);

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

акция записи или чтения. Процедура, которая посылает длинный текст
на СОМ2 следовательно только тогда будет снова покинута, когда все символы полностью
будут переданы. Другие программы работают при этом без возмущения, так как
мультизадачность не затрагив
ается.Только поток ( процесс) захватывается. В особенности
при приеме символов может программа зависнуть, когда в действительности поступило
символов меньше чем ожидалось. Против этого помогает установка оператора таймаута,
который позднее будет еще рассмо
трен.

В режиме перекрывания поток продолжает идти дальше, даже во время передачи через
последовательный порт. Времена передачи могут быть одновременно использованы для
других процессов. Для этого однако требуется синхронизация в форме сообщений о
состоянии

акции интерфейса. Функция
GetOverlappedResult

может применяться, чтобы
распознать успешный конец передачи. Режим перекрывания в целом значительно сложнее
чем синхронный и в этой книге не должен применяться. Его следует применять когда
должны передаваться
большие массивы данных. В измерительных экспериментах обычно
24


передаются короткие блоки данных, чьи времена передачи едва ли целесообразно
использовать.

Каждый открываемый интерфейс должен быть снова закрыт, чтобы его снова свободно
открыть для другого прим
енения. Для этого служит функция

BOOL

CloseHandle
(
HANDLE

hObject

// дескриптор объекта, который закрывается);

В Дельфи применение просто. В качестве ответа получают значение
TRUE

или
FALSE
,
когда закрытие невозможно.

Procedure CLOSECOM();

Begin

CloseHan
dle(PortHandle);

PortHandle
:=0;

End
;


WriteFile

и
ReadFile


Собственной доступ на запись к последовательному интерфейсу следует под
Win
32 в
основном с помощью
WriteFile
. Доступ соответствует записи в файл на дискете.

BOOL

WriteFile
(

HANDLE

hFile
, //дескри
птор на файл в который записываем

LPCVOID

lpBuffer
, //указатель на данные которые записываются в файл

DWORD

nNumberOfBytesToWrite
, //число записываемых байт

LPDWORD

lpNumberOfBytesWritten
, //указатель на число записываемых байт

LPOVERLAPPED

lpOverlapped

//

указатель на структуру необходимую для асинхронного
ввода
\
вывода

)

Таблица 1.6

hFile

дескриптор на открытый файл или прибор

lpBuffer

указатель на буфер данных

nNumberOfBytesToWrite

число байт, которые нужно переслать

lpNumberOfBytesWritten

указател
ь на переменную с числом действительно записанных байт

lpOverlapped

указатель на структуру перекрывания или
NIL

для режима неперекрывания

Буфер текста под
Windows

всегда является строками оканчивающимися нулем, т.е.
байтовым массивом, который завершается
нулем. Этот тип не совместим с Дельфи
-
типом
STRING
. Однако имеется тип
PChar

как указатель на нультеминированную строку. Как при
передаче текстовых параметров у
API
-

функций, так и при передаче к собственным
функциям должен применяться тип
PChar
. Этим дост
игается также совместимость со
строковым типом в
Visual

Basic
.

В Дельфи 4
WriteFile

объявлен в файле
WINDOWS
.
PAS
, причем применяемые типы данных
несколько отклоняются от тех первоначальных С
-
объявлений системы:

Function WriteFile(hFile:THandle;const Buffer
; nNumberOfBytesToWrite:DWORD;

Var lpNumberOfBytesWritte:DWORD;lpOverlapped: POverlapped):BOOL;stdcall;

Буфер данных здесь объявлен как константа, т.е. передается указатель на область данных.

Преобразование в указатель следует автоматически. Принципиально

можно передавать
постоянный текст, причем в
nNumberOfBytes

должно быть передано число символов. По
возвращении из функции
WriteFile

содержит
lpNumberOfBytes

в нормальном случае тоже
самое число. Только когда передача закончилась с ошибкой, может здесь име
ться разница.
Функция

возвращает

в

этом

случае

FALSE.

Success:=WriteFile(Handle,’ABCDEFG’,7,Count,NIL);

25


Когда текст должен быть передан в переменной, нужно позаботиться о
нультерминированной строке. Так как тип
PChar

конечно представляет указатель ,
WriteF
ile

однако ожидает явную переменную Необходимо текст разименовать с помощью ^.

Procedure

SENDSTRING

(
Buffer
:
String
);

Var

BytesWritten
:
DWord
;

Brgin

WriteFile(PortHandle,(Pchar(Buffer))^,Length(Buffer),BytesWritten,NIL);

End;

Procedure TForm1.ButtonClick(Se
nder:TObject);

Var TextString:String;

Begin

TextString:=Edit1.Text;

SendString
(
TextString
+ #13);

End
;

Проще когда посылаются только отдельные символы или байты. Вместо текстового буфера
нужно передать просто отдельную байтовую или целую переменную

Procedur
e SENDBYTE (Dat:Integer);

Var ByresWritten:DWord;

Begin

WriteFile(PortHandle,Dat,1,BytesWritten,NIL);

End
;

Для обратного переноса данных имеется функция
ReadFile
. В С
-
конвенции функция
объявляется так:

BOOL

ReadFile
(

HANDLE

hFile
, // указатель на файл, ко
торый читаем

LPVIOD

lpBuffer
, // адрес буфера, который принимает данные

DWORD

nNumberOfBytesToRead
, //число считываемых байт

LPDWORD

lpNumberOfBytesRead
, //адрес число прочитанных байт

LPOVERLAPPED

lpOverlapped

//адрес структуры для данных

);

hFile

дескри
птор на открываемый файл или прибор

lpBuffer

указатель на буфер данных для приема


nNumberOfBytesToRead

указатель на число байт, которые нужно принять

lpNumberOfBytesRead

указатель на переменную с числом действительно принятых байт

lpOverlapped

указатель н
а структуру перекрывания или
NIL

для неперекрываемого режима

Функция
ReadFile

импортируется через файл
WINDOWS
.
PAS

в Дельфи4

Function ReadFile(hFile:Thandle;var Buffer;nNumberOfBytesToRead:DWORD;var
lpNumberOfBytesRead:DWORD;lpOverlapped:Poverlapped):BOOL;
stdcall;

Пользователь должен знать, как много символов он собирается передать через интерфейс и
он должен приготовить буфер подходящего размера. Особенно прост случай, когда только
отдельный символ должен приниматься в момент.

Function READBYTE():Integer;

Var Dat:Byte;

BytesRead:DWORD;

Begin

ReadFile(PortHandle,Dat,1,BytesRead,Nil);

If BytesRead=1 then Result:=Dat else Result:=
-
1;

End
;

26


Функция
ReadFile

возвращает при успехе назад символ. В случае если ни одного символа в
приемном буфере нет, ожидает
R
е
adFil
e

символ или прерывается попытка приема через
тайм
-
аут. Считанный байт в этом случае нуль.
ReadByte

возвращает в этом случае
-
1.


Прием целой строки символов сложнее, так как
ReadFile

ожидает передачу длины текста.
Часто однако длина принимаемого текста за
ранее не известна. Принимаемый текст лучше
воспринимать как состоящий из отдельных символов. Конец текста можно обозначить
каким
-

нибудь особенным принятым байтом. Часто тексты заканчиваются символом
CR

#13.
Для строкового приема тогда подходит функция
Rea
dString

Function

READSTRING

():
string
;

Var Dat:Integer;

Data:string;

Begin

Dat:=0;

While ((Da�t
-
1) and (Da�t13) do begin

Dat:=ReadByte();

If ((Da�t
-
1) and (Dat&#x-700;13)) then Data:=Data+chr(Dat);

End
;

READSTRING
:=
Data
;

End
;

Посылка и прием последовательных д
анных основаны на предварительном определении
параметров интерфейса, которые в дальнейшем объясняются. Кроме того, играют во многих
случаях роль также времена тайм
-
аута и величины приемных и передаваемых буферов.


Для пояснения основополагающего доступа к
последовательному интерфейсу
выполним лабораторную работу по передаче и приему символа через
COM

порт. Для этого
необходимо присоединить заглушку к СОМ порту, которая соединяет выводы
TXD

и
RXD

.


Затем пишется программа, которая открывает СОМ1 с помощь
ю функции
CreateFile

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

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

Для чтения переданного байта используется функция
READBYTE
, которой в качестве
аргумента следует передать дескриптор. Функция
READBYTE

в случае успеха возвращ
ает
принятый символ. В случае если в приемном буфере не имеется символов, ожидает
ReadFile

поступающий символ или обрывает процесс приема через определенный интервал времени.
В этом случае считанный символ является нулем.
READBYTE

возвращает в этом случае
значение
-
1.

27





1
.2 Параллельный порт Centronics


Представляет собой отдельную интерфейсную карту ввода/вывода. Разъемы порта для
компьютера и принтера отличаются друг от друга. Первый

это 25
-
контактный разъем D
-
типа, а второй
-
36 контактный разъ
ем парал
лельного типа (Рисунок 1
.4) .


28



Рис.
1
.4 Назначение контактов параллельного порта



Назначение контактов обоих разъемов представлено в таблице рисунка
4
. Длина шнура
-

не
более 5 метров.

Логическая структура параллельного порта представлена на рисунке
1
.5
.


29



Рисунок
1
.5 Логическая структура параллельного интерфейса



Восьмибитовые данные заносятся во время записи в регистр с адресом базовый адрес+0.
Четыре бита управляющего слова записывается в регистр с адресом базовый адрес+2.
Состояние принтера контро
лируется через пять бит регистра с адресом базовый адрес+1.
Назначения регистров параллельного порта приведены в таблице. Базовыми адресами портов
LPT1 и LPT2 являются :

956(3BCh) или 888(378h) и 632 (278h). Базовый адрес для LPT1
зависит от конфигурации

оборудования. При включении или перезагрузке компьютера BIOS
проверяет наличие параллельных портов. Если они обнаруживаются, их базовые адреса
(двухбайтные слова) записываются для LPT1 в ячейки 0000h:0408h 0000h:0409h. Первая
ячейка содержит младший , а в
торая старший байт адреса. Ячейки памяти для следующих
портов расположены по следующим адресам. Ячейка памяти 0000:4011h содержит сведения
об общем количестве параллельных портов, установленных на компьютере. Эта информация
хранится в битах 6 и 7:


Биты 76

00
параллельные порты не установлены

01
установлен один порт

10
-
установлены два порта

11
-
установлены три порта.

Таким образом, чтобы получить данные о параллельных портах программа на Бейсике будет
иметь вид

10 DEF SEG=0

20 PRINT :Number of Centronics por
ts:”,(PEEK(&H411) AND (128+64))/64

30


30 PRINT :Address of LPT1:”,PEEK(&H408)+256*PEEK(&H409)

40 INPUT A

Процедура на Паскале делающая то же самое имеет вид

Procedure Centronics_address;

Var

Lpt:array[1..4] of integer;

Nunber_of_lpt:integer;

Begin

Number_of_l
pt:=mem[$0000:$0411];

Number_of_lpt:=(number_of_lpt and (128+64)) shr 6;

Lpt[1]:=memw[$0000:$0408];

Writeln(‘Number of LPT installed:’,number_of_lpt:2);

Writeln(‘Address for PPT1:’,lpt[1]:3);

End;

Для вывода данных через параллельный


порт в Бейсике имеетс
я команда PRINT ,а в
ТурбоПаскале
-

writeln (lst). Другим способом является использование прерывания BIOS

int
17h.Другим способом является непосредственный доступ к регистрам порта. Параллельный
порт рассматривается как три отдельных регистра ввода/вывода,

два из которых
предназначены для вывода данных, а один для ввода. Рассмотрим пример управления
портом LPT1. Д
л
я записи информации в регистры управления в Бейсике применяются
команды OUT 888,X и OUT 890,X. Некоторые линии порта управления инвертированы, ч
то
необходимо учитывать при выводе данных. Для чтения данных из регистра состояния можно
пользоваться следующей командой Y=INP(889). Следующие процедуры на Паскале делают
то же самое.

Procedure writedataport(P_address:integer,port_data:byte);

Begin port[P_
address]:=port_data;

End;

Procedure write_control_port(p_address:integer;port_data:byte);

Begin

If port_data and 1=1 then port_data:=port_data and (255
-
1) else port_data:=port_data or 1;

If port_data and 2=21 then port_data:=port_data and (255
-
2) else port
_data:=port_data or 2;

If port_data and 8=8 then port_data:=port_data and (255
-
8) else port_data:=port_data or 8;

Port[P_address+2]:=port_data;

End;

Следующая функция считывает биты с 3 по 6 из регистра состояния, выполняет битовые
преобразования и возвращает четырехбитовое данное.

Function read_status_port(P_address:integer):byte;

Var byte1:byte;

Begin byte1:=port[P_address+1];

Byte1:=byte1 and 120; (
*011111000 (
от

старшего

к

младшему
) and 0ddddd...=0dddd0000*)

Read_status_port:=byte1 shr 3;

End;




1
.3 Вывод данных через принтерный порт


31


Для проверки, что система вывода работает правильно, посылают двоичные числа по
базовому адресу принтерного порта.
Для индикации выводимого числа к принтерному порту
необходимо подключить блок СИД согласно рисунка
1
.6.










Рисунок
1
.6 Соединение компьютера с блоком светоиндикаторов



Программа, которая осуществляет этот вывод, приведена ниже.

# include Mos;&#x.h00;dos.h

#
include stdistd;&#xi-4o;&#x.h00;o.h

# include cӄo;&#xnio.;&#xh000;onio.h

int Out_address=0x3bc;

void main()

{int data,error=1;

clrscr();

printf(“input two number”);

printf(“any symbol for escape”);

do

{fflush(stdin);

error=scanf(“%2X”,&data);

_outp(Out_Address,data);

}

while(error!=0);

}


Д
ля тестирования как вывода, так и ввода чисел к принтерному порту необходимо
подключить еще и блок переключателей согласно схеме на рисунке
1
.7.


32



Рисунок
1
.7 Подключение к компьютеру блока переключателей



Программа, осуществляющая этот режим, приведена
ниже

# include Mos;&#x.h00;dos.h

# include stdistd;&#xi-4o;&#x.h00;o.h

# include stringstr;&#xin-1;g10;&#x.h00;.h

# include cӄo;&#xnio.;&#xh000;onio.h

void Input();

void Output();

int Out_Address=0x3bc;

int In_Address=0x3bd;

void main()

{int menu;

while(1)

{

printf(“Input/output of data”);

printf(“input push ”);

printf
(“output push ”);

printf(“for escape push ”);

menu=toupper(getch());

switch(menu)

{ case ‘I’: Input();break;

case ‘O’:Output();break;

case ‘Q’:exit(1);

}

}

}

void Input()

33


{int data.change,i;

printf(“Push any button for goto main menu”);

while(1)

{

do

{

change=_inp(In_Address);

if(kbhit())return;

}while (change==data);

data=change;

printf(“Dataoutput=%2x”,data);

printf(“Bit 76543”);

for(i=7;i�2;i
--
)

printf(“%1x”,(data>>i)&1);

}

}

void output()

{

int i,data;

char valid[17]=”0123456789ABCDEF”;

char k,*pt
r;

printf(“input two number”);

printf(“any else
-
escape to main menu”);

while(1)

{

data=0;

for(i=1;i�
-
1;i
--
)

{

k=(toupper(getch());

if((ptr=strchr(valid,k))==0)

return;data=data+(ptr
-
valid)(i*4);

}

_outp(Out_Address,data);

}

}


1
.4 Управление шаговым двиг
ателем через принтерный порт




Рассмотрим принципы строения и управления работой шаговых двигателей. Шаговый
двигатель может вращаться дискретно, выполняя 200 шагов на оборот, т.е. поворачиваясь на
1.8 градуса за шаг. На рисунке 8.8 представлено внутренне
е строение шагового двигателя
-

ротор и статор.

34





Рисунок
1
.8. Внутренне строение шагового двигателя


Ротор шагового двигателя состоит из двух шестеренок, которые смещены друг относительно
друга на половину шага шестерни и магнитно ориентированы противоп
оложно
-
верхняя
шестеренка на север, нижняя

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

магнит с
северным направлением, так что нижняя шестерня к этой катушке притягивается. Если
направление тока в этой обмотке поменять, тогда повернется ротор на полповорота дальше.
Биполярные обмотки содержат средний отвод, если подключить середину на 12 во
льт, затем
катушка магнитно переполюсуется, связывая или один или другой конец катушки с землей.
Шаговые двигатели бывают двухфазными и четырех фазными (рисунок
1
.9).




Рисунок
1
.9 Четырехфазный двигатель


35



Для этих двигателей требуются различные схемы
управления. Четырехфазные биполярные
двигатели имеют 6 подводящих проводов и легко управляются. Чтобы лучше понять
управление биполярным шаговым мотором рассмотрим следующую модель (рисунок
1
.10), в
которой ротор в середине представлен просто как постоянны
й магнит.

Когда при этом друг за другом биты 0,2,1,3 соединяются с землей, вращается магнит вправо.
Направление вращения можно обратить, поменяв последовательность переключения битов
на 0,3,1,2. Так как шаговые моторы потребляют высокие токи и напряжения
, то их следует
подключать через интерфейс.





Рисунок
1
.10 Схематическое представление шагового двигателя


Для управления шаговыми двигателями используются различные алгоритмы, которые
отличаются друг от друга последовательностями возбуждения обмоток.

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

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

это комбинация первых двух. Во время одного оборота
ротора количество ц
иклов возбуждения удваивается. При этом режиме двигатель работает
более ровно. Для управления двигателями существуют специальные микросхемы.
Микросхема UCN5804 (Allegro Microsystems, RS653
-
531) может генерировать все три
последовательности. Схема подключен
ия приведена на рисунке.

36


Для управления работой шагового двигателя можно использовать также микросхему
ULN2803, которая состоит из 8 инверторов и 8 диодов. Инверторы позволяют переключать
токи до 500 мА и напряжения до 50 вольт. Диоды служат для отвода ин
дукционных
напряжений, возникающих при переключении катушек. Схема подключения шагового
двигателя приведена на рисунке 1
.11. К одной микросхеме можно подключить два шаговых
двигателя.





Рисунок
1
.11 Схема подключения шагового двигателя


Униполярный шаго
вый двигатель имеет 4 катушки, которые должны быть подключены друг
за другом в правильной последовательности, чтобы достигнуть определенного поворота.
Для управления униполярными моторами требуется только
простая схема ULN2803. Рисунок
1
.12 показывает под
ключение ее к модулю С
-
Control


37




Рисунок
1
.12

Подключение шагового двигателя


Для управления двухфазными шаговыми двигателями используется мостовая микросхема
L298N для управления питанием двигателя и контроллер L297 (SGS
-
Thomson,RS636
-
363)
для генерац
ии шаговых последовательностей.


Для управления скоростью и направлением вращения шагового двигателя к принтерному
порту необходимо подключить шаговый двигатель, блок индикаторов и блок
переключателей согласно схеме, показанной на рисунке.




38




Рисунок
1
.
13 Подключение к компьютеру шагового двигателя



Программа, управляющая работой двигателя, приведена ниже.

# include Mos;&#x.h00;dos.h

# include stdistd;&#xi-4o;&#x.h00;o.h

# include stringstr;&#xin-1;g10;&#x.h00;.h

#include cӄo;&#xnio.;&#xh000;onio.h

int Out_Address=0x3bc;

int In_Address=0x3bd;

int cloc=0;

int anticloc
=1;

int slow=100;

int fast=10;

void rotate(int,int);

void main()

{

int k=1;

printf(“management of motor”);

do

{

k=((inp(IN_Addre�ss)�3)&0x0F);

printf(“%Li”,k);

switch(k)

{

case 1:rotate(slow,cloc);break;

39



case 4:rotate(fast,a
nty);break;

case 8:rotate(slow,anty);

break;

default:printf(“ motor is stop”);

}

}while(!kbhit());

}

void rotate(int speed,int direction)

{

int i;

int data[2][4]={3,6,12,9,9,12,6,3};

delay(speed*9/10);

printf(“...................”);

for(i=0;i4;i++)

{

_out
p(Out_Address,data[direction][i]);

delay(speed);

}

}

2 Управление эксперментом с помощью микроконтроллера


При создании автоматизированных установок
с использованием микроконтроллеров
простейшим примером является установка
отслеживанитя температуры
. Для эт
ого установка
должна включать датчик температуры. В качестве таков
ог

мо
жет

быть использован
терморезистор . Для организации
а
втоматического
отслеживания температуры

используется
плата
AVR
-
IO
. Она изготовлена с использованием микроконтроллера
ATTiny
2313
V
-
10
PU
.
Общий вид
платы
AVR IOM16
схемы показан на рисунке
.

40



Рисунок 2.1 Внешний вид платы
AVR
-
IO
-
M
16

В отличие от
нее
AVR

M
16 этот микропроцессор

не имеет встроенного АЦП,
поэтому аппаратное и программное обеспечение
в

ней делается иначе. В этом случае
факт
ически все разъемы микросхемы задействованы штатно, поэтому приходится
пожертвовать двумя реле и освободить разъемы компаратора, необходимого для оцифровки
аналогового сигнала. Для этого делаются изменения в схеме, представленные схеме
2
.2
1

41



Рисунок
2.
2

Схема модернизации платы микроконтроллера (показаны только измененные
участки)

Для подключения к плате терморезистора здесь нельзя использовать штатное гнездо для
Jtag
-
программатора, так как его просто нет. Поэтому на плату добавляется один разъем. На
элек
тронной плате это выглядит так, как показано на рисунке 2
.3
. Общий вид установки
показан на рисунке
2.4
.



42


Рисунок 2
.
3

Модернизация схемы



Рисунок
2.
4
. Общий вид установки


Затем пишутся две программы
-

одна для микроконтроллера для управления его работо
й и
вторая

для компьютера, который будет показывать температуру. Текст программы для
микроконтроллера пишется на языке
C

в оболочке
IAR

и прошивается в микроконтроллер с
помощью
avreal
32. Он приведен на рисунке
2.5

с подробными комментариями,
объясняющими

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

Основная идея программы состоит в том, что управление платой происходит через
интерфейс
RS
232 в виде потока команд от компьютера

и обратно
го потока данных от
микрконтроллера.

Схема
Tiny

не имеет АЦП, поэтому его приходится делать используя компаратор и счетчики.
На компаратор подводятся два напряжения
-

одно с делителя, в одном из плеч которого
находится терморезистор, а второе с таймера 16
-
р
азрядного, который работает в режиме 10
-
разрядного,т.е. имеет 1024 уровня. Программа пишется так, что при достижении уровня
напряжения происходит прерывание, которое обрабатывается так, что счетчик начинает
следовать за напряжением на терморезисторе. Поэто
му в любой момент мы знаем, какое
напряжение, а значит и температура. Чтобы опросы счетчика шли не очень часто, вводится
задержка на основе работы 8
-
разрядного счетчика. Из
-
за ограниченной памяти приходится
43


отказаться от операций с плавающей точкой и все
делать в целочисленном виде. Поэтому
таблицы представлены в целых, путем увеличения их на 10, а затем в результате
производится деление на 10, что дает точность в первом знаке после запятой. Результат
возвращается в виде 4
-
х значного числа с ведущим нулем
. Его приходится обрезать, так как
value

не умеет преобразовывать нули ведущие. Основная часть кода находится в обработчике
таймера.

procedure

TForm
1.
Timer
1
Timer
(
Sender
:
TObject
);


var s:string;


i:integer;

begin


SendString (PChar('g' + #13));


s:=readstring1();


if s䀀'ERROR' then


begin Edit1.Text:=s;s:=readstring1();PX:=PX+1;


s:=copy(Edit1.Text,2,length(Edit1.Text));


val(s, t, i);writeln(f,t);


PY:=trunc(Image1.Height
-
(t/10
-
Ymin)*Image1.height/(Ymax
-
Ymin));


image1.Canvas.Pi
xels[PX,PY]:=clBlack;


Image1.Canvas.LineTo(PX,PY);


end;

end;


Текст

s:=copy(Edit1.Text,2,length(Edit1.Text));

Вырезает первый символ в прочитанном значении температуры, который является пробелом
и препятствует использованию функции
val
, которая не умеет подавлять ведущие пробелы.


Текст программы для компьютера п
ишется в оболочке
Delphi

и приведен на рисунке
2.6
. При
управлении работой
COM


порта использована библиотека
RSCOM
.


#
include

"
io
2313.
h
"

#include stdistd;&#xi-4o;&#x.h00;o.h

#include inavr.hina;&#xvr5.;&#xh-90;


#define bit0 (10)

#define bit1 (11)

#define bit2 (12)

#define bit3 (13)

#define bit4 (14)

#define bit5 (15)

#define bit6 (16)

#define bit7 (17)


//
Прототипы

функций


int putchar( int data);

int getchar( void );

void ERROR(void);

void OK(void);

void DoCommand(void);

44


void NewLine(void);

void StrToPC(char *);

void conv1
0(int);


//
Глобальные

переменные


char Command[10]; // Буфер для приема команды (до 10 символов)

int volatile Rezult; // Код, полученный от "самодельного" АЦП


char Prompt;

char Rele;


#define Nclb 19

__flash int Ttable[Nclb]={00,10,20,90,100,1
50,200,


250,300,350,400,450,500,600,650,670,750,770,800 };

__flash int Rtable[Nclb]={ 5320,5240,4360,4210,3670,3230,2720,2290,1970,1660,


1400,1210,940,850,760,580,550,520 };


//
-------------

ТОЧКА

ВХОДА

ЗДЕСЬ

------
---------


__C_task main(void)

{


int iC; //
индекс

в

команде


char ch;



DDRB = bit2 | bit3; // направление на вывод: эти биты управляют релюхами


PORTB &= ~(bit2 | bit3); // обесточить обмотки



DDRB |= bit4; // Это выход
ШИМ


/*


DDRB |= bit4; // это светодиод


PORTB |= bit4; // погасить его

*/



// Компаратор уже включен




// Настроить таймер Т0
-

отсчет времени (прерывание с частотой 100 Гц)



TCCR0A = (1<


OCR0A = 99; // При достижении 99 таймер сбрасывается


TCCR0B = 5; // Тактирование таймера = 10'000'000 / 1024 = 10'000 Hz


TIMSK |= (1OCIE0A);





// Настроить таймер Т1
-

ШИМ генератор




TCCR1A = (1COM1B1) | (1WGM11) |

(1WGM10);

45



TCCR1B = 1; // тактовая частота равна системной




Rezult = 512;


OCR1B = Rezult;




// Настроить СОМ
-
порт




UBRRH = 0; // установить скорость 9600


UBRRL = 64; // для кварца 10.000 MHz




UCSRB = (1<ючить передатчик


UCSRB |= (1<

UCSRC = (1<


// Выключить все реле



Rele = 0;


for( iC=0; iC4; iC++ ) {


PORTB &= ~(1iC);


}



__enable_interrupt();





iC = 0;


Prompt=0;


//
----------------------

ПОЕХАЛИ
--------------------------



while(1) { // вечный цикл программы




ch = getchar(); // ждать очередной символ


if(ch!=0x0D) { // это не последний символ
-



if(iC10)

{


Command[iC++] = ch; // положить его в буфер


if(Prompt) putchar(ch); // вернуть эхо, если можно


}


}


else { // ввод завершен
-

отработать команду


if(Prompt) NewLine();


if(iC�0) DoC
ommand();


for(iC=0; iC10; iC++) {


Command[iC] = 0xFF; // "
замусорить
"
буфер


}


if(Prompt) putchar(�'');


iC=0;


}


}

46


}


//
---------------------------------------


void DoCommand(void)

{


signed char x,y;


int Rt;



int i;

/* Форматы команд:


Px
-

промпт включить/выключить (x=1/0)


?
-

вернуть состояние реле


Rxy
-

установить реле с номером x (0...3) в состояние y (0..1)


Ix
-

вернуть состояние оптопары x (0...3) в терминал


G
-
опрос АЦП и возврат значения компьютеру


Список команд расширяется по мере надобности

*/



switch( Command[0] ) // первый байт
-

собственно команда, за ним
-

аргументы


{

//
------------------------------------------------



case 'P':


case
'p': if( Command[1]=='1' ) {


Prompt = 1;


}


else if( Command[1]=='0' ) {


Prompt = 0;


}


else {


ERROR();


break;



}


OK();


break;

//
------------------------------------------------



case '?': for( x=0; x4; x++ ) {


if( Rele & (1x) ) y=1; else y=0;


if( y ) putchar('1'); else putchar('0'
);


}


NewLine();


OK();


break;

//
------------------------------------------------




case 'R': //
установка

реле


case 'r': x = Command[1]
-

'0'; //
номер

реле

47



y = Command[2]
-

'0'; //
вкл
/
выкл


if( x�=0 && x=3 && ( y==0 || y==1 ) ) {


char ttt;


ttt = Rele;




if(y) {



PORTB |= (1x);


ttt |= (1x);


}


else {


PORTB &= ~(1x);


ttt &= ~(1x);


}


Rele = ttt; // Сохрани
ть состояние в EEPROM


OK();


}


else {


ERROR();


}


break;

//
------------------------------------------------



case 'I':

// опрос входных линий


case 'i': x = Command[1]
-

'0';


if( x�=0 && x=3 ) {


if( x==0 ) y = PIND & bit2;


if( x==1 ) y = PIND & bit3;


if( x==2 ) y = PIND & bit5;


i
f( x==3 ) y = PIND & bit6;



if( y ) putchar('1'); else putchar('0');


NewLine();


OK();


}


else {


ERROR();


}


brea
k;

//
------------------------------------------------



case 'G': //
опрос

АЦП


case 'g':




Rt = 10*Rezult;


i=0;


while(iNclb
-
1) {


i++;


if(R�t Rtable[i]) break;

48



}


Rt = Ttable[i
-
1] + (Ttable[i]
-
Ttable[i
-
1]) * (Rt
-

Rtable[i
-
1])/(Rtable[i]
-
Rtable[i
-
1]);



conv10(Rt);


StrToPC
(Command);


NewLine();


OK();


break;


// Сюда можно добавлять новые команды



default: ERROR(); // недопустимый символ команды


break;


}

}


//
-----------------------------------


void NewLine(void)

{


putchar(0x0D);


p
utchar(0x0A);

}


void OK(void)

{


PORTB |= bit4; // погасить диод
-

нет ошибки


putchar('O');


putchar('K');


NewLine();

}


void ERROR(void)

{


PORTB &= ~bit4; //
зажечь

диод

-

ошибка


putchar('E');


putchar('R');


putchar('R');


putchar('O');


putchar('R');


NewLine();

}


//
------------------------


void StrToPC( char *s)

{


while(*s) {

49



putchar(*s);


s++;


}

}

//
------------------------


void conv10( int xx )

{


int yy;




Command[4]=0;


yy = xx/10;


Command[3] = xx
-

10*yy + '0'
;


xx = yy/10;


Command[2] = yy
-

10*xx + '0';


yy = xx/10;


Command[1] = xx
-

10*yy + '0';


Command[0] = yy + '0';

}


//
-----------------------------------


int putchar( int data)

{


while ( !( UCSRA & (1UDRE)) ) {};


UDR = data;


return data;

}


//
------------------------


int getchar( void )

{


while ( !(UCSRA & (1<

return UDR;

}



//
-------------

Обработка прерывания по таймеру Т0
---------------------


#pragma vector=TIMER0_COMPA_vect


__interrupt

void T0_comp(void)

{


if( ACSR & (1ACO) ) { //
компаратор

сработал


if(Rezult�0) Rezult
--
;


}


else { //
не

сработал

50



if(Rezult1023) Rezult++;


}


OCR1B = Rezult;


}



Рисунок
2.
5

Листинг программы для микроконтроллера




unit Unit1;


interface


uses


RSCOMdec,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,


Dialogs, StdCtrls, ExtCtrls;


type


TForm1 = class(TForm)


Button1: TButton;


Button9: TButton;


Button10: TButton;


Edit1
: TEdit;


Button2: TButton;


Button3: TButton;


Timer1: TTimer;


Image1: TImage;


procedure Button1Click(Sender: TObject);



procedure Button9Click(Sender: TObject);


procedure Button10Click(Sender: TObject);


procedure Button2Click
(Sender: TObject);


procedure Button3Click(Sender: TObject);


procedure Timer1Timer(Sender: TObject);



private


{ Private declarations }


public


{ Public declarations }


end;


var


Form1: TForm1;


new,state:boolean;


t:real;

implementat
ion

51



var Xmax,Xmin,Ymax,Ymin:real;


PX,PY:longInt;


f:TextFile;


{$R *.dfm}


function READSTRING1(): string;

var Dat: Integer;


Data: STRING;

begin


Dat := 0;


while ((Dat �
-
1) and (Da�t 13)) do begin


Dat := ReadByte();


if ((Dat �
-
1) an
d (Dat 䀀 13)) then Data := Data + chr(Dat);


end;


READSTRING1 := Data;

end;



procedure TForm1.Button1Click(Sender: TObject);


begin


Timeouts(50); new:=false;state:=false;


Timer1.Enabled:=true; Xmax:=600;

Xmin:=0;

Ymax:=40;

Ymin:=20;

PX:=0;Im
age1.Canvas.MoveTo(0,Image1.height div 2);


assignFile(f,'proba.txt');rewrite(f);

end;




procedure TForm1.Button9Click(Sender: TObject);

begin

OpenCOM (pchar('COM1:9600,N,8,1'));

end;


procedure TForm1.Button10Click(Sender: TObject);

begin

Timer1.Enabled:
=false;CloseCom;CloseFile(f);

Image1.Picture.SaveToFile('dib.jpg');

end;


procedure TForm1.Button2Click(Sender: TObject);

var s:string;

begin


SendString (PChar('p1' + #13));s:=readstring1();

end;


52


procedure TForm1.Button3Click(Sender: TObject);

var s:stri
ng;

begin

SendString (PChar('p0' + #13)); s:=readstring1();

end;


procedure TForm1.Timer1Timer(Sender: TObject);


var s:string;


i:integer;//x,y:real;

begin



SendString (PChar('g' + #13));


s:=readstring1();


if s䀀'ERROR' then


begin Edit1.
Text:=s;s:=readstring1();PX:=PX+1;


s:=copy(Edit1.Text,2,length(Edit1.Text));


val(s, t, i);writeln(f,t);


PY:=trunc(Image1.Height
-
(t/10
-
Ymin)*Image1.height/(Ymax
-
Ymin));


image1.Canvas.Pixels[PX,PY]:=clBlack;


Image1.Canvas.LineTo(PX,PY);



end;

end
;


end
.

Рисунок
2.
6
Листинг программы для компьютера

Текст процедур модуля
RSCOM

приведен на рисунке
2.
7
.

unit RSCOM;

{B.Kainka 2001}


interface

uses Windows;

var PortHandle: THandle;


function OPENCOM (OpenString: Pchar): Integer; stdcall;

procedure TIMEOUTS (TOut: Integer);

Procedure BUFFERSIZE (Size: Integer);

procedure CLOSECOM();

procedure SENDBYTE (Dat: Integer);

function READBYTE (): Integer;

procedure SENDSTRING (Buffer: Pchar);

function READSTRING (): Pchar;

procedure CLEARBUFFER ();

function INBUFFER (): DWORD;

function OUTBUFFER (): DWORD;

procedure DTR(State:integer);

procedure RTS(State:integer);

procedure TXD(State:integer);

function CTS():Integer;

53


function DSR():Integer;

function RI():Integer;

function DCD():Integer;

function IN
PUTS():Integer;

procedure TIMEINIT();

function TIMEREAD(): Real;

procedure DELAY(DelayTime: Real);

procedure REALTIME();

procedure NORMALTIME();


implementation


var StartTime: Int64;


TimeUnit: Real = 0.000838;



function OPENCOM (OpenString: pchar):

Integer;



DCB: TDCB;

begin


Result := 0;


if PortHa�ndle 0 then CloseHandle(PortHandle);




PortStr := copy (Parameter,1,4);


PortHandle:=CreateFile(PChar(PortStr),GENERIC_READ or
GENER
IC_WRITE,0,NIL,OPEN_EXISTING,0,0);


GetCommState(PortHandle,DCB);




DCB.Flags := 1;




TimeOuts (10);

end;



procedure TIMEOUTS (TOut: Integer);

var TimeOut:TCOMM
TIMEOUTS;

begin


TimeOut.ReadIntervalTimeout:=1;


TimeOut.ReadTotalTimeoutMultiplier:=1;


TimeOut.ReadTotalTimeoutConstant:=TOut;






SetCommTimeouts(PortHandle,Ti
meOut);

end;


Procedure BUFFERSIZE (Size: Integer);

begin


SetupComm(PortHandle,Size,Size);

54


end;



procedure CLOSECOM();

begin


CloseHandle(PortHandle);


PortHandle:= 0;

end;


procedure SENDBYTE (Dat: Integer);

var BytesWritten: DWord;

begin


Write
File(PortHandle,Dat,1,BytesWritten,NIL);

END;


function READBYTE(): Integer;

var Dat: Byte;


BytesRead: DWORD;

begin


ReadFile(PortHandle,Dat,1,BytesRead,NIL);


if BytesRead = 1 then Result:=Dat else Result :=
-
1;

end;


procedure SENDSTRING (Buffer: Pch
ar);

var BytesWritten: DWord;

begin


WriteFile(PortHandle,Buffer^,Length(Buffer),BytesWritten,NIL);

END;


function READSTRING(): Pchar;

var Dat: Integer;


Data: STRING;

begin


Dat := 0;


while ((Dat �
-
1) and (Da�t 13)) do begin


Dat := ReadByte
();


if ((Dat �
-
1) and (Dat 䀀 13)) then Data := Data + Chr(Dat);


end;


READSTRING := pchar(Data);

end;


procedure CLEARBUFFER ();

begin


PurgeComm(PortHandle,PURGE_TXCLEAR);


PurgeComm(PortHandle,PURGE_RXCLEAR);

end;


function INBUFFER (): DWORD;

55


var Comstat: _Comstat;


Errors: DWORD;

begin


if ClearCommError (PortHandle, Errors, @Comstat) then


INBUFFER := Comstat.cbInQue else INBUFFER := 0;

end;


function OUTBUFFER (): DWORD;

var Comstat: _Comstat;


Errors: DWORD;

begin


if ClearCommErr
or (PortHandle, Errors, @Comstat) then


OUTBUFFER := Comstat.cbOutQue else OUTBUFFER := 0;

end;


procedure DTR(State:integer);

begin


if (State=0) then EscapeCommFunction(PortHandle,CLRDTR)



end;


procedure RTS(
State:integer);

begin


if (State=0) then EscapeCommFunction(PortHandle,CLRRTS)



end;


procedure TXD(State:integer);

begin


if (State=0) then EscapeCommFunction(PortHandle,CLRBREAK)


else EscapeCommFunction(PortHa

end;


function CTS():Integer;

Var mask:Dword;

begin


GetCommModemStatus(PortHandle,mask);


if (mask and MS_CTS_ON)=0 then result:=0 else result:=1;

end;


function DSR():Integer;

Var mask:Dword;

begin


GetCommModemStatus(PortHand
le,mask);


if (mask and MS_DSR_ON)=0 then result:=0 else result:=1;

end;


function RI():Integer;

56


Var mask:Dword;

begin


GetCommModemStatus(PortHandle,mask);


if (mask and MS_RING_ON)=0 then result:=0 else result:=1;

end;


function DCD():Integer
;

Var mask:Dword;

begin


GetCommModemStatus(PortHandle,mask);


if (mask and MS_RLSD_ON)=0 then result:=0 else result:=1;

end;


function INPUTS():Integer;

Var mask:Dword;

begin


GetCommModemStatus(PortHandle,mask);


INPUTS := (mask div 16) a
nd 15;

end;


procedure TIMEINIT();

var f: Int64;

begin


QueryPerformanceFrequency(f);


TimeUnit := 1000 / f;


QueryPerformanceCounter(StartTime)

end;


function TIMEREAD(): Real;

var t: Int64;

begin


QueryPerformanceCounter(t);


TIMEREAD := TimeUnit*(t

-

StartTime) ;

end;


procedure DELAY(DelayTime: Real);

var TimeStart: real;

begin


TimeStart := TIMEREAD;


while TIMEREAD (TimeStart + DelayTime) do;

end;


procedure REALTIME();

begin


SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

e
nd;


procedure NORMALTIME();

57


begin


SetPriorityClass (GetCurrentProcess(), NORMAL_PRIORITY_CLASS);

end;


begin

end.

Рисунок

2.
7
.
Листинг

модуля

RSCOM


Вид экрана во время работы терморегулятора показан на рисунке
2.
8
.



Рисунок
2.
8
. Вид экрана во время р
аботы программы


3 Использование пакета
Office

для управления физическим экспериментом



Работа на РС концентрируется в настоящее время в основном на немногих
программах под общей платформой Windows. Для очень специфичных обл
астей работы, как
например, запись измеренных значений пользователя отправляют к специфическому
программному обеспечению, которое часто поставляется изготовителями аппаратного
обеспечения и подчиняются очень различающимся стандартам. Тогда пользователь нер
едко
встречается с необходимостью быстрого перехода между совершенно различными
программами и конвертированием данных различных форматов.

В этой книге предлагается другой путь: пользователь будет управлять специфическим
аппаратным обеспечением прямо из сво
его стандартного программного обеспечения
Windows. Измеренные значения без конвертирования прямо переносятся в тексты или
таблицы. И приборами можно управлять прямо из стандартного ПО Word и Excel. Основой
для этого служат макросы. Так как эти оба компоне
нты офисных приложения поставляются
с встроенным Visual Basic , располагает каждый пользователь автоматически мощным
программным окружением. Макросы являются написанными на Basic программными
частями. Им предоставлено не только почти полное VB


окружение
в распоряжение, но и с
ними можно подогнать поведение офисного приложения, так как они имеют доступ к
58


объектам приложения. В соединении с представленной в этой книге библиотекой функций
(DLL) могут следовать сообщения и управление прямо из Office. С помощь
ю этих DLL
можно прямо управлять такими приборами, которые связываются с РС посредством
последовательного интерфейса.

Библиотека функций RSAPI.DLL написана специально для этого проекта книги. Она
поддерживает многочисленные приборы через последовательный и
нтерфейс с помощью
специальных функций и предлагает кроме этого много общих функций, с которыми можно
реализовать различные приложения. Кто уже обладает навыками в Бейсике и особенно в
Visual Basic , тот не будет иметь проблем при работе с макро
-
программир
ованием. Но и без
предварительных знаний в VB через запись макросов возможно воспроизвести исходные
тексты, которые затем можно легко дополнять.

Здесь используется только Word и Excel, хотя и другие офисные программы годны для
создания макросов. В особенно
сти для представления и управления подходит табличный
процессор Excel с его возможностями построения диаграмм. Word в платформе Windows
является широко распространенной программой обработки текстов и поэтому почти
повсюду используется.

Изложение рассчитано

на версии Word/Excel 97 и 2000. В старых версиях имеются отчасти
большие различия относительно Visual Basic. Между тем соответствует Office
-
VBA Visual
Basic 5.0
-
6.0 .

Примеры применяют исключительно последовательный интерфейс, так как здесь особенно
прос
то без проблем можно подключить собственные или имеющиеся в продаже приборы. В
нескольких случаях, как например , у модемов и у многих измерительных приборов данные
обмениваются в текстовом формате. Многие специальные РС
-
интерфейсы и
микроконтроллерные сис
темы применяют наоборот отдельные числовые команды и обмен
данными на основе число бинарных чисел. Через прямой доступ к проводникам интерфейса
можно особенно просто реализовать приборы или подключить АЦП без проблем прямо к
последовательному интерфейсу.

Ш
ирокий спектр возможных РС
-
интерфейсов простирается от очень простых приборов с
ограниченной областью применения до гибких заменимых приборов с собственным
управлением. К таким причисляют, например программируемые микроконтроллерные
системы типа SIOS и C
-
C
ontrol. Пользователю предоставляется возможность решать
специальные задачи с собственным ПО контроллерами и собственными определенными
протоколами передачи.



Макросы в Word


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


3
.1 Записываем первый макрос


Макрос можно создать просто

записывая несколько обычных действий в Word. Первый
маленький пример поясняет это. Часто требуется в отдельных частях текста использовать
другой тип шрифта , например для строки заголовки для листинга и для табличного текста.
Чтобы каждый раз не искать в
списке всех типов шрифтов необходимый шрифт, нужно
записать макрос. Через Сервис
-
макрос
-
начать запись или через двойной щелчок на MAK в
59


списке статуса можно подготовить макрос. В качестве имени макроса задаем например
©SрaltenSatz”. Через это уже стартуетс
я запись макроса. Появляется маленькое окно
управления с двумя кнопками. Затем как обычно выбираем желаемый шрифт ( например ,
Courier New). Затем заканчиваем запись макроса, нажав кнопку окончания в окне
управления. Теперь можно запустить в действие макро
с ©SрaltenSatzª. Через меню
Extras/Makros (Сервис

Макрос) двойным щелчком на имени макроса. Рисунок 2.1
показывает выбор макроса.


Рисунок
3
.1 Макрос в Word


Сам макрос состоит из команд на языке программирования Visual Basic. Этот факт имеет
важное значе
ние и образует собственно основу для этой книги, так как можно расширить
макрос простым бейсик кодом и таким образом решать очень специфичные задачи типа
управления внешним аппаратным обеспечением через последовательный порт. Кроме этого
нужно знать, что к
ак пользователь Wordа , мы обладаем одновременно и VB и можем
работать в этом очень дружественном для пользователя языке.

Только что написанный макрос можно посмотреть в его программном тексте через
Extras/Makros/Bearbeiten(Сервис
-
Макрос
-
редактировать) в в
иде:

Sub Makro1()

Selection.Font.Name=”Courier New”

End Sub

Пример поясняет строение макроса: записываются одна или несколько инструкций между
инструкциями Sub Makroname и EndSub. Таким образом возникает в VBA процедура с
именем Makroname, которая содерж
ит блок команд макроса. Теперь можно изменять или
расширять текст макроса прямо в исходном тексте . Можно, например, подставить другой
тип шрифта и снова сохранить макрос под другим подходящим именем. Для возврата к
обычному тексту необходимо конечно вызва
ть макрос “Flisstext” или добавить несколько
строк в макрос, чтобы например всегда производить одинаковый заголовок ( например
©Таблицаª). Текст начинается с TypeText, новая строка

с TypeParagraph

...

Selection.TypeText Text:=”Tabelle:”

60


Selection.TypePara
graph

....

Чтобы изучить правильные ключевые слова имеется простая возможность сначала записать
макрос с желаемым действием и затем посмотреть получившийся исходный код.
Дополнительную информацию можно найти в справке online.


3.2
Создание собственных макр
осов


Чтобы изготовить свой собственный макрос можно действовать двумя методами. Простой
первый вариант идет через диалог на рис. 2.1. В текстовом поле макроимени задают,
например, “Neues Makro” и затем нажимают на Создать. Word показывает VB
-

редактор с
пустым новым макросом. Второй способ вставляет новый модуль в VB
-
редактор через
главное меню “
Insert
/Modul”. В этот модуль можно поместить несколько макросов. Модуль
имеет только свойство “Name”. Как видно на рис. 2.2 он называется “New Makros” и
находится

он в проекте документа “Normal.dot”.


Рисунок
3
.2 VB

редактор из Office с пустым макросом


В этот модуль вставляется макрос с именем “NeuesMakro”. Если теперь добавить
инструкцию в макрос, можно выполнить его через F5. При этом курсор должен находитьс
я
61


внутри выполняемого макроса. Следующее обобщение показывает окно сообщения с
текстом Hello Welt.

Sub NeuesMakro ()

MsgBox “Hallo Welt”

End Sub

Листинг
3
.1

Верхний макрос автоматически сохраняется в “Normal.dot” и через это доступен во всех
основанных на

этом проекте документах. Если макросы должны транспортироваться в
независимые документы, то нужно вводить их не в Normal.dot. Чтобы активизировать
макрос в документе нужно, начиная с Office2000 установить в меню
сервис
\
макрос
\
безопасность среднюю или низ
кую степень защиты. Высокий уровень защиты
служит для защиты от вирусов и не позволяет запускать макросы.


Рисунок
3
.3 Установки защиты в Office2000


3
.3 Вставка новых команд через DLL


Новые команды и функции можно легко добавлять через внешнюю библиотек
у функций в
виде DLL. Так возникает расширенный базис с новыми возможностями. Здесь в первую
очередь в центре стоит прямое управление аппаратным обеспечением через
последовательный порт RSAPI.DLL (RS232 Application Programming Interface) для
WIN9x/NT/2000
. Соответствующие файлы следует скопировать или в системный каталог
WIN или в текущий рабочий каталог для файлов Word. Для серьезной работы с DLL лучше
всего скопировать DLL в Windows системный каталог, так как тогда они могут быть
использованы многими пр
ограммами, в том числе и Excel и Word. Каждая новая функция
или процедура должна быть объявлена в VB , т.е. сообщено Бейсику, какая новая функция
применяется и где следует искать соответствующий программный код. Следующий блок
объявлений подготавливает 4
важных функции для использования последовательного порта.
62


При внедрении этих DLL следует соблюдать написание заглавными буквами имен функций.
Объявления должны вводиться в модуль на первом месте. VB
-

редактор распознает, что речь
идет об объявлении и показ
ывает это соответственно.



Рисунок

3
.4
Объявление

внешних

функций



Declare Sub OPENCOM Lib “RSAPI.DLL” (ByVal Parameter As String)

Declare Sub CLOSECOM Lib “RSAPI.DLL”()

Declare Sub TIMEOUT Lib “RSAPI.DLL’(ByVal Ms As Integer)

Declare Function READSTRIN
G Lib “RSAPI.DLL”(ByVal S As String)

As Integer

Declare Sub SENDSTRING Lib “RSAPI.DLL” (ByVal S As String)


Листинг
3
.2 Объявление для использования последовательного порта

Все примененные функции находятся в библиотеке функций RSAPI.DLL. Их значения
являю
тся

OPENCOM: открытие последовательного порта

CLOSECOM: закрытие последовательного порта

SENDSTRING: посылка сообщения в текстовом формате

READSTRING: прием сообщения в текстовом формате

TIMEOUT: установка максимального времени ожидания при приеме.

Для пе
рвого применения DLL следует использовать прибор, который находит общее
распространение. На многих РС рабочих местах имеется модем, который через
последовательный порт подключается, например к COM2.


СОМ
-
порт имеет размещение разъемов, показанное на рису
нке

63



В нормальном случае служит модем для того, чтобы обмениваться текстами и другими
данными через телефонную сеть.

Для коммуникации между модемом и РС разработаны различные наборы команд, которые в
основном начинаются с АТ ( внимание). Команда ATI побу
ждает модем послать назад
информацию с максимально возможной скоростью передачи, чтобы стал известен тип
модема. Особенность модема состоит в том, что скорость передачи посланных от РС
символов распознается автоматически и на нее настраивается модем.

Обыч
ные скорости передачи, например 19200 или 57600 бит в секунду ( кратно 19200 бод и
57600 бод). Макрос листинга
3
.2 посылает сообщение ATI1 с 19200 бод и принимает затем
ответ модема. Между посылкой и приемом устанавливается максимальное время ожидания в
0.
03 секунды (30 микросекунд). В случае если модем не подключен, не готов к работе или не
найден в выбранном порту программа прекращает работать через это время. Макрос в
листинге
3
.3 имеет следующее строение:

объявление используемых внешних функций

открытие

порта СОМ1

посылка цепочки символов к модему

прием цепочки символов от модема

выдача принятой цепочки символов

закрытие порта

OPENCOM открывает последовательный порт СОМ1 с 19200 бод, без бита четности,8 бит на
символ. Для модема можно также установить др
угую бодовую скорость. TIMEOUT
устанавливает максимальное время ожидания для приема символов. После максимум 0.03
секунды без поступления нового символа процедура приема прекращает свою работу. Перед
вызовом READSTRING необходимо подготовить переменную тип
а String с достаточной
длиной, соответствующей ожидаемому ответу от модема. Это происходит здесь через
присвоение A$ 1000 пробелов. Принимаемые байты переписывают пустой текст. Число
64


принятых символов возвращается назад от READSTRING и в примере передается

через
переменную i. С VB
-
функцией Mid$ можно принятые символы скопировать из A$. Когда
модем на выбранном порту готов, он сообщает назад сначала посланную строку команд от
РС ATI и затем , например, сообщение 14400 Ok.

Модем следовательно распознается зде
сь как тип с 14400 бодами. У других приборов может
это сообщение сильно отличаться. Поэтому можно вставить здесь простой макрос, чтобы
тестировать модемы по их основной функции.

Вызов с MsgBox требует задания выводимого текста и по возможности собственной

надписи. Дополнительно можно задать вид MessageBox через VB
-
константы. С VBOkCancel
наряду с кнопкой Ok будет также дана кнопка прерывания. Если ответит пользователь Ok ,
тогда возвращается назад значение VbOk. Собственная функция макроса может также в
за
висимости от управления пользователя производить . Макрос MODEM2 применяет второй
MessageBox для выдачи ответа модема.




Рисунок
3
.5 Старт макроса


Sub Modem ()

If vbOK=MsgBox(“ Этот макрос посылает на модем в СОМ1 ‘ATI1’”,vbOKCancel,”Опрос
модема”) Then

OPENCOM “COM1:19200,N,8,1”

TIMEOUT 30

SENDString “ATI6” +Chr$(13)

S$=Space$(1000)

I=READSTRING(S$)

MsgBox Mid$(S$,1,i),vbOKOnly+vbExclamation,”
Ответ

модема


CLOSECOM

End If

End Sub

Листинг
3
.3 Управление модемом (
MODEM
.
DOC
)


65



Рисунок
3
.6 Ответ модема


Ин
формация опроса последовательных приборов, как демонстрируемая здесь модемом,
может быть также вставлена прямо в документ.


В следующем параграфе показано как можно произвести управление опросом из документа.
Результат представлен на рис
3
.7.

Документ сост
оит из заголовка и трех текстовых полей. Из пиктографического списка
управляющих элементов выбраны ComboBox, TextBox и CommandButton. Оба верхних
текстовых поля служат исключительно надписями, тогда как третье, большое текстовое поле
воспринимает требуемую

информацию. Документ содержит два макроса.
CommandButton1_Click() вызывается, когда нажимается стартовая кнопка. Чтобы при
открытии документа вводилась символьная цепочка в комбинационное поле ComboBox1)
вызывается Document_Open().

Собственный вызов слегк
а измененного опроса модема следует в своем модуле, в котором
также объявляются внешние функции. Макрос Modem передает 2 параметра. Первый
параметр содержит текст выбора комбинационного поля ( бодовая скорость и т.д.), второй
параметр передает желаемую ком
анду модема ( например ATI6). Эти обе цепочки символов (
строки) затем соответственно оцениваются или используются. Опрос модема таким образом
делается гибким. Можно теперь без изменения исходного текста выбрать другой порт. Ядро
опроса модема однако остае
тся неизменным. Введение текста в текстовое поле “TextBox11”
выполняется через “Makro записьª.

66




Рисунок
3
.7 Управление модемом в документе Modem2.doc



Private Sub CommandButton1_Click()

Modem ComboBox1.Text,TextBox1.Text

End Sub


Private Sub Document_Op
en ()

If ComboBox1.ListCount=0 Then

ComboBox1.AddItem “COM1:19200,N,8,1”

ComboBox1.AddItem “COM2:19200,N,8,1”

ComboBox1.AddItem “COM3:19200,N,8,1”

ComboBox1.AddItem “COM4:19200,N,8,1”

ComboBox1.ListIndex=1

End If

End Sub


Declare Sub OPENCOM Lib “RSAPI.DLL
” (ByVal Parameter$)

Declare Sub CLOSECOM Lib “RSAPI.DLL”()

Declare Sub TIMEOUT Lib “RSAPI.DLL’(ByVal Ms$)

Declare Function READSTRING Lib “RSAPI.DLL”(ByVal S$)

As Integer

Declare Sub SENDSTRING Lib “RSAPI.DLL” (ByVal S$)

Sub Modem (Baud,Command)

OPENCOM B
aud

67


SENDSTRING Command + Chr$(13)

S$=Space$(2000)

I=READSTRING(S$)

ActiveDocument.Shapes(“Text Box 11”).Select

Selection.TypeText Text:=Mid$(S$,1,i)

CLOSECOM

End Sub



Рисунок
3
.8 Кнопка старт и ComboBox макрос в документе


3
.4 Звонок через модем


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

Макрос должен побудить телефон выбрать желаемый телефонный номер. Для этого имеются
две возможные модемные команды:

ATDP[Tel
-
Nr] выбор в пульсовом наборе

ATDT [Tel
-
Nr] выбор в тональном наборе

68


Старые телефонные сети допускают только импульсный выбор. Там
где также возможен
тональный выбор, следует выбрать его, так как это экономит время. Соответствующую
команду выбора можно легко послать с макросом как на листинге
3
.4. После выбора следует,
однако соединение от модема отключить, чтобы можно было вести разг
овор по телефону
вести по тому же проводу. Для этого имеется другая команда

ATH модем повешен

Со стартом макроса слышат сначала типичный шум выбора, в случае если в модемных
установках не отключен тон. Макрос открывает еще один MessageBox , который следует

закрыть, как только процесс выбора закончен. Когда модем выбран, следует снять трубку
телефона, чтобы дальше поддержать соединение.


Declare Sub OPENCOM Lib “RSAPI.DLL” (ByVal Parameter$)

Declare Sub CLOSECOM Lib “RSAPI.DLL”()

Declare Function READSTRING
Lib “RSAPI.DLL”(ByVal S$)

As Integer

Declare Sub SENDSTRING Lib “RSAPI.DLL” (ByVal S$)

Sub Wahlhilfe()

If i=vbok Then “Karl”: Telefon$=”3456789”

I=MsgBox(If i=vbok then + “ anrufen”, 64+1)

If i then

OPENCOM “COM1:19200,N,8,1”

SENDSTRING “ATDT “ +Telefon$ +

Chr$(13)

MsgBox “Horer abnehmen”

SENDSTRING “ATH” +Chr$(13)

CLOSECOM

EndIf

End Sub


Листинг
3
.4 Макрос для вызова (Karl.doc)


Рисунок
3
.9 Сообщение выбора помощи



3
.5 Команды в пиктографическом меню


Через добавление иконки в список иконок сильно упроща
ется доступ к собственным
макросам. Через главное меню Вид/Панели инструментов/настройка/Команды/Макрос или
через правый щелчок на списке иконок можно через “Настройка” записать дополнительные
команды и макросы в имеющийся список иконок. В диалоге “Настрой
ка” выбирают закладку
Команды , а в ней Макросы.

69



Рисунок
3
.10 Помощь выбора в списке иконок


Из списка выбирают желаемый макрос и перетаскивают мышкой на имеющийся список
иконок. Пока показывается диалог ©Настройкаª находится Word в другом режиме. Прав
ый
щелчок по заново добавленной иконке показывает другое контекстное меню. Там можно
учесть индивидуальные желания. Имя, например для “выбора помощи” и для изменения типа
кнопки можно выбрать телефонный символ. По стандарту дается иконка без текста. С
текс
том и символом кнопки получают представление на рис. 2.11.



Рисунок
3
.11 Подгонка списка иконок




3
.6 Использование форм в Visual Basic



В Office 97 макроязык в Word идентичен с Visual Basic. Согласно этому можно также
применить используемые по Visual

Basic методы. VB использует так называемые формы или
окна, в которых выполняются приложения. Чтобы организовать VB приложение нужно
сначала установить новую форму. Эта форма является объектом с различными свойствами и
методами. Среди методов можно предста
влять команды, которые действуют на объект.
Свойства являются атрибутами объекта . Достоинства такого варианта настолько велики, что
стоит сделать краткое разъяснение VB
-

объектов. Если не используют специфичных для
Word объектов можно этот проект без изме
нения экспортировать в Excel или VB. Через
ALT+F11 стартуется VB
-

редактор. В главном меню через
Insert
/
UserForm

устанавливается
70


новая форма. Появляется простое окно с кнопкой закрытия в верхнем правом углу окна. В
Свойствах окна изменяют только имя ( Name
) для Userform1 на Karl. Надпись на окне
(Caption) должна стать “Вызвать Карлаª. Теперь еще необходимы 3 управляющих элемента
из библиотеки разработки. В качестве первого
-
поле названия. Оно является меткой и должно
содержать текст “Telefonnummer”. Рядом по
мещается текстовое поле, чтобы можно было
задать другой номер телефона. Наконец еще ставят кнопку команды, чтобы стартовать
собственный макрос. Следует изменить следующие свойства различных объектов:

1) Поле надписи “Label1Э содержит как “Caption” текст “T
elefonnummer:”

2) Текстовое поле “Textbox1” содержит как текст цифровой ряд “3456789”.

3) Текстовое поле “Text box 1” содержит имя “Telefon”

4) кнопка команды “CommandButton1” содержит как “Caption” текст “Выбрать”.

5) форма “Userform1” содержит имя ©Кар
лª

Теперь следует приписать CommandButton1 макрос. Двойным щелчком открываем макрос,
который при одном щелчке выполняется. Макрос “CommandButton1_Click() выполняется
когда нажимается кнопка ©Выбратьª.

Declare Sub OPENCOM Lib “RSAPI.DLL” (ByVal Parameter$)

Declare Sub CLOSECOM Lib “RSAPI.DLL”()

Declare Sub SENDSTRING Lib “RSAPI.DLL” (ByVal S$)


Private Sub CommandButton1_Click()

OPENCOM “COM1:19200,N,8,1”

SENDSTRING “ATDT” + Karl.Telefon.Text + Chr$(13)

MsgBox “Horer abnrhmen”

SENDSTRING “ATH” + Chr$(13)

CL
OSECOM

End Sub



Это отличается только немного от предыдущей версии. Функция Karl.Telefon.Text
поставляет символьную цепочку телефонного номера. При этом Karl является главным
окном, Telefon является текстовым полем и Text

символьной цепочкой, которая
пок
азывается в текстовом поле.

71




Рисунок
3
.12 VB
-

редактор с UserForm1



Ключевое слово “Private” предотвращает конфликты с одноименными макросами и
объявлениями в других модулях. Имена и объявления, таким образом действительны только
локально. Когда форма K
arl показывается в VB
-

редакторе, можно стартовать по F5. Если это
должно быть вызываемо из списка иконок, то нужно еще добавить маленький макрос в
модуль. Этот маленький макрос показывает форму и выполняется через метод Show.

Sub Karlanrufen()

Karl.Show

E
nd Sub

Теперь можно взять макрос “Karlanrufen” также из списка иконок. На CD находится проект
документа Telefon.doc. Он содержит приведенные здесь макросы.

Здесь представленная помощь выбора функционирует без изменения в Excel и других
офисных приложениях
с поддержкой VB и в Visual Basic.

72




Рисунок
3
.13 Помощь выбора как VB
-
Form с списком иконок (Telefon.doc)




Так как не использовались команды и свойства Word, работает форма без проблем и в
других приложениях. С VB можно даже изготовить из этого самосто
ятельные программы
(exe). VB

редактор располагает этой возможностью через пункт меню
File
/Export и
File
/
Import
. Через этот путь можно обмениваться формами с исходным текстом между
приложениями. Если экспортировать Karl.frm , то возникает текстовый файл и
з листинга
3
.5.

VERSION 5.00

Begin {C62A69F0
-
16DC
-
11CE
-
9E98
-
00AA00574A4F} Karl

Caption =”Karl anrufen’

ClientHeight=1440

ClientLeft=45

ClientTop=330

ClientWidth=3630

OleObjectBlob=”Karl.frx”:0000

StartUpPosition=1 ‘CenterOwner

End

Attribute VB_Name=”Karl”

Attribute VB_Creatable=False

Attribute VB_PredeclaredId=True

Attribute VB_Exposed=False

Declare Sub OPENCOM Lib “RSAPI.DLL” (ByVal Parameter$)

Declare Sub CLOSECOM Lib “RSAPI.DLL”()

Declare Sub SENDSTRING Lib “RSAPI.DLL” (ByVal S$)

Private Sub CommandButt
on1_Click()

OPENCOM “COM1:19200,N,8,1”

73


SENDSTRING “ATDT” + Karl.Telefon.Text + Chr$(13)

MsgBox “Horer abnrhmen”

SENDSTRING “ATH” + Chr$(13)

CLOSECOM

End Sub

Листинг
3
.5 Экспортированный файл формы




рисунок
3
.14 Импортированная помощь выбора в Excel




Он возникает с Word 97. Это поддерживается VB5. Дополнительно еще производится
бинарный файл “Karl.frx”, который содержит среди прочих величину и положение окна.


3
.3
. Макросы в
Excel


Обработка больших массивов данных ставят пользователя старого ПО перед

большими проблемами. Во многих случаях требуется написать большие специальные
программы, обслуживание которых требует дополнительного времени и денег. Чтобы можно
было решить максимально возможное количество задач с помощью одной программы,
разработаны ун
иверсальные программы расчета таблиц. Пользователю не нужно больше
заботиться о внешнем виде, типе меню обслуживания и графическом представлении и можно
сосредоточиться на своих данных измерения и их оценке. Наиболее мощным представителем
такого класса явл
яется Excel. До сих пор при обработке данных измерений приходилось
работать с многими программами, причем чистое восприятие данных и их оценка и
представление были разделены. Для получения желаемых данных от измерительного
прибора или порта съем измеренных

данных поставлялся с помощью очень специальных
программ. Затем данные конвертировались и переводились в формат, читаемый Excel и
наконец оценивались с помощью табличных вычислений.

74


Целью этой раздела является сократить и упростить этот длинный путь . Изме
ренные данные
следует взять прямо из Excel , а именно с помощью очень простого Бейсик
-
макроса. Всю
работу можно проделать с помощью одной программы. Вместо больших программ
регистрации измеряемых данных нужно написать только маленький макрос. Подсоединение

внешнего аппаратного обеспечения следует при этом с помощью универсальной
бибилиотеки RSAPI.DLL для приборов с последовательным портом. DLL следует сначала
скопировать в Windows

каталог, Windows
-

System
-

каталог или текущий рабочий каталог
для Excel до
кумента.

Простое введение в VBA
-

программирование делается через запись макроса как следствия
отдельных действий мышью и на клавиатуре. Результат можно затем посмотреть как Бейсик
-
исходный текст и изменить его после изучения других тонкостей. Первый макрос

должен
получить имя Makro1 и выполнить следующие действия:

в рабочей папке активизировать рабочий лист1

Выделить столбцы А и В ( пометить)

Содержимое помеченных столбцов очистить

Ячейки от А1 до В2 заполнить числовыми значениями



Рисунок
3.
1
5

Вручную
введенные табличные значения


Для записи макроса выбирают сначала Сервис/Макрос/Начать запись . Появляется
диалоговое окно Запись Макрос с заданным именем макроса Makro1. После Ok появляется
на экране маленький символ Makro/Запись остановить. Теперь можно
проводить все
желаемые действия. В конце задействуется кнопка Макрос/Запись окончить . Чтобы показать
полученный исходный текст выбирают в Makro
-

диалоге, который достигается через меню
Сервис/Макрос/Макросы... (ALT+F8)
-

Выполнить (обработка).

75


В открытом т
ак VBA
-

редакторе можно редактировать исходный текст записанных действий.
Макрос можно теперь сколь угодно раз запускать в записанных или пустых табличных
листах, причем каждый раз снова появляются четыре числовых значения. Интереснее было
бы конечно, если

как в обычном Бейсике
-

вычислить числовые значения и внести в таблицу.
В классическом Бейсике можно, например, в качестве первого упражнения вычислить ряд
квадратов чисел.







Рисунок
3.16

VBA
-
редактор с исходным текстом записи


For n=1 to 10: print n
,n*n :next n.

Макрос test1 может решить эту задачу, если подставить строки для ввода числовых
значений. Следующий листинг показывает решение

Sub Makro1()

Sheets(“Tabelle1”).Select

Colums(“A:B”).Select

Selection.Clear Contents

For n=1 to 10

Cells(n,1).Value
=n

Cells(n,2).Value=n*n

Next n

End Sub

Листинг 1 Макрос для подстановки вычисленных значений в табличный лист

76





Рисунок 3
.17

показывает рабочий лист после старта этого макроса.




При присваивании вычисленных значений n и n*n в отдельные столбцы таблич
ного листа
следует соблюдать следующее:

Координаты задаются в Excel
-

манере в последовательности строка, столбец. Между обоими
параметрами стоит, как обычно, в Visual Basic в качестве символа разделения

запятая.



Вызов внешних функций


Присоединение макр
оса к внешнему аппаратному обеспечению следует через RSAPI.DLL.
Первый пример должен демонстрировать применение DLL в Excel. После этой первой
попытки остается только еще маленький шаг, подставить в таблицу вместо вычисленных
значений действительные измере
нные значения. Нужно принять аналоговые значения из
двух измерительных каналов порта в определенном временном интервале. Все для этого
необходимые функции поставляет RSAPI.DLL. Соответствующие функции можно также
использовать без подключения конкретного ап
паратного обеспечения, при этом ответ порта
эмулируются.

Для собственных попыток можно исходить из макроса, который сначала записывается
вручную, а затем изменяется. При повторной работе с Excel
-
макросом, однако, удобнее
работать с новыми рабочими листами

макроса. Для этого действуют так
-

после старта Excel
открывается рабочий лист с многими табличными листами. Здесь потребуется только лист с
именем таблицы Лист1. Активизируем окружение программирования Visual Basic через
77


Сервис/Макрос/Редактор Visual Bas
ic (ALT+F11). Там затем через пункт меню
Insert
/Modul
устанавливаем новый модуль, как представлено на рис.
3.18
.





Рисунок
3.18

Вставка нового модуля



Он назван именем Modul1. В случае, если необходимые объявления еще не определены ни в
каком модуле,

нужно их скопировать в макрос (Modul1) или ввести. Можно также все
объявления внести на собственном макро
-
листе и собственный программный текст через это
становится короче и яснее. Все применяемые функции сначала должны быть объявлены. При
объявлении DLL
-

функций придерживается Excel
-
VB строго обычных соглашений в Visual
Basic. Важно, что в VB все параметры ByVal должны также передаваться как параметры

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

этом может случиться труднообнаруживаемеая ошибка. Все функции в
RSAPI.DLL должны быть записаны большими буквами. Это необходимо соблюдать только
при объявлении. В исходном тексте функции затем автоматически представляются
редактором большими буквами. Пер
вый пример должен еще работать совсем без
специального аппаратного обеспечения. Однако применяется здесь специальная функция
таймирования, DLL которой в VBA отсутствует. С TIMEINIT обнуляется внутренний
миллисекундный счетчик. TIMEREAD считывает текущее со
стояние времени.
Дополнительно имеется в распоряжении функция DELAY как функция задержки с
миллисекундным разрешением. Другой примененной в этом примере DLL
-

функцией
является функция измерения AIN. Она применяется обычно в связи с интерфейсом типа
78


CompuLA
B или SIOS, которые далее будут обсуждены подробнее. Конечно, для
действительного управления аппаратным обеспечением предварительно необходимо
открыть последовательный порт. Если задать команду FINDHARD, то находится DLL в
режиме эмуляции. При этом для ана
логовых входов измеряются медленные синусоидальные
сигналы. Следующий макрос производит два столбца для времени и измеренного
эмулированного напряжения. Воспринимаются 60 строк с 60 измеренными точками в
минуту.


Declare Sub TIMEINIT “RSAPI.DLL” ()

Declar
e Function TIMEREAD Lib “RSAPI.DLL” () As Long

Declare Function AIN Lib “RSAPI.DLL” (ByVal Ein%) As Integer

Declare Sub DELAY Lib “RSAPI.DLL”(ByVal ms%)


Sub Makro1 ()

Sheets(“Tabelle1”).Activate

Columns(“A:B”).Select

Selection.ClearContents

TIMEINIT

For n
=1 to 60

Cells(n,1).Value=TIMEREAD/1000

Cells(n,2).Value=AIN(1)

DELAY 1000

Next n

End Sub


Листинг Эмуляция восприятия измеренных значений (YT1.XLS)



79




Рисунок
3.19

Эмулированный вывод измеренных значений





Восприятие измеряемых значений


Для действит
ельного управления портом нужно сначала открыть порт. Кроме того, нужно
сообщить DLL , с каким прибором работаем. Теперь можно учесть специфические команды
порта. RSAPI.DLL содержит, однако дополнительно также автоматическое распознавание
интерфейса. С FIN
DHARD ищет программа подключенный интерфейс и открывает затем
соответствующий порт. Если интерфейса не найдено, тогда активизируется автоматически
режим эмуляции. В примере YT2 применены следующие DLL
-

функции:

FINDHARD

поиск и инициализация интерфейса

AI
N опрос аналогового значения с порта

TIMEINIT инициализация миллисекундного таймера

TIMEREAD считывание текущего времени


DELAY ожидание n миллисекунд

Применяемый аппаратный интерфейс, например является CompuLab или SIOS
-
интерфейс.
Здесь следует работать
с автоматическим распознаванием интерфейса, чтобы можно было
подставлять различные интерфейсы и чтобы был возможен эмуляционный процесс
восприятия значений без интерфейса. Кроме аналогового ввода используется также
таймерная функция DLL.

Declare Sub TIMEIN
IT “RSAPI.DLL” ()

Declare Function TIMEREAD Lib “RSAPI.DLL” () As Long

80


Declare Function AIN Lib “RSAPI.DLL” (ByVal Ein%) As Integer

Declare Sub DELAY Lib “RSAPI.DLL”(ByVal ms%)

Declare Sub FINDHARD Lib “RSAPI.DLL” (ByVal Meldung%)


Sub Makro1()

FINDHARD 1

Sheets(“Tabelle1”).Activate

Columns(“A:B”).ClearContents

TIMEINIT

For n=1 to 60

Cells(n,1).Value=TIMEREAD/1000

Cells(n,2).Value=AIN(1)

Calculate

DELAY 1000

Next n

End Sub


Листинг Восприятие данных с порта (YT2.XLS)






Макрос поставляет в столбце А вре
мя в секундах, в столбце В измеренное значение как
грубые данные между 0 и 255. Значения можно перенести с помощью ассистента диаграмм в
диаграмму. Для нового использования достаточно стартовать макрос. Диаграмма остается на
табличном листе и видно, как вс
е измеренные значения вносятся как в таблицу, так и в
диаграмму. Папка предлагает, поэтому законченный графопостроитель данных. В
зависимости от задачи можно выбрать подходящие надписи и оцифровку осей. Когда, как
здесь, работают с жестким ( фиксированным
) временем измерения, рекомендуется
отключать автоматическое масштабирование и задать жестко длину осей.






81



В большинстве случаев требуется определенный пересчет или масштабирование для задач
измерения. В этом случае нужно пересчитать измеренные знач
ения исходных данных в
области 0
-
255 в напряжения в интервале 0
-
5 вольт. Для этого имеется два возможных пути.
По первому можно применить третий столбец с пересчетной формулой (=В1*5/255). По
второму можно ввести пересчет прямо в макрос. Для этого достаточ
но изменить строку

Cells(N,2).Value=AIN(1)/255*5

Дальнейшее улучшение касается изменения надписей столбцов, например ©Время/s”
“Напряжение/V”. Рабочая папка позволяет снабжать дополнительными надписями и
комментариями, так что бы другой пользователь быстро

вошел в курс дела.

Макрос YT2 применяет автоматическую актуализацию диаграммы во время изменения. За
это ответственна следующая строка программы

Calculate.


При быстром изменении или многоканальных измерениях часто разумно включить
автоматический расчет,
например, для восприятия данных со всех каналов. Эти методы
применяются в следующем.



Двухканальный регистратор данных


В зависимости от подключенного интерфейса можно применить несколько каналов входа.
Измеренные данные можно представить различными цвета
ми на диаграмме. Здесь
представленные макросы дают стартовую возможность из табличного листа и установку
времени измерения. Рис. 7 показывает готовый рабочий лист. Исходный текст макроса
находится в листинге 4.

Declare Sub TIMEINIT “RSAPI.DLL” ()

Declare
Function TIMEREAD Lib “RSAPI.DLL” () As Long

Declare Function AIN Lib “RSAPI.DLL” (ByVal Ein%) As Integer

Declare Sub FINDHARD Lib “RSAPI.DLL” (ByVal Meldung%)

82



Sub Makro1()

FINDHARD 1

Sheets(“Tabelle1”).Activate

Range(“A1”).Select

Columns(“A:B”).ClearCont
ents

Messdauer=60000

Intervall=1000

TIMEINIT

T=0:Zeile=1

Do

Cells(Zeile,1).Value=TIMEREAD/1000

Cells(Zeile,2).Value=AIN(1)/255*5

Cells(Zeile,3).Value=AIN(2)/255*5

Calculate

While TIMEREAD t+ Intervall

Wend

T=TIMEREAD

Zeile=Zeile +1

Loop Until� t=Messdauer

End Sub

Листинг 4 Двухканальный плоттер данных (YT3.XLS)



Рисунок
3.20

Двухканальный плоттер данных


83




Макрос производит три столбца для времени, напряжения на каналах А и В. Напряжения
пересчитываются уже из поставленных интерфейсом исходных данных и п
оявляются как
числовые значения в области измерения 0 до 5 вольт. После первого старта программы
имеют табличный лист с тремя столбцами. В нем можно теперь с помощью ассистента
диаграмм воспроизвести диаграмму. В табличном листе Tabelle1 маркируются три ст
олбца
A,B,C через протяжку через область А
-
С. В меню затем активируется ассистент диаграмм
через Вставить/Диаграмму. Ассистент сначала спросит о типе диаграммы. Разумно взять
точку (ХУ)
-
диаграммы. Дополнительно следует выбрать подтип, здесь измеренные точк
и с
прямой связью .



Рисунок
3.21

Первый шаг: тип диаграммы всегда Punkt(XY)


Маркированная область=Tabelle1!$A$1:$C$60 появляется на втором шаге как предложение и
должно быть подтверждено с

Далее (ср. рис.
3.22
). На третьем шаге можно определить
заго
ловок, оцифровку осей, линии решетки и легенду. Последний шаг должна ли быть
создана диаграмма на табличном листе или на отдельном диаграммном листе. В табличном
листе распознают дополнительно кнопку с обозначением start. Она вводится позднее и
связывается

с макросом через обработчик . Теперь можно через простой щелчок стартовать
84


новое сообщение. Практически возникает, таким образом, простой практический
измеритель.



Рисунок
3.22

Второй шаг: установка источников данных





Управляющие объекты в Excel


Of
fice97 предоставляет Excel еще две различных возможности, чтобы реализовать
управляющие объекты и другие обслуживающие элементы на рабочем листе

форма

палитра управляющих элементов (Toolbox)

Чтобы эти списки иконок показать, делают соответствующий выбор че
рез
Сервис/Настройка
-
Панели инструментов.

Оба списка иконок содержат одинаковые управляющие элементы. Однако поведение этих
элементов совершенно различное.

85




Рисунок
3.23

Toolbox с управляющими элементами и форма со списком символов в Excel



Здесь описа
нные управляющие элементы ставятся исключительно из списка иконок формы.
Эти управляющие элементы совместимы с предыдущими версиями Excel. Им тотчас после
установки приписывают макросы. У элементов листа работают эти элементы главным
образом с данными в я
чейках рабочего листа. Если после установки управляющей
поверхности приписать верхний макрос Test , то можно вызвать макрос из рабочего листа.
Управляющие элементы из Toolbox подходят для оформления V
B
-
форм и соответствуют
управляющим элементам Visual Basi
c. Для добавления кнопки из списка символов формы
требуются следующие шаги: сначала нужно сделать видимым список символов Formular
через меню.В нем выбирают кнопку и перетягивают его мышью на желаемое место.
Появляется диалог Назначить макрос объекту. В н
ем приведены все выбираемые имена
макросов, причем возможны только такие процедуры, которые объявлены без параметров.
Через выбор имени производится связывание с соответствующей процедурой. Подписи
кнопок можно редактировать, пока они помечены. Маркировка
следует через правую кнопку
мыши.



Применение комбинационных полей


Если желают представленные здесь методы измерений привести к комфортабельным
программам, тогда должна присутствовать возможность установки времени измерений.
Пользователь должен быть в с
остоянии подобрать как интервал измерений, также общую
длительность измерения.

86




Рисунок
3.24

Установка времени в собственных полях


Declare Sub TIMEINIT “RSAPI.DLL” ()

Declare Function TIMEREAD Lib “RSAPI.DLL” () As Long

Declare Function AIN Lib “RSAPI.
DLL” (ByVal Ein%) As Integer

Declare Sub FINDHARD Lib “RSAPI.DLL” (ByVal Meldung%)


Sub Makro1()

FINDHARD 1

Sheets(“Tabelle1”).Activate

Range(“A1”).Select

Columns(“A:
С
”).ClearContents

Messdauer=Cells(15,5).Value

Intervall=Cells(15,7).Value

TIMEINIT

T=0:Zei
le=1

Do

Cells(Zeile,1).Value=TIMEREAD/1000

Cells(Zeile,2).Value=AIN(1)/255*5

Cells(Zeile,3).Value=AIN(2)/255*5

Calculate

While TIMEREAD t+ Intervall

Wend

T=TIMEREAD

87


Zeile=Zeile +1

Loop Untel t�=Messdauer

End Sub

Листинг Установка длительности измерения и

интервала времени в табличном листе
(YT$.XLS)



В качестве первого шага можно установить простые ячейки таблицы, в которых стоят
желаемые установки. Пользователь может ввести тогда здесь новые значения. Макрос на
листинге демонстрирует метод. В EI8 стоит

длительность измерения в секундах, в G18

интервал времени в секундах. Внешность экрана управления можно еще больше отклонить
от обычной программы измерения, когда удается дать пользователю возможность выбора из
выпадающего меню. E
xc
el имеет для этих целе
й так называемые комбинационные поля. Их
использование требует только небольшое изменение в программе. Существенные свойства
устанавливаются в табличном листе. Рис. 12 показывает табличный лист с
комбинационными полями для длительности измерения и временно
го интервала.

Сначала нужно установить область листа, в которую будут вноситься длительности
измерения. В примере выбрано H1
-
H6. Здесь вводятся времена в секундах. Из списка
символов Formular выбирается комбинационное поле и устанавливается на желаемое мес
то.
Через меню Формат /Элемент управления или по правой кнопке мыши достигают диалога
Элемент управления. Здесь задают область списка для перед этим выбранных ячеек с вводом
выбора ($H$1:$H$6). Область можно также задать маркировкой мышкой. Как следующее
устанавливают связь вывода с полем. При этом речь идет о поле ( здесь $H$1) , в которое
автоматически записывается индекс выбранного ввода ( здесь 1..6). Макрос должен оценить
этот индекс, чтобы найти выбранную установку. Для этого требуются две следующие
строки

IX=Cells(10,8).Value

Messdauer=Cells(IX,8).Value*1000

В ячейке 10,8 ( соответствует Н10) стоит индекс IX выбора Drop
-
Down. Предописанная
установка длительности измерения достигается косвенно через ячейку IX,8. Считывают
здесь длительность измерения
в секундах, так что требуется пересчет в миллисекунды.

88




Рисунок
3.25

Комбинационное поле в рабочей папке Excel



Второй Drop
-
Down организуется подобным же образом для интервала времени. Также и эта
установка оценивается в макросе. Общий макрос можно увид
еть в листинге .



Наблюдение входов через диалоговые окна



Обычно выводы проводятся через команду Debug.Print с добавлением текста в текущий
документ или через MessageBox. В каждом случае можно представить только моментальное
значение. Однако иногда важ
но, чтобы можно было наблюдать также и изменение значения.
В этом разделе покажем, как можно сделать малое диалоговое окно для показа значений на
входе. При этом способ действия для Word и Excel идентичен. Чтобы сделать возможным
обмен используется специ
фический вызов. В VB

редакторе вводится новая форма
пользователя. Принципиально ведет себя VBA точно также, как Visual Basic. В этом
диалоговом окне можно располагать управляющие элементы. В данном примере
добавляются только два Label или окно надписей
из палитры инструментов. В левой
половине экрана показываются свойства объектов. В этом примере только имя “Label2”
имеет значение. Свойство Label2.Caption представляет текст метки. Здесь сначала вводится
©00000000ª. Позднее макрос подставит там цифровое з
начение функции DIN. С двойным
щелчком на диалоговом окне (UserForm) переходят в диалоговое окно кода.

89




Рисунок
3.2
6 Установка нового диалогового окна




Там находится пустая процедура

Private Sub UserForm_Click()

End Sub

В верхней области окна исходного

текста слева в выборе DropDown перечислены сами
различные элементы в диалоговом окне и само диалоговое окно. В правой части стоят
события. Для этого примера необходимы следующие события

Private Sub UserForm_Activate()

End Sub

Private Sub UserForm_Initiali
ze ()

End Sub

Событие Initialize наступает, когда диалоговое окно еще не видимо и должны быть
инициализированы списки и другие элементы. После инициализации следует изображение и
вызов процедуры активации. VBA не обладает, как VB элементом Timer , который
делает
возможным регулярный опрос. Чтобы удержать продолжающийся показ значений на входах,
необходим небольшой трюк. Сначала вводят в общей части ( выпадающем списке слева
вверху) объявления DLL.

Private Declare Sub FINDHARD Lib “RSAPI” (ByVal i%)

Private
Declare Function AIN Lib “RSAPI” (ByVal i%) As Integeer


При активации диалогового окна сначала ищется имеющееся аппаратное обеспечение. Здесь
можно также открыть с помощью OPENCOM интерфейс .



90




Рисунок
3.2
7 UserForm с двумя метками


Трюк с бегущим пока
зом основан на том, что пока видимо диалоговое окно , вызывается
процедура запасающая Label2 с соответствующим текстом. Эта процедура Scan имеет
следующее строение

Private Sub Scan ()

While UserForm1.Visible

Do Events

A$=””:B=128:Wert=DIN

For i=1 to 8

If B

AND Wert then A$=A$+”1” else A$=A$+”0”

B=B/2

Next i

Label2.Caption=A$

Do Events

Wend

End Sub

Эта процедура представляет собой бесконечный цикл, который может быть окончен только
по закрытию диалогового окна. Чтобы VBA отработал возможность передать наружу

этой
91


процедуры также и события кнопок , вызывается DoEvents. Иначе VBA не реагировал бы на
поле закрытия. Эта процедура Scan должна всегда начинаться, когда показывается
диалоговое окно ( активизируется). На этом основании следует в процедуре
-
событии вызо
в
активизации



Рисунок
3.2
8 Событие диалогового окна ( UserForm)



Private Sub UserForm_Activate()

FINDHARD 1

Scan

End Sub


С F5 можно стартовать диалоговое окно. Теперь входные значения цифровых входов
показываются бегущими.


Рисунок
3.2
9 Диалоговое
окно с бегущим показом

Private Declare Sub FINDHARD Lib “RSAPI” (ByVal i%)

Private Declare Function DIN Lib “RSAPI” () As Integeer

Private Sub Scan ()

While UserForm1.Visible

DoEvents

A$=””:B=128:Wert=DIN

For i=1 to 8

92


If B AND Wert then A$=A$+”1” else A$=A
$+”0”

B=B/2

Next i

Label2.Caption=A$

Do Events

Wend

End Sub

Private Sub UserForm_Activate()

FINDHARD 1

Scan

End Sub


Листинг
3.30

Бегущий вывод входных состояний в диалоговом окне



Управление шаговым двигателем


Шаговые двигатели используются, когда необх
одимо установить точное положение без
последующего опроса сообщения о позиции. Обычный шаговый двигатель проводит 200
отдельных шагов за оборот, так что получается разрешение по углу в 1.8 градуса. Когда
начальное положение известно, например, через механи
ческое фиксирование или через
определенный концевой выключатель, можно через заданное число шагов достичь точного
положения. Шаговые двигатели управляют, например, позицией следа пишущей
-

считывающей головки в дисководе или позицией печатающей головки в иг
ольчатом
принтере.

Принципиальное строение шагового двигателя показано на рис.
3.31
.



Рисунок
3.31

Строение шагового двигателя

Вращающийся магнитный ротор помещен между несколькими магнитными катушками.
Через включение катушек ротор устанавливается в оп
ределенную угловую позицию. Если
переключить затем на следующую катушку, тогда повернется ротор на один шаг дальше.
Если дополнительно также можно обратить направление тока, говорят о биполярных
шаговых двигателях. Они обходятся с 4 подключениями для двух

катушек. Униполярные
шаговые двигатели применяют например 4 катушки и обладают по крайней мере 5 входами.
Можно биполярно управлять униполярным шаговым двигателем. Поэтому здесь дается
только пример для биполярного управления. Биполярное управление шагов
ого двигателя
93


предполагает усилитель мощности с мостовыми выходами. Маленькие моторы потребляют
не более 200 милиампер на катушку при напряжении питания 12 вольт. Для управления
можно, например, использовать SIOS
-

интерфейс. Он обладает мостовыми выходами
с
нагрузкой до 600 миллиампер и регулируемым напряжением питания от 5 до 12 вольт.
Кроме того содержит этот прибор также аналоговые выходы по мощности.








Рисунок
3.32

Подключение шагового двигателя мостовым выходам нагрузки

Для CompuLab , который од
ин может давать только 10 миллиампер при 5 вольтах требуется
подключить усилитель мощности. В обоих случаях катушки шагового двигателя на рис.11
включаются между двумя выходами. Таблица 1 показывает требуемое управление выходами
для полушаговой работы.

Т
аблица 1 Схема управления для биполярного шагового двигателя




94


Шаговый мотор достигает при этом удвоенного числа шагов в одном обороте, так как всегда
попеременно одна катушка одна и две катушки вместе включаются. Управляет макрос на
листинге 11 точно од
ним оборотом мотора с 400 отдельными шагами. Это служит здесь как
простой пример и основу для более сложных управлений. Отдельные состояния выходов для
каждого отдельного шага предопределены в переменной В (8). Для текущего времени макрос
считывает состоян
ие через индексную переменную IX. Принципиально можно поменять
направление вращения , если уменьшать IX. Максимальная скорость шагового мотора
ограничена. Часто поэтому необходимо встраивать замедление с дополнительной командой
задержки.


Declare Sub INITS
IOS Lib “RSAPI.DLL” (ByVal COM%)

Declare Sub DOUT Lib “RSAPI.DLL” (ByVal Wert%)

‘0=b1,1=rt,2=ws,3=ge

Dim b(8) ‘Глобальные переменные


Sub Main

Links=0

Schritte=400

INITSIOS 2

B(0)=8:b(1)=9:b(2)=1:b(3)=5

B(4)=4:b(5)=6:b(7)=10:ix=0

For n=1 to Schritte

If lin
ks=1 then b(ix) else DOUT b(7
-
ix)

Ix=ix+1:if ix=8 then ix=0

Next n

DOUT 0

End Sub


Листинг Управление шаговым двигателем


С несколькими шаговыми моторами можно управлять сложными машинами. Обычно
вставляют дополнительный концевой выключатель, чтобы уста
новить определенное
начальное состояние. С двумя моторами можно, например, построить х
-
у
-

плоттер. Если
необходимы более чем два шаговых двигателя или дополнительно другие элементы вывода,
нужно переходить на двухбайтовое управление на каждом моторе. Это в
озможно когда
применяется полномостовое управление для каждого мотора.



Управление шаговым двигателем с помощью двух проводов


Шаговые моторы обладают вращаемыми заряженными магнитами и несколькими
жесткоустановленными магнитными катушками. Через включен
ие отдельной магнитной
катушки получается стабильное установка якоря, который может шагообразно
переключаться. Преимуществом этого метода является, что изменение угла известно без
опроса, так как шаги можно легко подсчитать. Обычные шаговые двигатели осуще
ствляют
полный поворот например за 100 шагов, так что можно сделать точный малый поворот. Из
-
за
некоторой массы якоря шаговые моторы не могут вращаться очень быстро. Достижима
скорость около 1000 шагов за секунду. Малые шаговые моторы обычно являются
унипо
лярными, т.е. ток через отдельную катушку течет только в одном направлении.
Поэтому можно применять простые схемы включения. Драйвер мощности ULN2803 состоит
из 8 дарлингтоновских транзисторов с открытыми коллекторами, которые подходят для
95


нагрузки до 500

mA. Интегральная схема содержит также необходимые защитные диоды для
управления индуктивной нагрузкой. Управление должно создать вращаемое магнитное поле
в моторе, путем поочередного последовательного включения соседних катушек друг за
другом. Если всегд
а включена только одна катушка, получается следующая схема
управления 8 4 2 1 8 4 .... Видно, что необходимо 4 выходных провода. Однако так как
практически только четыре различных состояния случаются можно реализовать управление
с помощью двух выходных пр
оводников DTR и RTS и схемы декодирования. Имеется еще
более простая возможность управлять шаговым мотором двумя битами. Для этого нужно
включать всегда две рядом стоящие обмотки:

кат 1 кат 2 кат3 кат 4 упрзнач

1 1 0 0 3

0 1 1 0 1

0 0 1 1 0

1 0 0 1 2

1 1 0 0 3

При этом управлении потребляет шаговый двигатель при том же напряжении удвоенный ток.
Однов
ременно он становится мощнее. Управление через два проводника облегчается, так как
две обмотки друг за другом инвертируются. Управляющий сигнал на катушку 3 можно
получить через инвертирование сигнала для катушки 1. То же для катушек 2 и 4. Рисунок
показы
вает управление через схему ULN2803. Так как каждый шаг одновременно вызывает
инвертирование, можно управляющий сигнал для катушек 2 и 4 одновременно брать с
выходов для катушек 1 и 2. Состояния обоих первых катушек можно воспринимать как
двоичные числа п
оследовательности 3,1,0,2. Управление шагового мотора через вывод этих
значений на проводники DTR и RTS должно быть относительно медленным, так как
наибольшая разрешенная последовательность шагов у мотора составляет от 100 до 500 шагов
в секунду. Поэтому д
остаточно использовать простую программ у на
Visual

Basic

. Задержки
можно получить с помощью
Delay

или
TimeRead
.

Простой пример программы позволяет ввод шаговой позиции двигателя. С помощью
стартовой команды затем будут выполняться соответствующее число
шагов. Возможны оба
направления вращения. Действительное положение
Ist

якоря мотора и состояние включения
показывается в текстовых окнах. Пользователь вводит желаемую позицию. Подпрограмма
Ausgabe

производит затем столько требуемых сигналов управления на
D
TR

и
RTS
, чтобы
достигнуть указанной позиции. С подходящим механическим приспособлением можно
произвести устройство с многими тысячами достижимых позиций. Как и в каждом
VB
-
проекте следует здесь правильно закрывать порт при завершении программы. Пример
пок
азывает еще одну важную деталь при обработке временных задержек. Если применить в
процедуре замедление с помощью
Delay

, тогда программа в течение этого времени не будет
больше реагировать на внешние события, кажется что она зависает. Это можно обойти, есл
и
процедура очень быстро выполняется. Длинные циклы, как при управлении шаговым
мотором напротив препятствуют тому, чтобы могли оставаться внешние события. Поэтому
здесь применено замедление не с помощью
Delay

, а с помощью
TIMEREAD

совместно с
DOEVENTS
. Ч
ерез это достигается, что например все события мыши могут быть правильно
обработаны.


96



Dim Soll,Ist

Private Sub Command1_Click()

Soll=Val(Text1.Text)

Ausgabe

End Sub

Private Sub Form_Load()

If OPENCOM(“COM2:9600,N,8,1”)=0

Then MsgBox”COM2 is not free”

DTR

1

RTS 1

Soll=0;Ist=0

End Sub

Sub Phase1()

DTR 1

RTS 1

Text3.Text= “ 1 1”

End Sub

Sub Phase2()

DTR 1

RTS 0

Text3.Text= “ 1 0”

End Sub

Sub Phase3()

DTR 0

RTS 0

Text3.Text= “ 0 0”

End Sub

Sub Phase4()

DTR 0

RTS 1

Text3.Text= “ 0 1”

97


End Sub

Sub Ausgabe()

Whil
e Soll䀀Ist

If Soll�Ist Then Ist=Ist+1

If Soll Ist Then Ist=Ist
-
1

Text2.Text=Str$(Ist)

Phase=Ist Mod 4

If Phase 0 Then Phase=Phase +4

If Phase=0 Then Phase1

If Phase=1 Then Phase2

If Phase=2 Then Phase3

If Phase=3 Then Phase4

TIMEINIT

While TIMEREAD10

D
oEvents

Wend

Wend

End Sub

Private Sub Form_Unload(Cancel As Integer)

CLOSECOM

End

Sub

Листинг Программа для 2
-
х битового управления шаговым двигателем






Прямое управление RS232 линиями


Последовательный интерфейс РС предоставляет наряду с проводниками
передачи и приема
также еще два других выхода и 4 входа, которые могут быть прямо опрошены. Особенность
этого интерфейса является его защита от перенапряжения и перегрузки. Приборы можно
подключать или отключать при включенном РС, что, например, при LPT

п
орте могло бы
привести к повреждению.

Все выходы поставляют напряжение ~ +
-
10 вольт. И могут отдавать ток до 10 миллиампер.
Их внутреннее ограничение тока делает их устойчивыми к коротким замыканиям. Входы
могут управляться TTL уровнями, выдерживают до +
-
3
0 вольт. В приложении находится
схема подключения последовательного порта для двух обычных типов разъемов. Следующая
таблица перечисляет все используемые входы и выходы.

Таблица 2 Обозначения контактов последовательного порта


98


Наименование Функция

Возможности применения

TxD передача данных Последовательный выход или выход управления

RxD прием данных Последовательный вход

DTR готов
ность конечного прибора Управляющий выход

RTS включение части передатчика Управляющий выход

CTS готовность к передаче Вход

DSR готовность к работе Вход

RI

Приходящий вызов Вход

DCD уровень приема сигнала Вход



Таблица явно показывает, что можно прямо управлять и TxD линией. Для этого нужно
перевести ее в т.н. BREAK
-

состояние. Всего получается, следовательно, 3 выхода и 4 вход
а
для прямого управления.RSAPI.DLL предоставляет для этого следующие функции

TxD (состояние) TxD включить

DTR (состояние )DTR включить

RTS (состояние)RTS включить

CTS опрос

DSR опрос

RI опрос

DCD опрос


Обычно состояния являются 1 для установки и 0 дл
я сброса ( возврата назад). Перед
применением этих функций нужно открыть последовательный порт ( например OPENCOM
“COM1:1200,N,8,2”) . При этом остаются все установленные параметры порта без
воздействия. Лишь номер порта оценивается, чтобы можно было подкл
ючить проводники.
Если применяют также последовательный вывод, например по SENDBYTE , тогда нужно
состояния BREA
K

перед этим поднять через TxD 0. После TxD1 перегружает состояние
BREA
K

посланный байт, т.е линия TxD длительно занята и не дает никакой смены

уровня
последовательного переноса. Если необходимо иметь больше входов и выходов чем имеется
в СОМ

порту, тогда можно открыть также несколько портов совместно с IX
-
OPENCOM.
Для каждой команды ввода и вывода тогда дается дополнительный индекс
-
номер порта
.

IX_OPENCOM открыть порт ix

IX_TXD включитьTxD

IX_DTR включить DTR

IX_RTS включить RTS

IX_CTS опросить CTS

IX_DSR опросить DSR

IX_RI опросить RI

IX_DCD

опросить DCD




Включение выходов


Первый опыт с тремя выходными линиями порта можно провести со светодиодом. Рисунок
показывает прямое подключение LED.

99




Рис.
3.33

Одиночный и антипараллельные LEDs на выходах


Можно здесь отказаться от до
бавочного сопротивления, так как внутреннее ограничение по
току не позволит ток более чем в 10 миллиампер. Возможно также антипараллельное
включение двух разноцветных LED. Имеется также готовый тестовый адаптер, т.н. тестер
порта, который показывает все со
стояния линий через встроенные LED.

Следующий диалог ( форма пользователя) демонстрирует прямое включение всех 3 х
выходов через простой щелчок ( сравни рис. )



Рис.
3.34

Диалог схемы для трех выходов


Здесь применяется диалог пользователя, который поз
воляет бегущие изменения выходов.

Private Declare Sub OPENCOM Lib “RSAPI” (ByVal A$)

Private Declare Sub RTS Lib “RSAPI” (ByVal A%)

Private Declare Sub DTR Lib “RSAPI” (ByVal A%)

Private Declare Sub TXD Lib “RSAPI” (ByVal A%)


Private Sub CheckBox1_Click(
)

TRS CheckBox1.Value

End Sub

Private Sub CheckBox2_Click()

DTR CheckBox2.Value

End Sub

Private Sub CheckBox3_Click()

TXT CheckBox3.Value

End Sub

Private Sub CommandButton1_Click()

RTSTest.hide

End Sub

100


Private Sub UserForm_Initialize()

OPENCOM “COM2:”: RTS

0:DTR 0

End Sub


Листинг 12 Управление выходными проводниками (RTSTest.frm и Doc)




Если применяют реле или драйвер мощности, тогда должна быть включена большая нагрузка
через прямо управляемые линии порта. Маленькое реле с данными подключения 5в
\
500
Ом
можно подключить без дальнейшей ступени усиления, если применить диод. Выходы имеют
достаточные напряжения, чтобы поставлять также повышенный спад напряжения LEDa.
Можно поэтому по рис. построить реле интерфейс с указателем состояния LED с небольшим
соп
ротивлением. При подключении пользователя следует соблюдать граничное значение,
например 60в
\
0.5 А. Для больших нагрузок сети переменного тока рекомендуется вставить
электронное реле нагрузки согласно рисунку 15 . Эта схема использует оптосвязь и ступень
в
ключения для изолированных переключателей 230 в потребителей. Следующий макрос
поставляет временной переключатель для универсального применения. Здесь применяется
линия DTR.





Рис
унок

3.35

Подключение реле



101




Рис
унок

3.36

Схема использования сети




Рис
унок

3.37

Подключение проводника DTR (Zeitschalter.Doc)

Declare Sub OPENCOM Lib “RSAPI.DLL” (ByVal A$)

Declare Sub DTR Lib “RSAPI.DLL” (ByVal Bit%)

Declare Sub DELAY Lib “RSAPI.DLL” (ByVal ms%)

Sub ZeitSchalter()

DTR 0

Num=Val(InputBox$(“
задайте

желае
мое

время

в

миллисекундах
:”))

OPENCOM “COM2:1200,N,8,1”

DTR 1

DELAY Num

DTR 0

End Sub

Листинг 12 включатель времени в Word

Можно вводить желаемое время в миллисекундах. Макрос применяет функцию задержки (
Delay) RSAPI.DLL для точного управления временем.



Опрос входов


Последовательный порт обладает 4 линиями входа, которые очень просто прямо опросить.
Открытые входы появляются как нули. Если приложено положительное входное напряжение
102


порядка 1.25 вольта на входе, он появляется как установленный. Порт под
ходит для прямого
подключения от одного до четырех включателей, причем необходимое напряжение питания
без проблем можно подать от одного из трех выходов. Рис. показывает подключение
четырех выключателей, которые получают свое напряжение питания через высо
кое
состояние TxD проводника.



Рис
унок

3.38

Прямое подключение входных тумблеров




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

Private Declare Sub OPENCOM Lib “RSAPI” (ByVal A$)

Private Declare Function DSR Lib “RSAPI” () As Integer

Private Declare Function CTS Lib “RSAPI” () As Integer

Private Declare Function RI Lib “RSAPI” () As Integer

Private Declare F
unction DCD Lib “RSAPI” () As Integer

Private Sub Scan()

While CTSTest.Visible

DoEvents

CheckDSR.Value=DSR

CheckCTS.Value=CTS

CheckDCD.Value=DCD

CheckRI.Value=RI

DoEvents

Wend

End Sub

Private Sub CommandButton1_Click()

End

End Sub

Private Sub UserForm_Acti
vate()

Scan

End Sub

Private Sub UserForm_Initialize()

OPENCOm “COM2:”

End Sub

Листинг Опрос и индикация четырех проводов входа (CTSTest.Doc)


103



Рисунок показывает выдачу макроса.




Рис
унок

3.39

Индикация состояний в диалоге пользователя



Литература


1.

П.Ан Сопряжение ПК с внешними устройствами. М., 2001

2.
S.Gotz,

R.Mende Messen,Steuern,Regeln mit Delphi,Germany,2001

3.
Дж.Смит Сопряжение компьютеров с внешними устройствами. Уроки
реализации.,М.,2000

4.
А.А.Авдюхин, А.В. Жуков Интерфейсы периферийных у
стройств ЭВМ, Уч. Пособие,
Санкт
-
Петербург,2003

5.
Сопряжение датчиков и устройств ввода данных с компьютерами IBM PC:

пер. с англ./под
ред. У. Томкинса, Дж. Уэбстера.
-
М.,1992

6.
Н.В.Новиков, О.А.Калашников, С.Э.Гуляев Разработка устройств сопряжения для
п
ерсонального компьютера типа IBM PC, М.,2002

7.
B. Kainka Messen,

Steuern,

Regeln mit dem C
-
Control/Basic System.
-
Germany,2000.

8.B.Kainka,H.J.Berndt PC
-
Schnittstellen unter Windows,Elektor
-
Verlag,2004.

9. H.J.Berndt,B.Kainka Messen,Steuern und Regeln mit

Word & Excel,Francis
Verlag,Germany,2005



104




Приложенные файлы

  • pdf 7008878
    Размер файла: 4 MB Загрузок: 0

Добавить комментарий