Предполагаю, что вы имеете уже зарегистрированную в системе Windows компоненту MSCOMM (описание компонента: http://msdn.microsoft.com/en-us/library/aa259393%28v=vs.60%29.aspx)
Также предполагаю, что вы соединили весы с ПК с помощью кабеля, схема распайки которого приведена в инструкции к весам.
По инструкции, прилагаемой к весам, настроим протокол обмена №1(простой протокол, при котором весы выдают вес постоянно, без запроса).
Скорость связи возьмём 9600.
В коде подключаем компоненту MSCOMM, выставляем скорость и параметры протокола обмена, размер буфера приема. Важным моментом является установка InputMode = 1 (comInputModeBinary), чтобы получить при приёме COMSafeArray, который просто выгружается в массив целых чисел 1С.
ComPort = Новый COMОбъект("MsCommLib.MsComm");
ComPort.CommPort = 1;
ComPort.Settings = "9600,N,8,1";
ComPort.Handshaking = 0;
ComPort.InBufferCount = 0;
ComPort.InBufferSize = 70;
ComPort.InputLen = 0;
ComPort.InputMode = 1;
ComPort.NullDiscard = 0;
Открываем порт, пытаемся получить 7-байтную посылку от весов, и закрываем порт.
ComPort.PortOpen = Истина;
ПодождатьПриемаСимволовСТаймаутом(ComPort, 7, 2);
ПринятаяПосылка = ComPort.Input; // получаем COMSafeArray
ComPort.PortOpen = Ложь;
Осталось убедится в том, что принята вся посылка из семи байт, перекинуть её в массив 1С, и обработать, выделив вес из посылки.
Если ПринятаяПосылка.GetLength(0) >= 7 Тогда
МассивПосылки = ПринятаяПосылка.Выгрузить();
Если ПосылкаСВесовКорректна(МассивПосылки) И ЭтотВесСтабилен(МассивПосылки) Тогда
Вес = ПолучитьЗначениеВесаИзПосылки(МассивПосылки);
КонецЕсли;
// отображение символьного представления посылки
Буфер = "";
Для Каждого Элемент Из МассивПосылки Цикл
Буфер = Буфер + Символ(Элемент);
КонецЦикла;
КонецЕсли;
Так как в 1С нет операций битовой арифметики, применим немного вычислений для выделения значений разрядов, знака веса, и других битовых параметров.
// Функция возвращающая числовое значение веса из 7-байтовой посылки
Функция ПолучитьЗначениеВесаИзПосылки(МассивПосылки)
Вес = ПолучитьЧисловоеЗначениеПарыРазрядов(МассивПосылки[2]) * 10000
+ ПолучитьЧисловоеЗначениеПарыРазрядов(МассивПосылки[3]) * 100
+ ПолучитьЧисловоеЗначениеПарыРазрядов(МассивПосылки[4]);
Вес = Вес * ПолучитьМножительДесятичнойТочки(МассивПосылки);
Если ЭтотВесОтрицательный(МассивПосылки) Тогда
Вес = - Вес;
КонецЕсли;
Возврат Вес;
КонецФункции // ПолучитьЗначениеВесаИзПосылки()
// Функция получает десятичное представление пары розрядов из двух тетрад байта
Функция ПолучитьЧисловоеЗначениеПарыРазрядов(Байт)
СтаршаяТетрада = Цел(Байт / 16);
МладшаяТетрада = Байт % 16;
Если СтаршаяТетрада > 9 Тогда
СтаршаяТетрада = 0;
КонецЕсли;
Если МладшаяТетрада > 9 Тогда
МладшаяТетрада = 0;
КонецЕсли;
Возврат СтаршаяТетрада * 10 + МладшаяТетрада;
КонецФункции // ПолучитьЧисловоеЗначениеПарыРазрядов()
// Функция получает множитель по положению десятичной точки из байта признаков посылки
Функция ПолучитьМножительДесятичнойТочки(МассивПосылки)
ПоложениеТочки = МассивПосылки[5] % 4;
Делитель = 1;
Пока ПоложениеТочки > 0 Цикл
Делитель = Делитель * 10;
ПоложениеТочки = ПоложениеТочки - 1;
КонецЦикла;
Возврат 1 / Делитель;
КонецФункции // ПолучитьЧисловоеЗначениеПарыРазрядов()
Как видите — ничего сложного. Удачных вам проектов.
Добрый день, подскажите пожалуйста, как мне организовать задержку между открытием порта и отправкой сообщения? Как работает Ваша функция: ПодождатьПриемаСимволовСТаймаутом ? Можете написать ее код?
(1) pomkka, в учебных целях делал примитивно через ожидание
Показать