Проще всего программировать PowerAnt используя стандартный компонент mscomm32.ocx. Компонент этот был разработан в Microsoft, но не смотря на свою полезность не попал в дистрибутивы MS Windows. Возможно, виной тому наличие в нем некоторых ошибок, которые могут усложнить жизнь разработчикам программ (Официально зарегистрированная ошибка: Утечка памяти при открытии/закрытии RS-232 порта). Учитывая тот факт, что обычно в RS-232 порт следует открыть в начале выполненя всей программы и закрыть его только по её завершению, эту ошибку не следует считать серьезной.
Загрузите mscomm32.ocx (mscomm.zip, 51KB) компонент и скопируйте его в каталог C:\Windows\System.
Разумеется, компонент, без некоторой пляски с бубном, работать не будет. Потребуется поместить небольшое заклинание в системный Реестр:
REGEDIT4 [HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905] @ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"Для того, чтобы внести эту запись в реестр необходимо дважды кликнуть на файле mscomm.reg (который находится в архиве mscomm.zip) в проводнике. Редактор реестра спросит: следует ли вносить изменения в системный реестр, и после Вашего утвердительного ответа отчитается о том, что изменения успешно внесены.
Запустите MS Excel. Откройте панели инструментов Visual Basic (Вид/Панели инструментов/Visual Basic) и "Элементы управления" (Вид/Панели инструментов/Элементы управления). Пользуясь панелью инструментов Visual Basic перейдите в режим конструктора. Пользуясь панелью инструментов "Элементы управления" создайте кнопку CommandButton1. Нажмите правую кнопку мыши на CommandButton1 и выберите пункт меню "Исходный текст".
Теперь потребуется произвести еще одно магическое действие в редакторе Microsoft Visual Basic. Открываем меню Tools/References. В открывшемся окне нажимаем кнопку Browse.... Находим в файловой системе mscomm32.ocx (C:\Windows\System). В результате в окне References в поле "Available References" появляется отмеченная галочкой строка "Microsoft Comm Control 6.0".
Дальше никакой магии, просто копируем в окно редактора приведенную ниже программу.
Dim PwrAntComm As New MSComm
' При нажатии кнопки выполняется команда 08?? и
' результат её выполенения заносится в ячейку C12
' заносится результат её выполнения
Private Sub CommandButton1_Click()
' 2 - Номер COM порта (COM1 = 1, COM2 = 2, ... )
PwrAntOpen (2)
' Спросить у 08 PowerAnt кто он и что может
' Поместить результат в ячейку C12
Лист1.[C12] = PwrAntCmd("08", "??")
Call PwrAntClose
End Sub
' Метод открывает RS-232 порт (если он еще не открыт)
' PortNumber - Номер COM порта (COM1 = 1, COM2 = 2, ... )
Sub PwrAntOpen(PortNumber As Integer)
If Not PwrAntComm.PortOpen = True Then
PwrAntComm.CommPort = PortNumber
PwrAntComm.Settings = "9600,N,8,1"
PwrAntComm.Handshaking = comNone
PwrAntComm.InputLen = 0
PwrAntComm.InBufferSize = 40
PwrAntComm.OutBufferSize = 40
PwrAntComm.PortOpen = True
PwrAntComm.RThreshold = 0
PwrAntComm.Output = Chr(27) ' Сразу делаем команду прочистки буфера
End If
End Sub
' Метод закрывает RS-232 порт (если он был открыт)
Sub PwrAntClose()
If PwrAntComm.PortOpen = True Then
PwrAntComm.PortOpen = False
End If
End Sub
' Метод выполняет команду и возвращает результат её выполнения
' Если в результате выполнения команды ничего не произошло (например, Вы
' обратились к не существующему PowerAnt), то
' функция возвращает пустую строку, причем делает это по таймауту.
' На выполнение команды отводится максимум 2 секунды
Function PwrAntCmd(AntName As String, AntCmd As String) As String
Dim AntInStr As String
Dim TimeOut As Date
' Отсылка команды устройству
PwrAntComm.Output = AntName & AntCmd & Chr(13)
'Четние строки с ожиданием символа 0x0D в конце
AntInStr = ""
TimeOut = Time
Do
dummy = DoEvents() ' не вешаем систему
If PwrAntComm.InBufferCount > 0 Then
AntInStr = AntInStr & PwrAntComm.Input
End If
Loop Until (Right(AntInStr, 1) = Chr(13)) Or (Time - TimeOut > 1)
' Убрать лишний 0x0D в конце
AntInStr = Left(AntInStr, Len(AntInStr) - 1)
PwrAntCmd = AntInStr
End Function
Сохраните программу и закройте редактор Visual Basic
При помощи панели инструментов Visual Basic отключите режим конструктора.
Теперь после нажатия кнопки отрабатывает команда 08??, результат её выполнения заносится в ячейку Лист1.C12.
Обратите внимания на тот факт, что в этой программе, каждый раз когда Вы нажимаете на кнопку, происходит открытие и закрытие COM порта, что ведет к потенциальным, незначительным утечкам памяти.