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 - не понял.
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 меня смущает вот это место:
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.
|