Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подлючение автовесов к 1С
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Работа с торговым оборудованием
kosalex
Добрый день. Есть весы которые подключаются к COM - порту, нужно, делать взвешивание и запись результата в 1С.

Использую com объект "MsCommLib.MsComm"

При нажатии на кнопку "Взвесить" выполняется код:
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;
        ComPort.PortOpen = Истина;
        ПринятыеДанные = ComPort.Input;



Вопрос:
Чтобы протестить код, сделал файл test.bat с содержимым:
mode com1 baud=9600 parity=n data=8 stop=1
type test.txt >com1


Ничего не получает "ПринятыеДанные" (см. код выше). Что делать, куда смотреть?


 ! 

Правила, п.3
 
logist
Цитата(kosalex @ 10.06.14, 11:46) необходимо зарегистрироваться для просмотра ссылки
Что делать, куда смотреть?

А почему он должен получать что-то? Если есть возвращаемые данные, то должен быть какой-то метод который их вернет. Т.е. ПринятыеДанные = ComPort.Input(); Либо ComPort.ЧеготоВыполнить(); ПринятыеДанные = ComPort.Input;
+ может быть порт занят другим приложением.
p.s. маловато исходной/отладочной информации
kosalex
Цитата(logist @ 10.06.14, 13:04) необходимо зарегистрироваться для просмотра ссылки
А почему он должен получать что-то? Если есть возвращаемые данные, то должен быть какой-то метод который их вернет. Т.е. ПринятыеДанные = ComPort.Input(); Либо ComPort.ЧеготоВыполнить(); ПринятыеДанные = ComPort.Input;
+ может быть порт занят другим приложением.
p.s. маловато исходной/отладочной информации


Процедура КнопкаВыполнитьНажатие(Кнопка)
    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;
    
    ComPort.PortOpen = Истина;
    
    ComPort.OutPut = "1";
    
    Если ComPort.PortOpen Тогда
    ПринятыеДанные = ComPort.Input;
    КонецЕсли;
    
    ComPort.PortOpen = Ложь;
    
    ЭлементыФормы.Надпись1.Значение = "";
    ЭлементыФормы.Надпись1.Значение = ПринятыеДанные;

КонецПроцедуры


При таком коде, в "ПринятыеДанные" должно же что то передаться от весов?
logist
Цитата(kosalex @ 10.06.14, 12:11) необходимо зарегистрироваться для просмотра ссылки
ComPort.CommPort        = 1;

А весы подключены к СОМ1?

Вы отладчиком прошлись, в ComPort вообще что-то есть?
Если ComPort.PortOpen Тогда

сюда заходит?
Ardi
Может надо через "Обработка ожидания" ловить сигнал с ком порта?
logist
Цитата(Ardi @ 10.06.14, 13:52) необходимо зарегистрироваться для просмотра ссылки
Может надо через "Обработка ожидания" ловить сигнал с ком порта?

Нет, этот комобъект сам открывает порт и читает.
Vofka
А что такое 1 в
ComPort.OutPut = "1";

?
DartRomanius
Цитата(Vofka @ 10.06.14, 16:50) необходимо зарегистрироваться для просмотра ссылки
А что такое 1 в
ComPort.OutPut = "1";

?


Есть подозрение что это команда весам типа "дай данные". smile.gif
И маленькое подозрение что должна быть циферка а не символ.
Vofka
Цитата(DartRomanius @ 10.06.14, 16:58) необходимо зарегистрироваться для просмотра ссылки
Есть подозрение что это команда весам типа "дай данные".

Я к чему спрашиваю. "1" - это точно ли "дай данные"? Может автор откуда-то скопипастил шото не то... Интересно откуда он взял именно "1".
logist
ComPort.OutPut - отправить данные в буфер
ComPort.InPut - получить данные из буфера
необходимо зарегистрироваться для просмотра ссылки
Vofka
logist, а это вы к чему?
logist
Цитата(Vofka @ 10.06.14, 16:26) необходимо зарегистрироваться для просмотра ссылки
а это вы к чему?

К этой теме. Если Вы про буфер, в данном случае без разницы как обзывать объект работы с данными.
Vofka
Цитата(logist @ 10.06.14, 18:24) необходимо зарегистрироваться для просмотра ссылки
Если Вы про буфер, в данном случае без разницы как обзывать объект работы с данными.

Я про то почему именно "1"? Не 1, не "3", не "Вася", а именно "1".
sava1
Весовой процессор какой (чей) ?
kosalex
Данные с весов попадают в перем "Данные".

Процедура КнопкаВыполнитьНажатие(Кнопка)
    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;
    
    ComPort.PortOpen = Истина;
    
    ComPort.Output = "1";
    
    Данные = ComPort.Input;
    
    ComPort.PortOpen = Ложь;
    
КонецПроцедуры



Посылает в порт единицу, чтобы весы выдали вес.
ComPort.Output = "1";


Вопрос, как эти данные преобразовать в десятичную систему вычисления?
Vofka
kosalex, так уже заработало? В чем же была ошибка?
kosalex
Цитата(Vofka @ 11.06.14, 9:33) необходимо зарегистрироваться для просмотра ссылки
kosalex, так уже заработало? В чем же была ошибка?



Ошибки как таковой не было, просто не посылал эту еденицу
 ComPort.Output = "1";
. Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)
Petre
Цитата(kosalex @ 11.06.14, 9:37) необходимо зарегистрироваться для просмотра ссылки
Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)

Какой в этом смысл?
DartRomanius
Цитата(kosalex @ 11.06.14, 9:37) необходимо зарегистрироваться для просмотра ссылки
Ошибки как таковой не было, просто не посылал эту еденицу
 ComPort.Output = "1";
. Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)


Число(....)? smile.gif
kosalex
Цитата(Petre @ 11.06.14, 9:50) необходимо зарегистрироваться для просмотра ссылки
Какой в этом смысл?



вы предлогаете записывать в БД 1С данные полученные с COM порта напрямую? Преобразовывать их в десятичную систему не надо?

Цитата(DartRomanius @ 11.06.14, 9:54) необходимо зарегистрироваться для просмотра ссылки
Число(....)? smile.gif


Я думаю, это не подойдет, так как данные это строка состоящая из грубо говоря: 64 00 00 00 00 00 00 00 48

Приходит ComSafeArray и элементы этого массива 64 00 00 00 00 00 00 00 48
Petre
Я не понимаю, как массив можно преобразовывать в число.
Уточните, какие данные содержит массив. В конце концов, преобразуйте его в массив 1с (.Выгрузить()), а потом разбирайте элементы последнего.
alex040269
Цитата(kosalex @ 11.06.14, 9:37) необходимо зарегистрироваться для просмотра ссылки
. Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)

GetType и GetValue, что возвращает?
kosalex
Сори, вроде додумался, возвращается массив 64 00 00 00 00 00 00 00 48 это строка, мне нужно выбирать из этой строки числа это и будет вес, ничего преобразовывать не нужно. Сори!
kosalex
Добрый день. Помогите разобраться, есть ж/д весовая подключенная через COM порт. Пишу в 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;
        ComPort.PortOpen = Истина;
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связь есть..."
    Исключение
        Сообщить("Не возможно открыть порт.",СтатусСообщения.ОченьВажное);
    КонецПопытки;
КонецПроцедуры




Процедура ЧтениеСОМПорта() Экспорт
    ДанныеСПорта = "";
    Если ComPort.PortOpen Тогда
        ComPort.Output = "1";
        ДанныеСПорта = ComPort.Input;
        ВывестиВес(ДанныеСПорта);
    Иначе
        Сообщить("Порт не открывается",СтатусСообщения.ОченьВажное);
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связи нет..."
    КонецЕсли;
    
КонецПроцедуры


Процедура ВывестиВес(ДанныеСПорта)
    Массив = ДанныеСПорта.Выгрузить();
    ИндексМин = ДанныеСПорта.GetLowerBound(0);
    ИндексМакс = ДанныеСПорта.GetUpperBound(0);
    СтрокаВес = "";
    Для Индекс = ИндексМин + 1 По ИндексМакс - 1 Цикл
        СтрокаВес = СтрокаВес + Строка(Массив.Получить(Индекс));
    КонецЦикла;
    
    ТекущийВес = СтрокаВес;
    
    ЭлементыФормы.ВесБрутто.Заголовок = ТекущийВес;
    ЭлементыФормы.ВесНетто.Заголовок = ТекущийВес;
    ЭлементыФормы.ВесТара.Заголовок = ТекущийВес;
    
КонецПроцедуры



В "ДанныеСПорта" попадает ComSafeArray 36484848484848...64, может я как то не так получаю вес, что делать с этим массивом? Может как то преобразовать нужно?
Ответ от порта поступает не всегда, и почему то 4848484848....
Настройки порта кто какие выставлял?

Очень нужна ПОМОЩЬ!
Acid
документация к весам есть? если нет, обратитесь к производителю. В ней многое можно почерпнуть.
kosalex
Цитата(Acid @ 16.07.14, 9:26) необходимо зарегистрироваться для просмотра ссылки
документация к весам есть? если нет, обратитесь к производителю. В ней многое можно почерпнуть.


Документации нет. К производителю обращался...с связи с обстановкой в г. Славянск производитель на связь не выходит...

Вроде как получилось получить данные с весов. Проблема была в настройках порта.Оставил вот это:
Процедура ИнициализацияСОМПорта(Отказ)
    ComPort = Новый COMОбъект("MsCommLib.MsComm");    
    Попытка
        ComPort.CommPort        = 1;
        ComPort.Settings        = "9600,N,8,1";
        ComPort.PortOpen = Истина;
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связь есть..."
    Исключение
        Сообщить("Не возможно открыть порт.",СтатусСообщения.ОченьВажное);
        Отказ = Истина;
    КонецПопытки;
    ComPort.PortOpen = Ложь;
КонецПроцедуры
andr_andrey
Писал статью по этому поводу
необходимо зарегистрироваться для просмотра ссылки
Vofka
Цитата(andr_andrey @ 16.07.14, 12:11) необходимо зарегистрироваться для просмотра ссылки
Писал статью по этому поводу

Я б нажал палец, если бы у нас опубликовали (например, необходимо зарегистрироваться для просмотра ссылки) smile.gif
andr_andrey
Цитата(Vofka @ 16.07.14, 12:21) необходимо зарегистрироваться для просмотра ссылки
Я б нажал палец, если бы у нас опубликовали (например, необходимо зарегистрироваться для просмотра ссылки) smile.gif

Не проблема, но
Причина:

У вас нет прав открытия тем в этом форуме
kosalex
Цитата(andr_andrey @ 16.07.14, 12:11) необходимо зарегистрироваться для просмотра ссылки
Писал статью по этому поводу
необходимо зарегистрироваться для просмотра ссылки


Что то брал с Вашего примера,точно уже не помню. Если оставить настройки порта как написано у меня, то ничего разберать,приводить не приходиться. Посылаем "1", получаем строку - ответ от весов "$000100000000@ = 100 кг.

Что скажете?
andr_andrey
Цитата(kosalex @ 16.07.14, 14:06) необходимо зарегистрироваться для просмотра ссылки
Что то брал с Вашего примера,точно уже не помню. Если оставить настройки порта как написано у меня, то ничего разберать,приводить не приходиться. Посылаем "1", получаем строку - ответ от весов "$000100000000@ = 100 кг.

Что скажете?

Скажу, что из вашего описания "весы которые подключаются к COM" понятия не имею какой там протокол.
Что такое 100 кг, это вес установленный на весах?
Судя по текущему сообщению, у вас стоит протокол вида "запрос-ответ", я же использовал (переводил весы в) протокол "без запроса" (весы всё время сообщают установленный на них вес).
Не зависимо от выбранного протокола передачи, весы передают посылку определённого формата, который вам придётся разбирать, либо в символьном, либо в двоичном виде.
kosalex
Цитата(andr_andrey @ 16.07.14, 14:38) необходимо зарегистрироваться для просмотра ссылки
Что такое 100 кг, это вес установленный на весах?


да, и приходит ответ с весов в виде $000100000000@


andr_andrey, я же не говорю что Ваша статья бред! Полезная статья. У меня была запарка с настройкой порта. Сначало стояло, как вы говорите "без запроса", потом поставил "запрос-ответ" и не пришлось преобразовывать, с полученной строки берем нужное количество знаков - это и будет вес, имхо =)
andr_andrey
Цитата(kosalex @ 16.07.14, 14:42) необходимо зарегистрироваться для просмотра ссылки
да, и приходит ответ с весов в виде $000100000000@

Ну тогда опытным путём узнаём в каких разрядах отображается вес
поставили 10 кг - посмотрели ответ от весов
поставили 15 кг - посмотрели.
А дальше - обычная десятичная арифметика (берём цифру разряда и умножаем на вес разряда).

П.С. Ну не верю я, что автовесы (основное средство) не имеет марку, а по марке можно поискать протокол.
kosalex
Цитата(andr_andrey @ 16.07.14, 14:51) необходимо зарегистрироваться для просмотра ссылки
Ну тогда опытным путём узнаём в каких разрядах отображается вес
поставили 10 кг - посмотрели ответ от весов
поставили 15 кг - посмотрели.
А дальше - обычная десятичная арифметика (берём цифру разряда и умножаем на вес разряда).

П.С. Ну не верю я, что автовесы (основное средство) не имеет марку, а по марке можно поискать протокол.



Фирма производитель есть, люди которые их ставили, говорят, протокол простой, шли единицу - получишь вес =)
andr_andrey
Цитата(kosalex @ 16.07.14, 14:46) необходимо зарегистрироваться для просмотра ссылки
да, и приходит ответ с весов в виде $000100000000@


andr_andrey, я же не говорю что Ваша статья бред! Полезная статья. У меня была запарка с настройкой порта. Сначало стояло, как вы говорите "без запроса", потом поставил "запрос-ответ" и не пришлось преобразовывать, с полученной строки берем нужное количество знаков - это и будет вес, имхо =)

То есть всё разрешилось? Тогда поздравляю.
Только имейте ввиду, что тупо получить вес и принять его - мало, надо быть уверенным, что вес стабилизирован, о чём весы дополнительно извещают в посылке ("вес стабилен").
kosalex
andr_andrey, А как получить эту посылку, расскажите по подробней,если не в тягость smile.gif
andr_andrey
Цитата(kosalex @ 16.07.14, 15:08) необходимо зарегистрироваться для просмотра ссылки
andr_andrey, А как получить эту посылку, расскажите по подробней,если не в тягость smile.gif

Для этого надо знать формат посылки, который описывается в протоколе обмена.
Например, для весов ВН-60-1Д в посылке есть байт признаков:
Цитата
s1s0 - положение точки на индикаторе
s2 - бит стабилизации веса
s3 - индикация нуля
s4 - индикация тары
s5 - знак весов (1 - отрицательная)
s6 - номер знакогенератора


Получается функция:
// Функция определяющая стабильность веса из байта признаков посылки
Функция ЭтотВесСтабилен(МассивПосылки)
    
    Возврат ((МассивПосылки[5] % 8) / 4) >= 1;
    
КонецФункции // ЭтотВесСтабилен()
Pavlik1c
Имеются весы ВН-150-А. В 1С 7.7 вес автоматически передается. Сейчас интегрируем с 1С8 УПП. Как вывести вес на форме обработки? Какой алгоритм действий? Помогите!!!
Vofka
Pavlik1c, давайте вы лучше создадите отдельную новую тема. Эта тема закрывается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.