Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

crc16 и modbus   Найти похожие ветки 

 
revo   (2003-12-08 11:53) [0]

Добрый день!

Ну никак не добьюсь ответа по modbas от контроллера! Грешу на неправилиное вычисление crs16.
Подскажите пожалуйста:
1. При формировании запроса crs16 надо считать на всю посылку, начиная с номера подчинённого, заканчивая баитами информации или только на байты информации?
2. Какое значение crs16 будет иметь для, допустим, следующей посылки: "0101020012"? (А то может, я вообще неправильно её считаю).

С уважением, revo.


 
AbrosimovA   (2003-12-08 12:55) [1]

Счетчик контрольной суммы предварительно инициализируется числом FF hex. Только восемь бит данных используются для вычисления контрольной суммы CRC. Старт и стоп биты, бит паритета, если он используется, не учитываются в контрольной сумме.
Во время генерации CRC каждый байт сообщения складывается по исключающему ИЛИ с текущим содержимым регистра контрольной суммы. Результат сдвигается в направлении младшего бита, с заполнением нулем старшего бита. Если младший бит равен 1, то производится исключающее ИЛИ содержимого регистра контрольной суммы и определенного числа. Если младший бит равен 0, то исключающее ИЛИ не делается.
Процесс сдвига повторяется восемь раз. После последнего (восьмого) сдвига, следующий байт складывается с текущей величиной регистра контрольной суммы, и процесс сдвига повторяется восемь раз как описано выше. Конечное содержание регистра и есть контрольная сумма CRC.


 
AbrosimovA   (2003-12-08 13:00) [2]

При передаче 16 бит контрольной суммы CRC в сообщении, сначала передается младший байт, затем старший. Например, если CRC равна 1241 hex :

Адрес | Функция | Счетчик байт | Данные | CRC Ст.| CRC Мл. |
| | | | 41 | 12 |


 
revo   (2003-12-08 14:21) [3]

А можно привести значение CRC16? Например для посылки "1234". Просто, чтобы проверить так ли я считаю CRC16.
C уважением,
Revo.


 
GEN++   (2003-12-09 00:12) [4]

Я же Вам послал на EMail работающую процедуру подсчета CRC16
В CRC16 входят все байты посылки кроме двух последних (они
являются CRC16 )
Как называется Ваш контороллер?


 
GEN++   (2003-12-09 00:48) [5]

Для последовательности 1,2,3,4 CRC16=$2BA1
Для справки .
Вычисление контрольного циклического кода производится путем логического деления битовой
последовательности полученной из последовательно составленных байтов информационного блока на
образующий полином вида X 1 6 +X 1 5 +X 2 +.
Алгоритм программного вычисления CRC.
1 . Загрузить двухбайтовый регистр (......его CRC- регистром ) начальным значением CRC.(для Modbus $FFFF)
2. Сложить по модулю 2 ( “”) младший байт CRC- регистра с первым байтом
последовательности и поместить результат в CRC-регистр .
3. Сдвинуть вправо CRC-регистр на флаг переноса (......бит старшего байта заместить нулем ).
4. Если флаг переноса = 0, повторить п .3
Если флаг переноса =, сложить по модулю 2 содержимое CRC- регистра с константой 0A00 h;
результат поместить в CRC- регистр .
5. Повторять п .3, п .4 пока общее количество сдвигов не станет равно 8.
6. Повторить п .2 для следующего и остальных байтов последовательности .
7. Получившееся в результате действий по п ....п .6 значение CRC- регистра является контрольным
циклическим кодом всей последовательности .


 
Вася Пупкин   (2003-12-09 03:20) [6]

Опять же, http://delphimaster.net/view/7-1070374485/
Adder © (02.12.03 23:27) [2] - тебе дали работающий модуль. Сейчас сделал тестовый пример на BP7 (на Delphi - тоже компилируется и работает)

В Adder © (02.12.03 23:27) [2] изменить:
unit crc;
interface
Type
Vmessage = array [0..255] of byte;
PVMessage = ^Vmessage;
function crc16(Start:byte;UsDataLen:byte;PMes:PVMessage):word;
implementation
// см. Adder © (02.12.03 23:27) [2] - copy-paste

Изменения минимальные - специально. Учтем, что модуль изначально написан под bp7.

Тестовый пример (bp7):

uses crc;
var
buf:VMessage;
_CRC:word;
begin
buf[0]:=1;
buf[1]:=2;
buf[2]:=3;
buf[3]:=4;
_crc:=crc16(0,4,@buf);
writeln(Hi(_crc)," ",Lo(_crc));
end.

Результат: 161 43 ($A1 $2B)

И не забываем про AbrosimovA © (08.12.03 13:00) [2]


 
Вася Пупкин   (2003-12-09 03:39) [7]

ps
Может, я и неправ, но вот посылку 0101020012 я не понимаю -( По протоколу:
функция 01 Чтение статуса выходов
ОПИСАНИЕ
Читает статуса ON/OFF дискретных выходов в подчиненном.
ЗАПРОС
Запрос содержит адрес начального выхода и количество выходов для чтения. Выхода адресуются начиная с нуля: выхода 1-16 адресуются как 0-15.
Ниже приведен пример запроса на чтение выходов 20-56 с подчиненного устройства 17.

Имя поля Пример
(Hex)

Адрес подчиненного 11
Функция 01
Начальный адрес Hi 00
Начальный адрес Lo 13
Количество Hi 00
Количество Lo 25
Контрольная сумма (CRC или LRC) --

Теперь пытаюсь понять "0101020012"
Адрес подчиненного 01
Функция 01
Начальный адрес Hi 02
Начальный адрес Lo 00
Количество Hi 12
Количество Lo ??????
Контрольная сумма (CRC или LRC) --



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.029 c
1-79907
AsbAlex
2004-02-08 01:23
2004.02.25
Помагите перенести код с паскаля на си


8-80035
Шимолин Сергей
2003-10-21 13:53
2004.02.25
? как отобразить PNG-файл в программе. Может ActiveX какой есть?


14-80299
MBo
2004-01-30 08:37
2004.02.25
Пятница... Задачка ;)


14-80117
SeriousSam
2004-02-02 20:51
2004.02.25
Как отклюить в процессе работы программы определенный пункты меню


1-79750
JaoDaoDzen
2004-02-14 12:31
2004.02.25
привязка расширения файла к своей программе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский