Проще всего программировать 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 порта, что ведет к потенциальным, незначительным утечкам памяти.