Либо так, либо функцией server.ReadTagByNumber( ).
Либо так, либо функцией server.ReadTagByNumber( ).
Добрый день!
Не могу найти информацию, по тому, сколько можно подключить клиентов к ОПС-серверу.
Хочу попробовать такую схему:
Вложение 30738
Знаю, что правильнее было бы это реализовывать через OPC UA клиенты с помощью tunneler. Но интересует возможность такой работы по приведенной выше схемы
Количество клиентов подключаемых к ОРС серверу не ограничено.
Извиняюсь, на нашем форуме есть тема с вопросами по скриптам insat OPC? (не смог найти)
Отдельные темы с конкретными вопросами есть.
Видеопримеры по работе со скриптами тут:
http://insat.ru/products/?category=2114
Есть функции читающие количество тегов, а функции возвращающей false если хотя бы 1 тег имеет статус BAD?
Такой функции нет.
Добрый день !
Есть счётчик ПСЧ и пара модбас устройств , линия связи только одна.
Вариант1 - взять Modbus Universal MasterOPC Server реализовать протокол счётчика ПСЧ на скрипте.
А есть ещё варианты ?
вот есть Multi-Protocol MasterOPC Server с поддержкой драйвера счётчика ПСЧ, как-бы исхитриться и его задействовать...
[QUOTE=Николай НВ;246930]
Есть счётчик ПСЧ и пара модбас устройств , линия связи только одна.
Вариант1 - взять Modbus Universal MasterOPC Server реализовать протокол счётчика ПСЧ на скрипте.
А есть ещё варианты ?
/QUOTE]
Сделать две отдельных шины
Не получится. Когда добавляете порт он будет монопольно открыт одним драйвером, из того же скрипта в Multi-Protocol обратится не получится.
Описание объекта:
Есть прибор с стандартным протоколом Modbus + счетчик с модбасоподобным протоколом (для его опороса был написан скрипт).
Все это опрашивается через один GPRS модем.
После запуска OPC все работает отлично.
Спустя день (2 дня) происходит сбой скрипта опроса счетчика. При этом второй прибор опрашивается без проблем (прямые теги).
Перезапуск OPC сервера решает проблему. Но спустя день ошибка повторяется.
Реинициализация узла не помогает.
Как перезапустить скрипт при ошибке без перезапуска программы?
В скрипте в функции Get_Register() формируется запрос к счетчику, выполняется байтстаффинг массива запроса и отправляется в счетчик функцией server.SendAndReceiveDataByMask.
Функция server.SendAndReceiveDataByMask возвращает ответ, производится байтстаффинг, проверка контрольной суммы, обработка результата и передача требуемой переменной.
Скрипт работает, но после некоторого количества запросов прекращается получение данных от счетчика.
При запросе 1 раз в секунду скрипт выдавал ошибку примерно через 20 часов работы, при запросе раз в минуту - около 3-х дней.
При запуске скрипта происходит следующее:
В локальный массив Array[] помещаются байты запроса, вычисляется контрольная сумма и выполняется байтстаффинг.
Посылается запрос счетчику массива Array без вычисления контрольной суммы с предполагаемой длиной ответа до 80 байт.
err,Otvet_0,Len_0=server.SendAndReceiveDataByMask( 0,Lenght,SendMask,Array,ReceiveMask,80);
Эта функция возвращает в локальный массив Otvet_0[] ответ счетчика, который далее обрабатывается.
В какой-то момент времени функция server.SendAndReceiveDataByMask не может передать данные переменной Otvet_0[] и генерирует ошибку.
При этом идет полноценный обмен данными между сервером и счетчиком, в окне OPC сервера "Запросы" отображаются отправленные и принятые байты.
Часто (раз в 100...150 запросов) появляется сообщение о неверной контрольной сумме, хотя все запросы и ответы одинаковы побайтно.
Что может быть с переменными Otvet_0[] и Len_0(длина ответа) ???
Они же локальные и должны инициализироваться заново при каждом запросе.