PDA

Просмотр полной версии : Десятичная точка Lectus



U_Dimas
27.11.2014, 09:53
Здравствуйте

Поимел вот такую проблему, приборов МВ110-8АС, раньше использовал opc драйвера фирмы Овен.
Теперь переходим на lectus, скада iFix. Но показания с lectus идут без десятичной точки, т.е. вместо 1.88 выдается 188. Раньше все было нормально.
Параметр смещения десятичной точки dT менял всяко - не помогло.
Может кто сталкивался с таким ?

and909
27.11.2014, 12:18
Читаете те-же адреса? Бывает в одних регистрах целое, в других отдельно положение точки или сразу число с точкой.
Типы данных такие-же? Int16, Float32.

U_Dimas
27.11.2014, 13:44
Вообщем если поподробнее:
начались массовые проблемы с блоками питания, после трех лет эксплуатации примерно у 50% БП уплывают характеристики.
Принято решение, брать питание с частотного привода, приборы перевели в конфигураторе в modbus RTU, переназначили адреса - 1,2,3
Каналы брали с 100 по 108 по моему, где-то был мануал, сейчас под рукой нет. В конфигураторе выдает правильно, в lectus-е вижу такое:
при выставление Параметра смещения десятичной точки dT:
при 0 - 1, при 1 - 18, при 2 -181, при 3 -1810.
В лектусе тип стоит dword, меняю тип получаю полную охинею.

and909
27.11.2014, 18:30
Глянул мануал. Таблица Г3. Там описано то, о чем я говорил.

По адресам 0х100-0х107 измеренные значения в int16 (2 байта).
По адресам 0х20-0х27 отдельно смещения точки для этих каналов.

По адресам 0х120-0х137 эти же измеренные значения во Float32 (4 байта) (с плавающей точкой и метками времени).

Либо читайте значения по адресам 0х100-0х107 и смещайте точку, исходя из значений 0х20-0х27.
Если Скада Овен читает эти адреса, то значения со смещением вычисляются скриптом.
Можно ли и как это сделать в Лектусе не знаю(надо смотреть).

Либо читайте значения сразу в формате с плавающей точкой по адресам 0х120-0х137 (метки времени можно отрезать в Лектусе).

Я тоже пользуюсь Лектусом. Для снижения траффика читаю значения в int16, а точку переношу в Скаде (значение делю на 10 в степени dT).

U_Dimas
28.11.2014, 04:31
А можно поподробнее, как отрезать метки времени в лексусе ?
В принципе значение я могу подогнать в самой скаде, только графики разъедутся.

and909
28.11.2014, 06:50
Либо собирайте переменную, используя закладку Составная переменная (скрипты) (Рис. 1).
Скрипты подсмотрите у Овена.

Либо вырезайте значимые биты (Рис. 2).

http://savepic.org/6616519.jpg

and909
28.11.2014, 06:55
Подсмотрел скрипт у MasterOPC:


--инициализация скрипта
function OnInit()
end
--деинициализация скрипта
function OnClose()
end
-- обработка
function OnRead()
--определение локальный переменных
local t,q,tstatus,qstatus, dpval,dpq;
--считывание значение и качества текущего тэга
t,q = server.ReadCurrentTag();
--считывание значения смещения десятичной точки
dpval,dpq=server.ReadTagByRelativeName("Смещение");
if ( not (dpval>=0 and dpval <= 4)) then
dpval = 0;
end

--смещаем полученное число
t=t/10^dpval;
if (q == OPC_QUALITY_GOOD) then
--если признак хороший анализируется статус измерения - тэг "Статус"
tstatus,qstatus = server.ReadTagByRelativeName("Статус");
--вызов внешней функции (функция прописана у устройства)
q = server.RunFunctionFromDevice("CheckQ",1,tstatus);
end
--если значение равно 0 то качество хорошее
--если значение не равно нулю
if(q ~= OPC_QUALITY_GOOD) then
--вывод сообщения в лог ОРС сервера server.Re
server.Message("q teg = ",q);
end
--запись в текущщий тэг измеренного значения и вычисленного признака качества
server.WriteCurrentTag(t,q);

end

U_Dimas
02.12.2014, 14:34
Спасибо за ответы, ни чего не помогло, решил средствами скада.