Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 17. Управление модулями Kernelchip из Excel. Часть 2.

Дмитрий Иванов, 28 Августа 2011

Файлы к статье скачать
Имя: KA017.zip (ZIP архив)
Размер: 22 КБ

I

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

Напомню, что низкоуровневое взаимодейсиве с COM портом мы будем осуществлять с помощью специального программного компонента от Microsoft - ActiveX элемент MSComm. Для того чтобы применять его в наших разработках, его необходимо сначала установить в системе. Дополнительно необходимы некоторые конфигурационные действия с программой Excel. Подробное описание процедуры установки и настройки приведено в первой части этой статьи Управление модулями Kernelchip из программы Microsoft Excel. Я позволю себе не повторять здесь всю эту процедуру. Так что ситаем что MSComm уже установлен.


Теперь давайте определимся что же мы собственно хотим на этот раз получить от Excel. Сформулируем задачу следующим образом:

У нас на руках есть модуль Ke-USB24R. Необходимо получать в Excel значения c входных дискретных линиий модуля и отображать их в ячейках программы.

I

Несмотря на то что здесь упомянут модуль Ke-USB24R, данный пример с минимальными изменениями может быть с равным успехом применен также для модулей Ke-USB24A и Ke-Box. Изменения обусловлены различным числом дискретных линий доступных на этих модулях.


Займемся непосредственно самой страницей Excel и программным кодом. Общие принципы размещения элементов управления на странице Excel и техника программирования на VBA (Visual Basic forApplications) были подробно рассмотрены в предыдущей статье этого раздела, так что здесь я не буду заострять внимание на создание проекта "с нуля" и предложу вам скачать готовый проект. Архив с готовым файлом Excel можно найти в "шапке" данной статьи.

Внешний "облик" страницы показан на рисунке ниже.

Чтение данных из COM порта в Excel

Давайте рассмотрим подробнее что же здесь происходит и как все это работает. Конопки "Открыть порт" и "Закрыть порт" в дополнительных объяснениях не нуждаются. Напомню, что для открытия порта в соответсвующем окне ввода необходимо указать номер порта к которому подключен модуль. Процедура открытия порта была рассмотрена в предыдущей статье.

Остальные же кнопки требуют некоторых объяснений. В раках решения поставленной задачи, давайте считать что нам нужна информация по всем линиям ввода, т.е. считаем что все доступные линии ввода-вывода настроены на вход. Процедуру настройки линий можно произвести самостоятельно, подав конфигурационную Ke-команду $KE,IO,SET для каждой линии вручную. Для удобства пользования здесь размещена кнопка "Настроить все линии на вход", по нажатию на которую производится конфигурирование всех доступных линий в состояние на вход. Код функции, выполняющий эту операцию представлен ниже:

Public Function LineInit() As Long
'Формируем команду $KE,IO,SET для каждой из дискретных линий
For i = 1 To IO_LINE_NUMBER
KeUSB.Output = "$KE,IO,SET," & i & ",1,S" & Chr(13) & Chr(10)
Next i
End Function

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

'Функция запуска таймера
Public Function TimerStart() As Long
   ' Запускаем таймер для чтения данных с идентификатором 1
   ' и периодом срабатывания 500 мс
    Call SetTimer(Application.Hwnd, 1, 500, AddressOf TimerCallBackRead)
    ' Запускаем таймер для записи данных с идентификатором 2
    ' и периодом срабатывания 500 мс
    Call SetTimer(Application.Hwnd, 2, 500, AddressOf TimerCallBackWrite)
End Function

Функция обработчик 2-го таймера отправляет модулю запрос состояния входных линий с помощью Ke-команды $KE,RD,ALL.

'Главная функция выполнения таймера WRITING
Public Sub TimerCallBackWrite(ByVal Hwnd As Long, ByVal nIDEvent As Long, 
                                    ByVal uElapse As Long, ByVal lpTimerFunc As Long)
' Запрашиваем состояние всех входных линий
KeUSB.Output = "$KE,RD,ALL" & Chr(13) & Chr(10)
End Sub

Функция обработчик 1-го таймера считывает данные из COM порта и проводит синтаксический разбор полученных данных в поисках ответа модуля #RD,...., содержащим сводную информацию по всем входным линиям. Выделенная информация по входным линиям обновляется в соответствующих ячейках таблицы.

'Главная функция выполнения таймера READING
Public Sub TimerCallBackRead(ByVal Hwnd As Long, ByVal nIDEvent As Long, 
                                    ByVal uElapse As Long, ByVal lpTimerFunc As Long)
' Считываем данные из COM порта
DataBuff = KeUSB.Input
KeUSB.InputLen = 0

' Проводим синтаксический разбор данных в поисках ответа модуля #RD,....
' содержащего сводную информацию по всем входным линиям
For i = 1 To Len(DataBuff)
strCh = Mid(DataBuff, i, 4)
If StrComp(strCh, "#RD,") = 0 Then

i = i + 4
For j = 0 To (IO_LINE_NUMBER - 1)
InIO(j) = Mid(DataBuff, i + j, 1)
Worksheets(1).Columns(2).Rows(j + 3).Value = InIO(j)
Next j
End If

Next i
End Sub

Итак, если теперь подключить модуль к COM порту, запустить этот Excel файл, открыть порт и нажать на кнопку "Старт" - то в соответсвующих ячейках появится обновляющаяся информация о состоянии входных линий. Если вместо символов '1' и '0' вы видете символ 'x' - это значит что соответствующая линия настроена на выход и ее чтение невозможно. Перевести все линии на вход можно с помощью кнопки "Настроить все линии на вход".


I

У модулей Ke-USB24A и Ke-USB24R в режиме ввода информации по линии ввода/вывода имеется некоторая специфичная особенность. Если линия, настронная на вход, не подключена к источнику информации, т.е. на ней нет ни логической еденицы ни логоческого нуля (она просто "висит в воздухе") то результат ее чтения непредсказуем. Он будет определяться наводками и т.д. Если линию подключить к источнику информации (подключить на +5 или землю) - резултьтат чтения будет полностью адекватным. См. статью Часто задаваемые вопросы по модулям серии Ke для дополнительной информации.



© Дмитрий Иванов
28 Августа 2011
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017