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

Тема: CRC-16/ARC помогите перевести с С++ на мэк

  1. #1
    Пользователь Аватар для Gvenihvivar
    Регистрация
    09.11.2012
    Адрес
    харьков
    Сообщений
    66

    По умолчанию CRC-16/ARC помогите перевести с С++ на мэк

    Добрый день.
    Помогите перевести код CRC-16/ARC с С++
    Код:
    #include <stdio.h> 
    #include <stddef.h> 
    #include <stdint.h> 
    
    static uint16_t CRC16_ARC(uint8_t *data, size_t len) { 
      uint16_t crc = 0x0000; 
      size_t j; 
      int i; 
      // Note: 0xA001 is the reflection of 0x8005 
      for (j=len; j>0; j--) { 
        crc ^= *data++; 
        for (i=0; i<8; i++) { 
          if (crc & 1) crc = (crc >> 1) ^ 0xA001; 
          else crc >>= 1; 
        } 
      } 
      return (crc); 
    }
    У меня получилось следующее
    Код:
    var
    	data : POINTER TO BYTE;
    	SIZE : INT;
    	j: INT;
    	i: INT;
    	crc : WORD:=16#0000;
            arr: array [0..3] of  byte:= [10,11,12,13];
    end_var
    
    data :=ADR(arr[0]);
    size  :=4;
    FOR j:=size TO 0 BY -1 DO
    	crc := data^;
    	FOR i:=0 TO 8 DO
    		IF WORD_TO_BOOL(crc AND 16#0001) THEN crc:= ( SHR(crc, 1) OR 16#A001); 
    		ELSE crc := SHR(crc, 1); END_IF
    	END_FOR
    	data:=data + SIZEOF(data^);
    END_FOR
    crc16ROCplus_1 := crc;
    должно получиться A819, но не получается. Помогите найти ошибку.
    Последний раз редактировалось Gvenihvivar; 02.07.2014 в 11:54.

  2. #2

    По умолчанию

    Сразу вижу, что вместо FOR i:=0 TO 8 DO, должно быть FOR i:=0 TO 7 DO

  3. #3
    Пользователь Аватар для Gvenihvivar
    Регистрация
    09.11.2012
    Адрес
    харьков
    Сообщений
    66

    По умолчанию

    тогда вместо FOR j:=size TO 0 BY -1 DO должно быть FOR j:=size-1 TO 0 BY -1 DO или FOR j:=size TO 1 BY -1 DO
    но все равно не сходится

  4. #4

    По умолчанию

    Цитата Сообщение от Gvenihvivar Посмотреть сообщение
    тогда вместо FOR j:=size TO 0 BY -1 DO должно быть FOR j:=size-1 TO 0 BY -1 DO или FOR j:=size TO 1 BY -1 DO
    но все равно не сходится
    Значит еще есть ошибки. Зачем вообще копировать код C++, ведь алгоритм расчета хорошо описан. Я в свое время по этому алгоритму свой код написал и все у меня срослось.
    Последний раз редактировалось Вольд; 02.07.2014 в 12:02.

  5. #5
    Пользователь Аватар для Gvenihvivar
    Регистрация
    09.11.2012
    Адрес
    харьков
    Сообщений
    66

    По умолчанию

    Я не против использовать уже написанный код, просто я нашла только это для расчета контрольной суммы roc протокола.

  6. #6

    По умолчанию

    Цитата Сообщение от Gvenihvivar Посмотреть сообщение
    Я не против использовать уже написанный код, просто я нашла только это для расчета контрольной суммы roc протокола.
    Какого протокола ?

  7. #7

    По умолчанию

    ( SHR(crc, 1) XOR 16#A001)

  8. #8
    Пользователь Аватар для Gvenihvivar
    Регистрация
    09.11.2012
    Адрес
    харьков
    Сообщений
    66

    По умолчанию

    XOR еще нужен в строке crc ^= *data++; , там же crc = crc ^ *data++; То есть crc := crc xor data^;
    Теперь все сходиться, я там немного ошиблась с суммой, правильный ответ dfb6
    Рабочий код. Контрольная сумма по протоколу ROC+ для плк ROC809
    Код:
    data:=ADR(arr[0]);
    size:=4;
    FOR j:=size TO 1 BY -1 DO
    	crc := crc xor data^;
    	FOR i:=0 TO 7 DO
    		IF WORD_TO_BOOL(crc AND 16#0001) THEN crc:= ( SHR(crc, 1) XOR 16#A001); 
    		ELSE crc := SHR(crc, 1); END_IF
    	END_FOR
    	data:=data + SIZEOF(data^);
    END_FOR
    crc16ROCplus_1 := crc;
    Всем большое спасибо!

  9. #9

    По умолчанию

    А почем этот ROC809, наверное, жутко дорогой ?
    Последний раз редактировалось Вольд; 02.07.2014 в 12:47.

  10. #10
    Пользователь Аватар для Gvenihvivar
    Регистрация
    09.11.2012
    Адрес
    харьков
    Сообщений
    66

    По умолчанию

    точной цены не знаю, но удовольствие это не из дешевых

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

Похожие темы

  1. Какой ПИД – регулятор выбрать на котёл ДЕ -16
    от Sasha55 в разделе Подбор Оборудования
    Ответов: 20
    Последнее сообщение: 02.04.2019, 16:02
  2. МЭК 60870-5-104
    от monteg в разделе ПЛК3хх
    Ответов: 23
    Последнее сообщение: 01.04.2016, 13:23
  3. Переход на МЭК 61850
    от Sergeus в разделе Другие SCADA системы
    Ответов: 1
    Последнее сообщение: 10.12.2013, 19:35
  4. CRC 8
    от kanadchikov в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 28.09.2012, 11:15
  5. мэк 61131-3
    от Евгений Б. в разделе Сервисное ПО
    Ответов: 1
    Последнее сообщение: 09.12.2007, 17:45

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

Ваши права

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