Здравствуйте, нужна помощь по реализации протокола DCON.
Пишу программу на C#. Обмен с модулем I-7017RC используя DCON. Читаю входные значения. Формат команды #AA,
на C# это выглядит так: var wBuffer = new byte[] {0x23, 0x30, 0x31, 0xD};
в ответ приходит такой буфер:
byte[0] = 62;
byte[1] = 50;
byte[2] = 50;
byte[3] = 0;
При конвертировании в строку получаем: 3F-32-32-00
Вопрос: как эти данные преобразовать в мА?
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Обмен по протоколу DCON
Модератор: Глоб.модераторы
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 07 июн 2013, 14:56
- Имя: Прокофьев Алексей Анатольевич
- Страна: Россия
- город/регион: Новосибирск
-
- почётный участник форума
- Сообщения: 3974
- Зарегистрирован: 20 янв 2010, 22:23
- Имя: Никита
- Страна: РФ
- город/регион: Мурманск
- Благодарил (а): 21 раз
- Поблагодарили: 230 раз
Re: Обмен по протоколу DCON
Коротковат у Вас ответ получается. 8-канальные модули на команду #01<CR>, без указания канала, насколько помню, выплевывают в ответ значения всех каналов в строку подряд, с завершением строки тем же символом <CR>. И это явно длиннее четырех байт.
Во-первых, без всяких C отправьте в модуль Ваш запрос хотя бы гипертерминалом или чем Вам удобнее и посмотрите, что будет. Во-вторых, ответный буфер при работе на С надо обработать и символ возврата каретки заменить принятым в С терминирующим нулем, чтобы получить нормальную для С строку.
В третьих - огласите весь список, пожалуйста. Т.е. и отклик модуля в терминале и весь полученный от него буфер до символа 0x0D
Непонятен ноль в последнем байте, его там по идее, быть не может. Но С воспринимает его как конец строки. Кстати, буфер-то у Вас если используется тот же самый, то он конечной длины. Объявите отдельную длинную строку для ответа, будет проще.
Во-первых, без всяких C отправьте в модуль Ваш запрос хотя бы гипертерминалом или чем Вам удобнее и посмотрите, что будет. Во-вторых, ответный буфер при работе на С надо обработать и символ возврата каретки заменить принятым в С терминирующим нулем, чтобы получить нормальную для С строку.
В третьих - огласите весь список, пожалуйста. Т.е. и отклик модуля в терминале и весь полученный от него буфер до символа 0x0D
Непонятен ноль в последнем байте, его там по идее, быть не может. Но С воспринимает его как конец строки. Кстати, буфер-то у Вас если используется тот же самый, то он конечной длины. Объявите отдельную длинную строку для ответа, будет проще.
Опыт - это когда на смену вопросам: "Что? Где? Когда? Как? Почему?" приходит единственный вопрос: "Нахрена? "
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 07 июн 2013, 14:56
- Имя: Прокофьев Алексей Анатольевич
- Страна: Россия
- город/регион: Новосибирск
Re: Обмен по протоколу DCON
Спасибо за ответ, разобрался! На диске icpdas есть программка Send232 V.2.0.1 называется. Попробовал ей послать #01<CR> Модуль ответил:
>222CFFFFFFFFFFFFFFFFFFFFFFFFFFFF Утилита DCON_Utility возвращает тоже самое. Т.е. модуль исправный.
Далее пробую так:
считываю 34 байта, и конвертирую в строку через BitConverter.ToString() получаем:
3E-
32-32-32-41-
46-46-46-45-
46-46-46-45-
46-46-46-46-
46-46-46-45-
46-46-46-45-
46-46-46-45-
46-46-46-45-
0D
это ASCII символы. 3E это '>', 0D это '♪' (возврат каретки). 32-32-32-41 в шестнадцатеричной 222А или в десятичной 8746.
Далее всё просто. Если датчик 4-20, то ((8746-6553)/(32767-6553))*16+4 = 5.34 мА.
>222CFFFFFFFFFFFFFFFFFFFFFFFFFFFF Утилита DCON_Utility возвращает тоже самое. Т.е. модуль исправный.
Далее пробую так:
считываю 34 байта, и конвертирую в строку через BitConverter.ToString() получаем:
3E-
32-32-32-41-
46-46-46-45-
46-46-46-45-
46-46-46-46-
46-46-46-45-
46-46-46-45-
46-46-46-45-
46-46-46-45-
0D
это ASCII символы. 3E это '>', 0D это '♪' (возврат каретки). 32-32-32-41 в шестнадцатеричной 222А или в десятичной 8746.
Далее всё просто. Если датчик 4-20, то ((8746-6553)/(32767-6553))*16+4 = 5.34 мА.
-
- SCADA+
- Сообщения: 597
- Зарегистрирован: 05 ноя 2009, 11:18
- Имя: Бузинов Роман Анатольевич
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 8 раз
- Поблагодарили: 36 раз
Re: Обмен по протоколу DCON
Вы в софте режим порта задайте (его кодировку, а то он по-умолчанию в 7-битной работает), поэтому и 3F идут по всем большим значениям. А вообще - мой совет: если работаете с портом в C#, то отправляйте и получайте байты, а не строку символов, так более адекватнее получается. Уже сам не раз на этом попадался. :)
SCADA+
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 07 июн 2013, 14:56
- Имя: Прокофьев Алексей Анатольевич
- Страна: Россия
- город/регион: Новосибирск