Что значит "последовательно"? В строке будет отображаться только одна какая то авария.
Что значит "последовательно"? В строке будет отображаться только одна какая то авария.
У меня есть скрипт для отображения аварий в контроллере Pixel. Все аварии вписываются одна за другой. В SCADA используется только функциональный блок "Сравнение строк" и всё. Да, я понимаю, тут идёт побитная информация. Вот я и спросил, нельзя ли сделать такого же типа скрипт, только конкретно с адресами.
-- Uninitialization
function OnClose()
end
-- Processing
function OnRead()
alarm, _, _ = server.ReadTag( "$(N).$(D).АВАРИЯ" )
if alarm == true then
S = ""
err, w = modbus.ReadInputRegistersAsInt16( 40966, 1, true, "10325476" )
if err == false then
if bit.BitFromData( w[1], 0 ) == true then S = S.."/Жалюзи притока " end
if bit.BitFromData( w[1], 1 ) == true then S = S.."/Обрыв ремней " end
if bit.BitFromData( w[1], 3 ) == true then S = S.."/Авария насоса " end
if bit.BitFromData( w[1], 4 ) == true then S = S.."/Низкая Т.притока " end
if bit.BitFromData( w[1], 5 ) == true then S = S.."/Обрыв датчика " end
if bit.BitFromData( w[1], 6 ) == true then S = S.."/Низкая Т.обратки " end
if bit.BitFromData( w[1], 7 ) == true then S = S.."/Авария двигателя " end
if bit.BitFromData( w[1], 8 ) == true then S = S.."/Пожар " end
if bit.BitFromData( w[1], 10 ) == true then S = S.."/Авария по термостату " end
server.WriteCurrentTag( S, OPC_QUALITY_GOOD)
end
else
S = ""
server.WriteCurrentTag( S, OPC_QUALITY_GOOD)
end
end
Можете по аналогии читать функциями modbus нужные адрес, полученную таблицу проверяете - если элемент равен 1, то формируете строку.
Посмотрите пример в приложнеии
Добрый день.
С авариями с отдельными адресами всё получилось. Спасибо.
Возник ещё один вопрос.
Имеется тэг со скриптом, в котором идёт побитный опрос аварий. Адрес (40966) с битами определённых аварий.
Мне необходимо добавить аварию обрыва датчика, но эта авария находится по другому адресу.
Подскажите, как в этот скрипт добавить аварию с другим адресом.
К примеру адрес 100. бит 5
Вложение 74047
Аналогично - читаете другой адрес, и точно также делаете проверку битов в нем.
В этом же теге, той же самой функцией - только адрес другой будет.
Посмотрите пример
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 значение затрется новым.
SCADAMaster
Поменял строку S = S.."Нет в списке аварий " на S ="Нет в списке аварий ".
Теперь при наличии битовой аварии скрипт её (битовую аварию) не записывает, хотя она присутствует. А записывает только "Нет в списке аварий ".
Мне кажется надо как то объединить биты аварий двух адресов...
Нет, не получается. Если в каждом адресе проверяю биты, то в конце скрипта пишет "Нет в списке аварий" дважды. Если убираю точки после S, в конце скрипта пишет нормально, но при битовой аварии вписывает"Нет в списке аварий" из другого адреса, в котором нет битовой аварии. Я не умею писать скрипты, но понимаю, что надо как то объединить биты двух адресов. Подскажите, как правильно написать строку...
Если биты одного адреса (1900) равны нулю и биты второго адреса (1902) равны нулю, то S = "Нет в списке аварий"
Можно так сделать:
if s=="" and alarm == true and err == false then
S = S.."Нет в списке аварий "
end
Примерно так
Код: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
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 S=="" then S = "Нет в списке аварий" end
server.WriteCurrentTag( S, OPC_QUALITY_GOOD)
else
S = "0"
server.WriteCurrentTag( S, OPC_QUALITY_GOOD)
end
SCADAMaster , 1exan
Сразу с утра проверил!!! Это для контроллера Danfoss MCX08 и MCX15B2.
Большое Вам спасибо!!! Работают оба варианта!