Просмотр полной версии : Modbus Universal MasterOPC Server новый OPC сервер от компании ИнСАТ
SCADAMaster
06.02.2022, 15:55
Активизируйте панель в легенде - там можно удалить добавленные значения.
А вот редактировать связь нельзя, да и зачем? Можно добавлять не только перетаскиванием, но и используя кнопку со звездочкой.
Alexusaty
07.02.2022, 18:22
С предыдущим разобрался, спасибо.
Теперь вот такой момент. Пытаюсь по уроку с ютьюба "Пример работы со SCADA-системой MasterSCADA. Часть 2.9" реализовать сохранение тренда. Добавил управление документом. Но в настройках нет возможности выбрать Тренд. У объекта ФК1 доступна только мнемосхема (или окно объекта, как у ФК2-4 - как я сделал изначально). Подскажите в чем я неправ? Архив проекта в приложении.
Архив с проектом во вложении.
SCADAMaster
07.02.2022, 19:36
Потому что мнемосхема у вас в объекте ФК1, а управление документом настроен на:
Alexusaty
07.02.2022, 19:44
Подскажите как выйти из этой ситуации.
Мне нужно для четырех однотипных объектов сохранять тренды с заданным периодом. Я на общую мнемосхему компьютера вынес 4 кнопки - окна объектов. По нажатию открывается нужный тренд. Как теперь сохранить его? Или как переделать структуру проекта чтобы было доступно сохранение?
Я пытаюсь в настройках сохранения изменить Объект.ФК 1 на просто ФК 1 - возникает ошибка "недопустимое значение свойств".
Пытался создать объект сохранение непосредственно от корня Объекта - все равно недопустимое значение свойств.
SCADAMaster
07.02.2022, 20:07
Неправильно вам написали.
У вас же тренд размещен на мнемосхему - почему нужно тренд то выбирать? Нужно выбирать мнемосхему.
Если вам нужно сохранять тренд, с возможность задания начала и конца, то нужно создать его на вкладке Тренды.
Alexusaty
07.02.2022, 20:22
Ну там в видео выбирается в качестве документа тренд, который размещен на мнемосхеме объекта. И тогда в настройках управления документом появляется возможность задать опции для сохранения типа графического формата и проч.
Если я выбираю мнемосхему как документ, то никаких опций в настройках сохранения не появляется.
Вот ссылка на этот урок. Гляньте пожалуйста. В чем разница и почему у меня не получается как по уроку.
https://www.youtube.com/watch?v=Qu3pRx1N37A
SCADAMaster
07.02.2022, 20:55
Потому что в видео выбирается тренда, а у вас мнемосхема.
Настройки в этом случае разные.
Сделайте тренд как мы описали и все будет нормально.
Как можно получить дерево тегов ОРС сервера на LUA?
SCADAMaster
16.02.2022, 11:31
Что подразумевается в данном случае под деревом?
Вы можете перебирать теги по именам или по номерам - соответствующие функции есть в разделе server
Что подразумевается в данном случае под деревом?
Вы можете перебирать теги по именам или по номерам - соответствующие функции есть в разделе server
Мне нужно из скрипта LUA получить имена тегов по имени группы. как это сделать?
SCADAMaster
16.02.2022, 13:08
По имени группы - нет.
Вы можете перебрать все теги, а потом отфильтровать по имени группы
По имени группы - нет.
Вы можете перебрать все теги, а потом отфильтровать по имени группы
function OnInit()
local err = false;
local num =0;
while not err do
err,Tab=server.GetAttributeTagByNumber(num);
num=num+1;
if err == true then
break;
end;
end;
end;
В сообщении протоколов и скриптов сообщение: GetAttributeTagByNumber : недопустимый номер тега.
Выполнение скрипта останавливается, и в последующем блоки
function OnBeforeReading()
function OnAfterReading()
не выполняются? если после while ..... end; добавить например строку: server.Message('цикл while выполнен'); <<<< то этого сообщения нет в сообщении протоколов и скриптов. почему так может быть?
SCADAMaster
17.02.2022, 12:27
Потому что используйте цикл for, и в качестве конечного адреса используйте номер тега полученного функцией servet.GetCountTags.
Потому что используйте цикл for, и в качестве конечного адреса используйте номер тега полученного функцией servet.GetCountTags.
А почему не работает то как сделал я выше?
SCADAMaster
17.02.2022, 13:46
Потому что вы доходите до адреса которого нет, обращаетесь и скрипт падает.
Alexusaty
17.02.2022, 19:41
function OnInit()
while not err do
err,Tab=server.GetAttributeTagByNumber(num);
num=num+1;
if err == true then
break;
end;
Странная конструкция. Здесь явно случай для использования цикла с постусловием. А вы используете цикл с ПРЕДусловием и с помощью break добиваетесь чтобы это работало как цикл с постусловием. Не знаю есть ли в LUA обработка исключений, но для критических ошибок, которые возникают в вашей конструкции, можно было ее (обработку) использовать. Хотя это конечно костыли для костылей...
Странная конструкция. Здесь явно случай для использования цикла с постусловием. А вы используете цикл с ПРЕДусловием и с помощью break добиваетесь чтобы это работало как цикл с постусловием. Не знаю есть ли в LUA обработка исключений, но для критических ошибок, которые возникают в вашей конструкции, можно было ее (обработку) использовать. Хотя это конечно костыли для костылей...
в этой конструкции break не нужен.
изначально break не было. скрипт зависал и я не мог понять почему.
в документации сказано:
server.GetAttributeTagByNumber
Возвращает атрибуты (свойства) произвольного тега по его номеру. Аргумент функции – номер тега.
Функция возвращает:
флаг ошибки: true – ошибка получения тега (тег не существует), false – ошибки нет;
таблицу атрибутов. Структура таблицы идентична таблице функции server.GetAttributeTag .
Пример
local err,Tab=server.GetAttributeTagByNumber(1);
-- переменная err содержит флаг ошибки, Tab – таблица со всеми атрибутами тега
Т.е. в моем случае когда происходит обращение к тегу по номеру которого не существует в err должно вернутся true, далее выход из цикла и продолжение выполнения кода...
SCADAMaster
18.02.2022, 09:46
Мы посмотрим данную проблему, а пока сделайте как мы написали
Dmitrijb
05.03.2022, 14:28
Добрый день, подскажите есть ли возможность подключить энкодер sick ATM60-PAH13X13 к скада системе посредством Modbus Universal MasterOPC Server, выход Profibus DP имеется
SCADAMaster
05.03.2022, 15:04
Profibus мы не поддерживаем
eigor_vl
29.03.2022, 03:15
Здравствуйте, есть ли документация на OPC сервер?
Например на OPCSetup_1.10.70.0.
На сайие не могу найти.
SCADAMaster
29.03.2022, 08:40
Про какой ОРС идет речь? У нас не было такой версии
m.petrovich
29.03.2022, 10:07
Здравствуйте, есть ли документация на OPC сервер?
Например на OPCSetup_1.10.70.0.
На сайие не могу найти.
Добрый день. Эта тема по Modbus Universal MasterOPC.
По ОВЕН ОРС-сервер можете создать тему в https://owen.ru/forum/forumdisplay.php?f=61
Приветствую,
Опрос устройства идет автоматически в соответствии с заданным периодом. Как сделать принудительный опрос устройства с возобновлением автоматического?
АлександрСи
15.06.2022, 08:39
Ребята, помогите или подскажите пожалуйста! ПЛК110 работает в кодесус 2.3 хорошо, все видит и управляет с компа и т.д. А в Скада (Мастер Скада) не хочет. Модбус универсал 32 бесплатная не хочет. Не работает ОРС Овен тоже. Запрос Тх идет, а ответа нет. Вроде все правильно, а работать не хочет.
Relaymen
08.08.2022, 14:05
Добрый день. Есть у кого нибудь документация по протоколу Метрабас, конвейерных весов от метра Микросим М0600-КМ-6. Хотим снимать данные с весов в СКАДА. Все ссылки которые удалось найти на данном форуме давно не рабочие.
SCADAMaster
08.08.2022, 14:39
Может лучше к производителю обратится?
Relaymen
08.08.2022, 15:06
Пробовал, молчат как рыбы.
Vitorgan
11.08.2022, 10:19
Добрый день, подскажите пожалуйста, если мастерскада была запущена, а кодесис плк перезагружался, то на переменных которые не меняли своего значения после перезагрузки плк, появляется признак bad, как только в эту переменную из скалы записываешь любое отличное от старого значение, оно мгновенно передаётся в плк с признаком good, как решить данную проблему?
Александр Пинэко-Скворцов
11.08.2022, 13:11
Добрый день, подскажите пожалуйста, если мастерскада была запущена, а кодесис плк перезагружался, то на переменных которые не меняли своего значения после перезагрузки плк, появляется признак bad, как только в эту переменную из скалы записываешь любое отличное от старого значение, оно мгновенно передаётся в плк с признаком good, как решить данную проблему?
Добрый день!
Какой OPC-сервер используете?
Vitorgan
11.08.2022, 14:05
Тот который в шапке темы, версия последняя
Relaymen
12.08.2022, 08:10
Добрый день, подскажите пожалуйста, если мастерскада была запущена, а кодесис плк перезагружался, то на переменных которые не меняли своего значения после перезагрузки плк, появляется признак bad, как только в эту переменную из скалы записываешь любое отличное от старого значение, оно мгновенно передаётся в плк с признаком good, как решить данную проблему?
Запись переменной в ПЛК из СКАДы может производится периодически или по изменению значения, скорее всего у ваз стоит по изменению, соответственно пока значение не изменится запись не производится. Поменяйте в СКАДе у значения переменной, на вкладке опрос галку с По изменению на Периодический.
Vitorgan
12.08.2022, 10:15
Запись переменной в ПЛК из СКАДы может производится периодически или по изменению значения, скорее всего у ваз стоит по изменению, соответственно пока значение не изменится запись не производится. Поменяйте в СКАДе у значения переменной, на вкладке опрос галку с По изменению на Периодический.
Подскажите пожалуйста о вкладке какой именно переменной вы говорите, переменная из дерева объектов выходит из st кода, у него опрос периодический, соединяется выход st с переменной дерева системы (которые уходят в OPC)62113
А у самого OPC (InSAT Modbus OPC Server DA) на вкладке вот такие настройки
62114
Relaymen
16.08.2022, 16:29
Подскажите пожалуйста о вкладке какой именно переменной вы говорите, переменная из дерева объектов выходит из st кода, у него опрос периодический, соединяется выход st с переменной дерева системы (которые уходят в OPC)62113
А у самого OPC (InSAT Modbus OPC Server DA) на вкладке вот такие настройки
62114
Поставить вот эту галку 62154
Добрый день. Кто-нибудь может подсказать что за коды функций 65-72 в modbus.ExtFunction (скрипты) InSAT Modbus OPC Server DA
66599
Еще вопрос. Как работает ретрансляция в устройстве?
66600
SCADAMaster
18.03.2023, 08:57
Добрый день. Кто-нибудь может подсказать что за коды функций 65-72 в modbus.ExtFunction (скрипты) InSAT Modbus OPC Server DA
Есть такие функции в стандарте применяются некоторыми приборами - например счетчики Взлет через 65 функцию передают архив
SCADAMaster
18.03.2023, 09:04
Еще вопрос. Как работает ретрансляция в устройстве?
Ретрансляция используется если Modbus запрос перед достижением конечного адресада, проходит ряд промежуточных устройств в собственные адресами (специальный Modbus ретрансляторы).
Александер2008
22.03.2023, 11:00
Мастерскада 3 демо версия в исполнении не запускает опс сервер демо
сообщение - OPC сервер приостановлен: InSAT Multi-Protocol MasterOPC Server DA
если опс сервер вручную запустить то работает
так и должно быть?
SCADAMaster
22.03.2023, 12:14
Да, это ограничение ОРС сервера, о чем прямо написано на сайте:
https://insat.ru/products/?category=1666
SCADAMaster
отличие ДЕМО-версии от коммерческой заключается в ограничении на количество контролируемых параметров - их 32. Для OPC-серверов, предназначенных для опроса счетчиков в ДЕМО-версии введено ограничение на взаимодействие только с одним счетчиком каждого типа. Других ограничений не накладывается.
Где там написано, что Демо не запускается автоматически и это тоже ограничение ?
Указанное вами ограничение относится к Trial версии по части автозапуска, но не к Демо версии...
SCADAMaster
22.03.2023, 13:19
Версия на 32 тега будет запускаться автоматически, но только если ее перед запуском закрыть полностью.
Если она будет в режиме разработки, то не запустится
Александер2008
22.03.2023, 13:28
Спасибо у меня триал всетаки
Еще вопрос. Как работает ретрансляция в устройстве?
66600
Есть какой-либо пример?
спасибо.
SCADAMaster
24.03.2023, 09:41
Пример чего? У вас используется такой ретранслятор?
Во встроенном языке LUA есть возможность реализовать опрос устройств через TCP-сокеты?
SCADAMaster
09.06.2023, 09:49
Вы можете использовать функцию SendAndReciveDataByMask.
Но сам узел нужно будет настроить на TCP соединение.
Михаил85
13.06.2023, 15:56
Добрые день, есть ли поддержка счетчиков воды пульсар Ду-15 с rs485 ?
SCADAMaster
13.06.2023, 16:10
Там свой протокол. Можно использовать Multi-Protocol с этим драйвером:
https://insat.ru/products/?category=2625
Михаил85
14.06.2023, 07:49
Там свой протокол. Можно использовать Multi-Protocol с этим драйвером:
https://insat.ru/products/?category=2625
Использую протокол для Пульсар турбинный счетчик, но считанные значения странные 68298
kondor3000
14.06.2023, 08:40
Использую протокол для Пульсар турбинный счетчик, но считанные значения странные 68298
А в чём странность, написать сразу нельзя? Сколько должно быть?
странность видимо в целых числах, при указанном типе double
Михаил85 а есть возможность дать доступ к счетчику? интересно было бы опросить
SCADAMaster
14.06.2023, 09:16
Во первых попробуйте опросить данный прибор конфигуратором от "Тепловодохран" - какие на нем будут значения. Пришлите скриншоты этих значений.
Пришлите лог обмена с устройством из ОРС. Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\Users\All Users\InSAT\Multi-Protocol MasterOPC Server\SERVERLOGS\
Лог заархивируйте и вышлите нам, также пришлите вашу конфигурацию ОРС сервера.
Также укажите точную модель счетчика - пришлите ссылку этот продукт на сайте производителя.
Михаил85
14.06.2023, 11:33
Во первых попробуйте опросить данный прибор конфигуратором от "Тепловодохран" - какие на нем будут значения. Пришлите скриншоты этих значений.
Пришлите лог обмена с устройством из ОРС. Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\Users\All Users\InSAT\Multi-Protocol MasterOPC Server\SERVERLOGS\
Лог заархивируйте и вышлите нам, также пришлите вашу конфигурацию ОРС сервера.
Также укажите точную модель счетчика - пришлите ссылку этот продукт на сайте производителя.
При опросе утилитой TestAll все корректно 68301 Во вложении лог опроса
SCADAMaster
14.06.2023, 11:52
Какую модель счетчика вы опрашиваете?
Пришлите ссылку на сайт производителя.
У Пульсар могла измениться версия. Так примерно было с тепловыми счетчиками.
Михаил85
14.06.2023, 12:56
Какую модель счетчика вы опрашиваете?
Пришлите ссылку на сайт производителя.
https://pulsarm.ru/products/schetchik-vody/kvartirnyy-schyetchik-vody-du-15-du-20/elektronnyy-schetchik-du15-rs-485-qn-1-5-m3-ch-l-80mm/
Судя по логу счетчика и количеству переменных, параметры счетчика в формате float а не double идут
kondor3000
14.06.2023, 14:44
У Пульсар могла измениться версия. Так примерно было с тепловыми счетчиками.
Написали бы сразу, у меня это число FLOAT ещё в 9 часов утра получилось 3.681835e-002 = 0,036818348 ( число с верхнего скрина 1024904918 )
kondor3000 в протоколе Пульсар предусмотрен и float и double в зависимости от версии прибора. Протокол и то и то поддерживает
А на скрине из OPC значения почему-то double - вопрос почему?
Михаил85
14.06.2023, 15:35
Написали бы сразу, у меня это число FLOAT ещё в 9 часов утра получилось 3.681835e-002 = 0,036818348 ( число с верхнего скрина 1024904918 )
Подскажите, как переводили?
Михаил85 а чего там переводить то?
https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
одно из ваших чисел B1 DB 16 3D = 0.0368306078
По протоколу последние 2 байта это CRC (аналогичное Modbus), еще два байта перед CRC это счетчик запросов (идентификатор). Потом отрезаете по 4 байта ваши 5-ть переменных, они float, что легко проверяется калькулятором
B0 F9 C0 3F = 1.50761986
SCADAMaster
14.06.2023, 16:04
https://pulsarm.ru/products/schetchik-vody/kvartirnyy-schyetchik-vody-du-15-du-20/elektronnyy-schetchik-du15-rs-485-qn-1-5-m3-ch-l-80mm/
Сделайте следующее. Напишите производителю и попросите предоставить описание протокола именно к этому счетчику. У них вся документация по протоколам свалена в один архив, и понять какой к чему относится - не возможно.
В турбинном счетчике который мы поддерживали использовался тип UINT32, поэтому у вас такое значение и получается.
Фактически же у вас, судя по всему идет float число.
kondor3000
14.06.2023, 16:32
Подскажите, как переводили?
Вам переводить не надо, поставьте вместо Double, читать как Float (Float32), если это возможно.
А переводил просто, разложил полученное число 1024904918, на два Word и собрал из них Float 0,036818348.
kondor3000 да тут проблема другого рода, читай пост SCADAMaster выше. Просто нет поддержки данного типа переменной в OPC
Счетчики воды Пульсар с цифровым выходом.doc - файл, который надо смотреть для данного счетчика.
Bobensky
17.09.2023, 10:13
Здравствуйте, а как передать, скажем, controlword, где у каждого бита свой тег и как это будет работать в скале?
Здравствуйте, а как передать, скажем, controlword, где у каждого бита свой тег и как это будет работать в скале?
Создаёте булевые теги как биты слова (указываете номер бита)
Примерно так
70244
В результате скада получает булевый тег, упаковкой-распаковкой занимается сервер.
Вот только тег будет считаться как отдельный, если считаете стоимость
Bobensky
17.09.2023, 15:02
Создаёте булевые теги как биты слова (указываете номер бита)
Примерно так
70244
В результате скада получает булевый тег, упаковкой-распаковкой занимается сервер.
Вот только тег будет считаться как отдельный, если считаете стоимость
Спасибо большое
Приветствую. Кто-нибудь пытался подружить этот OPC с модемами ЛЭРС? Я так понимаю это MODBUS поверх TCP и запросы улетают верные, а вот ответа либо нет, либо он не нравится OPC-серверу.
Поделитесь опытом, если таковой имеется.
Я так понимаю это MODBUS поверх TCP
А в доке на ЛЭРС слово "MODBUS" встречается? Почему Вы так решили?
А в доке на ЛЭРС слово "MODBUS" встречается? Почему Вы так решили?
Не встречается, да и не должно. Modbus Реализован в регуляторе, который подключен к ЛЭРС-модему. У модема есть IP адрес, на который и шлются запросы.
SCADAMaster
21.10.2023, 14:50
Напрямую к прибору (без этого шлюза) пробовали подключиться? Например через USB-COM?
Посмотрите на вкладке Сообщения и Запросы - что вообще происходит на шине? Открывается ли порт, есть ли запросы?
Напрямую к прибору (без этого шлюза) пробовали подключиться? Например через USB-COM?
Посмотрите на вкладке Сообщения и Запросы - что вообще происходит на шине? Открывается ли порт, есть ли запросы?
Разобрался, спасибо.
Добрый день.
Никогда не писал скриптов. По этому прошу у Вас помощи.
В Modbus сервере имеется значение с типом данных "bool'. Можно ли как то прописать в скрипте, что бы при значении 1
выдавалось какое либо сообщение. Т.е. При значении 1 выдавалась строка (string) с текстом "Авария", а при 0 ничего. Именно сделать это в сервере, а ни в SCADA системе в "Событии".
SCADAMaster
21.02.2024, 16:42
Довольно странно это решать в ОРС сервере.
Примерно так:
val,qual=server.ReadCurrentTag();
if (val==true) then
server.WriteCurrentTag("Авария", qual);
else
server.WriteCurrentTag("", qual);
end
Тег должен иметь тип в сервере - string. Тип в устройстве - bool.
Довольно странно это решать в ОРС сервере.
Большое спасибо! Завтра на работе попробую.
Довольно странно это решать в ОРС сервере.
Да, Вы правы. Странное решение. Я Вам сейчас попробую объяснить задачу.
Имеются чиллеры на основе контроллера CAREL.pCO XS. Он использует очень много адресов (более 30) с авариями. Мне не очень хочется вносить все аварии в сервер, а потом в SCADA для каждой аварии использовать событие.
Появилась одна идея. Вот хочу попросить у Вас помощи.
А идея заключается вот в чём:
В сервере создать тэг "SERVER ONLY" с типом данных "string" и в нём написать скрипт объединяющий все нужные адреса с авариями. И там преобразовать их в текстовое значение.
Выглядеть будет примерно так:
Если адрес 1 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 1". Или
если адрес 3 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 2". Или
если адрес 4 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 3".
И так далее.
В SCADA я в "Событие" в закладку "Сообщение" перетаскиваю этот тэг и жму кнопку "В текст".
Но написать такой скрипт тямы нет. Вот и пытаюсь как то решить эту задачу и прошу Вашей помощи.
SCADAMaster
22.02.2024, 10:12
Он использует очень много адресов (более 30) с авариями
Это разве много?
Вам в любом случае придется где-то создавать тесты аварии - так какая разница в скрипте или в событиях. В скаде это сделать просто - сделали событие, скопировали, связи поправили, а тексты сообщений можно через этот механизм сделать:
https://support.mps-soft.ru/MasterSCADAHelp/index.html?integrirovannaja_sreda_ms_polzovatelski j_interfase_menu_programmi_menu_servis_komanda_imp orteksport_dannykh.html
Если адрес 1 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 1". Или
если адрес 3 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 2". Или
если адрес 4 будет принимать значение 1, то это значение преобразовывается в текст "Авария Компрессора 3".
А если значение 1 пример и адрес и адрес 3?
А если значение 1 пример и адрес и адрес 3?
Вы имеете ввиду, что появятся сразу две аварии? Ну они же, наверное, будут отображаться последовательно в строке или только первая?
SCADAMaster
22.02.2024, 12:08
Что значит "последовательно"? В строке будет отображаться только одна какая то авария.
У меня есть скрипт для отображения аварий в контроллере 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
SCADAMaster
22.02.2024, 13:14
Можете по аналогии читать функциями modbus нужные адрес, полученную таблицу проверяете - если элемент равен 1, то формируете строку.
Можете по аналогии читать функциями modbus нужные адрес, полученную таблицу проверяете - если элемент равен 1, то формируете строку.
Этот скрипт писал инженер, который уволился. Я не умею писать скрипты. По этому и попросил у Вас помощи. Вы можете на примере, хотя бы двух переменных, написать скрипт?
SCADAMaster
22.02.2024, 14:20
Посмотрите пример в приложнеии
Посмотрите пример в приложнеии
Огромное Вам спасибо. Буду разбираться. С наступающим праздником!!!
Добрый день.
С авариями с отдельными адресами всё получилось. Спасибо.
Возник ещё один вопрос.
Имеется тэг со скриптом, в котором идёт побитный опрос аварий. Адрес (40966) с битами определённых аварий.
Мне необходимо добавить аварию обрыва датчика, но эта авария находится по другому адресу.
Подскажите, как в этот скрипт добавить аварию с другим адресом.
К примеру адрес 100. бит 5
74047
SCADAMaster
04.03.2024, 10:51
Аналогично - читаете другой адрес, и точно также делаете проверку битов в нем.
Аналогично - читаете другой адрес, и точно также делаете проверку битов в нем.
Вы имеете ввиду сделать ещё один тэг, только с побитным опросом другого адреса?
А в одном тэге добавить другой адрес не получится?
SCADAMaster
04.03.2024, 11:43
В этом же теге, той же самой функцией - только адрес другой будет.
Вы имеете ввиду сделать ещё один тэг, только с побитным опросом другого адреса?
А в одном тэге добавить другой адрес не получится?
Ну не получается у меня. Не спец я в этих скриптах. Не знаю я порядка написания команд. Если Вам не трудно, напишите на примере, как это будет выглядеть.
SCADAMaster
04.03.2024, 13:03
Посмотрите пример
SCADAMaster
Спасибо. Буду пробовать.
Добрый вечер. Что то у меня не совсем получается.
Когда тэг работает с одним адресом, всё отлично. Все аварии пишутся в строчку. ( См. картинку в сервере). А когда я добавляю ещё адрес, то аварии начинают поочерёдно меняться. Сразу две не отображаются. Я Вам картинки скинул по тэгу с одним адресом. И с двумя. Что то я не дописал. Получается тэг не останавливает свою работу, а гоняет по кругу.
74068
74069
74070
SCADAMaster
04.03.2024, 16:47
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.
Попробовал дома набросок сделать. Завтра на работе проверю.
Посмотрите пожалуйста, правильно я сделал или опять "накосячил".
74071
SCADAMaster
04.03.2024, 22:05
Без форматирования тут трудно понять логику.
Смотрите сами
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.
Большое спасибо за помощь! Всё получилось. Скрипт принял вот такой вид.
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
SCADAMaster
20.03.2024, 13:34
Но если в любом из двух адресов появляется побитовая авария, то она записывается вместе с основной аварией в строку ( "Нет в списке аварий /Авария насоса".)
И что вас удивляет?
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 значение затрется новым.
Добрый день. Помогите пожалуйста разобраться, что не так написал...
Вы же словами логику описали - теперь просто напишите это в программе.
err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю
SCADAMaster
Поменял строку S = S.."Нет в списке аварий " на S ="Нет в списке аварий ".
Теперь при наличии битовой аварии скрипт её (битовую аварию) не записывает, хотя она присутствует. А записывает только "Нет в списке аварий ".
Мне кажется надо как то объединить биты аварий двух адресов...
Вы же словами логику описали - теперь просто напишите это в программе.
err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю
Спасибо.
Попробую так. Потом отпишусь.
Вы же словами логику описали - теперь просто напишите это в программе.
err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю
Нет, не получается. Если в каждом адресе проверяю биты, то в конце скрипта пишет "Нет в списке аварий" дважды. Если убираю точки после S, в конце скрипта пишет нормально, но при битовой аварии вписывает"Нет в списке аварий" из другого адреса, в котором нет битовой аварии. Я не умею писать скрипты, но понимаю, что надо как то объединить биты двух адресов. Подскажите, как правильно написать строку...
Если биты одного адреса (1900) равны нулю и биты второго адреса (1902) равны нулю, то S = "Нет в списке аварий"
SCADAMaster
20.03.2024, 16:12
Можно так сделать:
if s=="" and alarm == true and err == false then
S = S.."Нет в списке аварий "
end
Нет, не получается. Если в каждом адресе проверяю биты, то в конце скрипта пишет "Нет в списке аварий" дважды. Если убираю точки после S, в конце скрипта пишет нормально, но при битовой аварии вписывает"Нет в списке аварий" из другого адреса, в котором нет битовой аварии. Я не умею писать скрипты, но понимаю, что надо как то объединить биты двух адресов. Подскажите, как правильно написать строку...
Если биты одного адреса (1900) равны нулю и биты второго адреса (1902) равны нулю, то S = "Нет в списке аварий"
Примерно так
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
Можно так сделать:
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.
Большое Вам спасибо!!! Работают оба варианта!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot