<< 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), а затем сравнить результат функции с контрольной суммой из прибора.
После этого можно приступать к анализу принятых по маске значений.