EnglishУкраїнськаmRussian
Login/New
Topic with many replies

Реализация протокола DCON модулей ввода-вывода I-7000 ICP DAS


Author Message
Written on: 11. 10. 2014 [23:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"GluckMaker" wrote:

Хочу подружить с Опенскадой 0,9 из вчерашнего SVN модуль ICP CON i-7016D. Wiki для этого модуля рекомендует настройки 2AI(#AA), 2AI(#AAN), 1DI(@AADI), 4DO(@AADO). В реальности же происходит следующее: согласно документации ( http://ftp.icpdas.com/pub/cd/8000cd/napdos/7000/manual/7016.pdf ) и экспериментам в терминалке, на #AA он отвечает одним значением для канала, выбранного командой $AA3N.
...
Это я что-то не так делаю, или этот модуль не поддерживается?

Ещё одна редкая специфика, т.е. это реально 1AI(#AA).

"GluckMaker" wrote:

Далее, проверил цифровые выходы (@AADO) - по документации на 4 выхода даются 2 команды, в которых:
00 - DO0 выкл, DO1 выкл;
01 - DO0 вкл, DO1 выкл;
02 - DO0 выкл, DO1 вкл;
03 - DO0 вкл, DO1 вкл;
Аналогично 10 - DO2 выкл, DO3 выкл и так далее. В логе вижу, что при включении одной галки DO0 передаётся @01DO01 и @01DO11

Судя по описанию это @AADO0D, а не @AADO.

"GluckMaker" wrote:

Для опроса цифрового входа по документации надо сказать @AADI, на что модуль ответит !AASOOII, где S - алармы, OO - состояние выходов, II - состояние входа. Например, у меня он говорит !0100901 (аларма нет, включены DO0 и DO3, на входе высокий уровень). Код ожидает увидеть в ответе 7 символов и обижается на то, что их 8 - "20:Ошибка в длине пакета модуля". Это ошибка или 7016 такой особенный?

Ещё одна специфика, поскольку не передаются какие-то алармы этой командой обычно.

"GluckMaker" wrote:

До кучи - аналоговый вывод у него управляется командой $AA7.

А это вообще странно, поскольку стандартная для AO команда это "~AA0Data".
Где Алмаз для AO взял #AA, который стандартно AI для меня загадка, может Алмаз таки зайдёт сюда и скажет?!

Learn, learn and learn better than work, work and work.
Written on: 16. 10. 2014 [15:07]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
Для AO не предусмотрел метода вывода. Упустил, что у него вообще есть аналоговый выход. Нужен новый метод вывода 1AO($AA7).

По AI модуль специфический. Тоже нужен новый метод, который перед вводом данных будет переключать аналоговые входы отдельной командой $AA3N.

По DI модуль специфический. Тоже нужен новый метод, который учтёт другую длину ответа и другую позицию нужных данных.

По DO, так понимаю, метод 4DO(@AADO) работает.

"GluckMaker" wrote:
Реализацию недостающих методов могу дописать самостоятельно, проблема с цифровым выводом похожа на программную ошибку, а вот со вводом - это баг или фича?
В чём проблема с DO - не понял. Методы ввода отрабатывались на других модулях и предполагалось, что все модули с одной и той же командой DCON работают однотипно. I-7016 оказался специфичным. Выкладывайте, если уже есть наработки недостающих методов.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 18. 10. 2014 [02:45]
GluckMaker
Иван Михайлов
registered since: 06.10.2014
Posts: 2
Здравствуйте.

"almaz" wrote:
В чём проблема с DO - не понял.

JAVASCRIPT
case 204://4DO (@AADO)
 if(!n) n = 4;
 for(int i_r = 0; i_r < n/2; i_r++)
 {
// Request with module
  code=0; //Добавлено мной
  for(unsigned i_n = 0; i_n < 2; i_n++) if(cntr.p_hd[i_p].at().DO[i_r*2+i_n]) code += (1<<i_n);
  pdu = TSYS::strMess("@%02XDO%01X%01X",(int)cntr.p_hd[i_p].at().mod_addr,i_r,code);
  do_txterr = cntr.DCONReq(pdu,cntr.p_hd[i_p].at().crc_ctrl,3,'!');
 }

Без строчки code=0 ко второму проходу цикла в переменной code остаётся цифра от первого, и к ней прибавляется цифра для второго. В итоге, например, при включении DO0 и DO2 программа в первый раз передаёт 01, а во второй - 12 вместо 11, что соответствует включению DO3 (11 + 1 из первой команды). Это не похоже на специфику конкретно 7016 - больше похоже на ошибку.

Про DI меня смущает вот это место:
JAVASCRIPT
case 101:<-----><------>//1DI (@AADI)
    //> Request with module
    pdu = TSYS::strMess("@%02XDI",(int)cntr.p_hd[i_p].at().mod_addr);
    di_txterr = cntr.DCONReq(pdu,cntr.p_hd[i_p].at().crc_ctrl,7,'!');
    cntr.p_hd[i_p].at().DI[0] = (di_txterr == "0") ? (char)strtoul(pdu.substr(6,2).c_str(),NULL,16) : EVAL_BOOL;
    break;

Мы берём из DCONReq() строку длиной 7 символов, после чего берём из неё 2 символа, начиная с 6-го. Но нумеруются они с 0, соответственно, 7-го в ней не бывает по определению - 6-й последний. Код для моего 7016 такой же, тоже substr(6,2), только ожидается 8 символов - работает правильно.

Я решил забить на этот модуль - понадобилось больше каналов, собрал на коленке модбасный, заточенный под задачу. Свою реализацию для 7016 прилагаю. Аналоговый вывод не проверял, т.к. у меня он не использовался - сделал до кучи.
Attachment

DCON_client.cpp (File type: text/x-c++src, Size: 41.2 kilobytes) — 2730 downloads
Written on: 09. 11. 2014 [23:06]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"roman" wrote:

Вот как раз истечение таймаута транспорта это и не повод повторять. Ещё раз повторяю — "Исходник смотрим" и не вещаем комментариев, что он там что-то должен!
Повторы для ошибок типа CRC и не полный ответ, т.е. когда связь вроде и есть, но плохая, что-бы перезапросить.

Включил сюда и ошибку подключения поскольку пакет может исказиться на запросе и ответа просто не будет.
Хотя очень не хотел этого делать из соображений конкатенации таймаутов подключения на количество попыток, но в живую увидел эту проблему и необходимость. Т.е. при установке попыток более одной важно оптимально установить таймаут подключения!

Learn, learn and learn better than work, work and work.



16685