Вы же словами логику описали - теперь просто напишите это в программе.
err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю
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.
Большое Вам спасибо!!! Работают оба варианта!