Использование Visual Basic 6.0 для управления внешними устройствами и приём внешней информации (температура, давление, напряжение, ток и т. п.)
Введение:
Любое внешнее устройство подключается к компьютеру через порты. Например, LTP, COM, USB. Наиболее просто – программирование LTP порта. Общий принцип компьютерной системы контроля выглядит так:

Компьютерная программа посылает определенные сигналы через LTP порт на коммутатор, на основании полученных сигналов коммутатор подключает к аналого-цифровому преобразователю датчики. Данные с АЦП поступают в коммутатор, LTP и обрабатываются нашей волшебной программой написанной на VB 6.0. Это – развитая промышленная система контроля и управления, которую я, Божьей помощью рассчитываю создать. Если вы хотите научится включать свет в своём туалете с помощью PC, узнавать температуру воды в вашей ванне, то надо начинать с системы попроще.
ШАГ 1. Изучение работы LTP порта.
Для тех, кто не знает что есть LTP, скажу – это то «отверстие» куда ты подключаешь принтер старой модели. Широкий разъём. LTP порт имеет следующую структуру:

Он состоит из отсеков (адресов) H378, H37a. Есть еще другие, но для создания компьютерного управления чайником на кухне тебе знать о них необязательно. Адреса H378, H37a могут выдавать и принимать сигналы, работают двунаправлено. Как правило H37a служит для управления коммутирующим устройством, а H378 для отправки и приёма сигналов. Под понятием сигнал надо понимать присутствие или отсутствие напряжения (5В) на порте. Например, если вы хотите включать/выключать всего 12 (8+4) лампочек или чайников (или светомузыки), то вы можете отказаться от коммутатора и АЦП. Просто программой необходимо подать, например, напряжение 5В адреса H378, ножки 2. Эта ножка, например, связана с реле, которое включает более мощное реле (можно и полупроводниковое) и энергия подаётся на вашу лампочку. Вот и весь принцип. Главное программой указать компьютеру, на какую ножку, какого адреса подать или убрать напряжение.
Можно сделать устройство, которое определит, например, горит ли у вас свет на кухне. Для этого необходимо сделать простенькое устройство, которое подаёт напряжение на LTP (5В). После программа читает порт и делает вывод, какое реле подаёт сигнал (1, 2, 3…) и делает вывод что работает (TRUE) или что не работает (FALSE). В зависимости от полученного результата, например, объект Shape меняет цвет.
Важно, чтобы коммутирующие устройства имели качественную гальваническую развязку с компьютером, иначе спалите PC.
ШАГ 2. Научимся считать в системах…BIN, HEX, DEC
BIN – цифровая форма записи числа (10111011 – байт), или бинарная система исчисления.
HEX – долго объяснять, если есть желание возьми и изучи булеву алгебру. Просто позже поймешь, как использовать HEX. Абстрактно – на этих числах работает электроника компьютера и команды управления, часто задаются в этой системе исчисления.
DEC – привычные нам числа, один, три целых шесть десятых. Любое число, которое вы видите в учебнике по математике за 7 класс.
Нам надо уметь пользоваться этой системой исчисления, для того чтобы составлять команды для LTP порта, какую ножку ему «зажечь или потушить».
Научимся сначала «зажигать».
Например, ты хочешь чтобы третья ножка адреса H378 загорелась. В бинарной системе это выглядит так: 00000100. Согласен? Третья справа имеет на выходе единицу (5В).
Запускаем калькулятор, меню «ВИД», пункт «ИНЖЕНЕРНЫЙ» или качаем понятную, специальную программу-конвертер изображенную снизу.

Если ты всё таки хочешь использовать калькулятор Била Гейтса, то укажи опцию BIN и введи число:

100 – это 00000100 за минусом передних нулей. После этого просто переключи опцию на HEX и ты получишь число 4. Это и есть число, которое надо послать в адрес H378, порта LTP чтобы на третьей ножке компьютер вывел напряжение 5 вольт.
Если ты хочешь зажечь 1,2,5,7 ножку то операция формирования команды выглядит так:
BIN – 01010011
HEX – 53
А привычное нам число – 83
Помни, что команда формируется не программой, а программистом (в простых системах).
Да забыл сказать, у нас адрес H378 имеет восемь выходов (битов), поэтому опция на калькуляторе 8-бит.
Пока не изучишь системы исчисления, не поймешь как получаются HEX. А пока, просто умей определять команду.
ШАГ 3. Понятие дискретного сигнала
Дискретный сигнал это – бит. Например, ты хочешь знать включена ли лампочка в ванне. Эта лампочка зажигается от реле, контакт которого соединен с третьей ножкой порта. В данном случае вас интересует, есть ли на 3-й ножке 5 вольт. Это и есть дискретный сигнал (один бит). Аналогично, если вы подаёте единицу на 4-ю ножку чтобы включить четвертую лампочку, можно расценивать это как дискретный сигнал (один бит).
ШАГ 4. Обработка дискретного сигнала.
Мы уже представляем принцип формирования команды на LTP порт. Как принять и понять, есть ли на определенной ножке напряжение (единица или включена ли ваша лампочка).
Принцип следующий:
Читаем порт, и получаем число, например DATA Оценка результатовШАГ 5. Написание программы
Для того, чтобы VB мог работать с LTP портом, необходимо скачать специальный драйвер. Установите этот драйвер у себя на компьютере (Setup прилагается).
Напишем программу, которая будет «зажигать» ножки LTP порта, или тушить их, а также определять на какую ножку приходит единица (5Вольт) с внешнего устройства и использовать результат для нашей программы.
Запустите VB 6.0 и создайте проект. Создайте форму по примеру:

На кнопках в скобках указан номер ножки на порте, а до скобки номер ножки на нашем рисунке, в CHECK указан номер ножки на порте. Например при нажатии кнопки 2(3) на 3-й разъём порта подаётся 5 вольт.
В случае адреса H37а рассмотрен другой вариант реализации запуск/остановка ножек. Там происходит автоматическое формирование команды, которая в последствии записывается в порт.
При нажатии кнопки ПРОЧИТАТЬ АДРЕС H378, производится считывание с порта и в зависимости от того, на какой ножке есть единица, та линия и окрашивается в красный цвет.
Если Вы хотите что-либо считывать с порта, то Вам необходимо переключить режим работы порта компьютера в режим EPP (Enhanced Parallel Port – режим двунаправленной передачи данных). Это делается в BIOS. Во время загрузки компьютера когда появится надпись Press DEL to enter setup, нажмите DEL, чтобы попасть в меню BIOS. Затем выберите раздел INTEGRATED PERIPHERALS и там выберите строку PARALLEL PORT MODE: измените режим работы Вашего порта на EPP или SPP/EPP. Сохраните сделанные изменения. Если же на Вашем компьютере нет режима EPP, то Вы сможете только передавать данные
Теперь декларируем в модуле:
Public Declare Function DlPortReadPortUchar Lib "dlportio. dll" (ByVal Port As Long) As Byte
Public Declare Function DlPortReadPortUshort Lib "dlportio. dll" (ByVal Port As Long) As Integer
Public Declare Function DlPortReadPortUlong Lib "dlportio. dll" (ByVal Port As Long) As Long
Public Declare Sub DlPortReadPortBufferUchar Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Public Declare Sub DlPortReadPortBufferUshort Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Public Declare Sub DlPortReadPortBufferUlong Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Public Declare Sub DlPortWritePortUchar Lib "dlportio. dll" (ByVal Port As Long, ByVal Value As Byte)
Public Declare Sub DlPortWritePortUshort Lib "dlportio. dll" (ByVal Port As Long, ByVal Value As Integer)
Public Declare Sub DlPortWritePortUlong Lib "dlportio. dll" (ByVal Port As Long, ByVal Value As Long)
Public Declare Sub DlPortWritePortBufferUchar Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Public Declare Sub DlPortWritePortBufferUshort Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Public Declare Sub DlPortWritePortBufferUlong Lib "dlportio. dll" (ByVal Port As Long, Buffer As Any, ByVal Count As Long)
Представте, что к адресу Н378 подключена схема:

В кнопку прочитать адрес H378:
Dim data as Integer
data = DlPortReadPortUchar(&H378)) ‘(читаем порт, полученное значение присваиваем переменной)
‘а теперь, проверяем наличие сигнала на каждой ножке и в зависимости от этого выполняем действие
If (data And &H1) > 0 Then Line1.BorderColor = &HFF& Else Line1.BorderColor = &H0&
If (data And &H2) > 0 Then Line2.BorderColor = &HFF& Else Line2.BorderColor = &H0&
If (data And &H4) > 0 Then Line3.BorderColor = &HFF& Else Line3.BorderColor = &H0&
If (data And &H8) > 0 Then Line4.BorderColor = &HFF& Else Line4.BorderColor = &H0&
If (data And &H10) > 0 Then Line5.BorderColor = &HFF& Else Line5.BorderColor = &H0&
If (data And &H20) > 0 Then Line6.BorderColor = &HFF& Else Line6.BorderColor = &H0&
If (data And &H40) > 0 Then Line7.BorderColor = &HFF& Else Line7.BorderColor = &H0&
If (data And &H80) > 0 Then Line8.BorderColor = &HFF& Else Line8.BorderColor = &H0&
Для работы с Check, необходимо объявить глобальную переменную:
Public nojka As Integer
Код выглядит следующим образом:
Private Sub Check10_Click()
If Check10.Value = 1 Then nojka = nojka + &H10 Else nojka = nojka - &H10
DlPortWritePortUlong &H37A, nojka
End Sub
Private Sub Check11_Click()
If Check11.Value = 1 Then nojka = nojka + &H2 Else nojka = nojka - &H2
DlPortWritePortUlong &H37A, nojka
End Sub
Private Sub Check12_Click()
If Check12.Value = 1 Then nojka = nojka + &H4 Else nojka = nojka - &H4
DlPortWritePortUlong &H37A, nojka
End Sub
Private Sub Check13_Click()
If Check13.Value = 1 Then nojka = nojka + &H8 Else nojka = nojka - &H8
DlPortWritePortUlong &H37A, nojka
End Sub
Вы видите, что в адрес H37a записывается команда nojka, которая формируется математически в зависимости от состояния Check-ов. Если к LTP порту вы подключите лампочки (с резистором), то вы увидите, как они загораются или тухнут (чертеж для адреса &H378).

Вот и всё, портом управлять вы умеете, собирайте схему и работайте…
ШАГ 6. Очень важные мелочи…
Для персонального обучения управлению LTP вам необязательно собирать внешние устройства (лампочки, реле и т. п.). Можно самостоятельно записывать данные в порт ('DlPortWritePortUlong Val(&H378), "&H" & "bf"), где "&H" & "bf" сформированная команда. Причем данные останутся записанными в порте и вы можете прочитать их:
Private Sub Command2_Click()
Dim Value As Long
Value = DlPortReadPortUchar((&H378)
TextValue = "&H" + Hex(Value)
Text1.Text = Value
End Sub
Или обработать данные по принципу кнопки «прочитать адрес H378».
Учтите, что в случае, когда вы самостоятельно записываете команду в порт и потом читаете порт, данные после чтения удаляются. А в случае, когда данные подаются на порт внешним устройством, читать можно хоть сто раз, данные с порта не исчезнут, так как подаются внешним, независимым от компьютера устройством.
ШАГ 7. Приём сигналов с АЦП, коммутаторов и т. п.
Расписывать подробно не буду, так как в домашних условиях вряд ли кто будет собирать АЦП или коммутатор. Скажу обобщенно. АЦП бывает 4, 6, 8, 16 и т. п. разрядный + тип. В зависимости от этого ( и от датчиков и всей системы подачи/отправки данных) необходимо определить коэффициент пересчёта. Пересчёт данных с порта выглядит обобщенно так:
Результат = ((«Верхняя граница измерения» - «Нижняя граница измерения»)/»Разрядность АЦП»)*«data» + «Нижний предел измерения»
Разрядность АЦП – 256 (если выдаёт восемь бит), 64 (если 4 бит) и т. д.
Это может казаться сложно, но это очень просто, просто нужно знать, что за система, с какими параметрами она передаёт данные. Скажу одно, эту систему собрать очень просто простым паяльником. Если есть вопросы, то я с удовольствием всегда вас проконсультирую о приёме «аналогового сигнала» *****@***ru.
ШАГ 8. Область применения
На этом принципе можно собрать светомузыку для дискотек, управление и контроль за работой любого оборудования, принимать и отображать на компьютере данные по току, давлению, температуре, потреблению газа, воды, воздуха и т. п. И всё это можно сделать на VB 6.0 используя его возможности. Главное, отправить и принять/обработать данные с порта и как вы видели, это так же просто, как и работа с элементом Adodc1
Михаил Пирогов.


