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

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


Author Message
Written on: 16. 03. 2011 [23:46]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
Удобство такой библиотеки для работы с устройствами было бы, конечно, сверхкомфортно. Но овчинка выделки не стоит, потому что настройка блоков нужна редко (при монтаже системы, при замене неисправного блока, при смене типа сигнала датчика). Тем более, если учесть многообразие блоков, многообразие команд настройки блоков. Даже аналоги разных производителей могут имеют различные наборы команд и различные аппаратные модификации, которые расширяют набор команд. Драйвер скады, обеспечивающий только обмен с устройствами, достаточен.

Для модулей I-7000 есть утилита, которая постоянно обновляется производителем и позволяет выполнить любые настройки всех поддерживаемых блоков. Особую ценность в нём представляет сканер для определения блока с неизвестными настройками связи (сброса к заводским настройкам в блоках нет). Да и отправить пару-тройку команд с терминала по документации для настройки нового блока специалисту АСУТП не составит проблемы.

Роман, Ваше внимание нужно на других участках OpenSCADA. С модулем DCON разберусь, проверю работу всех блоков (отсутствующие по документации) и выложу доработку. Естественно, с учётом стиля исходного кода и применённых методов оптимизации. И svn уже 1307.

PS Ошибочные данные проходят в дальнейшую обработку как EVAL. Нужно будет организовывать дополнительный фильтр на ява для отсева недостоверных значений...

[This article was edited 5 times, at last 17.03.2011 at 09:57.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 17. 03. 2011 [10:58]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

Удобство такой библиотеки для работы с устройствами было бы, конечно, сверхкомфортно. Но овчинка выделки не стоит, потому что настройка блоков нужна редко (при монтаже системы, при замене неисправного блока, при смене типа сигнала датчика). Тем более, если учесть многообразие блоков, многообразие команд настройки блоков. Даже аналоги разных производителей могут имеют различные наборы команд и различные аппаратные модификации, которые расширяют набор команд. Драйвер скады,
обеспечивающий только обмен с устройствами, достаточен.

Согласен.

"almaz" wrote:

PS Ошибочные данные проходят в дальнейшую обработку как EVAL. Нужно будет организовывать дополнительный фильтр на ява для отсева недостоверных значений...

Не фильтр, а нормальную обработку ошибок. В типовых шаблонах параметров и элементах визуализации, БД библиотек OpenSCADA, это учитывается, обычно.

Learn, learn and learn better than work, work and work.
Written on: 17. 03. 2011 [11:19]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
Ну да - нужно вводить нормальную обработку ошибок.

Смысл занесения обработки ошибок в процедуру DCONReq состоит в корректной работе количества опросов устройства. Поэтому собираюсь завести обработку ВСЕХ ошибок всех методов обмена в DCONReq. Для этого добавлю пару-тройку передаваемых параметров в эту процедуру, среди которых будет указание каким способом обрабатывать первый символ, CRC, ожидаемы длины ответов. Попутно поправлю мелочи, если будут, в Task. Согласны?

[This article was edited 1 times, at last 17.03.2011 at 11:26.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 17. 03. 2011 [13:45]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

Смысл занесения обработки ошибок в процедуру DCONReq состоит в корректной работе количества опросов устройства. Поэтому собираюсь завести обработку ВСЕХ ошибок всех методов обмена в DCONReq. Для этого добавлю пару-тройку передаваемых параметров в эту процедуру, среди которых будет указание каким способом обрабатывать первый символ, CRC, ожидаемы длины ответов. Попутно поправлю мелочи, если будут, в Task. Согласны?

Для количества опросов там всё нужное уже сделано. А обработка признаков ошибок и длины ответа для количества не нужно, потому как при такой ошибке повторять нет смысла ибо результат всегда будет тот-же. Один только момент - случай с нетипичным расположением CRC, но это можно опустить, я думаю.

Learn, learn and learn better than work, work and work.
Written on: 17. 03. 2011 [14:10]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
Не только случай с нетипичным CRC. Такие ошибки как "20:Respond length error.", "22:Invalid module response.", которые сейчас обрабатываются в Task, могут не повториться при повторном опросе. 20-я понятно почему, а 22-я может возникнуть из-за ошибочного принятого устройством запроса (особенно при обмене без CRC).

[This article was edited 1 times, at last 17.03.2011 at 14:16.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 17. 03. 2011 [16:17]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

Не только случай с нетипичным CRC. Такие ошибки как "20:Respond length error.", "22:Invalid module response.", которые сейчас обрабатываются в Task, могут не повториться при повторном опросе. 20-я понятно почему, а 22-я может возникнуть из-за ошибочного принятого устройством запроса (особенно при обмене без CRC).

Как раз 20 и не понятно. Если есть символ '\r' то наверняка сообщение получено целиком и размер корректен, а значит повтор ничего не изменит. Разве что с модулем конкретные проблемы. С 22 согласен, можно и повторить.

P.S. Добавил к функции DCONReq() параметр символа корректного завершения и упростил все вызовы с символом корректного результата '!'.

Learn, learn and learn better than work, work and work.
Written on: 11. 04. 2011 [12:49]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
строка 402 файла DCON_client.cpp

if(di_txterr == "0") DI = strtoul(pdu.substr(1,4).c_str(),NULL,16); //???? substring length 4 for any request?

Для всех cntr.p_hd[i_p].at().di_method длина вырезаемой строки 4, кроме cntr.p_hd[i_p].at().di_method==201. Нужна строка длиной 2. Или, раз уж вырезано 4 символа, после этой строки можно сдвинуть результат на 8 битов вправо при 201 методе (до оптимизации модуля использовались другие маски битов при длине строки 4):

if(cntr.p_hd[i_p].at().di_method==201) DI=DI>>8;

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 11. 04. 2011 [15:47]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

if(cntr.p_hd[i_p].at().di_method==201) DI=DI>>8;


Добавил, сегодня сгружу.

Learn, learn and learn better than work, work and work.
Written on: 12. 04. 2011 [10:33]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
svn 1337. Больше неполадок не нахожу. Ориентируясь по документации, должны работать любые блоки. Практика покажет...

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 13. 04. 2011 [16:12]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
Хорошо

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



15212