PDA

Просмотр полной версии : MasterOPC проблема с чтением



inspectorcot
10.10.2018, 21:08
Здравствуйте, пожскажите пожалуйста, опрашиваю устройство с нестандартной функцией чтения 0x06, использую для этого скрипт:
39116
вот лог опроса и ответа:
39117
39123
ПОлучается, что нужно выполнить перестановку байт, если я правильно понял. Может кто подскажет как сделать это скриптом
Или может подскажете как извлечь извлечь байт скриптом



спасибо заранее.

SCADAMaster
11.10.2018, 09:10
Чередование байт вы делаете в самом коде - int16:10
Только посмотрите справку - в destmask вторым параметром идет количество принмаемых элементов

inspectorcot
11.10.2018, 12:35
Большое спасибо, разобрался

inspectorcot
11.10.2018, 23:29
Подскажите еще пожалуйста, по поводу вот этого:
39159
как возобновить опрос после возникновения ошибки.
if dest == nil then
....

SCADAMaster
12.10.2018, 09:05
никак. Нужно обрабатывать такие ошибки - проверять значения на nil

inspectorcot
14.10.2018, 21:50
Спасибо большое за помощь, может быть еще подскажите с чем может быть связано появление в ответе пакетов из другого устройства
39207
04 - ответ из другого устройства

SCADAMaster
15.10.2018, 09:41
Вложение не добавилось.

inspectorcot
15.10.2018, 13:13
----------
39208

SCADAMaster
15.10.2018, 13:40
По какой то причине устройство отвечают не на свой запрос.
Трудно сказать почему, может быть это не отвеченные пакеты с прошлых запросов.

inspectorcot
15.10.2018, 13:44
получается проблема в самом устройстве?

SCADAMaster
15.10.2018, 14:01
Так трудно сказать. Пришлите полный лог.
Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам, также пришлите вашу конфигурацию ОРС сервера.

inspectorcot
15.10.2018, 14:51
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;
Но из-за того что часто приходят чужие пакеты, на какое-то время сбиваются данные.

inspectorcot
15.10.2018, 14:52
Вас понял, сделаю

SCADAMaster
15.10.2018, 15:12
Адрес и номер функции нужно обязательно в скрипте проверять.