Форум программистов, компьютерный форум, киберфорум
Контроллеры PLC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9

Работа с ICP DAS i-7043 по протоколу DCON

29.06.2017, 10:05. Показов 5619. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано: устройство i-7043, связано с компьютером по Ethernet через другое устройство ICP DAS (коммутатор PDS-775, создаёт виртуальные ком-порты). Нужно работать с 7043 на C# (.NET Framework 4.0). Для работы по протоколу DCON в наличии есть библиотеки (DCON_PC.dll и Uart.dll - для собственно работы, и DCON_PC_DOTNET.dll - обёртка, чтобы получить доступ к первым двум из под дотнета). Есть документация по протоколу, и я знаю, какие функции нужно использовать. Проблема в том, что они не работают.
Вот что я делаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using DCON_PC_DOTNET;
 
byte m_iCom = 3;    //номер виртуального ком-порта
uint m_iBaudrate = 9600;
short m_iTotalChannel = 16;    //16 DO-регистров на устройстве, от 0 до 15
short m_iSlot = -1;    //так как ком-порт виртуальный и подключение по Ethernet, то слот -1.
short addr = 1;    //адрес устройства
short open = DCON.UART.Open_Com(m_iCom, m_iBaudrate, 8, 0, 1);    //ком-порт открывается без проблем
uint res1;
 
//включим канал номер 0
short res = DCON.IO_Function.Write_DO_Bit(m_iCom, addr, m_iSlot, 0, m_iTotalChannel, true, 0, 300);
//считаем состояние каналов в res1
res = DCON.IO_Function.Read_DO(m_iCom, addr, m_iSlot, m_iTotalChannel, 0, 300, out res1);
//выключим канал номер 0
res = DCON.IO_Function.Write_DO_Bit(m_iCom, addr, m_iSlot, 0, m_iTotalChannel, false, 0, 300);
//ещё раз считаем состояние каналов в res1
res = DCON.IO_Function.Read_DO(m_iCom, addr, m_iSlot, m_iTotalChannel, 0, 300, out res1);
 
DCON.UART.Close_Com(m_iCom);
Функция Write_DO_Bit записывает в один указанный канал указанное значение (true или false), а на выходе выдаёт результат (0 - успешно, больше нуля - номер ошибки). Функция Read_DO считывает в выходной параметр текущие значения всех каналов, а на выходе также выдаёт признак успешности работы (0 - успешно, иначе номер ошибки).
В моём случае все эти функции стабильно выдают ошибку 15, что означает тайм-аут. Увеличение параметра тайм-аута (до трёх секунд) никакого результата не даёт. Но что самое смешное - на самом деле функция записи вполне себе отрабатывается! Эта хрень 7043 выдаёт питание на релешки, и на них загораются светодиоды, я физически это наблюдаю. Write_DO_Bit(0, true) - и на первом реле загорается светодиод, а функция выдаёт ошибку 15. Write_DO_Bit(2, false) - и на третьем реле гаснет светодиод, а функция выдаёт ошибку 15. Как так вообще может быть? Функция нормально сработала, но думает, что не сработала.
Но функция записи хотя бы записывает, а вот функция чтения ничего не читает - ошибка тайм-аута, а в res1 всё по нулям, ничего не записалось.
Да, на диске, прилагавшемся к устройству, вместе с либами и документацией есть также и демо-примеры. Но они тоже не работают. Точно так же - запись по каналам идёт, чтение - нет, и прога постоянно рапортует об ошибке 15.

То ли лыжи не едут, то ли я.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2017, 10:05
Ответы с готовыми решениями:

Работа с DCON протоколом (ICP DAS)
Здравствуйте уважаемые программисты. Я начинающий чайник. Начал изучать Delphi. Остановился на Delphi XE2 потому что нашел почти все...

Работа с модулем ICP DAS I-8831 по Modbus RTU
Доброго времени суток, господа. Прошу Вас подкинуть и указать путь к заголовочным файлам на "C", описывающим протокол передачи...

Обмен с I-87068 (ICP DAS)
Здравствуйте! Помогите пожалуйста!!! Я написал программку с использованием библиотеки CPort, RS-485 как модуль у меня I-87068. Мне надо...

13
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
29.06.2017, 16:51
Попробуйте без посредника, т.е. подключить к компу через переходник USB>>RS485/
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
29.06.2017, 16:59  [ТС]
Без посредника не вариант, мы специально переходим с 485 на Ethernet, в финальной конфигурации будет именно такая аппаратура.
До того, как поставили i-7043, стояли два адвантеховских ADAM-4050, с которыми такой проблемы не было.
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
29.06.2017, 17:09
Если в настройке PDS уверены, попробуйте пообщаться с модулем терминалкой от производителя.
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
30.06.2017, 09:46  [ТС]
Да терминалка-то работает. Правда, использует совсем другие либы, сейчас вскрыл их декомпилятором и пытаюсь скопировать алгоритм оттуда.
Странно, почему не работают стандартные либы, хотя должны.
Миниатюры
Работа с ICP DAS i-7043 по протоколу DCON  
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
30.06.2017, 10:29
Не понятно что на этой терминалке.
Если без контрольной суммы, то в ответ вы должны получить только символ ">" и конец кадра, у Вас там вроде какой то мусор.
Может на модуле контрольная сумма всётаки включена?

Зачем декомпилировать? Протокол простейший, а у студии есть шикарный контрол для прота
https://msdn.microsoft.com/ru-... s.90).aspx
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
30.06.2017, 14:58  [ТС]
Копнул ещё в библиотеке DCON (а точнее, в Uart.dll), нашёл там функцию Send_Receive_Cmd, которая посылает любую заданную команду, определённую в протоколе. Поэкспериментировал.
Взял команду "Get Module Name", она возвращает тупо имя устройства, к которому обращаются (фиг с ними, с регистрами). Синтаксис команды: "$01М" (01 - адрес). В DCON Utility ответ на эту команду выглядит так:
Code
1
!017043 [21 30 31 37 30 34 33 ]
01 - адрес, 7043 - имя.
Теперь делаю так в коде:
C#
1
2
3
4
5
6
7
string cmd = "$01M";
byte[] cmd2 = new byte[64];
cmd2 = PACNET.MISC.AnsiString(cmd);
byte[] result = new byte[64];
uint T;
short res = DCON.UART.Send_Receive_Cmd(m_iCom, cmd2, result, 300, 0, out T);
string result2 = PACNET.MISC.WideString(result);
В res функция как обычно вернула 15, уже даже не удивляет. Интересно, что у нас в массиве result:
Code
1
33 138 55 162 51 195
Или, что то же самое в hex,
21 8A 37 A2 33 C3
При конвертации в строку получаем "!?7?3?". Три символа не распарсились, потому что они больше 127.
Однако уже появляется закономерность: три символа (!, 7 и 3) прочитались без проблем. Но между ними должны быть по два символа, которые как будто слиплись в один: 0x30 и 0x31 (01) - в 0x8A, 0x30 и 0x34 (04) - в 0xA2, а откуда взялся 0xC3, вообще непонятно.
Отчего бы такому быть?
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
30.06.2017, 20:16
Если в ответе бред из символов, то не совпадают настройки связи на каком то из трёх устройств.
Или Ваша прога, или модуль, или посредник PDS-775
без контрольной суммы Вы должны получить в ответ один символ и конец строки.

настройки порта PDS вроде нужно заранее выставлять.. Я пользовал подобную, но только белую
https://ipc2u.ru/catalog/tds-725
в ней настройки порта задаются в самой коробочке, из своего приложения не поменять.

Не помешает проверить ответы обычной терминалкой, которая всё что из порта показывает.

Добавлено через 5 минут
Кстати, для моей коробочки была софтина VxComm Driver (полагаю у Вас она же), у неё в настройках можно поставить галку чтобы прога эмулировала порт даже при отсутствии связи с коробочкой.
Это помогает избавится от кучи исключений в своей проге, если с коробочкой связь потеряна.
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
03.07.2017, 09:09  [ТС]
Цитата Сообщение от Олег_ Посмотреть сообщение
без контрольной суммы Вы должны получить в ответ один символ и конец строки
Вы это с чего взяли? Я должен получить "!017043". Собственно, через DCON Utility я это и получаю. Следовательно, дело НЕ в настройках связи на 7043 или PDS.
Как поможет эмулирование порта при отсутствии связи, я вообще не понял.
Причина явно в используемых библиотеках. То ли я их использую не так, как надо, то ли они несовместимы сами по себе (может, оттого, что они написаны под WinCE, а у меня Win7, как предположение).
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
03.07.2017, 09:52
У Вас на скрине команда
2.3 #AABBDD
Назначение команды: Установить дискретные выходы
Формат команды: #AABBDD[CHK](cr)
в ответ можете получить
Допустимая команда: >[CHK](cr)
Недопустимая команда: ?AA[CHK](cr)
Проигнорированная команда: !AA[CHK](cr)
В случае синтаксической или коммуникационной ошибки может быть не принято
никакого ответного сообщения.
> разделитель в случае допустимой команды
? разделитель в случае недопустимой команды
! разделитель в том случае, если команда проигнорирована. Такая ситуация имеет место, если
установлен флаг срабатывания сторожевого таймера главного ПК, а выходы модуля установлены в
состояние, соответствующие «безопасному» значению (Safe Value).
Так что Вы в ответ получили?
Цитата Сообщение от avialaynen Посмотреть сообщение
они написаны под WinCE
ftp://ftp.icpdas.com/pub/cd/80... mo/dotnet/
Из описания вроде не только WinCE.
Цитата Сообщение от avialaynen Посмотреть сообщение
Как поможет эмулирование порта при отсутствии связи, я вообще не понял.
При отсутствии связи с PDS, пропадёт и порт из системы, при отсутствии порта Ваша прога вылетит на исключении. В тексте первого поста нет обработки исключений.
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
03.07.2017, 11:58  [ТС]
Цитата Сообщение от Олег_ Посмотреть сообщение
У Вас на скрине команда
Вы невнимательно читаете мои посты. В посте 7 я проверял совсем другую команду:
Цитата Сообщение от avialaynen Посмотреть сообщение
Взял команду "Get Module Name", она возвращает тупо имя устройства, к которому обращаются (фиг с ними, с регистрами). Синтаксис команды: "$01М" (01 - адрес).
Syntax:
$AAM[CHKSUM](CR)
$ Delimiter character
AA Address of the module to be read (00 to FF)
M Command to read the module name
Response:
Valid command: !AA(Data)[CHKSUM](CR)
Invalid command: ?AA[CHKSUM](CR)
! Delimiter character for a valid command
? Delimiter character for an invalid command
AA Address of the responding module (00 to FF)
(Name) Name string of the module
Ответ приходит верный, начинается с !. Проблема в том, что где-то на принимающей стороне софт этот ответ неправильно понимает.
Цитата Сообщение от Олег_ Посмотреть сообщение
В тексте первого поста нет обработки исключений.
Не стал копировать, потому что для текущей задачи это не важно.
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 323
03.07.2017, 15:29
Цитата Сообщение от avialaynen Посмотреть сообщение
Вы невнимательно читаете мои посты. В посте 7 я проверял совсем другую команду:
А с командой записи выхода у Вас всё в норме? Та что на скрине.
Непонятные символы в основном случаются из-за разных настроек связи. Это относится и к
Цитата Сообщение от avialaynen Посмотреть сообщение
При конвертации в строку получаем "!?7?3?"
Вы грешите на кривую библиотеку, не проверяя всё остальное.
Что мешает разобраться с библиотекой без PDS-775? и только потом подключить эту штуку?
Что мешает сравнить настройки связи всех троих?

Вы другим софтом (терминалкой) получаете всякую хрень в ответе от прибора, и упорно грешите на библиотеку которую используете. Где логика?
0
0 / 0 / 0
Регистрация: 29.06.2017
Сообщений: 9
05.07.2017, 15:57  [ТС]
Оказалось, дело было всё-таки в библиотеке Связался со специалистами ICP DAS - они сказали, что библиотека DCON_PC ими давно не поддерживается (несмотря на то, что тестовые примеры на диске написаны именно с её использованием) и порекомендовали использовать новую их библиотеку PACNET. С ней всё заработало. Ну или почти всё.
0
0 / 0 / 0
Регистрация: 23.07.2016
Сообщений: 2
24.07.2017, 14:50
Мы используем как-то так:
const int port=1;
const char* msg="@04\r";
int len=strlen(msg);
Send_Binary (port, msg, len);
И Receive_Binary, соответственно.
Работает неплохо.
Еще лучше работает, если отправлять и читать по одному байту.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2017, 14:50
Помогаю со студенческими работами здесь

Сервер на контроллере ICP DAS i-8831-80
Доброго всем времени суток! Есть привод и периферия к нему (датчики давления, перемещения и проч.), и встала задача всё это дело...

Бесплатная среда разработки для ICP DAS
Здравствуйте. Мы на производстве используем контроллеры I7188, с подключенными через rs485 модулями I7000. Вопрос: Есть ли бесплатная...

Проблемы с автозагрузкой программы в ICP DAS iPAC-8000E
Программа не работает при включении питания iPAC-8000 (режим "Run"). На терминал выводится строчка "CS:IP=:= SS:SP=: DS= ES",...

Ввод/вывод данных через com порт из модуля ICP DAS
Есть модуль аналогового вывода ICP DAS (i7018). Нужно получить с него данные по каналам. Нашел программку записи/чтения в comport. Создаю...

Общение АЦП i-7017 с компьютером по протоколу DCON на C#
Всем привет. Пишу программу связку АЦП i-7017 и компа. Все вроде сделал все работает вот только АЦП возвращает не то что должно быть. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru