-
Так трудно сказать. Пришлите полный лог.
Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам, также пришлите вашу конфигурацию ОРС сервера.
-
function OnInit()
end
function OnClose()
end
function Query(num_reg)
local send={};
local Addr=server.GetCurrentDeviceAddress();
table.insert(send,Addr);
table.insert(send,0x06);
table.insert(send,num_reg);
local sendmask={"byte","byte","byte","int16:10"};
local dest={};
local destmask={"byte","byte","byte","byte","int16:10"};
local err,len;
local n=0;
repeat
err,dest,len=server.SendAndReceiveDataByMask(2,3,s endmask,send,destmask,9);
n=n+1;
until err>=0 or n>=server.GetCurrentDeviceRetry()
if not dest then
return false,0;
end;
if err>=0 and dest[1] == 32 then
return true, dest[4];
else
return false,0;
end;
end;
function OnRead()
noerr,RegH=Query(0x00);
if noerr==false then
server.Message("Ошибка");
server.WriteCurrentTag(0,OPC_QUALITY_BAD );
return;
end;
local F=RegH
server.WriteCurrentTag(F,OPC_QUALITY_GOOD );
end
Мне кажется, что скрипт не правильно работает, приходиться обрабатывать входящие данные дополнительной строкой
if err>=0 and dest[1] == 32 then
return true, dest[4];
else
return false,0;
Но из-за того что часто приходят чужие пакеты, на какое-то время сбиваются данные.
-
-
Адрес и номер функции нужно обязательно в скрипте проверять.