Получение веса с весов ВН-… (индикатор IE-03) с помощью MSCOMM


Необходимо получать вес с весов типа ВН-… (индикатор IE-…), подключенных по COM-порту. На компьютерах, подключенных к весам, есть компонента MSCOMM от Visual Basic. Воспользуемся этой компонентой, получим данные с весов, найдём там вес и отобразим на форме.

Предполагаю, что вы имеете уже зарегистрированную в системе 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 / Делитель;
КонецФункции // ПолучитьЧисловоеЗначениеПарыРазрядов()

Как видите — ничего сложного. Удачных вам проектов.

2 Comments

  1. pomkka

    Добрый день, подскажите пожалуйста, как мне организовать задержку между открытием порта и отправкой сообщения? Как работает Ваша функция: ПодождатьПриемаСимволовСТаймаутом ? Можете написать ее код?

    Reply
  2. andr_andrey

    (1) pomkka, в учебных целях делал примитивно через ожидание

    // Процедура приема заданного количества символов из COM-порта втечение указанного количества секунд таймаута
    Процедура ПодождатьПриемаСимволовСТаймаутом(ComPort, КоличествоСимволов, Таймаут)
    
    ПорогТаймаута = ТекущаяДата() + Таймаут;
    
    Пока (ТекущаяДата() < ПорогТаймаута) И (ComPort.InBufferCount < КоличествоСимволов) Цикл
    // ждём …
    КонецЦикла;
    
    КонецПроцедуры // ПодождатьПриемаСимволов()
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *