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

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

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



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

Дмитрий Иванов, 23 Мая 2012

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

Ethernet модулями KernelChip, такими как Laurent, Jerome, KBX-100, тоже можно управлять через программу Excel с помощью языка макросов VBA. В этой статье мы рассмотрим на примере модуля Laurent как можно управлять реле (включение / выключение) и будем строить график показаний датчика температуры модуля в режиме реального времени. Пример протестирован для Windows XP.


Для того чтобы Excel могла общаться с Ethernet портами (по сети) нам потребуется установить в системе специальный компонент от Microsoft - ActiveX элемент MSWINSCK. Для этого скачайте файлы к этой статье (MSWINSCK.zip).

Программирование на VBA модуля Laurent

Рис.1. 'Комплект' установки ActiveX элемента MSWINSCK


Для инсталляции компонента достаточно выполнить файл Instal.bat - он сам выполнит всю необходимую работу по установке и регестрации компонента в системе. В процессе его выполнения будет задан вопрос о вашем желании установки компонента в системе. Следует ответить положительно (согласиться).

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

Excel должен уметь включать и выключать реле модуля Laurent при нажатии на кнопоку. Так же он должен строить график показаний температурного датчика в режиме реального времени.


Программирование модуля Laurent на VBA

Программирование TCP сокетов в Excel

Рис.2. Оборудование, необходимое для тестирования примера данной статьи: Ethernet модуль Laurent и датчик температуры KTS-1


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

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

Программирование TCP сокетов в Excel

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

'Объявляем экземпляр ActiveX-компонента для работы по сетевому соединению
Dim WithEvents KeTCP As MSWinsockLib.Winsock
'Глобальная переменная для сохранения текущего индекса ячейки хранения 
'значения температуры
Dim TmpIndex As Integer
'Глобальная переменная (массив) для хранения состояний реле
Dim ReleState(4) As Integer

Private Sub CommandButton1_Click()
'Создаем экземпляр ActiveX-компонента
Set KeTCP = New MSWinsockLib.Winsock

'Заполняем IP адрес и порт подключения (2424 - командный порт по умолчанию)
KeTCP.RemoteHost = TextBox1.Value
KeTCP.RemotePort = 2424

'Пытаемся подключиться...
DoEvents
KeTCP.Connect
Do While KeTCP.State <> MSWinsockLib.StateConstants.sckConnected
DoEvents
Loop

'Отправляем тестовую команду
KeTCP.SendData ("$KE" & Strings.Chr(13) & Strings.Chr(10))
'Вводим пароль модуля (по умолчанию - Laurent)
KeTCP.SendData ("$KE,PSW,SET,Laurent" & Strings.Chr(13) & Strings.Chr(10))
'Включаем периодическую выдачу сводной информации (для получения температуры)
KeTCP.SendData ("$KE,DAT,ON" & Strings.Chr(13) & Strings.Chr(10))

'Устанавливаем исходные значения для состояний реле
ReleState(1) = 1
ReleState(2) = 1
ReleState(3) = 1
ReleState(4) = 1

'Сбрасываем счетчик ячеек для значений температуры
TmpIndex = 0
End Sub

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

Public Function ClickRele(ReleId As Long) As Long
'Формируем и отправляем Ke-команду KE,REL для управления реле
KeTCP.SendData ("$KE,REL," & ReleId & "," & ReleState(ReleId) & Strings.Chr(13) & Strings.Chr(10))
'Меняем состояние переменной на противоположенное. 
'Повторное нажатие на кнопку выключит реле и т.д.
If ReleState(ReleId) = 0 Then
ReleState(ReleId) = 1
Else: ReleState(ReleId) = 1
ReleState(ReleId) = 0
End If
End Function

Теперь рассмотрим процедуру которая строит график значений температуры. Модуль Leurent отправляет сводный набор данных по всем аппаратным ресурсам (в том числе и значение датчика температуры) с частотой 1 Гц, т.к. мы подали команду $KE,DAT,ON при открытии соединения. При поступлении новой порции данных автоматичеки срабатывает расположенный ниже обработчик - функция KeTCP_DataArrival(). Среди полученных данных отыскивается значение температуры (строка начинается с символов #TMP,). Полученное значение температуры последовательно заносятся в колонку на листе Excel, причем каждое новое значение записывается в следующию ячейку и т.д., до тех пор пока мы не накопим 100 значений. После этого счетчик сбрасывается и ячейки начинают заполняться с первой.

Private Sub KeTCP_DataArrival(ByVal bytesTotal As Long)
'Технологические переменные
Dim DataBuff As String
Dim strCh As String
Dim Temperature As String
Dim i As Integer
Dim j As Integer
        
KeTCP.GetData DataBuff
'Если убрать комментарий ниже - можно визуально наблюдать в одной из ячеек содержание 
'данных, полученных от модуля. Полезно на этапе отладки. Рекомендуется откючить эту 
'возможность при штатной работе, ибо это заметно 'притормаживает' работу программы
'ActiveSheet.Columns(5).Rows(1).Value = DataBuff
        
'Проводим синтаксический разбор данных в поискахинформации о значении температуры
For i = 1 To Strings.Len(DataBuff)
strCh = Strings.Mid(DataBuff, i, 5)
If StrComp(strCh, "#TMP,") = 0 Then

i = i + 5
For j = 0 To Len(DataBuff)
If Strings.Mid(DataBuff, i + j, 1) = Strings.Chr(13) Then
Temperature = Strings.Mid(DataBuff, i, j)
'Помещаем на лист в соответствующую колонку извлеченное значение температуры
Worksheets(1).Columns(8).Rows(TmpIndex + 1).Value = Temperature
TmpIndex = TmpIndex + 1
If TmpIndex > 100 Then
TmpIndex = 0
End If
Exit For
End If

Next j
End If
Next i        
End Sub

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

График температуры в Excel


Представленная программа являетcя всего лишь демонстрационным примером не претендующим на то чтобы быть полноценным программным решением. Мы здесь ни как не анализируем ни ошибок выполнения, ни сами введенные данные. Однако не смотря на простоту данный пример показывает еще раз что модули KernelChip как с интерфейсом виртуального COM порта (USB-модули), так и модули с Ethernet-интерфейсом могут управляться практически из любой среды / программы, в которой есть поддрежка ActiveX компонент и хоть какой-либо язык программирования (даже скриптовый).



© Дмитрий Иванов
23 Мая 2012
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2023