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

Опубликовал Andrey Andriyashin (andr_andrey) в раздел Программирование - Внешние компоненты

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

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

Скачать файлы

Наименование Файл Версия Размер
ПолучениеВесаСВесов.epf
.epf 7,84Kb
18.02.14
19
.epf 7,84Kb 19 Скачать

См. также

Комментарии
1. Роман Сергиенко (pomkka) 07.09.15 12:44 Сейчас в теме
Добрый день, подскажите пожалуйста, как мне организовать задержку между открытием порта и отправкой сообщения? Как работает Ваша функция: ПодождатьПриемаСимволовСТаймаутом ? Можете написать ее код?
2. Andrey Andriyashin (andr_andrey) 7 21.09.15 09:26 Сейчас в теме
(1) pomkka, в учебных целях делал примитивно через ожидание
// Процедура приема заданного количества символов из COM-порта втечение указанного количества секунд таймаута
Процедура ПодождатьПриемаСимволовСТаймаутом(ComPort, КоличествоСимволов, Таймаут)
	
	ПорогТаймаута = ТекущаяДата() + Таймаут;
	
	Пока (ТекущаяДата() < ПорогТаймаута) И (ComPort.InBufferCount < КоличествоСимволов) Цикл
		// ждём ...
	КонецЦикла;
	
КонецПроцедуры // ПодождатьПриемаСимволов()
...Показать Скрыть

Оставьте свое сообщение