Имя: Пароль:
1C
1С v8
MSCOMM + Весы. Нужна помощь.
0 Юрий33
 
19.02.17
14:11
Уважаемые коллеги, нужна помощь в написании обработки для весов.
Сразу оговорюсь, что благодарю пивом на Webmoney :-)

Итак, ситуация.

Есть весы с портом rs232.
Пишем обработку с использованием компоненты mscomm.ocx  Компонента зарегистрирована.

Проблема состоит в том, что не знаем как передать команды для этих весов в ком порт. Т.е. как правильно сформировать код после Объект.Драйвер.Output =

Эталоном является родная программа (exe)с помощью которой и portmona мы видим, что на самом деле нужно передавать (на скриншоте)


Вот что написали (фрагмент):
Функция Подключить(Объект) Экспорт    
    Перем мУстановки, мСкорость,мПорт;

    Результат = мНетОшибки;
    
    Объект.Параметры.Свойство("Порт", мПорт);
    Объект.Параметры.Свойство("Скорость", мСкорость);    
    
    мУстановки = "" + Формат(мСкорость,"ЧГ=0") + ",E,8,1";
    
    Объект.Драйвер.CommPort = мПорт;
    Объект.Драйвер.Settings = мУстановки;    
    
    Попытка
        Объект.Драйвер.PortOpen = 1;
    Исключение
        Результат = мОшибкаПриПодключении;
        Объект.ОписаниеОшибки = ОписаниеОшибки();
    КонецПопытки;

    Возврат Результат;
КонецФункции

Функция Вес(Объект, Вес, Цена = 0) Экспорт
    Результат = мНетОшибки;
    
    Если НЕ Объект.Драйвер.PortOpen = 1 Тогда
        Возврат Результат;
    КонецЕсли;    
    
    Объект.Драйвер.Output = ???;


Скриншот эталонной программы http://screenshot.ru/upload/image/zB9g
160 строка для нас загадка. Как же её сделать?
1 oleg_km
 
19.02.17
14:16
Вроде пишут в порт двоичные данные. По-моему у компоненты есть признак, что обмен идет двоичными данными, тогда нужно формировать и читать COMSafeArray
2 Юрий33
 
19.02.17
14:25
Олег, проблема в том, что , как нам кажется,COMSafeArray работает для чтения. А мы никак не можем передать в ком порт двоичные данные.


Вот к примеру на инфостарте пишут
"В коде подключаем компоненту MSCOMM, выставляем скорость и параметры протокола обмена, размер буфера приема. Важным моментом является установка InputMode = 1 (comInputModeBinary), чтобы получить при приёме COMSafeArray, который просто выгружается в массив целых чисел 1С."
3 abuca
 
19.02.17
15:49
Вот инициализация:

Процедура ОсновныеДействияФормыИнит(Кнопка)
    Драйвер = Новый COMОбъект("MsCommLib.MsComm.1");
//Драйвер.InBufferSize    = 70;
Драйвер.InputLen        = 0;
Драйвер.InputMode       = 0;
Драйвер.NullDiscard     = 0;
Драйвер.InputLen = 0 ;
Драйвер.RThreshold = 0;
//Драйвер.Rthreshold  =1; //????etting RThreshold to 1, for example, causes the MSComm control to generate the OnComm event every time a single character is placed in the receive buffer.
Драйвер.Handshaking = 0;
//    Драйвер.InputLen = 0;//чистим буфер
    Драйвер.CommPort = Число(НомерПорта);// COM1
    Драйвер.Settings = СокрЛП(Скорость) + ",N,8,1";
    Драйвер.EOFEnable = Истина;
//    Драйвер.Break = 1;
    Если Драйвер.PortOpen =1 Тогда
           Драйвер.PortOpen = 0;
    КонецЕсли;
    Драйвер.PortOpen=1;  
    Сообщить("Состояние " + Драйвер.CommEvent);

    Попытка
        Ответ = Драйвер.input;
        Сообщить("Состояние " + Драйвер.CommEvent);
        
    Исключение
        Сообщить("Состояние " + Драйвер.CommEvent);
    КонецПопытки;
    
    
КонецПроцедуры
4 abuca
 
19.02.17
15:55
Пример для работы со Штрихом по протоколу.
Отправляю команду гудок:

Функция Гудок()
    Драйвер.Output = ВернутьСтр("02 05 13 1E 00 00 00 08");
    Ответ = ПолучитьОтвет("Гудок");
КонецФункции

Отправил команду, иду слушать в функцию ПолучитьОтвет:


Функция ПолучитьОтвет(Команда)

    Пока Истина Цикл
                ОбработкаПрерыванияПользователя();

    
    Пока Драйвер.InBufferCount > 0 Цикл
        Сообщить(Команда + " - В буфере байт:" + Драйвер.InBufferCount);                
        Попытка
            InBuff = InBuff + Драйвер.Input;
        Исключение
            Сообщить("Исключение ");
        КонецПопытки;
        ОбработкаПрерыванияПользователя();
    КонецЦикла;

    КонецЦикла;
5 abuca
 
19.02.17
15:58
Блин! Я тебе про TCP все скинул через сокет. Извини, сейчас про СОМ порт поищу, где-то я с ним возился...
6 abuca
 
19.02.17
16:02
(5) ...вроде не пил ничего сегодня кроме кофе, а путаюсь на ровном месте. Все верно. Это СОМ Порт.
Далее самое интересное, как раз ответ на Ваш вопрос.

Функция ВернутьСтр(Стр)
    Стр = СтрЗаменить(Стр," ",Символы.ПС);
    Ткс = Новый ТекстовыйДокумент;
    Ткс.УстановитьТекст(Стр);
    Команда = "";
    Для н = 1 По Ткс.КоличествоСтрок() Цикл
        Слово = Ткс.ПолучитьСтроку(н);
        Команда = Команда + ChR(ToDec(Слово, 16));
    КонецЦикла;
    Возврат Команда;
КонецФункции
7 abuca
 
19.02.17
16:04
Т.е. в драйвер мы пишем строку символов!!!
Ну и напоследок, функции преобразования, чтобы на пиво ;)))

Функция ToDec(Знач тЗначение, тОснование)
   тРезультат=0;

   тДлина = СтрДлина(тЗначение);
   Для тСимвол = 1 По СтрДлина(тЗначение) Цикл
      тМножитель = 1;
      Для тСчет = 1 По тДлина-тСимвол Цикл
         тМножитель = тМножитель * тОснование;
      КонецЦикла;

      тРезультат=тРезультат + (Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Сред(тЗначение, тСимвол, 1))-1) * тМножитель;
   КонецЦикла;

   Возврат Окр(тРезультат);
КонецФункции

Функция Chr(Code)
    sc = Новый COMОбъект("MSScriptControl.ScriptControl");
      sc.language="VBscript";
      Возврат sc.eval("Chr("""+Code+""")");
КонецФункции
8 abuca
 
19.02.17
16:10
Юрий, я себе месяца 3 назад всю голову об посыл команды в СОМ порт изломал. Не надо COMSafeArray. Я тоже сначала так думал. "Как же передать HEX или Bin на порт..." дня три убил, пока не поставил Слушалку по СОМпорту и увидел что идет и что приходит.
Возвращаться будет тоже строками.
Еще грабли:
Если 1 символ вернется с кодом > 255, то преобразуется в Unicode штатной функцией 1С КодСимвола() Поэтому используем VBScript. Но, символы < 32 (по-моему) выбивают CHR в ошибку, поэтому, возможно, придется совмещать обе.
Если что - звони, подскажу.
9 Юрий33
 
19.02.17
18:29
abuca

как с Вами связаться? Тел или скайп.
10 Кирпич
 
19.02.17
19:49
в документации по весам всё написано. чего и как писать читать
11 abuca
 
19.02.17
20:05
(10) Вопрос был как передать, к примеру, "00 00 03" в СОМ порт.
Ответ был передавать символы с кодами 0,0,3
12 abuca
 
19.02.17
20:08
А если строка будет типа "00 1A 0E" - вот тогда нужны функции преобразования из HEX в DEC чтобы потом передать что-то типа: КодСимвола(0) + КодСимвола(26) +КодСимвола(14)
13 abuca
 
19.02.17
20:15
*не кодСимвола(), а Символ(), простите, оговорился
14 Кирпич
 
19.02.17
21:04
(11) можно наверное и так:

Объект.Драйвер.Output = 0;
Объект.Драйвер.Output = 0;
Объект.Драйвер.Output = 3;
15 Кирпич
 
19.02.17
21:08
(12) ну и так:

Объект.Драйвер.Output = 0;
Объект.Драйвер.Output = 26;
Объект.Драйвер.Output = 14;
16 Кирпич
 
19.02.17
21:11
так шо Webmoney мои :)
17 Кирпич
 
19.02.17
21:20
но это я так. теоретически. я не пробовал :)
18 Юрий33
 
19.02.17
21:25
Коллеги, программа, которая идёт в наборе показывает такие настройки в portmone:

Shake 0, Replace 40 XonLimit: 2048 Xofflimit: 512 XON:11 XOFF:13

Возможно ли настроить так порт, с такими показателями?
19 Юрий33
 
19.02.17
21:26
16 Нет, abuca честно заработал. Подключился, проконсультировал.
20 abuca
 
19.02.17
21:46
(18) не уверен, но мне кажется это уже не в ту сторону...
Если уже удается отправить команду, назад что-то приходит?

По настройкам XON/XOF или RTS - протоколы передачи данных.
11,13 - они уже и так есть если выбран данный протокол.
Выбирается протокол так:
MSComm.Handshaking = protocol
где protocol есть:

ComNone 0 Нет подтверждения связи (Значение по
умолчанию)
ComXOnXoff 1 XON/XOFF – подтверждение связи
ComRST 2 RTS/CTR – подтверждение связи
comRTSXOnXOff 3 RТS и XON/XOFF – подтверждение связи
21 Torquader
 
19.02.17
22:22
В MSCOMM пишется или объект VBArray с элементом Byte (другие футболит) или просто строка.
Но, в VbScript есть возможность создания строки через ChrB - запись байта, или просто Chr, а в 1С такого нету.

Вообще-то, можно написать сценарий на VbScript, а потом влимонить его в 1С через MsScriptControl - я так в 1С 7.7 всегда делал.

Чего там нужно передать ?
22 Torquader
 
19.02.17
22:24
https://msdn.microsoft.com/en-us/library/aa259393(v=vs.60).aspx

У него, кстати, есть документация - там всё сказано.

И, если есть ADODB.Stream с типом Binary, то он прекрасно туда передаётся.
23 Кирпич
 
19.02.17
22:34
Нашел этот mscomm.ocx
всё делает как в документации. либо строка либо массив. так что в (14) ересь написана :)
24 abuca
 
19.02.17
22:36
(21)С ComArray пробовал, получалось, но сложнее получалось.
(23)Хорошо, что сам увидел, не стал огорчать))
25 Torquader
 
19.02.17
22:38
(24) С ADODB.Stream - попробовали ? По-мойму, наиболее удачное решение - собрал строку и отправил.
26 abuca
 
19.02.17
22:38
(21) Но, приходит обратно с COM все-равно в виде строки!
Как ее загонять в ComSafeArray обратно, чтобы получить байты... Если проще эти байты сконвертировать через VBScript
27 abuca
 
19.02.17
22:40
(25) до этого не добрался. А ведь помогло бы в самом начале!
28 Torquader
 
19.02.17
22:40
В чём скажешь, в том и придёт:
https://msdn.microsoft.com/en-us/library/aa259414(v=vs.60).aspx
29 Torquader
 
19.02.17
22:40
(27) Мне что - телефон оставлять, чтобы мне звонили и спрашивали ?
Или ещё обучать как поиском пользоваться ?
30 abuca
 
19.02.17
22:41
(28) опередил, как раз хотел об этом спросить
31 abuca
 
19.02.17
22:41
(29) )))
32 Torquader
 
19.02.17
22:43
Я понимаю, автор темы - только вчера родился.
Но вы-то с такими полосками устроили тут "пишу по памяти - не знаю, что выйдет".
33 Torquader
 
19.02.17
22:43
(32)+ Прошу прощения - ещё сегодня ^_^
34 abuca
 
19.02.17
22:45
(32)(33) не въехал, простите. Какие полоски, чья память?
35 Кирпич
 
19.02.17
22:50
(34) он типа намекает, что он самый умный
36 Torquader
 
19.02.17
22:52
(34) (35) Я не намекаю, я просто говорю, что чем гадать - читаем документацию и не задаём вопросов.
А полоска - это чёрточка под ником - показывает сколько времени прошло с даты регистрации пользователя на форуме, то есть, косвенно, сколько он занимается 1С и прочими вопросами.
37 abuca
 
19.02.17
22:56
(35)Другое дело, если бы нерабочий код дал... Код абсолютно рабочий. А методов может быть намного больше. Важно, что все они передают один и тот же код на устройство.
В моем случае код 1С окажется проще.
А ADODB возьмем на заметку. Пригодится.
(36) Вроде я и не гадал. Не цыганка.
Кстати, можно рассмотреть еще написание своей ВК на С# или Дельфах обычно все к этому сводится в конце каждой ветки касательно сокетов
38 abuca
 
19.02.17
22:57
(36) Спасибо, не обращал внимания на полоски.
39 Кирпич
 
19.02.17
22:58
(36) гадать интереснее
40 abuca
 
19.02.17
23:01
(39)Кирпич! У тебя полоска длиннее чем у нас! Я перед тобой преклоняюсь.
Завтра будет продолжение по выбору протокола передачи данных в весы.
41 Torquader
 
19.02.17
23:03
А вообще, наверное, проще было бы марку весов озвучить и посмотреть описание их протокола, чтобы не гадать, а сразу угадать.
42 Кирпич
 
19.02.17
23:04
(41) уже предлагали. решили всё таки методом тыка. да ты ещё всё испортил со своей документацией на mscomm.ocx
43 Torquader
 
19.02.17
23:06
(42) А, всё, понял - прошу прощения - вы цену набивали.
44 abuca
 
19.02.17
23:06
(41)Есть уже протокол. Человек спросил, как 00 00 03 передать в ком.
Я сказал что можно символами кидать, переведя их из HEX в DEC
Дальше, вроде, справились.
Однако зачем-то остался вопрос по выбору протокола.
Хотя, думаю, вопрос будет касательно прикручивания событий.
45 Torquader
 
19.02.17
23:09
(44) У меня на событии Socket-а восьмёрка падала ничего не успев сказать - как бы - тут также не получилось.
Насколько я знаю, там библиотека не совсем потокобезопасным образом написана.
46 abuca
 
19.02.17
23:12
У меня тоже падало на УФ. Проспался - нашел ошибку. Глупая, не запомнил. Что-то с передачей на сервер наврал. Или передавал на сервер, что глупо. Или определял на сервере а не на клиенте...