gifts2017

Получение веса с весов ВН-... (индикатор 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 18
.epf 7,84Kb
18.02.14
18
.epf 7,84Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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

Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа