Имя: Пароль:
1C
1С v8
Получение данных с COM-порта
,
0 askharlov
 
04.09.11
10:28
Возникла новая задача: Необходимо затягивать данные в 1С с COM-порта.
Кто знает как работать с RS232 в 1С отзовитесь. Скажите пожалуйста с чего начать копать задачу.
П.С.: внешнее устройство не кассовый аппарат (горнолыжный хронометр)
1 vudo
 
04.09.11
10:32
Искать ВК! Видел компоненту для работы с COM!

Например:
http://infostart.ru/public/71456/
2 vudo
 
04.09.11
10:36
(1)Вот только такая работа со стороны 1С может быть проблематичной, т.к. будут критические задержки в обработке сигнала и ответах. Может не получится из-за этого реализовать протокол обмена с хронометром...
3 askharlov
 
04.09.11
10:38
Спасибо, скачал, посмотрю
4 askharlov
 
05.09.11
21:54
Скачал vk_rs232.dll.
Но там описание по созданию объекта и открытию порта для 7-ки. Как это делать в 8-ке? Есть у кого готовый фрагмент кода как подключить компоненту, подключить порт, открыть его и принять данные?
Поделитесь кодом, пожалуйста,
Заранеее спасибо
5 askharlov
 
05.09.11
22:24
Подключить компоненту и открыть порт вроде получилось (по крайней мере для других программ он заблокирован), но вот как принять данные????
Сделал как было в примере:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
   Сообщить("Внешнее событие: Источник="+Источник+"  Событие="+Событие+"Данные="+Данные);
КонецПроцедуры
Пускаю данные с внешнего девайса на КОМ-порт, а в ответ тишина.

И также вопрос как потом закрыть КОМ-порт. Написал rs232.ЗакрытьПорт(), 1С не ругается, но для других проограмм порт остается недоступным.
6 Vladal
 
05.09.11
23:38
(5) Объект обнули, который у тебя Новый COMОбъект
7 askharlov
 
06.09.11
09:49
(6) Да, большое спасибо. Обнулил, теперь вроде закрытие порта работает
8 vudo
 
06.09.11
09:53
(5) В форме в которой ОбработкаВнешнегоСобытия в свойствах формы ссылка на эту процедуру есть?
9 askharlov
 
06.09.11
09:53
Остался еще один вопрос:
При передаче данных с хронометра на КОМ-порт у меня за одну передачу несколько раз инициализируется внешнее событие. И каждый раз в переменную "Данные" дописывается информация Вот пример:

Внешнее событие: Источник=rs232  Событие=StringДанные=ID 02021    01A2
DS 04  00 START - FINISH        0637
AN   23    1 M1 20:26:45.29100  4265    06A5
AC   2
Внешнее событие: Источник=rs232  Событие=StringДанные=ID 02021    01A2
DS 04  00 START - FINISH        0637
AN   23    1 M1 20:26:45.29100  4265    06A5
AC   24    2 M1 20:27:00.06500  4265    0693
AN   25    3 M1 20:27:30.97800  4265    06B0
AN   23    1 M4 20:2
Внешнее событие: Источник=rs232  Событие=StringДанные=ID 02021    01A2
DS 04  00 START - FINISH        0637
AN   23    1 M1 20:26:45.29100  4265    06A5
AC   24    2 M1 20:27:00.06500  4265    0693
AN   25    3 M1 20:27:30.97800  4265    06B0
AN   23    1 M4 20:27:33.94900  4265    06B0
RR    0   23          48.65800    04F6
AN   25    2 M4 20:27:48.22400  4265    06A
Внешнее событие: Источник=rs232  Событие=StringДанные=ID 02021    01A2
DS 04  00 START - FINISH        0637
AN   23    1 M1 20:26:45.29100  4265    06A5
AC   24    2 M1 20:27:00.06500  4265    0693
AN   25    3 M1 20:27:30.97800  4265    06B0
AN   23    1 M4 20:27:33.94900  4265    06B0
RR    0   23          48.65800    04F6
AN   25    2 M4 20:27:48.22400  4265    06AB
RR    0   25          17.24600    04ED
AC   26    4 M1 20:27:55.63700  4265    06A6
DE 04    010D

Можно как-то побороть чтоб на одну передачу по КОМ-порту было одно внешнее событие?
10 big
 
06.09.11
09:58
(9) Дык, разруливай это в самой ВК. Зачем всю шнягу в 1С-то пихать??
11 askharlov
 
06.09.11
09:59
(10) не понял. как разруливать в ВК? взять ее исходник и самому дописать нужный код?
12 Serginio1
 
06.09.11
10:32
Пишешь
public void ПодключитьСканер(int НомерПорта)
      {
          sp = new SerialPort("COM" + НомерПорта.ToString());

          sp.BaudRate = 9600;
          sp.Parity = Parity.None;
          sp.StopBits = StopBits.One;
          sp.DataBits = 8;
          sp.Handshake = Handshake.None;

          sp.DataReceived += (sender, e) => {
              SerialPort sp1 = (SerialPort)sender;
              string indata = sp1.ReadExisting();
              Sc.Send(d => EventTo1C.ExternalEvent("ДанныеОтСканера", sp1.PortName, indata), null);
          };

          sp.Open();

       
      }


где
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
          Sc = SynchronizationContext.Current;

Берешь отсюда ВК
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender

Берешь ВК
13 vudo
 
06.09.11
11:22
(9)Скорее всего он от тебя ждет контрольного байта о получении пакета... А раз его нету, то продолжает долбить. Описание протокола обмена есть?
14 askharlov
 
06.09.11
11:32
(13) описания нету
15 vudo
 
06.09.11
18:11
(14)Скорее всего там 1 байт подтверждения. Попробуй в цикле различными байтами подолбить в ответ на пакеты.

Если не выйдет, то только описание протокола обмена искать...
16 vudo
 
06.09.11
18:13
(15)+ Правда есть еще вероятность, что ты во временной интервал ожидания ответа попасть не сможешь. Так что дело будет геморройное...
17 askharlov
 
08.09.11
10:18
Решил иначе:
заня, что последняя строка начинается с DE анализирую Данные и когда встречается DE, тогда понимаю, что передача завершена и запускаю обработку полученных данных
18 defini
 
08.09.11
10:27
http://infostart.ru/public/69762/

Вот здесь глянь, то что нужно.
19 vudo
 
08.09.11
10:35
(17)Если посмотреть на данные из (9), так такое впечатление, что передача порвалась как минимум 3 раза...

Может и твое DE 04 - это только часть пакета?
20 askharlov
 
08.09.11
11:01
(19) нет, DE - это конец, по структуре данных я понимаю что есть что
21 mzelensky
 
08.09.11
11:06
(9) это фишка в самой ВК. Я подправлял библиотеку
22 mzelensky
 
08.09.11
11:07
(17) ТУПНЯК! я тоже так сперва хотел, но отказался. Проще взять Делфяк и внести изменение в библиотеку (добавить 1 строчку)!
Программист всегда исправляет последнюю ошибку.