Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 19
1

Контрольная сумма модбас

07.01.2018, 21:12. Показов 2865. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем
Прошу помощи. Не могу реализовать LCR.

массив List<String> в нем (1B 03 03 26 00 12) Получатся A7.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public void lrcAdd(List<String> hexList){
 
 
        int sum=0;
 
        int FF=Integer.parseInt("FF", 16);
        for (String hex:hexList) {
            sum=sum+Integer.parseInt(hex, 16);
            if (sum>0xFF) {
                sum=sum-0xFF;}
        }
        int dop1 =FF-sum;
        int dop2= dop1+1;
        String lrc=(String)Integer.toHexString(Integer.parseInt(Integer.toBinaryString(dop2),2));
        System.out.println("lrc = "+lrc);
        
    }
При малом размере входного массива (как я показал) вычисляется нормально. Если массив больше то выдает ошибку.
Нужно правильно реализовать сложение так, чтобы перенос сбрасывался. может кто подскажет как сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2018, 21:12
Ответы с готовыми решениями:

Контрольная сумма(сумма цифр)
Помогите пожалуйста с такой задачей Акела постарел, стал слабее, и теперь хромой тигр Шерхан...

Контрольная сумма QT
Нужно посчитать контрольную сумму файла. Есть ли стандартная библиотека в Qt 3, что бы...

Контрольная сумма
В ТЗ сказано вычислить контрольную сумму строки. Не нашёл исходных кодов или алгоритмов. Мне любую,...

Контрольная сумма
Для нескольких файлов требуется вычислить контрольную сумму. Обработку каждого массива выполнить в...

7
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
07.01.2018, 21:53 2
Цитата Сообщение от nicamx Посмотреть сообщение
Если массив больше
Приведи пример входных данных, приводящих к ошибке.

Java
1
2
3
4
5
6
7
8
9
10
11
public void lrcAdd(List<String> hexList) {
        int sum = 0;
        for (String hex : hexList) {
            sum += Integer.parseInt(hex, 16);
            if (sum > 255) {
                sum -= 255;
            }
        }
        String lrc = Integer.toHexString(256 - sum);
        System.out.println("lrc = " + lrc);
    }
Все работает...
0
0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 19
07.01.2018, 23:00  [ТС] 3
Спасибо за ответ.
На не большом массиве все ОК а вот если побольше то нет.
Вот последовательность, где не работает :
1B 03 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
07.01.2018, 23:05 4
А ты проверь. Работает всё
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.01.2018, 02:21 5
Цитата Сообщение от nicamx Посмотреть сообщение
то выдает ошибку
Телепаты ещё на новогодних праздниках. Какую ошибку?
0
0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 19
08.01.2018, 10:54  [ТС] 6
Доброго времени суток. Спасибо за ответы.
Да, там строка с нулями и перенос не нужно было обрабатывать

Вот строка, на которой идет не правильный ответ.
"1B 10 00 1C 00 04 08 00 09 06 1B 06 01 FF CF"

Ответ должен быть “AE”, а по моей программе получается “AC”.

Если вообще убрать сброс, который я сделал
/* if (sum>0xFF) {
sum=sum-0xFF;}*/

, то идет ошибка
java.lang.NumberFormatException: For input string: "11111111111111111111111010101110"

Нужно правильно реализовать сложение так, чтобы перенос сбрасывался. А по моему варианту сброс работает не правильно
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
08.01.2018, 11:51 7
Лучший ответ Сообщение было отмечено nicamx как решение

Решение

Цитата Сообщение от nicamx Посмотреть сообщение
Ответ должен быть “AE”
С какого рояля?

Добавлено через 1 минуту
Цитата Сообщение от nicamx Посмотреть сообщение
java.lang.NumberFormatException
Зачем изгаляться с переводом в бинарную строку туда-сюда?

Добавлено через 2 минуты
Цитата Сообщение от nicamx Посмотреть сообщение
Ответ должен быть “AE”, а по моей программе получается “AC”
Или у тебя при каждом переполнении FF, +1 должен быть чтоли?

Добавлено через 3 минуты
Java
1
2
3
4
5
6
7
8
9
10
11
public static void lrcAdd(List<String> hexList) {
        int sum = 0;
        for (String hex : hexList) {
            sum += Integer.parseInt(hex, 16);
            if (sum > 255) {
                sum -= 256;
            }
        }
        String lrc = Integer.toHexString(256 - sum);
        System.out.println("lrc = " + lrc);
    }
Профит
1
0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 19
08.01.2018, 12:34  [ТС] 8
Большущее спасибо!!! Все корректно теперь работает!!!

Это был алгоритм вычисления контрольной суммы ModBus ASCII протокола
Longitudinal Redundancy Chek (LRC)

Алгоритм генерации LRC:
1) Сложить все байты сообщения, складывая
их так, чтобы перенос отбрасывался.
2) Отнять получившееся значение от числа FF(Hex) - это является первым дополнением.
3) Прибавить к получившемуся значению 1 - это второе дополнение.
0
08.01.2018, 12:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2018, 12:34
Помогаю со студенческими работами здесь

Контрольная сумма
что такое контрольная сумма ??? На многих описаниях для скачки прикреплённым к файлам даётся такой...

Контрольная сумма CRC32
Добрый день! Вопрос такой, проверяю CRC32 файла из по винды, говорит:0x9E5A7DB8 Проверяю под...

Контрольная сумма CRC16
Всем доброго времени суток, нужно посчитать контрольную сумму, я уже измучился, не понимаю почему...

Контрольная сумма программы
Не знаю к какой теме это лучше отнести. У нас разработчики железок используют для написания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru