Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Checksum

 Ответить Ответить Страница  12>
Автор
Сообщение
Urik Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Октябрь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 6
Свойства публикации Свойства публикации   Ответить, цитируя автора - Urik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Checksum
    Опубликовано: 18 Октябрь 2006 12:48
Не могу понять как пересчитывается контрольная сумма в модулях ADAM из трехзначного вида в двухзначный.

В мануале написано:
The sum of these ASCII codes is 125h, and the
result equals to 25h after modulus-256(100h) execution.

Я отнимал от 125h сотню и получал 25h. Но это при небольших значениях (запрос модулю и показания из модуля по одному каналу)
Сейчас решил снимать показания сразу по всем каналам. И расчитанное мною значение контрольной суммы выросло (примерно: 568, 5AB, 58D и т.д.) Модуль выдает 58, 6B, 4D сответственно. т.е. он выдает первый и последний символ расчетной контрольной суммы (568 это 58). Когда средний символ - A,он увеличивает первую цифру на 1 (5AB это 6B).
Когда средний символ 8 модуль уменьшает первую цифру на единицу (58D это 4D).

Одним словом запутался я в шестнадцатиричной системе.
Я просто хочу понть как трехзначное значение контрольной суммы преобразуется в двузначное.
Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 18 Октябрь 2006 13:15

Первоначально опубликовано Urik

The sum of these ASCII codes is 125h, and the
result equals to 25h after modulus-256(100h) execution.

В переводе это означает, что сотни (16-ричные) всегда будут отбрасываться (результат будет всегда от 00h до FFh), так на число на второй позиции ему "наплевать". А вот примеры явно с этим не согласуются

Наверх
Urik Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Октябрь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 6
Свойства публикации Свойства публикации   Ответить, цитируя автора - Urik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 18 Октябрь 2006 22:07
Пример 1

>+016.19+017.81+012.43+018.85              64

> - 3E
+ - 2B
0 - 30
1 - 31
6 - 36
. - 2E
1 - 31
9 - 39
+ - 2B
0 - 30
1 - 31
7 - 37
. - 2E
8 - 38
1 - 31
+ - 2B
0 - 30
1 - 31
2 - 32
. - 2E
4 - 34
3 - 33
+ - 2B
0 - 30
1 - 31
8 - 38
. - 2E
8 - 38
5 - 35

сумма = 5A4
Модуль выдает - 64

Пример 2

>+015.94+017.34+012.22+018.71              5C

> - 3E
+ - 2B
0 - 30
1 - 31
5 - 35
. - 2E
9 - 39
4 - 34
+ - 2B
0 - 30
1 - 31
7 - 37
. - 2E
3 - 33
4 - 34
+ - 2B
0 - 30
1 - 31
2 - 32
. - 2E
2 - 32
2 - 32
+ - 2B
0 - 30
1 - 31
8 - 38
. - 2E
7 - 37
1 - 31
сумма = 59С
модуль выдает - 5С
Наверх
Urik Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Октябрь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 6
Свойства публикации Свойства публикации   Ответить, цитируя автора - Urik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 18 Октябрь 2006 22:20
Вообще-то модуль шестиканальный, но мне нужны только 4 канала. Вместо 2-х последних значений идут пробелы. Может пробел тоже как-нибудь считается?
Наверх
Urik Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Октябрь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 6
Свойства публикации Свойства публикации   Ответить, цитируя автора - Urik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 18 Октябрь 2006 23:26
Замучил калькулятор и нашел некую закономерность:

В первом примере если к 54А прибавить С0, то получится 664. Отбрасываем сотни получаем 64 (OK)
Во втором примере к 59С прибавить С0, получим 65С.
Отбрасываем сотни получаем 5С (ОК)
Завтра еще проверю на других примерах.
Но что такое С0?
Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Октябрь 2006 05:55
Закономерность тут простая:

0x125 mod 0x100 = 0x25 - это четко из мануального примера, можно воспользоваться виндовым калькулятором :)

C0 - это, очевидно, сумма кодов пробелов, которые в вышеприведенных вычислениях не учитывались. Там наверное было 6 пробелов?
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Октябрь 2006 10:29

Скорее всего, что 6 пробелов (код пробела, вроде, 32=20h). 32*6=192=C0h

Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Октябрь 2006 10:39
Точнее,
число_пробелов = 6 + 8*i , где i=0,1,2...

Этому соответствует сумма C0h + 100h*i

Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
Urik Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Октябрь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 6
Свойства публикации Свойства публикации   Ответить, цитируя автора - Urik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Октябрь 2006 22:54
Итак, если отключить последний канал, то к контрольной сумме нужно прибавлять E0h (224), если два последних, то C0h и т.д.

все      100h   (256) (все включены, можно ничего не прибавлять)
без 1    E0h    (224)
без 2    С0h    (192)
без 3    A0h    (160)
без 4    80h    (128)
без 5    60h    (96)
без 6    40h    (64)
подозреваю, если каналов 8, то есть продолжение
без 7    20h    (32)

А в мануале об этом ничего не сказано.
Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 20 Октябрь 2006 12:22

Работаю с I-7017

вот пример обмена:

#01
>-00.033-00.412-00.076-00.066-00.057-00.049-00.043-00.037E6

вот п/п подсчитывающая КС

static void CalcKC (char *buf,char *ks) {  // подсчет ks, как в Adam
  unsigned short cc=0;
  int i,j;

  for (i=0,j=strlen (buf); i<j; i++)
    cc += (unsigned short)buf;
  cc &= 0xFF;
  signed char ccc[10];
  ostrstream sbuf(ccc,sizeof(ccc));
  sbuf<<setbase(16)<<setw(2)<<setfill('0')<<setiosflags(ios::uppercase) <<cc<<ends;
  strcpy (ks,sbuf.str());
}

Для данного примера в цикле получаем AE6, затем отбрасываем A и получаем E6

 

Наверх
 Ответить Ответить Страница  12>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz