PDA

Просмотр полной версии : Настройка опроса ModBus Master



Raikkonen
10.08.2020, 14:29
Добрый день!
ПЛК - 110-60
Сконфигурировал опрос модулей овен по модбасу в окошке "Кнфигурация ПЛК". Забегая вперед вопрос- кто-нибудь кроме меня так делает? или есть другие быстрые или правильные решения?

И для анализа связи с модулями написал микро код:


CASE mb_last_addr OF
1: mb_modul_state.0 := (mb_last_err=0);
2: mb_modul_state.1 := (mb_last_err=0);
3: mb_modul_state.2 := (mb_last_err=0);
4: mb_modul_state.3 := (mb_last_err=0);
5: mb_modul_state.4 := (mb_last_err=0);
6: mb_modul_state.5 := (mb_last_err=0);
7: mb_modul_state.6 := (mb_last_err=0);
END_CASE;

где соответственно mb_modul_state.X - это бит состояния N модуля (с адресами от 1 до 7)
И понял, что эта штука не адекватно оценивает связь с модулем, потому что я вижу, что все ответы ок приходят.

Для того чтобы разобраться, я установил "Framing Time" - 1000, в настройках РС-485 чтобы опрос был раз в секунду.
Опрос и правда стал похожим на "раз в секунду", но переменная "last address" и "last error" - почему-то меняются чаще чем раз в секунду, значительно.
И у всех модулей, кроме последнего опрошенного получается ошибка 81 (таймаут) - но как? раз в секунду все модули отвечают!

Я решил посмотреть опрос.... и просто офигел от того что творит этот контроллер:
50568
каждая строка помеченная красным - появляется раз в секунду, это куча запросов
за тем сразу же идет строка с нормальным запросом и ответом.
секунда ожидания - и снова строка с кучей запросов, строка с нормальным запросом/ответом

что происходит?


опрос всех 7 модулей настроен одинаково:
work mode: by poll time
poll time: 10 ms
max timeout: 150 ms

melky
10.08.2020, 14:41
а вы можете свои примеры выложить в виде файла а не скрина ? ну как-то некрасиво заставлять людей перепечатывать символы с картинки вместо копирования...

Raikkonen
10.08.2020, 15:09
Framing Time - что про него сказано в документации на модбас слейв и где оно встречается в мастере?
В слейве сказано - задержка перед ответом. В мастере сказано - "настройки мастера такие же как и слейва"
Я понимаю, что это задержка перед ответом, в режиме слейв, но я надеялся что это так же и задержка перед следующим запросом к подчиненному в мастре, ведь суть и замысел тот же - дать одуматься медленным устройствам.
Как бы то ни было - эта настройка явно вносит коррективы в работу мастера, вот только я немного в шоке от того, какие.



poll time аналогичный вопрос про документацию
Период опроса конкретного устройства, то есть, если устройств 100 - то опрос будет чаще в 100 раз чем в настройке каждого из них.
При чем ни слова о том, что будет если полл тайм меньше реально осуществимого.
Вообще это не адекватная настройка. Я думал, это параметр, по которому ПЛК заносит в очередь опрос устройства, а по факту это не пойми что.
У меня в одном "универсал модбас девайс" находится, допустим 5 регистров для чтения, и плк НЕ каждый регистр опрашивает раз в "полл тайм", а просто делает следующий запрос по этому устройству.


исходя из ответов на эти вопросы, чему равно время опроса вместо этой фразы
...

как на счет "max timeout" ??? почему он не ждет это время перед тем как опрашивать следующее устройство? почему он выдает сразу пачку запросов?

Raikkonen
10.08.2020, 15:11
а вы можете свои примеры выложить в виде файла а не скрина ? ну как-то некрасиво заставлять людей перепечатывать символы с картинки вместо копирования...

000001-Rx:01 03 00 63 00 02 34 15 01 03 04 00 00 00 00 FA 33
000002-Rx:02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 2C 00 01 44 21 04 03 00 2C 00 01 45 96 05 03 00 2C 00 01 44 47 06 03 00 2C 00 01 44 74 07 10 00 06 00 01 02 00 00 8D 96 01 03 00 63 00 02 34 15
000003-Rx:02 10 00 61 00 02 04 00 00 A0 00 43 0F 02 10 00 61 00 02 10 25
000004-Rx:03 03 00 28 00 02 45 E1 04 03 00 28 00 02 44 56 05 03 00 28 00 02 45 87 06 03 00 28 00 02 45 B4 07 10 00 05 00 01 02 00 00 8D A5 01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F
000005-Rx:03 03 00 26 00 01 64 23 03 03 02 F0 0A 05 83
000006-Rx:04 03 00 26 00 01 65 94 05 03 00 26 00 01 64 45 06 03 00 26 00 01 64 76 07 10 00 04 00 01 02 00 00 8C 74 01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 22 00 02 65 E3
000007-Rx:04 03 00 22 00 02 64 54 04 03 04 FA 07 9E 00 46 4A
000008-Rx:05 03 00 22 00 02 65 85 06 03 00 22 00 02 65 B6 07 10 00 03 00 01 02 00 00 8D C3 01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 20 00 01 84 22 04 03 00 20 00 01 85 95
000009-Rx:05 03 00 20 00 01 84 44 05 03 02 F0 0B 4C 43
000010-Rx:06 03 00 20 00 01 84 77 07 10 00 02 00 01 02 00 00 8C 12 01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 1C 00 02 04 2F 04 03 00 1C 00 02 05 98 05 03 00 1C 00 02 04 49
000011-Rx:06 03 00 1C 00 02 04 7A 06 03 04 FB 07 8E 00 69 B6
000012-Rx:07 10 00 01 00 01 02 00 00 8C 21 01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 1A 00 01 A4 2F 04 03 00 1A 00 01 A5 98 05 03 00 1A 00 01 A4 49 06 03 00 1A 00 01 A4 7A
000013-Rx:07 10 00 00 00 01 02 00 00 8D F0 07 10 00 00 00 01 01 AF
000014-Rx:01 03 00 63 00 02 34 15 02 10 00 61 00 02 04 00 00 A0 00 43 0F 03 03 00 16 00 02 24 2D 04 03 00 16 00 02 25 9A 05 03 00 16 00 02 24 4B 06 03 00 16 00 02 24 78 07 10 00 07 00 01 02 00 00 8C 47
000015-Rx:01 03 00 63 00 02 34 15 01 03 04 00 00 00 00 FA 33

melky
10.08.2020, 15:30
Вторая строка
02 10 00 61 00 02 04 00 00 A0 00 43 0F - это у вас запись
03 03 00 2C 00 01 44 21 - чтение
04 03 00 2C 00 01 45 96 - то же чтение
05 03 00 2C 00 01 44 47 - то же чтение
06 03 00 2C 00 01 44 74 - то же чтение
07 10 00 06 00 01 02 00 00 8D 96 - запись
01 03 00 63 00 02 34 15 - чтение



Вероятно срабатывает таймаут и ПЛК переходит к чтению следующего адреса.... и при этом есть запись еще

3 строка
02 10 00 61 00 02 04 00 00 A0 00 43 0F - запись
02 10 00 61 00 02 10 25 - ответ что запись успешна

Raikkonen
10.08.2020, 15:43
Да, я отлично знаю модбасик, без парса его читаю. Так меня это и шокирует. Что творит этот крейзи плк?

Raikkonen
10.08.2020, 15:44
А кто как реализует обмен с модулями? я один чтоли делаю это через настройку конфигурации ПЛК?

Raikkonen
10.08.2020, 15:49
Кстати, ПЛК ваще не реагирует на опрос по команде...... записываю в команду 255 и ничего не происходит =))))

melky
10.08.2020, 15:52
ну так по настройкам смотрите, почему ПЛК у вас не ждет ответа. Наверняка же причина быть должна? на ПЛК100 опрашивал 2 устройства, вроде не замечал проблем. з.ы. кстати как вариант, а точно модули поддерживают групповой запрос ?, а то мало ли, чего там у Овен в голове.....
Ну или для модуля это просто некорректная команда запроса и он просто не отвечает ?

Raikkonen
10.08.2020, 16:01
ну так по настройкам смотрите, почему ПЛК у вас не ждет ответа. Наверняка же причина быть должна?
Я смотрю на настройки, и понимаю - чтобы пользоваться овеном нужен особенный склад ума, заточенный только под овен, поэтому тут и советуюсь. Собственно - я и не понимаю как эти настройки себя ведут.


з.ы. кстати как вариант, а точно модули поддерживают групповой запрос ?, а то мало ли, чего там у Овен в голове.....
что за групповой запрос? то что тут в одной строке - это не групповой запрос, это просто плк решил что так опрос лучше пойдет =)))))


Ну или для модуля это просто некорректная команда запроса и он просто не отвечает ?
так вот модули как-то умудряются понять, что на бред можно не отвечать, а раз в секунду можно и ответить, они ж из одного овеновского теста

melky
10.08.2020, 18:02
групповой запрос ОДНОГО модуля, то есть несколько регистров. Если я прав, то модули отвечают у вас на команду записи максимум 2-х регистров, это нормально, если есть поддержка команды 0x10.

начните с одного модуля, только чтение и смотрите логи. Ну и сверяйтесь с документацией на модуль. ну и начните с чтения одного регистра.

что тут еще можно посоветовать, не зная всего?

capzap
10.08.2020, 18:07
как на счет "max timeout" ??? почему он не ждет это время перед тем как опрашивать следующее устройство?

Вы серьезно задаетесь этим вопросом, а скажите от какого запроса нужно ждать срабатывание таймаута, если у Вас

work mode: by poll time
poll time: 10 ms
max timeout: 150 ms

каждые десять мс идет очередной запрос, когда ему ждать таймаут в 150 мс?

Raikkonen
10.08.2020, 18:50
что тут еще можно посоветовать, не зная всего?
как вы реализуете обмен данными плк овен, и, например 1 модуля ввода, 1 модуля вывода, и 3 модулей аналогового ввода?

Raikkonen
10.08.2020, 19:00
каждые десять мс идет очередной запрос, когда ему ждать таймаут в 150 мс?
какой смысл в этом, если 10 мс полл тайм все равно не соблюдается?

вот у него есть признак "нет ответа", когда ласт адресс =5, и ласт эррор = 81.
по уму, это устройство с адресом 5 не отвечало в течение (допустим настроено) 150 мс. И контроллер - должен ждать эти 150 мс. Это и есть тайм аут ответа во всех остальных нормальных устройствах.
А по факту - я методом проб и ошибок примерно +- понял что это если я не опрашивал устройство №5, и от него не приходило ответа в течение 150 мс - то извините, оно не отвечает.... хотя его может ни кто и не оправшивал.

Как я думал устроена настройка этого дела:
Framing Time - время между ответом запросом, по другому - время пока оптрон там переключится с приема на передачу.
poll time - желаемая частота опроса
max timeout - время ожидания ответа от устройства

получаем:
1. запрос. и сброс таймера полл тайм
2. ждем таймаут
3. если таймаут вышел - то "last address = 5" и "last error = 81"
4. если устройство ответило, отлично
5. ждем Framing Time после ответа
6. если тем временем вышло время опроса другого устройства(полл тайм) - опрашиваем его

Так, например, работает программка модбасс пол

А как работает овен, я тупо понять не могу....
что за фрейм тайм? что за пол тайм, если он не соблюдается? что за таймаут, если его ни кто не ждет?

capzap
10.08.2020, 19:03
какой смысл в этом, если 10 мс полл тайм все равно не соблюдается?

вот у него есть признак "нет ответа", когда ласт адресс =5, и ласт эррор = 81.
по уму, это устройство с адресом 5 не отвечало в течение (допустим настроено) 150 мс. И контроллер - должен ждать эти 150 мс. Это и есть тайм аут ответа во всех остальных нормальных устройствах.
А по факту - я методом проб и ошибок примерно +- понял что это если я не опрашивал устройство №5, и от него не приходило ответа в течение 150 мс - то извините, оно не отвечает.... хотя его может ни кто и не оправшивал.

Как я думал устроена настройка этого дела:
Framing Time - время между ответом запросом, по другому - время пока оптрон там переключится с приема на передачу.
poll time - желаемая частота опроса
max timeout - время ожидания ответа от устройства

получаем:
1. запрос. и сброс таймера полл тайм
2. ждем таймаут
3. если таймаут вышел - то "last address = 5" и "last error = 81"
4. если устройство ответило, отлично
5. ждем Framing Time после ответа
6. если тем временем вышло время опроса другого устройства(полл тайм) - опрашиваем его

Так, например, работает программка модбасс пол

А как работает овен, я тупо понять не могу....
что за фрейм тайм? что за пол тайм, если он не соблюдается? что за таймаут, если его ни кто не ждет?
не будте идиотом, верните все настройки по умолчанию как минимум, а не то что Вы там себе надумали и заработает всё

Raikkonen
10.08.2020, 19:04
Вы серьезно задаетесь этим вопросом

если можете, просто скажите, как вы реализуете опрос модулей ввода вывода ОВЕН на плк ОВЕН.

модулей у меня:
1 дискретный ввод
1 дискретный вывод
4 аналоговых ввода
1 аналоговый выход

Мне надо чтобы это работало шустро. Сейчас это работает просто ужасно.

я пока придумал это все ускорить - опрашивать аналоговые не регистрами (только состояние и значение, разумеется) а все одной строкой в 47 символов, думаю будет быстрее, чем 16 запросов

Raikkonen
10.08.2020, 19:06
не будте идиотом, верните все настройки по умолчанию как минимум, а не то что Вы там себе надумали и заработает всё

работает с заводскими настройками. но медленно.
сейчас у меня стоит полл тайм 10 мс - все шевелится немного быстрее

capzap
10.08.2020, 19:25
я это делаю на библиотеках, но Вам это еще рано

melky
10.08.2020, 22:14
work mode: by poll time
poll time: 10 ms
max timeout: 150 ms

На самом деле это было бы правильнее трактовать как запрос, макс время на ответ 150 ms, пауза 10 ms и опять опрос. Соответственно если ответ пришел за меньшее время то опять 10 ms и опрос. Если у Овен не так, то печально.

з.ы. у меня было всего два модуля и я как-то не запаривался со сменой настройек. А нет, вру, как-то на 150-м было модулей по 6 или 7, но и там я не менял настройки, все работало через конфигурацию.

Вообще timeout всегда должен выдерживаться, отодвигая время опроса... так правильно везде. Мало ли, человек ошибся в настройке. а тут сиди и гадай....

Валенок
11.08.2020, 00:37
было бы правильнее трактовать как запрос, макс время на ответ 150 ms, пауза 10 ms и опять опрос
Я б с выделенным поспорил. Не пауза, а проверка истекшего времени от момента отправки предыдущего запроса. Т.е. если девайс отвечает за 5..10мс, а poll-time 10мс, то за 1 сек я четко 100 транзакций (ниже) сделаю. А если пауза, то транзакций за секунду будет 1000 / (t + 10), где t среднее время транзации, т.е. хрен знает сколько в общем случае.

Ничего странного с таймаут=150/полтайм=10 не вижу. Ушедший погулять девайс задержит всю очередь, но дальше все тоже самое. Ну и ессно что если устройств больше 1..2х и они опрашиваются строго по-очереди, то 10мс полтайма вероятнее всего будет просто некоей недостижимой мечтой.

Но это - как я считаю и делаю. А как там овен делает мне пофиг.

-------
Транзакция = время ухода пакета (прихода в слев) + тайм_фрейм + раздумья_слейва + время ухода пакета (прихода в мастер) + тайм_фрейм. Всё чотко.

PS
И никогда больше 30..50мс таймаут не делаю за ненадобностью.
1 раз только встречал какого-то китайца с реально рандомным временем раздумий 0...200мс.

Raikkonen
11.08.2020, 06:27
я это делаю на библиотеках, но Вам это еще рано
Улыбнуло =))
У меня уникальный проект на овене, не целесообразно самому ручками писать опрос.... на потоке, конечно, написал бы

Raikkonen
11.08.2020, 06:33
Но это - как я считаю и делаю. А как там овен делает мне пофиг.
Так о том и речь - не адекватный набор настроек... и каждый гадает что какая делает.

Как вы реализуете опрос модулей? Конфигурацией, или тоже пишете ручками?

З.ы. Электросчетчики, например, долго бывает отвечают

melky
11.08.2020, 09:06
А электросчетчики с чего бы медленно отвечали ? отвечают так же быстро, просто с ними возни больше на получение данных....

Валенок ну, трактовать поллинг да, может не совсем корректно, как я написал, но вот то, что timeout должен выдерживаться на ожидание тут факт, даже если опрос циклический с поллинг = 0. Устройство должно либо получить ответ, либо дождаться окончания таймаута... а тут фигня какая-то.

Raikkonen
11.08.2020, 20:10
короче, переделал я обмен полностью на код.....
стало быстрее, за секунду опрашивает каждое устройство 3-4 раза
ну более менее, но все равно не приятный отклик на ручное управление дискретными выходами...……..

теперь новая проблема.
почему не работает моя функция?


FUNCTION b_to_r : REAL
VAR_INPUT
b1: BYTE;
b2: BYTE;
b3: BYTE;
b4: BYTE;
END_VAR
VAR
pnt: POINTER TO REAL;
END_VAR
pnt:=ADR(b_to_r);
pnt^:=b4;
pnt:=pnt+1;
pnt^:=b3;
pnt:=pnt+1;
pnt^:=b2;
pnt:=pnt+1;
pnt^:=b1;


я конечно пока пользуюсь DW_TO_REAL (DWORD_OF_BYTE(1,2,3,4)) из oscat, но хочется то свою!

Валенок
11.08.2020, 20:25
Конфигурацией, или тоже пишете ручками?
Не знаю что подразумевают под ручками. Конфигурацию тоже ручками настраивают.
Библиотеки часто проще настройки конфигурации. И код быстрее и компактнее


почему не работает моя функция?
Абонемент просрочен. В чем выражается ?

Валенок
11.08.2020, 20:38
.. а тут фигня какая-то.
Никакой фигни. Разные таймеры. На полл-таймер смотрят после окончания очередной транзакции.

Raikkonen
11.08.2020, 20:41
Абонемент просрочен. В чем выражается ?
На выходе при любой последовательности «склеивания» байтов не получается риал... всегда разные НО целые числа.

Это я полученные данные пытаюсь в риал перевести.
Или существуют более изящные методы?
Функцию взял из руководства овеновского

Валенок
11.08.2020, 21:19
всегда разные НО целые числа
На выходе ? Так обратную задачу сделайте - что как дитя-то. Посмотрите 4 байта от пи. Их и пихните. Только с порядком байт разберитесь.

Raikkonen
11.08.2020, 21:35
Так обратную задачу сделайте - что как дитя-то.

В смысле обратную задачу?
У меня в руках 4 байта, 100% верные, как из низ сделать риал?

Валенок
11.08.2020, 21:40
как из низ сделать риал
из реала сделайте 4 байта.

Raikkonen
11.08.2020, 23:37
из реала сделайте 4 байта.

Какой смысл?

saii
12.08.2020, 00:08
почему не работает моя функция?


Указатель сделайте на BYTE, а не на REAL...

Валенок
12.08.2020, 06:57
Какой смысл?
Чтоб пожевав сами косточку нашли.
Но уже помогли выше))

Raikkonen
12.08.2020, 09:03
Указатель сделайте на BYTE, а не на REAL...

Спасибо! Кстати может заработает и на риал, только не + а - адрес, наверное =)

saii
12.08.2020, 09:48
Спасибо! Кстати может заработает и на риал, только не + а - адрес, наверное =)

Не заработает.

saii
12.08.2020, 19:50
)) ТС даже не понимает сути. А если б сделал обратную функцию постепенно бы дошел.

Может не дойти... Обратная функция поможет понять порядок в каком надо байты подавать. А чтобы понять что не так, надо взять массив реалов порядка трех-четырех элементов, взять указатель на второй элемент и попробовать положить туда сначала один байт и посмотреть что происходит в окрестностях, потом сдвинуть его и положить второй, посмотреть, подумать, сделать выводы... А так, с таким пониманием работы указателей, крайне рискованно их использовать...