Пишите в нулевой байт буфера:
abyMY110_16R_buffer[0].0:=TRUE; // выход 9
abyMY110_16R_buffer[0].1:=TRUE; // выход 10
и т.д.
Спасибо, заработало.
То есть младший-старший байты местами поменяны?
Надо бы в доке указать.
Опрос через биб-ку ModbasOwenLib:МК110-4ДН4Р--МК110-4К4Р--МВ110-8А--МВ110-8ДФ--МУ110-8Р--ТРМ202--ATV312--МК110-4ДН4Р скорость 19200.Опрос идет безумно медленно, можно наблюдать в программе как переключаются шаги в case,на модуле МВ110-8А происходит вообще зависание на несколько секунд, на модулях постоянно загорается ошибка таим-ауты в модулях 5 сек, при этом на аварийных выходах Фб ноль, выкинул из 8а все переменные кроме real то-же самое, как бы все это дело разогнать и провалы убрать
Библиотека ModulsOwenLib построена на использовании групповых запросов, т.е. в любом случае с модуля будут считаны все переменные. В данном случае лучше перейти на библиотеку Modbus Master и опрашивать только те регистры, которые реально нужны. Если с какого-то модуля нужны все регистры, то лучше считывать в несколько заходов (по ~20 регистров за раз). По возможности рекомендуется увеличить скорость обмена до 115200.
Хорошо попробую, скорость поднять не получиться частотник не даст
Дак а какой смысл писать заново Ваши блоки собраны на этой бибке, я же не просто отключил выхода 8А. а пересобрал ФБ, всего 16 регистров
CASE marker OF
0: get_modbus(
Enable:=trig.Q1 , (* разрешение работы блока *)
Mode:=Modd , (*режим передачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr1 , (*номер регистра*)
Quantity:=2, (*количество регистров*)
ComHandle:=handle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера*)
inp1:=0;
ptr_x:=ADR(inp1);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
marker:=1;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=1;
ErrCount:=0;
Т.е. вы все же используете библиотеку Modbus?
Т.к. раньше вы писали "ModbasOwenLib" - я подумал, что вы используете "ModulsOwenLib" (как наиболее похожую по названию).
В вашем случае я бы порекомендовал связаться с техподдержкой. На стр. 171 документа перечислены материалы, которые желательно предоставить при обращении.
Все примеры в документе иллюстрируют чтение одного канала с каждого устройства. Можно в документе как-то описать момент опроса нескольких каналов с одного устройства?
Я так понимаю, речь о примере с библиотекой Modbus - потому что при опросе через конфигуратор процесс опроса нескольких каналов не должен вызывать вопросов, а библиотека ModulsOwenLib опрашивает модули целиком.
В том случае, если нужно опросить несколько каналов модуля через библиотеку Modbus, у вас есть два варианта:
1. Считать групповым запросом все нужные данные (при условии, что нет "дырок" в карте регистров) и дальше в программе разобрать их;
2. Считывать каждый канал по отдельности. В этом случае просто посмотрите, как реализован последовательный опрос двух модулей (например, рис. 6.12) - вам необходимо сделать то же самое, только вместо опроса двух модулей у вас будет два раза опрос разных регистров одного и того же модуля.
Да, всё правильно, извиняюсь, что не уточнил.
Поясню почему возникает некоторая неоднозначность в части ModulsOwenLib. В тексте документе отражена особенность нумерации устройств (с учётом конфигурации по протоколу OWEN), и помня об этом при переработке примера 5.9 под чтение двух каналов первое, что приходит в голову, это необходимость последовательно изменять номер адреса (Addr), так же в тексте не увидел, что библиотека ModulsOwenLib опрашивает модули целиком. Это касается и описания библиотеки Modbus (в примерах тоже адреса начальные и не нашёл про групповое чтение).
Я и стал прорабатывать этот вариант для МВ110-8А (читаем 10 регистров начиная со 2-го для получения данных с 1-го и 2-го канала), но возник ламерский вопрос: Как правильнее сделать преобразование WORD_TO_REAL для двух каналов одного устройства в этом случае?
Спрашиваю, так, как в железе пока проверить не могу (в закупке).
1. Нет, адреса изменять не надо. Вы сейчас как раз описали методику опроса по протоколу Овен - но этот документ о Modbus, а в Модбасе устройство определяется одним адресом. По поводу принципа работы ModulsOwenLib - спасибо за замечание, в следующей версии опишем это в явном виде. По поводу группового опроса через библиотеку Modbus - в принципе, в примере как раз показан групповой опрос модуля 8А (считываются 4 регистра, с 2 по 5).
2. В принципе, точно также, как и для одного. После чтения данных вы получаете массив байт. Вы знаете, в каких байтах лежат ваши REAL. Если вы читаете 10 регистров, начиная со второго - то это байты 4-7 (первый REAL, как в примере) и 16-19 (второй REAL). Записываете байты первого REAL в объединение, меняя их порядок - опять же, как в примере. Забираете из объединения значение с плавающей точкой в нужную переменную. Теперь точно также записываете в объединение байты второго REAL, поменяв их порядок - и забираете из объединения второе значение.
Т.е. в случае увеличения числа опрашиваемых каналов и модулей примеры концептуально не изменятся - просто увеличится кол-во типовых кусков кода.
Концептуально это всё понятно, но вот механически...(потому и назвал вопрос ламерским).
Так можно?
Вложение 25184
Не думаю, что открою что-то новое, но тем не менее...
Имеются: СПК-107, МВ1100-8А, МВ110-16Д и МУ110-16Р. Первая попытка вязать их через шаблоны провалилась: связь не устойчивая, отклики на изменения входов несколько секунд. Перепробованы всевозможные варианты скоростей обмена, тайм-аутов и т.д. Попытка вторая - через ModulsOwenLib.Результат такой же. Далее МВ110-8А был посажен на один порт, остальные на другой и о, чудо! все заработало. Однако у дискретных модулей тайм-аут должен быть 45 мс, а иначе почему то не работает (скорость обмена 115200)... Что еще было подмечено: если в конфигураторе любого из модулей задержку ответа установить 1000мс (ну кроме МВ110-16Д, у него почему то дурацкое ограничение в те самые 45мс), то модуль зависает и становится недоступным ни для СПК, ни для конфигуратора. Решается подключением по заводским настройкам и изменением того самого тайм-аута в меньшую сторону.
Теперь про модуль вывода. В данный момент связь идет, лампочки моргают, физически выхода срабатывают с минимальной задержкой, но код ошибки 255. Как так?
Почему? Как теперь контролировать наличие связи? Мне, как нормальному человеку надо, чтобы при потери связи выходы сбрасывались, а сейчас этого не происходит. Почему этого нельзя сделать на уровне самой библиотеки? Как это красиво оформить в программе? Упаковывать в ворд и если код ошибки не ноль (а у меня, напоминаю, почему-то 255), отправлять ноль в этот ворд или же проделывать тоже самое с каждым битом отдельно?
И последнее: в мыслях посадить на шину еще два ПЧВ. Как это лучше сделать и на какой порт?
Но это же не нормально! К примеру у меня на одном порту модули, а к другому прицеплен модем, и как тогда выкручиваться?Цитата:
Далее МВ110-8А был посажен на один порт, остальные на другой и о, чудо! все заработало.
не получается скачать документ из первого поста!!
зАГРУЖАЕТСЯ несколько страниц первых и всё.
В большинстве случаев - да, будет достаточно.
Если я правильно понял, у вас не модули не отказались работать, а работали с периодической потерей связей и большим временем отклика. Сходу сложно назвать причину. Вы можете обратиться в техподдержку, предоставив материалы, упомянутые в п. 9 данного документа.
ПЧВ обычно вешаются на отдельный порт, поскольку в значительном числе случаев у них жестко заданы сетевые настройки.
Залил на файлообменник.
http://file.karelia.ru/d7jq62/
ерунда какая то...
на 27% останавливается и всё...
дома попробую, возможно мыгафон так чудит.
А для owen logic нет таких документов?
Доступна релизная версия документа (1.0). Исправлены ошибки предыдущей версии. Спасибо всем, кто сообщал об ошибках.
Евгений, забыли исправить описку на стр.28:
Одна и та же переменная в тексте - MV110_16В_DN.rEAd_1, а на рис. 3.26 - MV110_16D_DN.rInput1.
Что за ошибка, что не правильно делаю?
Покажите строку объявления переменной abyMV110_16D_data.
Спасибо.
Это конечно всё хорошо, но сделали бы Вы пример когда 16Д, 16Р и 8А находятся на одном порту.
К сожалению, в рамках документа невозможно охватить все сочетания slave-устройств - их бесчисленное множество. Но гораздо важнее, по-моему, показать саму концепцию настройки обмена. В документе показано, как опросить два модуля на одной шине - точно также можно опросить 3, 5, 10 модулей - принципиальных отличий не будет.
Все примеры у Вас сделаны в СП7 до которого похоже мы не дойдём.
Поэтому ещё один вопрос, ещё одна ошибка, как исправить?