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

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

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

Доброго времени суток всем
Прошу помощи. Не могу реализовать 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
Йуный падаван
Эксперт PythonЭксперт Java
8803 / 5205 / 1793
Регистрация: 21.10.2017
Сообщений: 14,003
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
Йуный падаван
Эксперт PythonЭксперт Java
8803 / 5205 / 1793
Регистрация: 21.10.2017
Сообщений: 14,003
07.01.2018, 23:05 4
А ты проверь. Работает всё
0
Эксперт Java
3866 / 2486 / 447
Регистрация: 28.04.2012
Сообщений: 8,164
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
Йуный падаван
Эксперт PythonЭксперт Java
8803 / 5205 / 1793
Регистрация: 21.10.2017
Сообщений: 14,003
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2018, 12:34

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.