Показано с 1 по 3 из 3

Тема: КОнтрольная сумма (CRC16) Библиотека MEM. Проверка целостности сохраняемых данных

  1. #1

    По умолчанию КОнтрольная сумма (CRC16) Библиотека MEM. Проверка целостности сохраняемых данных

    Прошу помочь советом, кто решал подобную задачу
    Есть массив структурированных данных (конфигурационные данные для использования в программе). Сразу замечу что структура весьма сложная. Данный массив сохраняется в файл (хотел использовать рецепты, но в SP14 в них нельзя сохранить переменную с типом LTIME). Далее при запуске контроллера приложение проверяет наличие данных конфигурационных файлов. Если файлы есть переменные программы заполняются значениями из файла, если нет - значениями по умолчанию из RETAIN памяти.
    Для контроля целостности данных в конец каждого элемента структуры массива я добавить переменую с CRC - кодом (wCRC16Val). Естественно при расчете CRC я должен исключить эту переменную, т.е. уменьшить размер блока на величину переменной. для вычислений я использую MEM.CRC16_standard. ПРимерно так:
    Код:
    GVL.stRecipies[bRecipeIndexTmp].wCRC16Val := MEM.CRC16_standard(pMemoryBlock := ADR(GVL.stRecipies[bRecipeIndexTmp]), uiLength := SIZEOF(GVL.stRecipies[bRecipeIndexTmp])-SIZEOF(GVL.stRecipies[bRecipeIndexTmp].wCRC16Val));
    Но такой подход не дает ожидаемого результата. При вычислении у меня CRC каждый раз новый. При том что данные не изменяются, кроме значения CRC, но я же этот блок исключил. Т.е. в функцию я передаю начальный адрес блока и длину блока, уменьшенную на размер переменной wCRC16Val.

    Посоветуйте, как выкрутиться? Сохранять CRC в отдельный файл не очень хочется.
    Каждый в меру своего понимания работает на себя, а в меру непонимания на того, кто понимает больше!

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,066

    По умолчанию

    но я же этот блок исключил
    Нет, не исключили. Вы, вероятно, считаете, что wCRC16Val занимает последние 2 байта структуры - но из-за выравнивания памяти это может быть не так.
    Управлять выравниванием можно с помощью атрибута pack_mode:
    https://help.codesys.com/webapp/_cds...rsion=3.5.17.0

    Добавление в объявлении структуры атрибута со значением 0 должно позволить вам достичь ожидаемого результата.

  3. #3

    По умолчанию

    Я и думал о выравнивании, только не добрался проверить.

    Я немного схитрил - делаю так:
    Код:
    wCRC16_RCP := GVL.stRecipies[bRecipeIndexTmp].wCRC16Val;
    					GVL.stRecipies[bRecipeIndexTmp].wCRC16Val := 0;
    					wCRC16_StdTmp :=
    						MEM.CRC16_standard
    						(
    							pMemoryBlock := ADR(GVL.stRecipies[bRecipeIndexTmp]), 
    							uiLength := SIZEOF(GVL.stRecipies[bRecipeIndexTmp])
    						);
    					IF wCRC16_StdTmp <> wCRC16_RCP THEN
    Смысл, я думаю понятен.
    ЕЩе попробую с атрибутом
    Спасибо
    Каждый в меру своего понимания работает на себя, а в меру непонимания на того, кто понимает больше!

Похожие темы

  1. Контрольная сумма ПО или его части
    от chizhik1980 в разделе СПК2хх
    Ответов: 2
    Последнее сообщение: 12.07.2019, 07:36
  2. Контрольная сумма DCON
    от Vitto в разделе Помощь Разработчикам
    Ответов: 20
    Последнее сообщение: 23.01.2018, 14:30
  3. Контрольная сумма ТРМ201
    от _AS в разделе Помощь Разработчикам
    Ответов: 19
    Последнее сообщение: 26.01.2016, 14:46
  4. ТРМ133М: контрольная сумма CRC
    от Нат в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 01.03.2012, 20:52
  5. контрольная сумма УКТ38
    от rvint в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 19.02.2007, 16:27

Ваши права

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