DCON

<< Click to Display Table of Contents >>

Navigation:  Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Примеры расчета контрольных сумм >

DCON

Функция server.SendAndReciveDataByMask поддерживает вычисление контрольной суммы DCON - для этого необходимо установить параметр подсчета контрольной суммы в 1. Однако в этом режиме требуется полное соответствие кадру формата DCON - кадр будет заканчиваться символом "перед каретки" (CR). Существует ряд устройств, использующих похожий на DCON протокол, но использующие другой символ окончания, например два символа - CR LF. В таком случае стандартный алгоритм подсчета не подходит, и необходима реализация подсчета вручную.

Контрольная сумма DCON представляет собой 2 байта, алгоритм подсчета контрольной суммы очень просто - сумма всех байт, по модулю 256. Например запрос:

$012

Преобразуем символы в байты (http://www.asciitable.com) и суммируем - контрольная сумма 0xB7

0x24h + 0x30h + 0x31 + 0x32 = 0xB7

Пример функции подсчета контрольной суммы DCON:

function DCONcrc(str)

   crc=0;

   for i=1,string.len(str),1 do    

       local byte=string.byte(str,i);--получаем нужный байт

       crc=math.fmod((crc+byte),256); --делим по модулю на 256

   end;

   return string.format("%02X",crc); --преобразуем в строку и возвращаем итоговую сумму

end;

Пример использования:

val="!01070600";

CRC=DCONcrc(val);

--CRC = AF

Для интеграции данной функции в собственный код, при использовании функции server.SendAndReciveDataByMask, используйте 4 выходной аргумент - принятая строка буфера. После этого принятую строку необходимо подготовить - проверить корректность символа окончания, выделить два байта контрольной суммы, передать в функцию строку до контрольной суммы (воспользуйтесь функцией string.sub), а затем сравнить результат функции с контрольной суммой из прибора.

После этого можно приступать к анализу принятых по маске значений.