Посмотрите пример
Спасибо.
SCADAMaster
Спасибо. Буду пробовать.
Спасибо...
Добрый вечер. Что то у меня не совсем получается.
Когда тэг работает с одним адресом, всё отлично. Все аварии пишутся в строчку. ( См. картинку в сервере). А когда я добавляю ещё адрес, то аварии начинают поочерёдно меняться. Сразу две не отображаются. Я Вам картинки скинул по тэгу с одним адресом. И с двумя. Что то я не дописал. Получается тэг не останавливает свою работу, а гоняет по кругу.
Один адрес.png
Отображение в сервере с одним адресом.png
Два адреса.png
Спасибо...
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.
Спасибо.
Попробовал дома набросок сделать. Завтра на работе проверю.
Посмотрите пожалуйста, правильно я сделал или опять "накосячил".
13.png
Спасибо...
Без форматирования тут трудно понять логику.
Смотрите сами
Спасибо.
Большое спасибо за помощь! Всё получилось. Скрипт принял вот такой вид.
10.png
Спасибо...
Добрый день. Помогите пожалуйста разобраться, что не так написал.
СКРИПТ АВАРИИ.png
При появлении общей аварии "ОБЩАЯ АВАРИЯ" скрипт проверяет два адреса (1900 и 1902) побитно.
Если есть какие либо побитные аварии, то они в строчку пишутся в скрипте. Это всё отлично. Если нет "ОБЩЕЙ АВАРИИ" и нет битовых аварий,
то в конце скрипта появляется "0".
Мне надо сделать, что бы когда нет побитных аварий, но присутствует "ОБЩАЯ АВАРИЯ", в конце скрипта отображался текст " Нет в списке аварий".
Я добавил три строки (они выделены в картинке). Но что то не так работает.
Когда нет побитовых аварий, то всё нормально записывается ("Нет в списке аварий").
Но если в любом из двух адресов появляется побитовая авария, то она записывается вместе с основной аварией в строку ( "Нет в списке аварий /Авария насоса".)
А должна записаться только одна битовая авария ("Авария насоса"). Что я не так написал.
Когда пробую скрипт только с одним из адресов (1900 или 1902) то всё нормально получается.
Подскажите пожалуйста.
А это скрипт в тексте:
---------------------------------
function OnRead()
alarm, _, _ = server.ReadTag( "$(N).$(D).ОБЩАЯ АВАРИЯ" )
if alarm == true then
S = ""
err, w = modbus.ReadInputRegistersAsInt16( 1900, 1, true, "10325476" )
if err == false then
if bit.BitFromData( w[1], 0 ) == true then S = S.."/Авария " end
if bit.BitFromData( w[1], 3 ) == true then S = S.."/Авария насоса " end
if bit.BitFromData( w[1], 13 ) == true then S = S.."/Низкая Т.обратки " end
if bit.BitFromData( w[1], 14 ) == true then S = S.."/Низкая Т.притока " end
if bit.BitFromData( w[1], 15 ) == true then S = S.."/Сработал термостат " end
end
if alarm == true then
err, w = modbus.ReadInputRegistersAsInt16( 1902, 1, true, "10325476" )
if err == false then
if bit.BitFromData( w[1], 8 ) == true then S = S.."/Авария вентилятора №1 " end
if bit.BitFromData( w[1], 14 ) == true then S = S.."/Авария приточки "end
end
if alarm == true and err == false then
S = S.."Нет в списке аварий "
end
server.WriteCurrentTag( S, OPC_QUALITY_GOOD) end
else
S = "0"
server.WriteCurrentTag( S, OPC_QUALITY_GOOD)
end
end
Спасибо...
И что вас удивляет?
if bit.BitFromData( w[1], 8 ) == true then S = S.."/Авария вентилятора №1 " end
if bit.BitFromData( w[1], 14 ) == true then S = S.."/Авария приточки "end
end
if alarm == true and err == false then
S = S.."Нет в списке аварий "
end
Если условие из bit.BitFromData( w[1], 8 ) и bit.BitFromData( w[1], 14 ) выполнятся, то и в S запишется значение.
Можете вот так сделать:
S = "Нет в списке аварий "
Тогда прошлое S значение затрется новым.
Спасибо.