Добрый день, уважаемые коллеги!

Занялся я изучением MasterOPC, в частности скриптов, поскольку в перспективе нужно будет связать СКАДу с нестандартным оборудованием. Потренироваться решил на протоколе ОВЕН, т.к. есть на чем проверять свои изыски. Взял для испытаний ТРМ101. Получилось почти все, за исключением подсчета контрольной суммы - и хэширование имени параметров получается, и упаковка "тетрада-в-ASCII", а вот контрольная сумма считается неправильно (я сравниваю что получается у меня и что видит сниффер при работе конфигуратора ТРМ101, разница как раз в CRC). Прошу объяснить методику подсчета CRC в протоколе ОВЕН, особенно сам алгоритм (я его прописал, но может как-то неправильно), какие байты в него входят, байты в чистом виде или уже упакованные по методу "тетрада-в-ASCII"? Желательно чем подробней, тем лучше.

Привожу скрипт на Lua (DataBlock - это строка, в которую вставлены все байты сообщение, за исключением самой CRC, '#' и '0D'):

function CRCcalc(DataBlock)
local dCRC={};
local i,dbLen,tbLen=0;
local j=1;

dbLen=string.len(DataBlock);
for i=1,dbLen,2 do
dCRC[j]=(string.byte(string.sub(DataBlock,i,i))*10)+strin g.byte(string.sub(DataBlock,i+1,i+1));
j=j+1;
end
tbLen=table.maxn(dCRC);
local H0,H1=0;
for i=1,tbLen,1 do
H1=server.RunFunctionFromDevice("Hashing",1,bit.Bi tLshift(dCRC[i],1),7,H0);
H0=H1;
end
return H1;
end

function Hashing (Byte,nbit,Hash)
i=0;
Aux=0;

for i=1,nbit,1 do
Aux=bit.BitAnd(bit.BitXor(bit.BitAnd(Byte,0x00ff), bit.BitRshift(Hash,8)),0x80);
if Aux ~= 0 then
Hash=bit.BitLshift(Hash,1);
Hash=bit.BitXor(Hash,0x8F57);
else
Hash=bit.BitLshift(Hash,1);
end
Byte=bit.BitLshift(Byte,1);
end
Hash=bit.BitAnd(Hash,0x0000ffff);
return Hash;
end

Я уже задавал вопрос в разделе MasterSCADA, но там посоветовали обратиться сюда, так что прошу не ругать за "удвоение" темы.