На фирме создался (и продолжает пополняться новыми экземплярами) "зверинец" из разного оборудования, которое нужно сопрягать с ПК через com-порт (для получения данных в 1С). Автовесы, ж/д весы, анализаторы зерна. До недавнего времени я решал вопрос сопряжения так - выходил на поставщиков оборудования и старался получить от них внешнюю компоненту или exe-файл, которые могут считывать информацию с оборудования и предоставлять ее 1С через OLE-объект или внешний текстовый файл. Вникать в программирование внешних компонент как-то не хотелось, да и времени нет. Сейчас нашел способ считывания данных с com-порта и дальнейшего их использования (можно через 1С, VBS и т.д.) Нужна библиотека Mscomm32.ocx (вроде, из состава Visual Basic) + reg-файл с лицензией для нее. В Сети это легко находится. Вот небольшая документация на нее. Справка по элементу управления на firststeps.ru. Далее нужно забросить ее в %windir%\system32\
и зарегистрировать в системе: regsvr32 "%windir%\system32\MSCOMM32.OCX". И можно использовать. Естественно, нужна документация по оборудованию - что оно выводит в com-порт, по какой команде (или без команды), в каком формате.
Важные свойства этого элемента управления: - ComPort - Устанавливает и возвращает номер используемого COM-порта
- Settings - Устанавливает и возвращает скорость в бодах, контроль по четности, биты данных, стоповые биты
- PortOpen - Устанавливает и возвращает состояние порта связи, а также открывает и закрывает COM-порт
- Input - Возвращает и удаляет символы из получающего буфера
- InputLen - Устанавливает и возвращает число считываемых символов свойством Input из буфера
- InBufferCount - Возвращает количество символов ждущих в получаещем буфере
- InBufferSize - Устанавливает и возвращает размер получающего буфера в байтах
- Output - Записывает последовательность символов в передающий буфер
- OutBufferCount - Возвращает число символов ждущих в передающем буфере
- OutBufferSize - Устанавливает и возвращает размер передающего буфера в байтах
Пример (1С 7.7, весовой терминал WE2108): Перем Конт, КомПорт;
// ===============================================================
Процедура ПолучитьВес(ИзТТН = 0)
Состояние("Триває отримання результатів зважування");
ВремяОжиданияВСек = 10;
флПревышенияОжидания = 0;
тв1 = глТекущееВремяВСек();
тд1 = ТекущаяДата();
КомПорт.Settings = "9600,N,8,1";
КомПорт.Output = "MSV?;"; // Посылаем в com-порт команду WE2108 на выдачу веса
Буфер = "";
Пока КомПорт.InBufferCount <= 2 Цикл // Пока в буфере <= 2-х символов. Цикл реально загружает процессор - для длительного ожидания лучше использовать процедуру ОбработкаОжидания()
тв2 = глТекущееВремяВСек();
тд2 = ТекущаяДата();
Если тв2 > тв1 Тогда
Если тв2 - тв1 > ВремяОжиданияВСек Тогда
флПревышенияОжидания = 1;
Прервать;
КонецЕсли;
Иначе
Если тд2 > тд1 Тогда
Если тв2 > ВремяОжиданияВСек Тогда
флПревышенияОжидания = 1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если флПревышенияОжидания = 1 Тогда
Сообщить("Перевищено час очікування отримання ваги!");
Возврат;
Иначе
// В буфере строка вида: s ° ° m m m m m , a a , st st st CR LF (при COF=9)
// CR - конечный символ 1 (заводская установка: возврат каретки)
// LF - конечный символ 2 (заводская установка: перевод строки)
// m - цифра измеренного значения
// s - знак (- или пробел)
// ° - пробел
// a - адрес
// st - байт статуса
Буфер = СокрЛП(КомПорт.Input);
Поз = Найти(Буфер,",");
пВес = Число(Лев(Буфер,Поз-1)) * 10; // Переводим вес в кг
КонецЕсли;
Состояние("");
Если ИзТТН = 1 Тогда
Конт.Вес = пВес;
Форма.Закрыть();
Иначе
Сообщить("Отримана вага: " + пВес + " кг.");
КонецЕсли;
КонецПроцедуры // ПолучитьВес
// ===============================================================
Процедура ПриОткрытии()
ОчиститьОкноСообщений();
НомерПорта = 1;
Попытка
КомПорт = СоздатьОбъект("MSCOMMLib.MSComm.1");
Исключение
Сообщить(ОписаниеОшибки());
СтатусВозврата(0);
Возврат;
КонецПопытки;
КомПорт.CommPort = НомерПорта;
Если Компорт.PortOpen = 1 Тогда
Сообщить("Com-порт №" + НомерПорта + " занят");
СтатусВозврата(0);
Возврат;
Иначе
Компорт.PortOpen = 1;
КонецЕсли;
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
Конт = Форма.Параметр;
ПолучитьВес(1);
КонецЕсли;
КонецПроцедуры
// ===============================================================
Процедура ПриЗакритии()
Компорт.PortOpen = 0;
КонецПроцедуры
|