Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Fbd
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Автоматизация систем
Сергей А. Ефремов
Подскажите, если кто знает, как сделать счётчик с нарастающим итогом? В программе есть контрольный блок связи, который выдаёт количество не отвеченных запросов по Modbus от конкретного устройства. После того как устройство хоть раз ответило, счётчик обнуляется, а надо чтоб не обнулялся. Блок называется Slave (Link), сам он так делать не умеет, а просто выдаёт количество зафиксированных подряд ошибок связи. Вот как их можно суммировать за всё время работы устройства с момента включения питания?
По самые по...
Цитата(Сергей А. Ефремов @ 9.4.2019, 20:00) *
Подскажите, если кто знает, как сделать счётчик с нарастающим итогом? В программе есть контрольный блок связи, который выдаёт количество не отвеченных запросов по Modbus от конкретного устройства. После того как устройство хоть раз ответило, счётчик обнуляется, а надо чтоб не обнулялся. Блок называется Slave (Link), сам он так делать не умеет, а просто выдаёт количество зафиксированных подряд ошибок связи. Вот как их можно суммировать за всё время работы устройства с момента включения питания?


За 10лет или 100лет, или 1000.., или...? Глупости морозите..
stscat
На нормальном языке решается в 4 строчки, попробуйте перевести в свой придуманный язык.

if (cnt1_pre != cnt1)
{
if (cnt1_pre < cnt1)
cnt2 += cnt1 - cnt1_pre;
cnt1_pre = cnt1;
}
Ashihara
Цитата(stscat @ 10.4.2019, 6:38) *
На нормальном языке решается в 4 строчки, попробуйте перевести в свой придуманный язык.


Ваша программа недостаточно оптимальна, чтобы бахвалиться знанием языка.

Цитата(Сергей А. Ефремов @ 9.4.2019, 20:00) *
Подскажите, если кто знает, как сделать счётчик с нарастающим итогом? В программе есть контрольный блок связи, который выдаёт количество не отвеченных запросов по Modbus от конкретного устройства. После того как устройство хоть раз ответило, счётчик обнуляется, а надо чтоб не обнулялся. Блок называется Slave (Link), сам он так делать не умеет, а просто выдаёт количество зафиксированных подряд ошибок связи. Вот как их можно суммировать за всё время работы устройства с момента включения питания?



Если слейв единственный на шине, то можно использовать блок Device.link, там нарастающий итог.


Нажмите для просмотра прикрепленного файла

В принципе, и мою программу можно упростить, сравнивая входящее значение с нулём, а не с предыдущим значением. Минус один блок.
stscat
Ну вот Ashihara все сделал за Ефремова. Дословный перевод моего примера.

Ashihara, интересен ваш вариант кода на C)
Ashihara
Цитата(stscat @ 10.4.2019, 9:35) *
Ashihara, интересен ваш вариант кода на C)


Померяемся как-нибудь в другой раз wink.gif
Сергей А. Ефремов
Цитата(Ashihara @ 10.4.2019, 9:26) *
Нажмите для просмотра прикрепленного файла

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

Проверил - не работает....

После того как связь восстанавливается всё обнуляется.
Ashihara
Цитата(Сергей А. Ефремов @ 10.4.2019, 11:03) *
Проверил - не работает....


Порядок блоков очень важен. Какие левее, какие правее. Иначе да, работать не будет.
Сергей А. Ефремов
Цитата(dopi @ 10.4.2019, 11:34) *
при сбросе питания счетчик обнулится

Схема обнуляется после восстановления связи на линии, а не пропадания питания, то есть по сути никак не влияет на работу первоначального блока.
cauto
Цитата(Сергей А. Ефремов @ 10.4.2019, 11:50) *
Схема обнуляется после восстановления связи на линии, а не пропадания питания, то есть по сути никак не влияет на работу первоначального блока.
И ничего там после восстановления связи не обнуляется. rolleyes.gif
Сергей А. Ефремов
хз
Ashihara
Цитата(Сергей А. Ефремов @ 10.4.2019, 13:15) *
хз


Я проверил, прежде чем выложить. Так что соберите волю в кулак, распечатайте мою схему на листик, листик приложите к монитору и соберите свою схему один-в-один. Будет работать. Обещаю.
Сергей А. Ефремов
Нажмите для просмотра прикрепленного файла

Может что-то не так делаю?...
cauto
Цитата(Сергей А. Ефремов @ 10.4.2019, 17:49) *
Может что-то не так делаю?...
Естественно не так. rolleyes.gif
Цитата(Ashihara @ 10.4.2019, 11:05) *
Порядок блоков очень важен. Какие левее, какие правее. Иначе да, работать не будет.
Сергей А. Ефремов
Нажмите для просмотра прикрепленного файла

Так работает.

Цитата(cauto @ 10.4.2019, 17:55) *
Естественно не так. rolleyes.gif

Левее, правее... момент зарождения сознания происходит в момент осознания сознанием своей способности осознавать, вы это имеете в виду что-ли?
cauto
Цитата(Сергей А. Ефремов @ 10.4.2019, 18:07) *
Левее, правее... момент зарождения сознания происходит в момент осознания сознанием своей способности осознавать, вы это имеете в виду что-ли?
Всё проще. В вашем варианте на входы А и В блока сравнения (СМР_long) приходят одинаковые значения, сравнивать по сути нечего. А у Ashihara на вход А значение в текущем цикле программы, на вход В значение в предыдущем цикле.
Сергей А. Ефремов
Цитата(cauto @ 10.4.2019, 18:36) *
Всё проще. В вашем варианте на входы А и В блока сравнения (СМР_long) приходят одинаковые значения, сравнивать по сути нечего. А у Ashihara на вход А значение в текущем цикле программы, на вход В значение в предыдущем цикле.


Нажмите для просмотра прикрепленного файла

Ещё проще вариант, совсем без компаратора.

Ashihara подсказал направление, спасибо ему огромное, а там уже само как-то получилось. Ну и действительно левее, правее имеет значение, в программе несколько счётчиков, логика по сути одинаковая, а расположение блоков на поле рандомное, работает по разному - одни обнуляются, другие нет. ))
Ashihara
Цитата(Сергей А. Ефремов @ 10.4.2019, 19:21) *
Ещё проще вариант, совсем без компаратора.


Этот вариант неправильно ошибки считает. Он просто "что-то считает", но не более того.
Сергей А. Ефремов
Цитата(Ashihara @ 11.4.2019, 9:33) *
Этот вариант неправильно ошибки считает. Он просто "что-то считает", но не более того.

Да вроде правильно... Прежде чем начинается сложение на вход С приходит 0 и на выходе Q фиксируется значение A+B, так как в самом начале это 0, то Q=0. Далее происходит сложение этого 0 и значения Errors и прежде чем сложение заканчивается на вход С приходит 1, блок пробрасывает значение D равное А+В на выход Q, которое в свою очередь отправляется на вход B, но так как к этому моменту уже Errors=0=A, то получается A+B=B. Далее цикл повторяется, только уже B не 0, а В=А+В в предыдущем цикле.

Как именно утроен ваш алгоритм не особо разобрался, но смысл у него абсолютно тот же самый, в этом можно даже не сомневаться. В любом случае вам огромное спасибо за подсказку в использовании D-триггера.
Сергей А. Ефремов
Коллеги, подскажите по случаю. Сколько терминаторов должно быть на линии RS485? В начале и в конце линии или только в конце?
stscat
Цитата(Сергей А. Ефремов @ 11.4.2019, 14:21) *
Коллеги, подскажите по случаю. Сколько терминаторов должно быть на линии RS485? В начале и в конце линии или только в конце?


Чем больше - тем лучше.
Если серьезно, читайте первоисточник.
Modbus_over_serial_line_V1_02
Сергей А. Ефремов
Ещё такой вопрос, с чем может быть связано, что без терминатора наблюдается перекос на линии, на А 1,9В, а на В 1,6В? С терминатором выравнивается до 1,8-1,7В...
Сергей А. Ефремов
Цитата(stscat @ 11.4.2019, 14:30) *
Чем больше - тем лучше.
Если серьезно, читайте первоисточник.
Modbus_over_serial_line_V1_02

Спасибо, полезный документ.
Сергей А. Ефремов
Трим5 генерирует в RS485 помеху с интервалом 18мкс и амплитудой 500мВ - с чем это интересно связано? Ну и соответственно если помеха попадает на фронт какого-нибудь бита, то посылка в некоторых случаях портится.

Даже 800 мВ! Ёшкин-матрёшкин.
Ashihara
Цитата(Сергей А. Ефремов @ 11.4.2019, 16:33) *
Трим5 генерирует в RS485 помеху с интервалом 18мкс и амплитудой 500мВ - с чем это интересно связано?


Как проверяете?
Сергей А. Ефремов
Цитата(Ashihara @ 11.4.2019, 16:49) *
Как проверяете?

Осцилографом. С подключенными и без устройств на линии результат одинаковый, кроме самих командных запросов каждые 18 мкс на линии образуется помеха амплитудой до 800 мВ. По идее 500 мВ - это уже уровень логической единицы.
stscat
Если trim 5 не использовать помехи нет?
Выложите картинку с осциллографа. Одновременно обе линии A и B и чтобы сетки и размерности напряжения видны были.
Ashihara
Я заморочился, интересно было. Всё ок вроде.

Линии А и В, красный - разностный.


Нажмите для просмотра прикрепленного файла
stscat
Цитата(Ashihara @ 12.4.2019, 10:53) *
Я заморочился, интересно было. Всё ок вроде.

Линии А и В, красный - разностный.


Нажмите для просмотра прикрепленного файла


Прекрасные сигналы. Никаких помех не вижу.
Ashihara
Что-то у вас всплески на разных пределах разные. На шкале 1В всплеск примерно 0.5В и менее, а на шкале 0.5В всплески 0.8В.

Такого быть не должно. Осциллограф точно у вас в порядке?


PS. В питание контроллера воткнитесь, там всё чисто?

PPS. Между чем и чем вы меряете? Я смотрел относительно gnd порта. Щас глянул между каналами, тоже всё ок.

Нажмите для просмотра прикрепленного файла
stscat


Крайне маловероятно что такие помехи происходили по вине программы. Были бы лишние "0" или "1", но не такие всплески. Смотрите питание, осциллограф, что еще подключено к линии RS-485.

Как вариант - подгорел драйвер RS-485, что-то мне кажется уже видел подобные всплески из ниоткуда, замените его.
Сергей А. Ефремов
Цитата(stscat @ 12.4.2019, 13:38) *


Крайне маловероятно что такие помехи происходили по вине программы. Были бы лишние "0" или "1", но не такие всплески. Смотрите питание, осциллограф, что еще подключено к линии RS-485.

Как вариант - подгорел драйвер RS-485, что-то мне кажется уже видел подобные всплески из ниоткуда, замените его.

Это естественно не программные помехи и как они влияют или не влияют трудно сказать, но они никуда не деваются если даже отключить от контроллера всю линию и запитать его от АКБ.

Измеряем относительно GND.
Сергей А. Ефремов
Цитата(stscat @ 11.4.2019, 14:30) *
Если серьезно, читайте первоисточник.
Modbus_over_serial_line_V1_02

Подскажите если кто точно знает и читал, между запросом мастера и ответом слейва должна быть какая-то минимальная задержка или слейв может отправлять ответ практически сразу, допустим через наносекунду после получения запроса от мастера?
yozik
Цитата(Сергей А. Ефремов @ 18.4.2019, 13:56) *
Подскажите если кто точно знает и читал, между запросом мастера и ответом слейва должна быть какая-то минимальная задержка или слейв может отправлять ответ практически сразу, допустим через наносекунду после получения запроса от мастера?

А зачем Вам это?
Глупый вроде бы вопрос?
Но в нем есть ответ....

Если Вы делаете универсальное устройство то .....
Приемо/передатчики RS-485 они ведь разные бывают...
Half Duplex и Full Duplex
Если будут Half Duplex ....
смотрите время переключения Rx\TX
и там совсем не наносекунды..
Сергей А. Ефремов
Цитата(yozik @ 18.4.2019, 14:35) *
А зачем Вам это?
Глупый вроде бы вопрос?
Но в нем есть ответ....

Если Вы делаете универсальное устройство то .....
Приемо/передатчики RS-485 они ведь разные бывают...
Half Duplex и Full Duplex
Если будут Half Duplex ....
смотрите время переключения Rx\TX
и там совсем не наносекунды..

Не про физический уровень интересуюсь, а именно регламент работы ModBus протокола.
kosmos440o
Цитата(Сергей А. Ефремов @ 18.4.2019, 13:56) *
Подскажите если кто точно знает и читал, между запросом мастера и ответом слейва должна быть какая-то минимальная задержка или слейв может отправлять ответ практически сразу, допустим через наносекунду после получения запроса от мастера?

время молчания между запросами 3.5 байта минимум на этой скорости. Иначе конец посылки не определишь. До 1 байта допускаются перерывы в сообщении. Это тебе не хухры-мухры маде ин задрищенск, это модбус))).

Но некоторые мастера иногда грешат, не дожидаются паузы. Видать или CRC считают, или просто подглюкивают))).
stscat
Цитата(Сергей А. Ефремов @ 18.4.2019, 13:56) *
Подскажите если кто точно знает и читал, между запросом мастера и ответом слейва должна быть какая-то минимальная задержка или слейв может отправлять ответ практически сразу, допустим через наносекунду после получения запроса от мастера?


Modbus_over_serial_line_V1_02.pdf
Стр.13. Все размусолено. Даже временные диаграммы нарисованы. Просто удивительно таки вопросы слышать.
Сергей А. Ефремов
Цитата(kosmos440o @ 18.4.2019, 16:44) *
время молчания между запросами 3.5 байта минимум на этой скорости. Иначе конец посылки не определишь. До 1 байта допускаются перерывы в сообщении. Это тебе не хухры-мухры маде ин задрищенск, это модбус))).

Но некоторые мастера иногда грешат, не дожидаются паузы. Видать или CRC считают, или просто подглюкивают))).



Цитата(stscat @ 18.4.2019, 17:53) *
Modbus_over_serial_line_V1_02.pdf
Стр.13. Все размусолено. Даже временные диаграммы нарисованы. Просто удивительно таки вопросы слышать.

Ништяк, спасибо.

Попросили протестировать устройство, на скорости 115200 1000мс/100мс на 35000 запросов 35 ошибок, на осцилографе видно, что запрос и ответ практически единое целое, различить можно только по высоте формируемого фронта. Я говорю, что типа так наверное не должно быть, а мне типа всё в порядке, вот я и засумневался.
kosmos440o
Цитата(Сергей А. Ефремов @ 18.4.2019, 18:07) *
на 35000 запросов 35 ошибок

Многовато, но с пивасом пойдёт. На слабенькой линии могут быть сюрпрайзы. У нас все любят говорить, что у них всё в порядке))). Хлебом не корми))).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.