Версия для печати темы (https://pro1c.org.ua/index.php?s=efe9cc023ae75c3c67880d3fb8fcdd25&showtopic=18276)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Работа с торговым оборудованием _ Подлючение автовесов к 1С

Автор: kosalex 10.06.14, 11:46

Добрый день. Есть весы которые подключаются к 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 10.06.14, 12:04

Цитата(kosalex @ 10.06.14, 11:46) *
Что делать, куда смотреть?

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

Автор: kosalex 10.06.14, 12:11

Цитата(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 10.06.14, 13:21

Цитата(kosalex @ 10.06.14, 12:11) *
ComPort.CommPort        = 1;

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

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

сюда заходит?

Автор: Ardi 10.06.14, 13:52

Может надо через "Обработка ожидания" ловить сигнал с ком порта?

Автор: logist 10.06.14, 13:57

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

Нет, этот комобъект сам открывает порт и читает.

Автор: Vofka 10.06.14, 15:50

А что такое 1 в

ComPort.OutPut = "1";

?

Автор: DartRomanius 10.06.14, 15:58

Цитата(Vofka @ 10.06.14, 16:50) *
А что такое 1 в
ComPort.OutPut = "1";

?


Есть подозрение что это команда весам типа "дай данные". smile.gif
И маленькое подозрение что должна быть циферка а не символ.

Автор: Vofka 10.06.14, 16:11

Цитата(DartRomanius @ 10.06.14, 16:58) *
Есть подозрение что это команда весам типа "дай данные".

Я к чему спрашиваю. "1" - это точно ли "дай данные"? Может автор откуда-то скопипастил шото не то... Интересно откуда он взял именно "1".

Автор: logist 10.06.14, 16:24

ComPort.OutPut - отправить данные в буфер
ComPort.InPut - получить данные из буфера
http://pro1c.org.ua/redirect.php?http://msdn.microsoft.com/en-us/library/aa259393(v=vs.60).aspx

Автор: Vofka 10.06.14, 16:26

logist, а это вы к чему?

Автор: logist 10.06.14, 17:24

Цитата(Vofka @ 10.06.14, 16:26) *
а это вы к чему?

К этой теме. Если Вы про буфер, в данном случае без разницы как обзывать объект работы с данными.

Автор: Vofka 10.06.14, 18:10

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

Я про то почему именно "1"? Не 1, не "3", не "Вася", а именно "1".

Автор: sava1 10.06.14, 19:39

Весовой процессор какой (чей) ?

Автор: kosalex 11.06.14, 7:55

Данные с весов попадают в перем "Данные".

Процедура КнопкаВыполнитьНажатие(Кнопка)
    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 11.06.14, 8:33

kosalex, так уже заработало? В чем же была ошибка?

Автор: kosalex 11.06.14, 8:37

Цитата(Vofka @ 11.06.14, 9:33) *
kosalex, так уже заработало? В чем же была ошибка?



Ошибки как таковой не было, просто не посылал эту еденицу
 ComPort.Output = "1";
. Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)

Автор: Petre 11.06.14, 8:50

Цитата(kosalex @ 11.06.14, 9:37) *
Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)

Какой в этом смысл?

Автор: DartRomanius 11.06.14, 8:54

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


Число(....)? smile.gif

Автор: kosalex 11.06.14, 8:59

Цитата(Petre @ 11.06.14, 9:50) http://pro1c.org.ua/index.php?act=findpost&pid=87611
Число(....)? smile.gif


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

Приходит ComSafeArray и элементы этого массива 64 00 00 00 00 00 00 00 48

Автор: Petre 11.06.14, 9:02

Я не понимаю, как массив можно преобразовывать в число.
Уточните, какие данные содержит массив. В конце концов, преобразуйте его в массив 1с (.Выгрузить()), а потом разбирайте элементы последнего.

Автор: alex040269 11.06.14, 9:12

Цитата(kosalex @ 11.06.14, 9:37) *
. Теперь бы преобразовать полученный COMSafeArray в десятичные числа =)

GetType и GetValue, что возвращает?

Автор: kosalex 11.06.14, 9:24

Сори, вроде додумался, возвращается массив 64 00 00 00 00 00 00 00 48 это строка, мне нужно выбирать из этой строки числа это и будет вес, ничего преобразовывать не нужно. Сори!

Автор: kosalex 16.07.14, 7:52

Добрый день. Помогите разобраться, есть ж/д весовая подключенная через 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 16.07.14, 8:26

документация к весам есть? если нет, обратитесь к производителю. В ней многое можно почерпнуть.

Автор: kosalex 16.07.14, 9:30

Цитата(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 16.07.14, 11:11

Писал статью по этому поводу
http://pro1c.org.ua/redirect.php?http://infostart.ru/public/259710/

Автор: Vofka 16.07.14, 11:21

Цитата(andr_andrey @ 16.07.14, 12:11) http://pro1c.org.ua/index.php?act=findpost&pid=88874) smile.gif

Автор: andr_andrey 16.07.14, 12:10

Цитата(Vofka @ 16.07.14, 12:21) http://pro1c.org.ua/index.php?act=findpost&pid=88875) smile.gif

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

У вас нет прав открытия тем в этом форуме

Автор: kosalex 16.07.14, 13:06

Цитата(andr_andrey @ 16.07.14, 12:11) http://pro1c.org.ua/index.php?act=findpost&pid=88874


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

Что скажете?

Автор: andr_andrey 16.07.14, 13:38

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

Что скажете?

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

Автор: kosalex 16.07.14, 13:46

Цитата(andr_andrey @ 16.07.14, 14:38) *
Что такое 100 кг, это вес установленный на весах?


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


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

Автор: andr_andrey 16.07.14, 13:51

Цитата(kosalex @ 16.07.14, 14:42) *
да, и приходит ответ с весов в виде $000100000000@

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

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

Автор: kosalex 16.07.14, 13:53

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

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



Фирма производитель есть, люди которые их ставили, говорят, протокол простой, шли единицу - получишь вес =)

Автор: andr_andrey 16.07.14, 13:57

Цитата(kosalex @ 16.07.14, 14:46) *
да, и приходит ответ с весов в виде $000100000000@


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

То есть всё разрешилось? Тогда поздравляю.
Только имейте ввиду, что тупо получить вес и принять его - мало, надо быть уверенным, что вес стабилизирован, о чём весы дополнительно извещают в посылке ("вес стабилен").

Автор: kosalex 16.07.14, 14:08

andr_andrey, А как получить эту посылку, расскажите по подробней,если не в тягость smile.gif

Автор: andr_andrey 16.07.14, 14:43

Цитата(kosalex @ 16.07.14, 15:08) *
andr_andrey, А как получить эту посылку, расскажите по подробней,если не в тягость smile.gif

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


Получается функция:
// Функция определяющая стабильность веса из байта признаков посылки
Функция ЭтотВесСтабилен(МассивПосылки)
    
    Возврат ((МассивПосылки[5] % 8) / 4) >= 1;
    
КонецФункции // ЭтотВесСтабилен()

Автор: Pavlik1c 17.05.16, 13:26

Имеются весы ВН-150-А. В 1С 7.7 вес автоматически передается. Сейчас интегрируем с 1С8 УПП. Как вывести вес на форме обработки? Какой алгоритм действий? Помогите!!!

Автор: Vofka 17.05.16, 13:43

Pavlik1c, давайте вы лучше создадите отдельную новую тема. Эта тема закрывается.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua