PDA

Просмотр полной версии : Modbus Universal MasterOPC Server новый OPC сервер от компании ИнСАТ



Страницы : 1 2 3 4 [5]

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
Потому что в видео выбирается тренда, а у вас мнемосхема.
Настройки в этом случае разные.
Сделайте тренд как мы описали и все будет нормально.

Makc
16.02.2022, 11:08
Как можно получить дерево тегов ОРС сервера на LUA?

SCADAMaster
16.02.2022, 11:31
Что подразумевается в данном случае под деревом?
Вы можете перебирать теги по именам или по номерам - соответствующие функции есть в разделе server

Makc
16.02.2022, 11:40
Что подразумевается в данном случае под деревом?
Вы можете перебирать теги по именам или по номерам - соответствующие функции есть в разделе server

Мне нужно из скрипта LUA получить имена тегов по имени группы. как это сделать?

SCADAMaster
16.02.2022, 13:08
По имени группы - нет.
Вы можете перебрать все теги, а потом отфильтровать по имени группы

Makc
17.02.2022, 12:14
По имени группы - нет.
Вы можете перебрать все теги, а потом отфильтровать по имени группы

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.

Makc
17.02.2022, 13:03
Потому что используйте цикл 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 обработка исключений, но для критических ошибок, которые возникают в вашей конструкции, можно было ее (обработку) использовать. Хотя это конечно костыли для костылей...

Makc
18.02.2022, 04:31
Странная конструкция. Здесь явно случай для использования цикла с постусловием. А вы используете цикл с ПРЕДусловием и с помощью 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

Andrevo
19.05.2022, 07:21
Приветствую,

Опрос устройства идет автоматически в соответствии с заданным периодом. Как сделать принудительный опрос устройства с возобновлением автоматического?

Andrevo
19.05.2022, 09:02
Спасибо разобрался.

АлександрСи
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

evg3798
18.03.2023, 03:21
Добрый день. Кто-нибудь может подсказать что за коды функций 65-72 в modbus.ExtFunction (скрипты) InSAT Modbus OPC Server DA
66599

evg3798
18.03.2023, 04:33
Еще вопрос. Как работает ретрансляция в устройстве?
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

melky
22.03.2023, 12:20
SCADAMaster

отличие ДЕМО-версии от коммерческой заключается в ограничении на количество контролируемых параметров - их 32. Для OPC-серверов, предназначенных для опроса счетчиков в ДЕМО-версии введено ограничение на взаимодействие только с одним счетчиком каждого типа. Других ограничений не накладывается.

Где там написано, что Демо не запускается автоматически и это тоже ограничение ?

Указанное вами ограничение относится к Trial версии по части автозапуска, но не к Демо версии...

SCADAMaster
22.03.2023, 13:19
Версия на 32 тега будет запускаться автоматически, но только если ее перед запуском закрыть полностью.
Если она будет в режиме разработки, то не запустится

Александер2008
22.03.2023, 13:28
Спасибо у меня триал всетаки

evg3798
24.03.2023, 04:22
Еще вопрос. Как работает ретрансляция в устройстве?
66600

Есть какой-либо пример?
спасибо.

SCADAMaster
24.03.2023, 09:41
Пример чего? У вас используется такой ретранслятор?

Makc
09.06.2023, 09:14
Во встроенном языке 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

А в чём странность, написать сразу нельзя? Сколько должно быть?

melky
14.06.2023, 08:48
странность видимо в целых числах, при указанном типе 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
Какую модель счетчика вы опрашиваете?
Пришлите ссылку на сайт производителя.

melky
14.06.2023, 12:33
У Пульсар могла измениться версия. Так примерно было с тепловыми счетчиками.

Михаил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/

melky
14.06.2023, 13:09
Судя по логу счетчика и количеству переменных, параметры счетчика в формате float а не double идут

kondor3000
14.06.2023, 14:44
У Пульсар могла измениться версия. Так примерно было с тепловыми счетчиками.

Написали бы сразу, у меня это число FLOAT ещё в 9 часов утра получилось 3.681835e-002 = 0,036818348 ( число с верхнего скрина 1024904918 )

melky
14.06.2023, 15:31
kondor3000 в протоколе Пульсар предусмотрен и float и double в зависимости от версии прибора. Протокол и то и то поддерживает
А на скрине из OPC значения почему-то double - вопрос почему?

Михаил85
14.06.2023, 15:35
Написали бы сразу, у меня это число FLOAT ещё в 9 часов утра получилось 3.681835e-002 = 0,036818348 ( число с верхнего скрина 1024904918 )
Подскажите, как переводили?

melky
14.06.2023, 15:43
Михаил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.

melky
14.06.2023, 16:40
kondor3000 да тут проблема другого рода, читай пост SCADAMaster выше. Просто нет поддержки данного типа переменной в OPC

Счетчики воды Пульсар с цифровым выходом.doc - файл, который надо смотреть для данного счетчика.

Bobensky
17.09.2023, 10:13
Здравствуйте, а как передать, скажем, controlword, где у каждого бита свой тег и как это будет работать в скале?

1exan
17.09.2023, 14:58
Здравствуйте, а как передать, скажем, controlword, где у каждого бита свой тег и как это будет работать в скале?

Создаёте булевые теги как биты слова (указываете номер бита)
Примерно так
70244
В результате скада получает булевый тег, упаковкой-распаковкой занимается сервер.
Вот только тег будет считаться как отдельный, если считаете стоимость

Bobensky
17.09.2023, 15:02
Создаёте булевые теги как биты слова (указываете номер бита)
Примерно так
70244
В результате скада получает булевый тег, упаковкой-распаковкой занимается сервер.
Вот только тег будет считаться как отдельный, если считаете стоимость

Спасибо большое

bukhval
21.10.2023, 04:45
Приветствую. Кто-нибудь пытался подружить этот OPC с модемами ЛЭРС? Я так понимаю это MODBUS поверх TCP и запросы улетают верные, а вот ответа либо нет, либо он не нравится OPC-серверу.
Поделитесь опытом, если таковой имеется.

imaex
21.10.2023, 07:17
Я так понимаю это MODBUS поверх TCP

А в доке на ЛЭРС слово "MODBUS" встречается? Почему Вы так решили?

bukhval
21.10.2023, 12:09
А в доке на ЛЭРС слово "MODBUS" встречается? Почему Вы так решили?

Не встречается, да и не должно. Modbus Реализован в регуляторе, который подключен к ЛЭРС-модему. У модема есть IP адрес, на который и шлются запросы.

SCADAMaster
21.10.2023, 14:50
Напрямую к прибору (без этого шлюза) пробовали подключиться? Например через USB-COM?
Посмотрите на вкладке Сообщения и Запросы - что вообще происходит на шине? Открывается ли порт, есть ли запросы?

bukhval
24.10.2023, 01:17
Напрямую к прибору (без этого шлюза) пробовали подключиться? Например через USB-COM?
Посмотрите на вкладке Сообщения и Запросы - что вообще происходит на шине? Открывается ли порт, есть ли запросы?

Разобрался, спасибо.

mkv
21.02.2024, 16:23
Добрый день.
Никогда не писал скриптов. По этому прошу у Вас помощи.
В 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.

mkv
21.02.2024, 18:48
Довольно странно это решать в ОРС сервере.

Большое спасибо! Завтра на работе попробую.

mkv
22.02.2024, 09:17
Довольно странно это решать в ОРС сервере.

Да, Вы правы. Странное решение. Я Вам сейчас попробую объяснить задачу.
Имеются чиллеры на основе контроллера 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?

mkv
22.02.2024, 11:54
А если значение 1 пример и адрес и адрес 3?

Вы имеете ввиду, что появятся сразу две аварии? Ну они же, наверное, будут отображаться последовательно в строке или только первая?

SCADAMaster
22.02.2024, 12:08
Что значит "последовательно"? В строке будет отображаться только одна какая то авария.

mkv
22.02.2024, 12:21
У меня есть скрипт для отображения аварий в контроллере 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, то формируете строку.

mkv
22.02.2024, 13:44
Можете по аналогии читать функциями modbus нужные адрес, полученную таблицу проверяете - если элемент равен 1, то формируете строку.
Этот скрипт писал инженер, который уволился. Я не умею писать скрипты. По этому и попросил у Вас помощи. Вы можете на примере, хотя бы двух переменных, написать скрипт?

SCADAMaster
22.02.2024, 14:20
Посмотрите пример в приложнеии

mkv
22.02.2024, 14:48
Посмотрите пример в приложнеии

Огромное Вам спасибо. Буду разбираться. С наступающим праздником!!!

mkv
04.03.2024, 10:00
Добрый день.
С авариями с отдельными адресами всё получилось. Спасибо.
Возник ещё один вопрос.
Имеется тэг со скриптом, в котором идёт побитный опрос аварий. Адрес (40966) с битами определённых аварий.
Мне необходимо добавить аварию обрыва датчика, но эта авария находится по другому адресу.
Подскажите, как в этот скрипт добавить аварию с другим адресом.
К примеру адрес 100. бит 5


74047

SCADAMaster
04.03.2024, 10:51
Аналогично - читаете другой адрес, и точно также делаете проверку битов в нем.

mkv
04.03.2024, 10:54
Аналогично - читаете другой адрес, и точно также делаете проверку битов в нем.

Вы имеете ввиду сделать ещё один тэг, только с побитным опросом другого адреса?
А в одном тэге добавить другой адрес не получится?

SCADAMaster
04.03.2024, 11:43
В этом же теге, той же самой функцией - только адрес другой будет.

mkv
04.03.2024, 12:12
Вы имеете ввиду сделать ещё один тэг, только с побитным опросом другого адреса?
А в одном тэге добавить другой адрес не получится?
Ну не получается у меня. Не спец я в этих скриптах. Не знаю я порядка написания команд. Если Вам не трудно, напишите на примере, как это будет выглядеть.

SCADAMaster
04.03.2024, 13:03
Посмотрите пример

mkv
04.03.2024, 13:32
SCADAMaster
Спасибо. Буду пробовать.

mkv
04.03.2024, 16:28
Добрый вечер. Что то у меня не совсем получается.
Когда тэг работает с одним адресом, всё отлично. Все аварии пишутся в строчку. ( См. картинку в сервере). А когда я добавляю ещё адрес, то аварии начинают поочерёдно меняться. Сразу две не отображаются. Я Вам картинки скинул по тэгу с одним адресом. И с двумя. Что то я не дописал. Получается тэг не останавливает свою работу, а гоняет по кругу.
74068
74069
74070

SCADAMaster
04.03.2024, 16:47
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.

mkv
04.03.2024, 21:33
Попробовал дома набросок сделать. Завтра на работе проверю.
Посмотрите пожалуйста, правильно я сделал или опять "накосячил".

74071

SCADAMaster
04.03.2024, 22:05
Без форматирования тут трудно понять логику.
Смотрите сами

mkv
05.03.2024, 11:33
Потому что вы дважды значение в тег пишите.
Вам нужно скомпоновать ваши условия, чтобы в итоге получалось одно значение строки е его уже писать через WriteCurrentTag.

Большое спасибо за помощь! Всё получилось. Скрипт принял вот такой вид.

74084

mkv
20.03.2024, 12:48
Добрый день. Помогите пожалуйста разобраться, что не так написал.

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 значение затрется новым.

1exan
20.03.2024, 13:38
Добрый день. Помогите пожалуйста разобраться, что не так написал...

Вы же словами логику описали - теперь просто напишите это в программе.

err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю

mkv
20.03.2024, 13:50
SCADAMaster
Поменял строку S = S.."Нет в списке аварий " на S ="Нет в списке аварий ".
Теперь при наличии битовой аварии скрипт её (битовую аварию) не записывает, хотя она присутствует. А записывает только "Нет в списке аварий ".
Мне кажется надо как то объединить биты аварий двух адресов...

mkv
20.03.2024, 14:03
Вы же словами логику описали - теперь просто напишите это в программе.

err - это просто признак удачного/неудачного чтения тега. Чтобы определить, что отсутствуют битовые аварии в прочитанном слове, проверьте это значение (w[1]) на равенство нулю
Спасибо.
Попробую так. Потом отпишусь.

mkv
20.03.2024, 15:34
Вы же словами логику описали - теперь просто напишите это в программе.

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

1exan
20.03.2024, 16:21
Нет, не получается. Если в каждом адресе проверяю биты, то в конце скрипта пишет "Нет в списке аварий" дважды. Если убираю точки после 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

mkv
20.03.2024, 16:40
Можно так сделать:
if s=="" and alarm == true and err == false then
S = S.."Нет в списке аварий "
end

Ох блин, вроде так работает!!! Уже домой пора. Завтра с утра ещё хорошенько погоняю, проверю все варианты аварий и тогда отпишусь.
СПАСИБО!!!

mkv
20.03.2024, 16:42
Примерно так



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


СПАСИБО ОГРОМНОЕ!!! Завтра и Ваш вариант испробую!!!

mkv
21.03.2024, 08:54
SCADAMaster , 1exan
Сразу с утра проверил!!! Это для контроллера Danfoss MCX08 и MCX15B2.
Большое Вам спасибо!!! Работают оба варианта!