|
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
|
||||
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
|
У меня тоже падало на УФ. Проспался - нашел ошибку. Глупая, не запомнил. Что-то с передачей на сервер наврал. Или передавал на сервер, что глупо. Или определял на сервере а не на клиенте...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |