Доброго дня.
Ранее для опроса ведомых устройств (4 единицы оборудования одного типа, и 4 единицы - другого типа), использовались стандартные устройства CDS, и опрос велся из дерева проекта. Контроль линий и отключение опроса устройства, с его последующим включением в цикл опроса доставлял неудобства.
Было принято решение использовать программные средства для описания протокола из библиотеки ModBusEx.
Стартовая программа для опроса 1 единственного устройства, 1 единственного регистра не вызвала каких либо проблем. Ошибок на выходе блока ReadHoldRegsAsync не получено, всё стабильно.
Но вот пакеты данных, которые ПЛК получает от ведомого устройства вызывают некоторые подозрения.
Как ив примере данные по ссылке пишутся в массив ErCodeSlave с элементами byte. Запрашиваем мы всего 1 регистр по адресу 16№4000 (16384). Заведомо известно что в данном регистре лежит значение 81 (или 16#51). Получается отправляем запрос, получаем ответ в размере 2 Byte (в ведомом устройстве word).
В итоге при работе опроса на выходе в массиве получаем не 2 значения (младший и старший байты) а целый набор данных, который ещё и меняется от запроса к запросу.
Что примечательно, блок ReadHoldRegsAsync на выходе в переменной ByteCnt так же выдаёт не 2 байта, а разные значения, то 8, то 7 байт данных, хотя должно быть 2 байта, так как регистр опрашиваем всего один.
Подключившись к шине, и послушав, что происходит на ней с использованием Serial Port Monitor, замечено что и запрос от ПЛК, и ответ от устройства более чем логичный, и верный. В ответе 2 байта с 16#0051 (10#81)? что и должно быть!
Пока писал весь вопрос, понял, что в массив данных пишется весь запрос, а затем весь ответ. Включая и адрес устройства, и функцию, и начальный адрес, и количество считываемых байт.
Получается из этого массива нужно будет ещё в определённый момент вычленить полученные данные, предполагаю что по восходящему фронту xComplete надо из текущего массива вытащить необходимые данные, и это легко если читается 1 регистр. для этого ещё надо выделить область памяти под структуру с нужным набором.... А если читается целая структура из разного набора данных? в общем сложно...
Будет ли продолжение развития данного функционального блока, в том плане что я на выходе блока буду получать не набор данных, описывающих весь запрос и ответ, а только уже преобразованные конечные данные, например как это делает Овен в своей библиотеке OwenCommunication?
Либо может есть возможность получить исходник ФБ ReadHoldRegsAsync, дабы допилить его на получение того, что мне нужно? Потому что обрабатывать каждый запрос из требуемых мне 120 штук (грубо) это то ещё удовольствие...
Ранее для опроса ведомых устройств (4 единицы оборудования одного типа, и 4 единицы - другого типа), использовались стандартные устройства CDS, и опрос велся из дерева проекта. Контроль линий и отключение опроса устройства, с его последующим включением в цикл опроса доставлял неудобства.
Было принято решение использовать программные средства для описания протокола из библиотеки ModBusEx.
Стартовая программа для опроса 1 единственного устройства, 1 единственного регистра не вызвала каких либо проблем. Ошибок на выходе блока ReadHoldRegsAsync не получено, всё стабильно.
Но вот пакеты данных, которые ПЛК получает от ведомого устройства вызывают некоторые подозрения.
Как ив примере данные по ссылке пишутся в массив ErCodeSlave с элементами byte. Запрашиваем мы всего 1 регистр по адресу 16№4000 (16384). Заведомо известно что в данном регистре лежит значение 81 (или 16#51). Получается отправляем запрос, получаем ответ в размере 2 Byte (в ведомом устройстве word).
В итоге при работе опроса на выходе в массиве получаем не 2 значения (младший и старший байты) а целый набор данных, который ещё и меняется от запроса к запросу.
Что примечательно, блок ReadHoldRegsAsync на выходе в переменной ByteCnt так же выдаёт не 2 байта, а разные значения, то 8, то 7 байт данных, хотя должно быть 2 байта, так как регистр опрашиваем всего один.
Подключившись к шине, и послушав, что происходит на ней с использованием Serial Port Monitor, замечено что и запрос от ПЛК, и ответ от устройства более чем логичный, и верный. В ответе 2 байта с 16#0051 (10#81)? что и должно быть!
Пока писал весь вопрос, понял, что в массив данных пишется весь запрос, а затем весь ответ. Включая и адрес устройства, и функцию, и начальный адрес, и количество считываемых байт.
Получается из этого массива нужно будет ещё в определённый момент вычленить полученные данные, предполагаю что по восходящему фронту xComplete надо из текущего массива вытащить необходимые данные, и это легко если читается 1 регистр. для этого ещё надо выделить область памяти под структуру с нужным набором.... А если читается целая структура из разного набора данных? в общем сложно...
Будет ли продолжение развития данного функционального блока, в том плане что я на выходе блока буду получать не набор данных, описывающих весь запрос и ответ, а только уже преобразованные конечные данные, например как это делает Овен в своей библиотеке OwenCommunication?
Либо может есть возможность получить исходник ФБ ReadHoldRegsAsync, дабы допилить его на получение того, что мне нужно? Потому что обрабатывать каждый запрос из требуемых мне 120 штук (грубо) это то ещё удовольствие...
Комментарий