Попробуйте вначале скрипта записи добавить строчку:
if server.IsWriteFromScript( )==true then return; end;
Но в версии 3.2.10 эта функция работать перестала - мы с этим разберемся.
08.08.2016, 16:10
Alexandr Ryzhikov
Спасибо большое! Пока не заработало.
12.08.2016, 14:49
energvk
Добрый день! Возникли некоторые проблемы при опросе опс-сервером архивов. На объекте в программе плк забыл при формировании строки добавить символ =, в результате чего конец строки получается вида "#000512\N\R", вместо "#000=512\N\R"
Соответственно, скрипт
Код:
local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
local str1=string.sub(str,1,n-1 ); --выделяем строку после символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local k,z= string.find(str1, "=" ); --разбираем остальные элементы после символа "="
if k~=nil and z~=nil then
local str2=string.sub(str1,z+1); --символ найден - выделяем подстроку со значением
local str3=string.sub(str1,1,z-1); --символ найден - выделяем подстроку с номером
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
else
Correct=false;
TimeVal=nil;
break; --символ не найден - ошибка
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;
не обработает данные строки.
Так как объект удаленный, решил скорректировать код скрипта, получив
Код:
local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
local str1=string.sub(str,1,n-1 ); --выделяем строку после символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local str2=string.sub(str1,1,3); --выделяем подстроку со значением
server.Message("номер найден. sym=",str2);
local str3=string.sub(str1,4); --символ найден - выделяем подстроку с номером
server.Message("значение найдено. val=",str3);
if string.len(str3)<6 then --(для случаев некорректного получения переменной)
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;
Этот вариант кода не работает, хотя в терминале вижу корректные и номера и значения переменной в процессе обработки. Но запись при этом в тэги не происходит. Точнее записывается только если значение переменной (val) = 1. Значения же отличные от 1 не записываются
Что я делаю не так?
Проверяйте - записались ли они в таблицу. Добавьте дальше по программе - где происходит запись в теги server.Message, где значения пропадают.
12.08.2016, 16:13
energvk
добавил сообщений:
Скрытый текст:
Код:
local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
server.Message("найден символ ","#");
local str1=string.sub(str,1,n-1 ); --выделяем строку до этого символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local str2=string.sub(str1,1,3); --выделяем подстроку со значением
server.Message("номер найден, ",str2);
local str3=string.sub(str1,4); --символ найден - выделяем подстроку с номером
server.Message("значение найдено, val=",str3);
if string.len(str3)<6 then
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
server.Message("вставили элемент в таблицу - ", elem[str3+1]);
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;
until n==nil or l==nil; --выходим из цикла если разделитель не найден
return Correct,TimeVal,elem; --возвращаем найденные элементы
end;
function WriteToTag(InSrt,InTags,ToHDA) --функция записи значений в теги
local NoErr,TimeVal;
local Elem={};
NoErr,TimeVal,Elem=StringToElement(InSrt);
if NoErr==true and TimeVal~=nil then
local count=table.maxn(InTags);
if table.maxn(Elem)<count then count=table.maxn(Elem); end; --находим минимальное значение
for i=1,count,1 do
if Elem[i]~=nil then
local val;
--if InTags[i]=="int32" or InTags[i]=="uint32" or InTags[i]=="int16" or InTags[i]=="uint16"
--then --целые числа передаются в 16-ричном формате
--val = tonumber(Elem[i], 16) --преобазуем строку с 16-ричным числом в десятичное
--else
val=Elem[i];
server.Message("записываем значение в тэг, ", i);
server.Message("Значения=",server.TimeStampToString(TimeVal)," ", Elem[1]," ",Elem[2]);
--end;
if ToHDA==true then
server.WriteTagByNumberToHda(i-1,val,OPC_QUALITY_GOOD,TimeVal);
else
server.WriteTagByNumber(i-1,val,OPC_QUALITY_GOOD,TimeVal);
end;
end;
end;
server.Message("Значения=",server.TimeStampToString(TimeVal)," ", Elem[1]," ",Elem[2]);
end;
return TimeVal;--возвращаем значение времени
end;
В сообщении скриптов вижу следующее:
Код:
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:30.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=16
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:29.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=32
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:28.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=16
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:26.000 nil 001
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:26.000 nil 001
12-08-2016 14:58:48.860 объект.архив:записываем значение в тэг, 2
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=1
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.859 объект.архив:найден символ #
12-08-2016 14:58:48.859 объект.архив:найден символ #
12-08-2016 14:58:48.859 объект.архив:str=16.8.5 8:57:26#0011