Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Вопрос на алгоритмы: правильный подсчёт числа импульсов с модуля Mx110 (переполнение)

  1. #1

    Question Вопрос на алгоритмы: правильный подсчёт числа импульсов с модуля Mx110 (переполнение)

    Камрады!
    У меня тупой вопрос на математику и алгоритмы, так как я снова туплю и запутался с простыми вещами.
    Мне надо считать импульсы на входе модулей Mx110 (подсчёт расхода, цена одного импульса известна, импульсы поступают редко) с учётом переполнения WORD, в котором модуль их хранит и по их изменению что-то делать.
    Примечания:
    а) Это НЕ реакция на нажатия кнопок по счётчику импульсов - такое я уже писал. Там было не важно количество импульсов, а тут важно.
    б) Пишу на CodeSys 3.5, где медленный Modbus, поэтому вариант считать импульсы самому по R_TRIG не подходит.
    в) Внутри программы я могу взять даже 32-битный тип данных, с этим проблем нет. Но штатно модуль считает в типе WORD.

    Вопрос-тупняк:
    Сейчас я написал простой алгоритм:
    * Сохраняем предыдущее значение импульсов с модуля
    * Вычисляем по модулю разницу с текущим считанным
    * Если разница больше нуля - что-то делаем и текущее значение запоминаем как предыдущее.

    Косяк будет в том, когда у нас будет такая ерунда:
    Предыдущее = 65534, Текущее = 65535 ===> ОК, разница будет равна 1, и всё будет верно
    Предыдущее = 65535, Текущее = 0 ===X, Жесть! Разница будет 65535, что будет ошибкой

    Как вы решали такую задачу? Как правильно отреагировать на переполнение WORD в модулей Мх110?
    Если вас не затруднит - поясните мне для совсем тупых, так как я очень затупил на простой вещи.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    Но штатно модуль считает в типе WORD.
    Косяк будет в том, когда у нас будет такая ерунда:
    Предыдущее = 65535, Текущее = 0 ===X, Жесть! Разница будет 65535, что будет ошибкой
    См. скриншот:

    2023-01-31_6-20-51.png

  3. #3

    По умолчанию

    Евгений Кислов Хммм... то есть разницу стоит считать именно в том типе, который даёт модуль IO?
    Я-то её в LINT переводил и потом считал! А вычитать WORD из WORD и использовать штатную фишку переполнения - гениальная идея! Вау!
    Сегодня внесу в код!! СПАСИБО!
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  4. #4

    По умолчанию

    Евгений Кислов Спасибо! Переписал, заработало!
    Сделал FBшку универсальной под Mx110 (WORD) и Mx210 (UDINT).
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  5. #5
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,276

    По умолчанию

    Добавлю (для прогулявших 1-4й класс, хотя сейчас это видимо кандидатская)
    Предыдущее = 65534, Текущее = 65535 ===> ОК, разница будет равна 1, и всё будет верно
    да, удивительно. Текущее минус предыдущее => 1

    Предыдущее = 65535, Текущее = 0 ===X, Жесть! Разница будет 65535, что будет ошибкой
    С какого 65535 ? Вот тута Вам надо учить арихметику
    Текущее(0) минус предыдущее(65535) => -(минус, знак такой)65535

    А как выглядит -65535 в 16-битном формате показали выше. Видимо как чудо.

    Я-то её в LINT
    LINT_ := LINT_ + LINT_TO_WORD(current - prev);
    prev := currrent;
    Последний раз редактировалось Валенок; 31.01.2023 в 13:42.

  6. #6
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,648

    По умолчанию

    предыдущее 65500, текущее 100 ???

  7. #7

    По умолчанию

    Валенок Я первый класс не прогуливал, а честно и открыто сказал, что затупил над простой вещью.
    С математикой у меня всегда был ровный стабильный кол: я из тех, кто 10-7.5 будет на калькуляторе подбирать сложением в виде "Так... это вроде много... это недобор".

    Просьба пояснить, почему разница будет минусом, если я её считаю по модулю ABS(), а тип подсчёта изначально был больше чем WORD - DWORD. Всё это указано в начале поста.
    У меня получалось так: 0 - 65535 = 65535 (по модулю). А так как тип был DWORD, то он бы не переполнился бы.

    При чём тут дополнительный код для минуса-то в беззнаковом типе? Если его рассматривать как unsigned и 16 бит, то он так и будет переполняться: 0x0000 => 0xFFFE => 0xFFFF => 0x0000

    Я ещё больше затупил.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  8. #8
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,276

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    предыдущее 65500, текущее 100 ???
    Неповерите - тоже самое.
    Открываете win-калькулятор.
    Вычитаете из 100 65500. Причем видите отрицательное число. Удивительно.
    Не стирая это число делаете вид hex
    Запоминаете последние 4 знака (магическое действие)
    Пишите только эти загадочные последние 4 знака
    Делаете вид dec
    И о чудо !!!

  9. #9
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,648

    По умолчанию

    Валенок а если разница будет больше, чем в 4-х знаках?, скажем в 8-ми знаках ?, блин... тоже торможу
    Cs-Cs при использовании ABS надо по другому формулу делать... так как ABS(-65400) будет 65400, то потом еще надо 65535 (или 6) минус ваше ABS и получится ветвление в коде, типа если число отрицательное то то-то, если положительное то то-то
    Последний раз редактировалось melky; 31.01.2023 в 14:15.

  10. #10

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Cs-Cs при использовании ABS надо по другому формулу делать... так как ABS(-65400) будет 65400, то потом еще надо 65535 (или 6) минус ваше ABS и получится ветвление в коде, типа если число отрицательное то то-то, если положительное то то-то
    Блин, у меня заработало с таким кодом вот:
    WaterCheck.gif
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Вопрос по счетчику импульсов СИ8.
    от Виктор Романов в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 29.04.2021, 12:27
  2. Ответов: 1
    Последнее сообщение: 30.07.2020, 17:02
  3. Максимальная частота и подсчёт её импульсов
    от mr_Frodo в разделе Подбор Оборудования
    Ответов: 5
    Последнее сообщение: 24.04.2016, 10:35
  4. Подключение модуля Mx110-8AC
    от PotokU в разделе СПК2хх
    Ответов: 7
    Последнее сообщение: 03.08.2015, 09:49
  5. помогите подобрать контроллер и пид алгоритмы
    от superroma в разделе Подбор Оборудования
    Ответов: 9
    Последнее сообщение: 09.03.2010, 23:44

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •