Ну не получается у меня. Не спец я в этих скриптах. Не знаю я порядка написания команд. Если Вам не трудно, напишите на примере, как это будет выглядеть.
Посмотрите пример
SCADAMaster
Спасибо. Буду пробовать.
Добрый вечер. Что то у меня не совсем получается.
Когда тэг работает с одним адресом, всё отлично. Все аварии пишутся в строчку. ( См. картинку в сервере). А когда я добавляю ещё адрес, то аварии начинают поочерёдно меняться. Сразу две не отображаются. Я Вам картинки скинул по тэгу с одним адресом. И с двумя. Что то я не дописал. Получается тэг не останавливает свою работу, а гоняет по кругу.
Вложение 74068
Вложение 74069
Вложение 74070
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.
Попробовал дома набросок сделать. Завтра на работе проверю.
Посмотрите пожалуйста, правильно я сделал или опять "накосячил".
Вложение 74071
Без форматирования тут трудно понять логику.
Смотрите сами
Большое спасибо за помощь! Всё получилось. Скрипт принял вот такой вид.
Вложение 74084
Добрый день. Помогите пожалуйста разобраться, что не так написал.
Вложение 74521
При появлении общей аварии "ОБЩАЯ АВАРИЯ" скрипт проверяет два адреса (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 значение затрется новым.