PDA

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



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

SCADAMaster
02.03.2015, 19:41
512 в двоичной системе это 0000 0010 0000 0000. То есть первый бит все равно равен False.
Вы получается не тот бит меняете. В вашем случае меняется 9 бит.

Vitaliy
13.03.2015, 10:33
Здравствуйте!
ОРС сервер настроен на опрос устройств с периодичностью примерно 1 раз в 10 мин. После удачного запроса/ответа качество переменных "ОК" но спустя некоторое время (около 30 сек) качество сбрасывается в "BAD"?

SCADAMaster
14.03.2015, 09:57
Мы проверили - у нас проблема не проявляется.
Какие сообщения при этом выводятся на вкладку "Сообщения"? Какая версия ОРС сервера?

Пьер
24.03.2015, 09:03
Уважаемый SCADAMaster, помоги пожалуйста разобраться?
Есть модуль. У него Modbus Mapping:
Coil 0xXXXX
Input Coil 0x1XXXX
Input Register 0x3XXXX
Holding Register 0x4XXXX

Разъясни пожалуйста, что это ? приблизительно понимаю, но сути не уловил.
В справке особых разъяснений нет. Хочу понять, что и как. Чтобы при настройке OPC не было непоняток.
Спасибо!

SCADAMaster
24.03.2015, 10:44
Судя по всему это Modbus адрес в стандартном формате. Стандартный Modbus адрес, определяет номер используемой функции чтения, записи и адрес переменной.
При стандартной адресации существует четыре области памяти:
Дискретные флаги (COILS): адреса 00001...09999, чтение функция 1, запись -функция 15;
Дискретные входы (DISCRETE_INPUTS): адрес 10001...19999, чтение - функции 2;
Входные регистры (INPUT_REGISTERS): адрес 30001...39999, чтение - функция 4;
Хранимые регистры (HOLDING_REGISTERS): адрес 40001...49999, чтение - функция 3, запись - функция 16.
Для преобразования стандартного Modbus адреса, к современному представлению адресов OPC сервера, необходимо выполнить следующее:
1. По первой цифре стандартного адреса определить регион, к которому принадлежит данный регистр;
2. Убрать из стандартного адреса первую цифру и вычесть единицу.
Например, если стандартный адрес равен 40013, то в Modbus Universal MasterOPC сервере, это будет тег региона Holding_Registers, а адрес регистра будет равен 12

Пьер
25.03.2015, 10:12
SCADAMaster, спасибо за инфу!
Написал элементарный проект.
Как мне его запускать, типа как HMI визуализацию, чтобы у меня были скрыты все связи, чисто внешний вид проекта, кнопочки, графики и все. Так называемая защита от д...ка.
В примерах смотрел, там просто основы проектирования.

Хочу реализовать что-то типа Plug in play на вашей скаде. Видел, что это возможно.
Спасибо!

SCADAMaster
25.03.2015, 10:46
Назначаете мнемосхему стартовой, создаете оператора и запрещаете у оператора все посторонние действия (переход к проекту, открытие дерева объектов и системы).
В видео все это показывалось.

Flomaster
31.03.2015, 17:52
Здравствуйте!
Имеется сеть RS-485, к которой подключены несколько устройств. Настройки коммуникационного узла OPC-сервера компании ИнСАТ: COM2, скорость 38400, без контроля четности, 1 стоповый бит. Устройства опрашиваются по протоколу Modbus-RTU.
К OPC-серверу требуется подключить новое устройство. Проблема в том, что производителем устройства жестко заданы коммуникационные параметры: 38400, включен контроль четности, 1 стоповый бит. Устройство поддерживает протокол Modbus-ACSII.
Каким образом можно осуществить добавление такого устройства в имеющуюся сеть RS-485?
Можно ли решить задачу "в лоб", просто создав новый коммуникационный узел в OPC-сервере, но с другими параметрами связи (включен контроль четности) и добавить в этот узел новое устройство? Будет ли в этом случае OPC-сервер сам формировать "правильные" пакеты к устройствам? Или же наиболее правильным шагом будет подключение добавляемого устройства к отдельному физическому порту (тем самым будет создана новая сеть RS-485)?

SCADAMaster
31.03.2015, 18:29
Каким образом можно осуществить добавление такого устройства в имеющуюся сеть RS-485?

Только подключив его к другой линии RS-485.



Можно ли решить задачу "в лоб", просто создав новый коммуникационный узел в OPC-сервере, но с другими параметрами связи (включен контроль четности) и добавить в этот узел новое устройство? Будет ли в этом случае OPC-сервер сам формировать "правильные" пакеты к устройствам? Или же наиболее правильным шагом будет подключение добавляемого устройства к отдельному физическому порту (тем самым будет создана новая сеть RS-485)?
Нет, не будет. Порт не откроется - так как его перед этим откроет другой узел.

Пьер
01.04.2015, 13:54
Проект в СКАДЕ.
Схематично изображаю ПК и некий Прибор.
Между ними связь.
Есть ли какие элементы в СКАДЕ, которые дают возможность отображать на схеме наличие и отсутствие связи??? или это надо прописывать логическими элементами? или просто обычный выход отображать как индикатор?
Спасибо, Мастер!

SCADAMaster
01.04.2015, 15:03
Наличие связи определяется признаком качества переменной. Для анализа признака качетства можно использовать модуль "Событие" - у него есть функция OPCQuality( ).
Это событие вы уже можете размещать на мнемосхеме или использовать в других частях проекта.

Пьер
01.04.2015, 15:27
Наличие связи определяется признаком качества переменной. Для анализа признака качетства можно использовать модуль "Событие" - у него есть функция OPCQuality( ).
Это событие вы уже можете размещать на мнемосхеме или использовать в других частях проекта.

Этот модуль добавляется через Объект-> добавить Событие? И там прописывать функции?
Но там непонятно, нет примера?

У меня OPC сервер (пробная версия на 32 тега).

SCADAMaster
01.04.2015, 15:51
Этот модуль добавляется через Объект-> добавить Событие? И там прописывать функции?

Да, там


Но там непонятно, нет примера?

На закладке "Формула" есть кнопка вызова справки - там есть примеры синтаксиса всех функций, в том числе и этой.

omelchuk
16.04.2015, 14:45
Доброго времени суток.
Имеется Мастер ОРС модбас 32, а так-же контроллер, у которого регистры расположенны в ряд, но групповое чтение неподдерживается.
Можно-ли заставить сервер считывать переменные "поштучно"?

SCADAMaster
16.04.2015, 14:54
Нужно у каждого тега включить настройку "Последний тег в групповом запросе".

omelchuk
16.04.2015, 15:12
Большое спасибо, за оперативность так-же спасибо!

Safron
16.04.2015, 17:38
Здравствуйте... Может здесь мне дадут ответ. Посмотрите пож. http://www.owen.ru/forum/showthread.php?t=21020 .

SCADAMaster
16.04.2015, 18:04
У вас какая то ерунда с файлом. Должна быть одна запись - одна строка, и без лишних переводов каретки (тоже есть такой глюк в контроллере), например:
Arxive "MyArch" Comment "Comment" #000 size=002 name=var1
2012.09.04 13:19:39 #000=0000
2012.09.04 13:19:49 #000=0000
2012.09.04 13:19:58 #000=0000
А у вас все одной строкой идет и выдает какой-то шлак:
Arxive "Insert a name here" Comment "" #000 size=002 name=Insert vari #001 size=002 name=Insert vari #002 size=002 name=Insert vari #003 size=002 name=Insert vari #004 size=002 name=Insert vari #005 size=002 name=Insert vari #006 size=002 name=Insert vari #007 size=002 name=Insert vari
2015.03.10 20:01:01 #000=0007 #001=0000 #002=0001 #003=0006 #004=0000 #005=0000 #006=0000 #007=0000

Safron
16.04.2015, 18:28
Так я никаких отличий не нахожу в записи. За предыдущие дни...А их читает без проблем...Получается проблемы с ПЛК

SCADAMaster
16.04.2015, 18:49
Проблемы точно с ПЛК - генерация такого файла это ошибка.

energvk
23.04.2015, 16:38
Проявилась ошибка в masterOPC.


23-04-2015 15:28:13.696 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 9222 ms) (H41 0,2780,4 )
23-04-2015 15:28:10.915 гайдара-99а:Соединение установлено xx.xx.xxx.x 502
23-04-2015 15:28:04.477 гайдара-99а:Попытка соединения xx.xx.xxx.x 502
23-04-2015 15:28:04.477 гайдара-99а.гайдара-99а:Старт опроса устройства
23-04-2015 15:18:04.390 гайдара-99а:разрыв соединения xx.xx.xxx.x 502
23-04-2015 15:18:04.390 гайдара-99а.гайдара-99а:Старт опроса устройства
23-04-2015 15:08:08.330 poll:Запись в гайдара-99а.гайдара-99а.poll значения 0
23-04-2015 15:08:08.330 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 4004 ms) (H41 0,1574,7 )
23-04-2015 15:08:06.752 гайдара-99а:Соединение установлено xx.xx.xxx.x 502
23-04-2015 15:08:04.330 гайдара-99а:Попытка соединения xx.xx.xxx.x 502
23-04-2015 15:08:04.330 гайдара-99а.гайдара-99а:Старт опроса устройства
23-04-2015 15:08:04.330 poll:Запись в гайдара-99а.гайдара-99а.poll значения 1


То есть, выполнился опрос, на следующий опрос появляется

23-04-2015 15:18:04.390 гайдара-99а:разрыв соединения xx.xx.xxx.x 502
23-04-2015 15:18:04.390 гайдара-99а.гайдара-99а:Старт опроса устройства

Получается удачный опрос выполняется через один.

SCADAMaster
23.04.2015, 17:37
Не совсем понятно в чем проблема. Опишите проблему подробнее, а также пришлите конфигурацию и полный лог обмена с устройством.

energvk
23.04.2015, 22:45
Не совсем понятно в чем проблема. Опишите проблему подробнее, а также пришлите конфигурацию и полный лог обмена с устройством.

Видимо сегодня что-то со скриптами намудрил. Пробую предыдущую конфигурацию - всё нормально.

lara197a
30.04.2015, 11:20
Здравствуйте!
Устройство периодически шлет в сеть данные в формате строки по UDP.
Помогите настроить Мастер ОРС для приема данных.
Тему пролистал, но про UDP ничего не нашел.

SCADAMaster
30.04.2015, 11:55
В Modbus Universal работать с UDP нельзя.
Вам нужно написать свой плагин для User Protocol на С++. Там можно будет выполнять любые работы с сетью:
http://insat.ru/products/?category=1275

Hemann
30.04.2015, 17:26
Добрый день!

Подскажите пожалуйста такой момент. Я пишу свой скрипт для работы с нестандартным устройством. В нем сервер сначала шлет запрос устройству, получает от него квитанцию о правильном распознавании запроса, анализирует квитанцию, и если все нормально - ждет посылки с данными. И вот как-то не соображу, как получать вторую посылку, т.к. функция server.SendAndRecieveDataByMask требует ненулевую длину передаваемой таблицы, а мне как раз посылать ничего нельзя - нужно только получить и проанализировать вторую посылку от устройства.

SCADAMaster
30.04.2015, 18:44
В следующей версии ОРС сервера можно будет в функции server.SendAndRecieveDataByMask не посылать запрос.
В приложении заархивированный exe файл с новой версией. Вам нужно установить текущую версию 3.1.4 на 32 тега и заменить exe файл.
Чтобы функция server.SendAndRecieveDataByMask не посылала запрос, нужно вторым параметром указать 0:
local sendmask={};
err,dest,len=server.SendAndReceiveDataByMask(0,0,s endmask,send,destmask,200);

Hemann
01.05.2015, 11:12
SCADAMaster Спасибо!

Hemann
07.05.2015, 12:18
Добрый день!

Подскажите пожалуйста, а есть ли какая-то возможность управлять служебными сигналами СОМ-порта? Сегодня был на объекте, пробовал взаимодействие своего скрипта из MasterOPC с оборудованием заказчика, смотрел что происходит с портом-посылка от скрипта уходит какая надо, а ответа нет. Я посмотрел что происходит в порту при работе оригинальной программы, шедшей с оборудованием. Посылки совпадают с тем, что я формирую скриптом, но когда когда работает MasterOPC, сигналы CTS и DTR установлены в 1, а при работе оригинальной программы они равны 0. Соответственно, нужна возможность управления этими сигналами.

SCADAMaster
07.05.2015, 12:55
В функциях скрипта есть функции для установки сигналов RTS и DTR.

Hemann
08.05.2015, 10:45
SCADAMaster Спасибо!
А описание этих функций есть? В хелпе я их не вижу. какие аргументы нужно передать функциям, чтобы переключить их в 0? В 1?

SCADAMaster
08.05.2015, 11:48
В Хелп их пока не внесли. Если нужно переключить их в 1, подайте в качестве аргумента True, если 0 - False.

Hemann
21.05.2015, 15:18
Подскажите пожадуйста, есть ли встроенные средства для преобразования строки вида "+14.25" в число типа float, или нужно писать такую функцию самостоятельно?

SCADAMaster
21.05.2015, 15:40
Поясните - как именно вы получаете эту строку?

Hemann
22.05.2015, 11:41
SCADAMaster Поясните - как именно вы получаете эту строку?
Эта строка приходит от оборудования внутри его ответа на запрос ПК (протокол не стандартный, описан скриптом)

SCADAMaster
22.05.2015, 13:02
Если скриптом, то тогда используйте функцию SendAndReciveDataByMask, а в качестве маски используйте sdouble. Посмотрите пример в документации про DCON - там примерно такая же задача.

Brewer
28.05.2015, 20:23
Добрый день.Столкнулся с проблемой записи значения "предустановленного задания 0" (параметр 3-10) по адресу 3099 в Овен ПЧВ2.
Создав тег в сервере MasterOPC Universal Modbus Server,пытаюсь записать необходимое значение.Сервер пишет, что значение записано. А в ПЧВ данные не меняются. Или записываются в "предустановленное задание 7".Отмечу, что "предустановленное задание" является массивом из 7 ячеек(Адрес один).
Спрашивал техподдержку Овена. Вот что ответили:
"...Также вы можете записывать данные в ячейки параметров , которые являются массивами, например 3-10 или 13-51.
Чтобы записать в нужную ячейку данные , предварительно нужно указать номер ячейки , записав её в регистр номер 6, после этого обратиться к регистру параметра (№ параметра *10 - 1 )."
Попробовал записать в Holding_Registers 0X0006 .Данные не записываются. Сервер выдает ошибку записи.Подскажите пожалуйста, как записывать на уровне сервера именно в "предустановленное задание 0"

SCADAMaster
29.05.2015, 15:37
Уточните у ОВЕН какие точно Modbus команды нужно выполнить в какой последовательности (номер функции, номер ячейки, данные).

Brewer
01.06.2015, 09:49
Вот ответ:
"Пишите 16ой функцией, читаете 3 или 4."
Крайне лаконично :(
А вот как записать функцией 16 ?

SCADAMaster
01.06.2015, 10:43
Для региона Holding Registers по умолчанию запись ведется как раз функцией 16.
Нужен более развернутый ответ - в какие регистры, в какой последовательности.

Brewer
01.06.2015, 11:53
Это стало понятно из Руководства.
Сначала запись в 9 регистр номера ячейки массива, затем запись значения в ячейку массива.Однако при старте сервера тег с 9 регистром выдает COMM_FAILURE.А при попытке записать- Ошибка процедуры.

01-06-2015 11:50:52.619 Oven PCV:Запись в устройство будет произведена через 10 ceкунд или после восстановления соединения
01-06-2015 11:50:52.619 Oven PCV:Ошибка в процедуре записи ( ) NodeRS.Oven PCV
01-06-2015 11:50:52.586 Oven PCV:Ошибка в процедуре записи ( ) NodeRS.Oven PCV
01-06-2015 11:50:52.555 Oven PCV:Ошибка в процедуре записи ( ) NodeRS.Oven PCV
01-06-2015 11:50:52.506 Адрес масива:Запись в NodeRS.Oven PCV.Адрес масива значения 1
01-06-2015 11:50:52.506 Адрес масива:Запись в NodeRS.Oven PCV.Адрес масива значения 1

SCADAMaster
01.06.2015, 12:57
Пришлите конфигурацию ОРС сервера и лог обмена с устройством.
Для того чтобы получить лог сервера, включите в свойствах запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам вместе с конфигурацией.

Brewer
01.06.2015, 13:36
Лог и настройки во вложении

SCADAMaster
01.06.2015, 14:53
Запрос уходит корректный, но прибор дает ошибку
[01.06.2015 13:31:35.448] WRITE : Адрес масива:Запись в NodeRS.Oven P4V.Адрес масива значения 1
[01.06.2015 13:31:35.448] TRACE : (COM5) Tx: [0011] 13 10 00 09 00 01 02 00 01 B3 A9
[01.06.2015 13:31:35.485] TRACE : (COM5) Rx: [0005] 13 90 02 6D C4
Код ошибки 90, с расшифровкой 02 - это Illegal Data Address. То есть данный адрес является недопустимым для данной операции. Уточните у техподдержки ОВЕН почему так происходит.

Brewer
02.06.2015, 11:15
Вопрос решился.Вот ответ техподдержки Овен.
"Уточнил у коллег.
Девятый регистр в обсолютном значении, а т.к. в модбас области памяти регистры считаются с нуля, то в ОРС ставьте обращение к 8ому регистру а не к 9. Передам информацию, чтоб это отразили в руководстве."
После того как поменял регистр, все заработало.Только странно. Что, только я озадачился этой проблемой?..

lomtik
22.06.2015, 23:41
Здравствуйте,
подскажите, пожалуйста, можно ли реализовать передачу данных из Modbus Universal MasterOPC-сервера в web-сервер и как? Сейчас данные поступают в Мастер-скаду. Хочу продублировать их на web-сервер, чтоб было видно их из интернета.

SCADAMaster
23.06.2015, 09:35
Здравствуйте,
подскажите, пожалуйста, можно ли реализовать передачу данных из Modbus Universal MasterOPC-сервера в web-сервер и как? Сейчас данные поступают в Мастер-скаду. Хочу продублировать их на web-сервер, чтоб было видно их из интернета.
Лучше это делать средствами скады - экспортировать данные в БД, а потом обращаться к ним из сайта.

lomtik
23.06.2015, 22:37
capzap
зато вот Вы везде пишете, Вас везде много, во всех темах следы оставили, наверно тяжело всем отвечать, спасибо что уделили и мне своё время, моей скромной персоне, но я немного не понял - где я везде задаю свой вопрос? спросил только здесь - как это можно сделать мне, ну и в еще одной теме спросил как это сделано у другого, и все. Разве форум не для этого, чтоб обмениваться и учиться у других? Вопрос как бы был больше адресован к инсату - SCADAMaster, ну и вам тоже спасибо за ответ.
Web-сервера как бы нету еще, он пока в голове.


SCADAMaster спасибо за наводку.

SCADAMaster
28.07.2015, 14:26
В версии 2 импорта еще не было. Импорт появился в третьей версии. Обновите вашу версию до текущей - обратитесь в отдел продаж.
Подробнее про импорт описано в блоге:
http://blog.insat.ru/2014/05/modbus-universal-masteropc-import.html

v.agoshkin
24.08.2015, 12:42
Добрый день! Поддерживает ли последняя версия Modbus Universal MasterOPC Server 32 работу с модемами? Я пытаюсь сделать такую связку ПЛК 150 - модем ПМ01 - модем ПМ01 - Modbus Universal MasterOPC Server 32. Связать пока не получается. Связка с ModBus OPC сервер Lectus работает переменные получаю передаю. Строка инициализации в HyperTerminal проходит. Если зацепить Modbus Universal MasterOPC Server 32 напрямую по RS485 или RS232 тоже все прекрасно работате. Если не трудно, то подскажите возможные причины 19637

SCADAMaster
24.08.2015, 13:35
Вам лучше скачать последнюю версию ОРС сервера - 3.1.7
http://insat.ru/prices/info.php?pid=6944
И ознакомьтесь с этой документацией:
http://www.insat.ru/products/Universal_MasterOPC/work_with_modem.pdf

Андрей К
25.08.2015, 02:49
Здравствуйте. Есть да контроллера, которые соединяются с сервером по Modbus TCP. Второй контроллер резервирует первый. У них разные ip адреса. Вопрос в следующем: как сделать переход с одного ip адреса на другой (Теги идентичны). Пробовал ковырять скрипты, но не нашёл функции изменения ip адреса узла связи.

SCADAMaster
25.08.2015, 07:54
У нас есть штатная функция резервирования, но она доступна только в Unlim версии.
Переход происходит автоматически, при потере связи, также доступны скрипты для ручного переключения каналов.

Андрей К
25.08.2015, 08:12
У нас есть штатная функция резервирования, но она доступна только в Unlim версии.
Переход происходит автоматически, при потере связи, также доступны скрипты для ручного переключения каналов.

Это значит, что в версии на 2500 тегов нет такой возможности? Даже с помощью скриптов нельзя изменить адрес узла связи по условию?

SCADAMaster
25.08.2015, 08:47
Мы вам ответили по почте.

v.agoshkin
25.08.2015, 10:54
[QUOTE]Вам лучше скачать последнюю версию ОРС сервера - 3.1.7
http://insat.ru/prices/info.php?pid=6944
И ознакомьтесь с этой документацией:
http://www.insat.ru/products/Univers...with_modem.pdf[/QU

Я это все проделывал и именно по вашим инструкциям программное обеспечение последнее. Оба модема ПМ01 строку инициализации принимают. Сим карты мегафон, функция передачи данных подключена.. Проверял на OPC Lectus - работают модемы и данные передают и принимают. Проверял на прямую подключать также работают. Поэтому я и засомневался работают ли модемы на бета версии вашего опс сервера. Раньше я так понимаю бесплатная версия была ограничена 32 тегами и отсутствием подключения модема.

SCADAMaster
25.08.2015, 11:34
Пришлите лог обмена с устройством. Для этого в свойствах сервера включить запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам. Также пришлите конфигурацию ОРС сервера.

v.agoshkin
25.08.2015, 12:11
Спасибо за суету! Проблему решил. Перешел на другой ComPort (родной на материнке) и все зашевелилось. Будем воевать дальше.

Hemann
25.08.2015, 22:21
Коллеги, приветствую!
Работаю над удаленным опросом ПР110 с помощью Modbus OPC-Server через GPRS-канал обеспечиваемый средствами фирмы iRZ (модем ATM2-485, iRZ Server, iRZ Dispatcher). Модем подключен к ПР110 по RS485 (19200, 8N1), на ПК - статический IP-адрес.
Никак не могу добиться стабильного чтения ОРС-переменных. В прикрепленных файлах - запросы/ответы ОРС-сервера, лог с Гипертерминала на зажимах RS485 модуля ПР-МИ485, скриншот и онфигурация ОРС-сервера и проект ПР110-го.
Прошу помощи, т.к. пока не допетрил на кого грешить.
Заранее спасибо.

SCADAMaster
26.08.2015, 08:15
Не совсем понятно как у вас организована связь - пишите про GPRS, в проекте обычный COM.
Судя по логам все корректно - приходят нули на запрос. Попробуйте сначала подключиться напрямую - по проводам.
И обновите версию ОРС сервера до текущей.

Hemann
26.08.2015, 18:35
Коллеги, спасибо! Вопрос был все-таки в связи, вернее в ее транспортной задержке, ОРС-сервер не при чем. Решилось настройками модема. Да, забыл пояснить в вопросе - СОМ-порт виртуальный, организуется посредством оборудования и ПО iRZ по GPRS-каналу при наличии статического IP-адреса на ПК.

Hemann
22.09.2015, 14:29
Коллеги, приветствую!

Что-то я после отпуска немного торможу еще. Поэтому прошу подсказать такой момент. Я опрашиваю частотник по Модбасу - читаю и пишу его регистры. Но мне нужно передавать в программу верхнего уровня не только целиком регистры, но и биты из некоторых регистров. Частотник работу с битовыми функциями Модбаса не поддерживает. Как бы сделать чтение-запись битов с помощью скрипта на Lua, чтобы минимизировать количество тэгов ОРС-сервера? Т.е. нужно в частотнике читать-писать регистрами, а в верхнюю программу кроме целых регистров (типа ток, напряжение, частота), передавать еще и биты, вычлененные из некоторых регистров (например пуск, стоп, вперед, назад - это разные биты регистра управления).

SCADAMaster
22.09.2015, 14:49
А почему нельзя опрашивать регистры, а извлекать биты регистра на верхнем уровнем. В MasterSCADA для этого есть специальный ФБ - "Распаковка 32-битного значения".

Hemann
22.09.2015, 14:56
В связи с ограниченностью клиента в деньгах приходится пользоваться SimpleSCADA, а ее функционал ограничен. Как обычно у нас бывает - ребята выиграли тендер, который длился долго - цены ускакали вверх, а конкуренты уронили стоимость контракта и слиняли в пампасы. Пришлось изощряться, считать каждую копейку. Соответственно, они вынуждены были отказаться от MasterSCADA и услуг подходящего программиста. Вот, пытаюсь выручить. В любом случае, буду использовать MasterOPC.

Hemann
22.09.2015, 15:15
Да дело в том, что получилась дурацкая ситуация. Был тендер и конкурирующая контора уронила цену контракта. А поскольку длился этот тендер довольно долго, то и цены на оборудование ускакали вверх. Ребятам пришлось отказаться от MasterSCADA и услуг соответствующего программиста. Пытаюсь их выручить по дружбе, но придется использовать SimpleSCADA, а там ограниченный функционал. В любом случае, буду использовать MasterOPC.

Hemann
22.09.2015, 15:22
Блин, что-то браузер что-ли проглючило? Набираю пост - он пропадает, набираю второй раз - он опять пропадает. Потом отобразились оба.

SCADAMaster
22.09.2015, 16:17
Как вы планируете работать с битами и при этом минимизировать количество тегов?
Если ваша скада не умеет работать с битами, то тогда в ОРС придется делать - один бит, один тег. Это явно не приведет к их уменьшению в ОРС

Hemann
22.09.2015, 17:43
Так с тэгами - это понятно. Но как-то работать с битами нужно.

SCADAMaster
22.09.2015, 17:56
С помощью функций bit.BitFromData( ) и bit.BitToData( )
Описание функцией есть в справке.

Hemann
22.09.2015, 18:22
Спасибо за подсказку!

msnya
10.10.2015, 22:18
Здравствуйте! Подскажите пожалуйста, есть ли возможность опрашивать тег не циклически а по команде из скады однократно в нужный момент? или в зависимости от состояния другого тега?

SCADAMaster
11.10.2015, 10:29
Можно положить его в подустройство, установить у устройства период опроса 0, а затем используя скрипт - функцию server.PollCurrentSubDevice( ) вызывать его опрос.

msnya
12.10.2015, 11:12
Совсем не разбираюсь в Lua, но подозреваю что скрипт должен быть не сложным. Может быть напишите как это должно выглядеть?
Заранее спасибо!

SCADAMaster
12.10.2015, 11:29
Добавляете тег типа Server_Only. Включаете у него исполнение скрипта после чтения, в функции Read пишете:
function OnRead()
val=server.ReadCurrentTag();
if (val==true) then
server.PollCurrentSubDevice( );
end;
end

Vish57
12.10.2015, 20:53
Только что скачал бесплатную версию сервера.
При установке выскакивает сообщение "Точка входа не найдена" и соответственно сервер не запускается. ОС - WinXP.
Вчем причина?

SCADAMaster
13.10.2015, 08:02
А вы какой ОРС сервер скачали - Modbus или Multi-Protocol?
Приложите скриншот ошибки.

Vish57
13.10.2015, 08:23
К сожалению сейчас не могу приложить скриншот ошибки, на прилагаю скриншот места скачки.20377

SCADAMaster
13.10.2015, 11:45
В приложении dll библиотека в архиве. Замените этой библиотекой ту что в папке
c:\Program Files\InSAT\MasterOPC Universal Modbus Server\

Vish57
13.10.2015, 16:13
Спасибо заработало!!

msnya
16.10.2015, 00:00
Добавляете тег типа Server_Only. Включаете у него исполнение скрипта после чтения, в функции Read пишете:
function OnRead()
val=server.ReadCurrentTag();
if (val==true) then
server.PollCurrentSubDevice( );
end;
end

server.PollCurrentSubDevice(Здесь должен быть тег, опросить который я хочу?)

val=server.ReadCurrentTag(А здесь тег в зависимости от состояния которого будет выполнен скрипт?)

SCADAMaster
16.10.2015, 08:00
server.PollCurrentSubDevice(Здесь должен быть тег, опросить который я хочу?)

Нет, здесь ничего не надо, в скобках пусто. Будет опрошено текущее подустойство.
Только исполнение скрипта не после чтения, а перед записью, и функция соответственно Write.



val=server.ReadCurrentTag(А здесь тег в зависимости от состояния которого будет выполнен скрипт?)
От текущего тега.
Посмотрите описание функций в справке.

msnya
16.10.2015, 12:13
Спасибо! Заработало!

equ1per
16.11.2015, 14:38
Добрый день, скажите а есть возможность в ходе опроса изменять номер порта, скорость, данные?

SCADAMaster
16.11.2015, 15:05
Нет, в режиме исполнения так делать нельзя.

Al-Al
17.11.2015, 08:27
Добрый день.

MasterOPC Universal Modbus server.

Требуется настроить запись в Modbus RTU устройство функцией 06. Т.е. запрос должен быть вида : 02 06 "адрес регистра" "данные" "кс". Как ни крутил Holding Registers и другие параметры, ОРС шлёт запросы с функцией 0х10 и никак не удаётся отправить запрос с функцией 0х06.
Подскажите как решить эту проблему?

С чтением данных проблем пока нет. Командой 0х03 всё необходимое читается.

PS. Нашёл, что надо выбрать пункт "принудительная запись командой 06"

SCADAMaster
17.11.2015, 08:49
Можно еще на уровне устройства - настройка "Не использовать команду Write Single Register"

Александр N
17.11.2015, 10:29
Добрый день.
Где-то месяца 4 назад установил Modbus Universal MasterOPC Server, наладил, все работает нормально, но примерно раз в месяц ОРС сервер зависает, по всем тэгам показывает бэды.
Перезапускаю его прямо не отключая основной программы и опять все работает. Оборудование которым управляет программа достаточно серьезное и поэтому чувствую себя не комфортно.
Раньше в комплексе с программой управления работал овеновский ОРС, таких сбоев не было. Может быть есть какие-то советы, буду признателен.

SCADAMaster
17.11.2015, 10:51
Скорее всего зависает СОМ порт.
Попробуйте в настройках устройств включить "Реинициализация узла при ошибке".
Если это не поможет, то можно будет делать перезапуск ОРС сервера средствами MasterSCADA.

Александр N
17.11.2015, 12:24
Спасибо. Ваш совет выполню. Может быть подскажете сразу решение проблемы средствами MasterSCADA.
Спасибо.

SCADAMaster
17.11.2015, 13:04
В приложении пример такого скрипта с обвязкой - ОРС сервер опрашивается только когда нажата кнопка на мнемосхеме. Проект можно легко переделать - сделать чтобы процесс закрывался при нарушении признака качества например.
Имя OPC процесса ОРС сервера задается в коде скрипта.
После того процесс будет убит, спустя несколько секунд нужно выполнить переподключение к ОРС серверу (поле на вкладке "Опрос"), чтобы скада снова подписалась на изменения ОРС

Александр N
19.11.2015, 09:58
Большое спасибо! Разбираюсь.

za9c
08.12.2015, 15:03
Добрый день! используем Master OPC universal modbus Подскажите пож-та!! принимаю последовательность - BF ED 58 60 13 66 0E 52 --ЧТО соответствует числу -0.917038!!! т.е если указать тип данных double -- должно само преобразовывать к читаемому виду!!! но на деле выдаёт совсем не то!!! что делать подскажите плз??

SCADAMaster
08.12.2015, 15:13
Правильное ли чередование байт вы задаете?
Для Double чисел обычно "Старшим двойным словом вперед".

za9c
08.12.2015, 15:18
а как поменять на уровне скрипта - допустим - прибор отвечает 52 0E 66 13 60 58 ED BF а нужно наоборот??

SCADAMaster
08.12.2015, 15:26
Какой функцией скрипта вы ведет опрос?
Приведите этот кусок кода.

za9c
08.12.2015, 15:28
local destmask={"byte","byte","byte","byte","byte","byte","byte","byte",
"byte","byte","byte","byte","double:3:?????"}

local err,len;
local n=0;
err,dest,len=server.SendAndReceiveDataByMask(0,35, sendmask,send,destmask,200);
я должен принять 3 числа по 8 байт в формате double

SCADAMaster
08.12.2015, 15:35
Ну вот вам нужно в маске и указать чередование байт:
local destmask={"byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","double:3:76543210"}
Возможно будет другое чередование - надо проверять, тогда чередование будет другое.

za9c
08.12.2015, 15:37
т.е я принимаю 12 байт всякого мусора ненужного и 3 числа в формате double по 8 байт каждое!! Так от прибора и приходит!!! как в маске перевернуть очерёдность байтов???

za9c
08.12.2015, 15:41
спасибо - пытался - не помогает! есть кусок рабочего кода конвертера 32бит в флоат!!! поможет ли переделка на 64 бита или OPC не поддерживает 64 бита!! делал так(например) - а=0x520E66136058EDBF после server.WriteCurrentTag(a,OPC_G_G) - выдаёт число - но только на 32 бита и усё - больше нельзя получается!!!!

SCADAMaster
08.12.2015, 15:48
Очередность байт?
Если у вас другая, пишите так например:
local destmask={"byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","double:3:01234567"}

za9c
08.12.2015, 15:52
Очередность байт?
Если у вас другая, пишите так например:
local destmask={"byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","double:3:01234567"}
Писал по-разному - не помогает!!! скажите пож-та - а эта функция работает на OPC на 32 тега? я просто не пытался ещё на OPC на 500 точек!!!

za9c
08.12.2015, 15:55
опс !!! Извините - пошли данные!!! "double:3:01234567" - помогло - странно - два дня комбинации перебирал - походу в отпуск пора!!!

energvk
10.12.2015, 15:37
Добрый день! Я правильно понимаю, что пункт настройки коммуникационного узла "Modbus поверх TCP" нужно использовать в случаях, если используется связь с ПЛК наподобие удаленных модемов с режимом прозрачной передачи данных. То есть по TCP устанавливается связь с удаленным оборудованием, коммуникационной оборудование (например GPRS-терминал) устанавливает режим прозрачной передачи данных с ПЛК и OPC уже опрашивает плк по modbus rtu/ascii?

SCADAMaster
10.12.2015, 16:03
Да, это для оборудования которое конвертирует Ethernet в COM - Moxa Port и подобные. GPRS модемы также можно сюда отнести.

energvk
10.12.2015, 17:01
Спасибо за информацию

Ваган
28.01.2016, 17:45
не получается настроить opc-сервер на работу с ПР110 через пр-ми485, вот настройки: 22101 22102
в настройках OPC видно МВ110 и ТРМ, они нормально опрашиваются.

rovki
28.01.2016, 18:03
не получается настроить opc-сервер на работу с ПР110 через пр-ми485, вот настройки: 22101 22102
в настройках OPC видно МВ110 и ТРМ, они нормально опрашиваются.
А вы зайдите в тему Области применения ПР110 ,там есть примеры ...

energvk
02.02.2016, 17:40
Добрый день! Успешно по вашей документации читаю файлы вашим ОПС с ПЛК1хх. При том, что файлы создаю не штатным архиватором в конфигурации, а через библиотеку, но содержание в принципе выглядит аналогично, в скрипте практически ничего менять не пришлось. Теперь же пытаюсь считать файл с СПК1хх. Также создаю файл через библиотеку такого же содержания как и в ПЛК1хх. Для обмена с сервером использую библиотеку от ОВЕН modbusTCPslave. Данные передаются без проблем, но как передать файл не могу понять. Данная библиотека поддерживает передачу файлов, и что самое интересное, когда у меня был неправильно в конце строки сформирован разделитель (перепутал местами /R и /N) скрипт об этом сообщил. То есть по идее ОПС видит файл, и при этом, когда он к нему обращается, на выходе блока видно, что файл становится занят. Но при этом в ОПС висит статус COMM_FAILURE и данных нет. Видимо, что-то я не правильно делаю, но что? Может что-то в скрипте изменить нужно?

SCADAMaster
02.02.2016, 18:19
Может быть и нужно.
Сначала нужно посмотреть что происходить в логе обмена - есть ли ответы от контроллера.

energvk
03.02.2016, 00:07
Снял лог, вроде как от контроллера какой то ответ есть:


[02.02.2016 17:49:24.268] Inf : тест:Запрос 0:тест:MODBUS_FILE
[02.02.2016 17:49:24.283] TRACE : (ххх.ххх.ххх.ххх:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
[02.02.2016 17:49:24.670] TRACE : (ххх.ххх.ххх.ххх:502) Rx: [0111] 01 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[02.02.2016 17:49:24.670] Inf : тест:Запрос 0:тест:MODBUS_FILE
[02.02.2016 17:49:24.685] TRACE : (ххх.ххх.ххх.ххх:502) Tx: [0016] 02 00 00 00 00 0A 01 14 07 06 00 00 00 0A 00 0A
[02.02.2016 17:49:25.090] TRACE : (ххх.ххх.ххх.ххх:502) Rx: [0111] 02 00 00 00 00 69 01 14 66 65 06 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 34 36 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 32 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 33 32 20 23 30 30 30 3D
[02.02.2016 17:49:25.090] Inf : тест:Запрос 0:тест:MODBUS_FILE
[02.02.2016 17:49:25.105] TRACE : (ххх.ххх.ххх.ххх:502) Tx: [0016] 03 00 00 00 00 0A 01 14 07 06 00 00 00 14 00 0A
[02.02.2016 17:49:25.490] TRACE : (ххх.ххх.ххх.ххх:502) Rx: [0094] 03 00 00 00 00 58 01 14 55 54 06 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 34 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 38 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 39 3A 31 39 20 23 30 30 30 3D 38 39 36 0A 0D


В последнем варианте, который пробовал, уже под файл выделил отдельный блок
22263
Сначала файл заводил в тот же блок, что и буфер с данными

SCADAMaster
03.02.2016, 08:06
Замените в папке c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\MODULES\ файл OwenPlcHDA.lua на тот что в приложении.
В свойствах сервера включите запись журнала и всех его событий.
Запустите режим исполнения и подождите некоторое время. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Вышлите лог нам.

energvk
03.02.2016, 13:22
Сделал, как вы сказали, по логу видно, что файл считывается, так так переменные не присваиваются, видимо неправильно обрабатывается строка?




[03.02.2016 12:17:02.820] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.1.10
[03.02.2016 12:17:02.820] Inf : Server:Cтарт конфигурации C:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\test_spc_comm.mbp
[03.02.2016 12:17:02.836] Inf : тест:Попытка соединения xxx.xxx.xxx.xxx 502
[03.02.2016 12:17:03.149] Err : тест:Соединение установлено xxx.xxx.xxx.xxx 502
[03.02.2016 12:17:03.149] Inf : тест.текущие:Старт опроса устройства
[03.02.2016 12:17:03.195] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0012] 01 00 00 00 00 06 01 03 00 00 00 29
[03.02.2016 12:17:03.696] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0091] 01 00 00 00 00 55 01 03 52 14 00 0A 10 00 0C 00 0F 00 08 00 03 00 02 00 10 00 05 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 07 E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 C0 00 00 40 80 00 00 40 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[03.02.2016 12:17:03.696] Inf : тест.текущие:Стоп опроса устройства (t = 865 ms) (H41 0,495,6 )
[03.02.2016 12:17:03.696] WRITE : poll_time:Запись в тест.тест.текущие.poll_time значения 24223.000000
[03.02.2016 12:17:03.727] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:03.742] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
[03.02.2016 12:17:04.133] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 01 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[03.02.2016 12:17:04.133] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=16.2.2 15:27:38 #000=896

16.2.2 16:1:3 #000=896

16.2.2 16:9:11 #000=896

16.2.2 16:16:21 #000=896

[03.02.2016 12:17:04.133] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.149] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 02 00 00 00 00 0A 01 14 07 06 00 00 00 0A 00 0A
[03.02.2016 12:17:04.524] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 02 00 00 00 00 69 01 14 66 65 06 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 34 36 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 32 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 33 32 20 23 30 30 30 3D
[03.02.2016 12:17:04.524] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=
16.2.2 16:16:46 #000=896

16.2.2 16:17:10 #000=896

16.2.2 16:17:21 #000=896

16.2.2 16:17:32 #000=
[03.02.2016 12:17:04.524] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.555] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 03 00 00 00 00 0A 01 14 07 06 00 00 00 14 00 0A
[03.02.2016 12:17:04.946] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 03 00 00 00 00 69 01 14 66 65 06 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 34 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 38 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 39 3A 31 39 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 31 35 3A 33 32 20 23 30
[03.02.2016 12:17:04.946] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=896

16.2.2 16:17:43 #000=896

16.2.2 16:18:10 #000=896

16.2.2 16:19:19 #000=896

16.2.3 8:15:32 #0
[03.02.2016 12:17:04.946] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.977] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 04 00 00 00 00 0A 01 14 07 06 00 00 00 1E 00 0A
[03.02.2016 12:17:05.352] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0094] 04 00 00 00 00 58 01 14 55 54 06 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 32 38 3A 37 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 33 32 3A 34 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 31 32 3A 31 32 3A 31 37 20 23 30 30 30 3D 38 39 36 0A 0D
[03.02.2016 12:17:05.352] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=00=896

16.2.3 8:28:7 #000=896

16.2.3 8:32:40 #000=896

16.2.3 12:12:17 #000=896

[03.02.2016 12:17:05.352] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:05.368] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 05 00 00 00 00 0A 01 14 07 06 00 01 00 00 00 0A
[03.02.2016 12:17:05.727] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 05 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[03.02.2016 12:17:05.727] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=16.2.2 15:27:38 #000=896

16.2.2 16:1:3 #000=896

16.2.2 16:9:11 #000=896

16.2.2 16:16:21 #000=896

[03.02.2016 12:17:05.727] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:05.743] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 06 00 00 00 00 0A 01 14 07 06 00 01 00 0A 00 0A
[03.02.2016 12:17:06.164] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 06 00 00 00 00 69 01 14 66 65 06 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 34 36 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 32 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 33 32 20 23 30 30 30 3D
[03.02.2016 12:17:06.164] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=
16.2.2 16:16:46 #000=896

16.2.2 16:17:10 #000=896

16.2.2 16:17:21 #000=896

16.2.2 16:17:32 #000=
[03.02.2016 12:17:06.164] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:06.180] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 07 00 00 00 00 0A 01 14 07 06 00 01 00 14 00 0A
[03.02.2016 12:17:06.539] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 07 00 00 00 00 69 01 14 66 65 06 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 34 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 38 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 39 3A 31 39 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 31 35 3A 33 32 20 23 30
[03.02.2016 12:17:06.539] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=896

16.2.2 16:17:43 #000=896

16.2.2 16:18:10 #000=896

16.2.2 16:19:19 #000=896

16.2.3 8:15:32 #0
[03.02.2016 12:17:06.539] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:06.571] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 08 00 00 00 00 0A 01 14 07 06 00 01 00 1E 00 0A
[03.02.2016 12:17:07.133] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0094] 08 00 00 00 00 58 01 14 55 54 06 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 32 38 3A 37 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 33 32 3A 34 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 31 32 3A 31 32 3A 31 37 20 23 30 30 30 3D 38 39 36 0A 0D
[03.02.2016 12:17:07.133] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=00=896

16.2.3 8:28:7 #000=896

16.2.3 8:32:40 #000=896

16.2.3 12:12:17 #000=896

[03.02.2016 12:18:02.981] Inf : тест.текущие:Старт опроса устройства
[03.02.2016 12:18:03.013] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0012] 02 00 00 00 00 06 01 03 00 00 00 29
[03.02.2016 12:18:04.185] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0091] 02 00 00 00 00 55 01 03 52 14 00 0A 10 00 0C 00 10 00 08 00 03 00 02 00 10 00 05 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 07 E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 C0 00 00 40 80 00 00 40 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[03.02.2016 12:18:04.185] Inf : тест.текущие:Стоп опроса устройства (t = 1205 ms) (H41 0,1181,6 )
[03.02.2016 12:18:04.185] WRITE : poll_time:Запись в тест.тест.текущие.poll_time значения 24225.000000

SCADAMaster
03.02.2016, 13:53
Скорее всего из-за метки времени:
16.2.2 16:16:21 #000=896
16 год вместо 2016.
И в исходной дате (которая была на серии ПЛК1хх) нули в датах выводились. Вот пример:
2012.09.04 13:19:39 #000=0000

energvk
03.02.2016, 14:51
Действительно, год я не учел, проверю. По нулям в датах, раньше не было, но посмотрю как будут без них, если что, тоже исправлю. Спасибо большое за подсказку. И ещё вопрос каким образом выполнять считывание ещё одного файла? Я правильно понимаю, что в тексте должно быть #001 вместо #000 для определения номера файла и достаточно добавить ещё один Modbus_TCP_SERVER c привязкой к нему второго файла или нужно как-то по другому делать?

Изменил год на 2016 и заработало. Правда вместо значения 896 в тэг пишется 2198, буду разбираться

Понял, в шестнадцатиричном формате

SCADAMaster
03.02.2016, 15:24
И ещё вопрос каким образом выполнять считывание ещё одного файла? Я правильно понимаю, что в тексте должно быть #001 вместо #000 для определения номера файла и достаточно добавить ещё один Modbus_TCP_SERVER c привязкой к нему второго файла или нужно как-то по другому делать?

В смысле не один файл читать а два?
Нужно добавить еще одно подустройство, у него в настройках задать номер файла - 1.

energvk
04.02.2016, 09:18
В смысле не один файл читать а два?
Нужно добавить еще одно подустройство, у него в настройках задать номер файла - 1.

Да, я имею ввиду читать два файла. И я знаю, что ужно добавить еще одно подустройство, у него в настройках задать номер файла - 1. У меня так и сделано. Просто я обратил внимание, что второе подустройство, формирует тэги, аналогично первому, хотя в СПК у меня второй файл не добавлен (как видно из вложения выше). То есть получается первое подустройство считывает файл, а затем второе подустройство считывает тот же файл.. Номера в настройках разумеется заданы разные 0 и 1, соответственно

SCADAMaster
04.02.2016, 09:52
Приложите запросы которые выполняют оба подустройства.

energvk
04.02.2016, 10:19
[03.02.2016 12:17:02.820] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.1.10
[03.02.2016 12:17:02.820] Inf : Server:Cтарт конфигурации C:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\test_spc_comm.mbp
[03.02.2016 12:17:02.836] Inf : тест:Попытка соединения xxx.xxx.xxx.xxx 502
[03.02.2016 12:17:03.149] Err : тест:Соединение установлено xxx.xxx.xxx.xxx 502
[03.02.2016 12:17:03.149] Inf : тест.текущие:Старт опроса устройства
[03.02.2016 12:17:03.195] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0012] 01 00 00 00 00 06 01 03 00 00 00 29
[03.02.2016 12:17:03.696] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0091] 01 00 00 00 00 55 01 03 52 14 00 0A 10 00 0C 00 0F 00 08 00 03 00 02 00 10 00 05 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 07 E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 C0 00 00 40 80 00 00 40 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[03.02.2016 12:17:03.696] Inf : тест.текущие:Стоп опроса устройства (t = 865 ms) (H41 0,495,6 )
[03.02.2016 12:17:03.696] WRITE : poll_time:Запись в тест.тест.текущие.poll_time значения 24223.000000
[03.02.2016 12:17:03.727] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:03.742] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
[03.02.2016 12:17:04.133] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 01 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[03.02.2016 12:17:04.133] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=16.2.2 15:27:38 #000=896

16.2.2 16:1:3 #000=896

16.2.2 16:9:11 #000=896

16.2.2 16:16:21 #000=896

[03.02.2016 12:17:04.133] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.149] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 02 00 00 00 00 0A 01 14 07 06 00 00 00 0A 00 0A
[03.02.2016 12:17:04.524] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 02 00 00 00 00 69 01 14 66 65 06 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 34 36 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 32 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 33 32 20 23 30 30 30 3D
[03.02.2016 12:17:04.524] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=
16.2.2 16:16:46 #000=896

16.2.2 16:17:10 #000=896

16.2.2 16:17:21 #000=896

16.2.2 16:17:32 #000=
[03.02.2016 12:17:04.524] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.555] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 03 00 00 00 00 0A 01 14 07 06 00 00 00 14 00 0A
[03.02.2016 12:17:04.946] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 03 00 00 00 00 69 01 14 66 65 06 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 34 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 38 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 39 3A 31 39 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 31 35 3A 33 32 20 23 30
[03.02.2016 12:17:04.946] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=896

16.2.2 16:17:43 #000=896

16.2.2 16:18:10 #000=896

16.2.2 16:19:19 #000=896

16.2.3 8:15:32 #0
[03.02.2016 12:17:04.946] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:04.977] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 04 00 00 00 00 0A 01 14 07 06 00 00 00 1E 00 0A
[03.02.2016 12:17:05.352] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0094] 04 00 00 00 00 58 01 14 55 54 06 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 32 38 3A 37 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 33 32 3A 34 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 31 32 3A 31 32 3A 31 37 20 23 30 30 30 3D 38 39 36 0A 0D
[03.02.2016 12:17:05.352] SCRIPT : <<тест.тест.архив>> : тест.тест.архив:str=00=896

16.2.3 8:28:7 #000=896

16.2.3 8:32:40 #000=896

16.2.3 12:12:17 #000=896

[03.02.2016 12:17:05.352] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:05.368] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 05 00 00 00 00 0A 01 14 07 06 00 01 00 00 00 0A
[03.02.2016 12:17:05.727] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 05 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[03.02.2016 12:17:05.727] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=16.2.2 15:27:38 #000=896

16.2.2 16:1:3 #000=896

16.2.2 16:9:11 #000=896

16.2.2 16:16:21 #000=896

[03.02.2016 12:17:05.727] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:05.743] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 06 00 00 00 00 0A 01 14 07 06 00 01 00 0A 00 0A
[03.02.2016 12:17:06.164] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 06 00 00 00 00 69 01 14 66 65 06 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 34 36 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 32 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 33 32 20 23 30 30 30 3D
[03.02.2016 12:17:06.164] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=
16.2.2 16:16:46 #000=896

16.2.2 16:17:10 #000=896

16.2.2 16:17:21 #000=896

16.2.2 16:17:32 #000=
[03.02.2016 12:17:06.164] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:06.180] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 07 00 00 00 00 0A 01 14 07 06 00 01 00 14 00 0A
[03.02.2016 12:17:06.539] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0111] 07 00 00 00 00 69 01 14 66 65 06 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 37 3A 34 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 38 3A 31 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 39 3A 31 39 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 31 35 3A 33 32 20 23 30
[03.02.2016 12:17:06.539] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=896

16.2.2 16:17:43 #000=896

16.2.2 16:18:10 #000=896

16.2.2 16:19:19 #000=896

16.2.3 8:15:32 #0
[03.02.2016 12:17:06.539] Inf : тест:Запрос 0:тест:MODBUS_FILE
[03.02.2016 12:17:06.571] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 08 00 00 00 00 0A 01 14 07 06 00 01 00 1E 00 0A
[03.02.2016 12:17:07.133] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0094] 08 00 00 00 00 58 01 14 55 54 06 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 32 38 3A 37 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 38 3A 33 32 3A 34 30 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 33 20 31 32 3A 31 32 3A 31 37 20 23 30 30 30 3D 38 39 36 0A 0D
[03.02.2016 12:17:07.133] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=00=896

16.2.3 8:28:7 #000=896

16.2.3 8:32:40 #000=896

16.2.3 12:12:17 #000=896

[03.02.2016 12:18:02.981] Inf : тест.текущие:Старт опроса устройства
[03.02.2016 12:18:03.013] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0012] 02 00 00 00 00 06 01 03 00 00 00 29
[03.02.2016 12:18:04.185] TRACE : (xxx.xxx.xxx.xxx:502) Rx: [0091] 02 00 00 00 00 55 01 03 52 14 00 0A 10 00 0C 00 10 00 08 00 03 00 02 00 10 00 05 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 07 E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 C0 00 00 40 80 00 00 40 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[03.02.2016 12:18:04.185] Inf : тест.текущие:Стоп опроса устройства (t = 1205 ms) (H41 0,1181,6 )
[03.02.2016 12:18:04.185] WRITE : poll_time:Запись в тест.тест.текущие.poll_time значения 24225.000000



Вот в приложенном ранее логе видно
тест.тест.архив и тест.тест.события это два разных подустройства с номерами файлов 0 и 1 соответственно

SCADAMaster
04.02.2016, 10:55
Нет, все корректно:
[03.02.2016 12:17:03.742] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
[03.02.2016 12:17:05.368] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 05 00 00 00 00 0A 01 14 07 06 00 01 00 00 00 0A
Разбирайтесь почему у вас возвращается тот же самый файл.

energvk
04.02.2016, 11:12
А как плк1хх определяет что файл первый или второй, если брать пример из плк100?

SCADAMaster
04.02.2016, 11:37
А вот это вам надо в ОВЕНе уточнять.
ОРС просто посылает Modbus запрос, одним из полей которого является номер файла, а также определенная запись файла. Контроллер должен ответить на этот запрос.

Brewer
04.02.2016, 20:56
Вопрос.Возможно ли из под сервера при изменения определенного тега запустить внешнюю программу? Например тег проверяет качество переменной и при плохом качестве запускает программу командной строки(для примера).

SCADAMaster
04.02.2016, 21:32
Можно - через скрипт. Используйте команду others.CreateProcess( )

Brewer
04.02.2016, 22:29
Можно - через скрипт. Используйте команду others.CreateProcess( )

Если можно ,простой пример.А то по данной команде инфы мало.Или где почитать?

SCADAMaster
05.02.2016, 08:08
others.CreateProcess("c:\\Windows\\notepad.exe","","d:\\Temp\\1.txt",0);

Brewer
05.02.2016, 23:11
others.CreateProcess("c:\\Windows\\notepad.exe","","d:\\Temp\\1.txt",0);

Большое спасибо.Реализовал давнюю идею.

energvk
09.02.2016, 14:25
Да, я имею ввиду читать два файла. И я знаю, что ужно добавить еще одно подустройство, у него в настройках задать номер файла - 1. У меня так и сделано. Просто я обратил внимание, что второе подустройство, формирует тэги, аналогично первому, хотя в СПК у меня второй файл не добавлен (как видно из вложения выше). То есть получается первое подустройство считывает файл, а затем второе подустройство считывает тот же файл.. Номера в настройках разумеется заданы разные 0 и 1, соответственно


Нет, все корректно:
[03.02.2016 12:17:03.742] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
[03.02.2016 12:17:05.368] TRACE : (xxx.xxx.xxx.xxx:502) Tx: [0016] 05 00 00 00 00 0A 01 14 07 06 00 01 00 00 00 0A
Разбирайтесь почему у вас возвращается тот же самый файл.


А вот это вам надо в ОВЕНе уточнять.
ОРС просто посылает Modbus запрос, одним из полей которого является номер файла, а также определенная запись файла. Контроллер должен ответить на этот запрос.

Как я понял, библиотека modbus tcp slave от ОВЕН не поддерживает номера файлов. Соответственно у меня возникло пару идей как можно обойти эту проблему. У меня имеется 3 подустройства в сервере: одно - опрос/чтение переменных, второе и третье - 1-й и 2-й файл. Как вариант, хочу перед началом опроса файла менять тэг в первом подустройстве, который будет переключать файлы для опроса в контроллере, и после того как опс выполнит обратное чтение (в настройках - "Чтение после записи") только начитать читать файл. Я так понимаю, что скриптом же это можно решить?

SCADAMaster
09.02.2016, 21:17
В принципе можно. Можно в скрипте перед началом чтения выполнить Modbus команду записи и записать нужное вам значение в контроллер.
А уже затем будет выполняться код чтения архива.

energvk
10.02.2016, 10:32
Я правильно понял, что я ставлю в теге (файла) Разрешение выполнения скрипта перед записью и пишу в него следующее:

-- Initialization
function OnInit()
end
-- Uninitialization
function OnClose()
end
-- Processing
function OnRead()
server.WriteTag("$(N).$(D).текущие.file_num",0,192);
t1,q1,ts1 = server.ReadTag("$(N).$(D).текущие.file_num");
if q1==192 then
server.PollCurrentDevice( );
end;
end

SCADAMaster
10.02.2016, 11:21
А зачем вам вообще тег? Вам же нужно контроллеру сообщить что будете читать такой то файл.
Выполняете команду modbus.WriteHoldingRegistersAsInt16( ) пишите в нужный Modbus регистр например 0, читаем нулевой файл.
Это нужно вставить в сам код скрипта - в функцию OnBeforeReading(), перед выполнением скрипта чтения файла.

energvk
10.02.2016, 12:43
А зачем вам вообще тег? Вам же нужно контроллеру сообщить что будете читать такой то файл.
Выполняете команду modbus.WriteHoldingRegistersAsInt16( ) пишите в нужный Modbus регистр например 0, читаем нулевой файл.
Это нужно вставить в сам код скрипта - в функцию OnBeforeReading(), перед выполнением скрипта чтения файла.

Не получается почему то
Пишу

function OnBeforeReading()
local err;
err = modbus.WriteHoldingRegistersAsInt16(30,1,true,"10325476",false,0);
end
--вызов кода из файла
dofile(LUA_MODULES.."\\OwenPlcHDA.lua")


В плк изменения тэга тоже не видно
22557

SCADAMaster
10.02.2016, 13:31
Так нельзя. Надо писать прямо в файле OwenPlcHDA.lua
Откройте его любым блокнотом и правьте.

energvk
10.02.2016, 14:09
Вставляю код

local FirstRead=false; --объявление флага первого считывания файла (нужен при докачивании файла)

modbus.WriteHoldingRegistersAsInt16(30,1,true,"10325476",false,0);

if UsePart==true and LastRec>NumRec then --если используется докачивание и есть сохраненный номер записи

В ответ при опросе:

10-02-2016 13:06:25.165 события:WriteModbus : данные должны быть переданы таблицей
10-02-2016 13:06:25.165 архив:WriteModbus : данные должны быть переданы таблицей

SCADAMaster
10.02.2016, 14:52
Вот пример из справки:
--записать 2 значения int16 с адреса 1 c перестановкой байт, не используя команду 6
local w={}
local err
w[1]=5; w[2]=7;
err = modbus.WriteHoldingRegistersAsInt16(1,2,true,"10325476",false,w);
--err: true – ошибка, false – ошибки нет
То есть данные нужно сначала положить в таблицу, перед посылкой.
То есть в вашем случае написать:
w[1]=0;
И w передавать в функцию вместо значения.

energvk
10.02.2016, 15:40
Спасибо большое, недоразобрался с примером из справки. Сделал как вы сказали, переменная стала писаться, но... Даже с учетом того, что переключение выбора файла происходит, что наглядно видно в плк, но второе подустройство всё равно считывает данные первого файла, и потом выдает уже ошибку чтения файла (так как второго файла на плк ещё не существует). У меня подозрение что пока происходит присвоение переменной, опс уже успевает начать чтение файла.

P.S. для 2-ух подустройств создал два аналогичных скрипта с разными значениями w. Может в этом ошибка и нужно делать присваивание w в зависимости от

NumFile=server.ReadSubDeviceExtProperty("NumFile"); --получить номер файла

Или может команду вставить в функцию, выполняющуюся после чтения тэгов?

SCADAMaster
10.02.2016, 16:06
Как хотите - это не играет роли.
Посмотрите по Modbus запросам - корректный ли номер шлется.

energvk
10.02.2016, 16:50
По логу вроде бы всё правильно

2016.2.10 14:4:53 #000=896

[10.02.2016 14:23:22.686] WRITE : avars:Запись в тест.тест.архив.avars значения 896
[10.02.2016 14:23:22.686] WRITE : тест:Запись в FromScript1 значения 1
[10.02.2016 14:23:22.702] TRACE : (ххх.ххх.ххх.ххх:502) Tx: [0015] 17 00 00 00 00 09 01 10 00 20 00 01 02 00 01
[10.02.2016 14:23:23.155] TRACE : (ххх.ххх.ххх.ххх:502) Rx: [0012] 17 00 00 00 00 06 01 10 00 20 00 01
[10.02.2016 14:23:23.155] Inf : тест:Oтвет тест.тест
[10.02.2016 14:23:23.155] Inf : тест:Запрос 0:тест:MODBUS_FILE
[10.02.2016 14:23:23.186] TRACE : (ххх.ххх.ххх.ххх:502) Tx: [0016] 18 00 00 00 00 0A 01 14 07 06 00 01 00 00 00 0A
[10.02.2016 14:23:23.671] TRACE : (ххх.ххх.ххх.ххх:502) Rx: [0111] 18 00 00 00 00 69 01 14 66 65 06 31 36 2E 32 2E 32 20 31 35 3A 32 37 3A 33 38 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 3A 33 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 39 3A 31 31 20 23 30 30 30 3D 38 39 36 0A 0D 31 36 2E 32 2E 32 20 31 36 3A 31 36 3A 32 31 20 23 30 30 30 3D 38 39 36 0A
[10.02.2016 14:23:23.671] SCRIPT : <<тест.тест.события>> : тест.тест.события:str=16.2.2 15:27:38 #000=896

16.2.2 16:1:3 #000=896

SCADAMaster
10.02.2016, 17:33
Тогда разбирайтесь с контроллером - почему он продолжает передавать только один файл.

energvk
10.02.2016, 17:46
Спасибо за помощь, буду дальше ковырять

za9c
15.04.2016, 11:18
Прошу о помощи. В мастер опс юниверсал модбас - поставил пароль на запрет редактирования - сохранил изменения! Запустил мастерскада - параметры отображаются! Хотел изменить в OPC - OPC не даёт ввести пароль для редактирования - можно ли как нибудь восстановить текщую конфигурацию OPC? и убрать пароль!

za9c
15.04.2016, 11:39
Разобрался = создал в опс новую конфигурацию и убрал парольный доступ к редактированию - и всё пошло спс!

Александр88
14.06.2016, 16:42
Возможно ли использовать в ПЛК Eternet как основной канал а GSM как резервный?

SCADAMaster
14.06.2016, 17:19
Вы имеете ввиду для опроса ОРС сервером?
Теоретически можно - но нужно будет сделать два отдельных узла и не нужных держать выключенным (это можно делать функцию скрипта).
Штатное резервирование в нашем ОРС сервере есть только для Ethernet каналов

Alex Tulaev
19.07.2016, 10:23
Нужна помощь по server.SendAndRecieveDataByMask. Запускаю Free Serial Port Monitor на СОМ2, затем читаю данные из Modbus Universal MasterOPC Server. По монитору вижу :

Порт открыт процессом "modbusopcserver.exe" (PID: 3564)

Запрос:19.07.2016 8:34:01.48264

53 59 53 SYS

Ответ:19.07.2016 8:34:01.54564 (+0.0625 seconds)

53 88 E0 A3 A0 2D 32 00 00 38 33 39 31 00 00 00 Sˆ&#224;&#163;*-2..8391...
00 .

Запрос:19.07.2016 8:34:01.56164 (+0.0000 seconds)

FA FE 01 AD 52 FF 00 0F F0 &#250;&#254;.*R&#255;..&#240;

Ответ:19.07.2016 8:34:01.59264 (+0.0313 seconds)

16 00 36 00 21 00 05 22 09 15 20 02 10 80 24 39 ..6.!..".. ..€$9
C8 42 00 00 00 00 57 02 31 07 15 8C 13 80 3F 00 &#200;B....W.1..Œ.€?.
00 00 00 33 93 88 43 66 A6 3F 00 FF 00 00 44 03 ...3“ˆCf¦?.&#255;..D.
07 83 EF 45 9C 04 5A BA CA 48 9C 04 F8 C8 0C 44 .ƒ&#239;Eœ.Z&#186;&#202;Hœ.&#248;&#200;.D
96 00 F0 B8 EB 41 E4 7A F0 42 FF FF FF FF 00 00 –.&#240;&#184;&#235;A&#228;z&#240;B&#255;&#255;&#255;&#255;..
00 00 00 00 00 00 00 00 01 00 05 04 13 22 09 15 ............."..
21 14 03 08 15 A8 A8 DB 43 7F 70 EB 01 C6 43 00 !....&#168;&#168;&#219;Cp&#235;.&#198;C.
00 00 00 44 06 FF FF 02 FF 00 00 59 EE 01 FF 00 ...D.&#255;&#255;.&#255;..Y&#238;.&#255;.
00 FF FF FF FF 00 00 00 00 00 00 C5 80 97 3E 00 .&#255;&#255;&#255;&#255;......&#197;€—>.
00 00 00 14 00 00 00 00 00 00 00 00 00 D4 5F 86 .............&#212;_†
49 BE 0F FF FF FF FF 00 00 00 00 00 00 EB 8A 56 I&#190;.&#255;&#255;&#255;&#255;......&#235;ŠV
3E 94 10 8C 13 80 3F 80 00 82 44 00 00 00 04 FF >”.Œ.€?€.‚D....&#255;
FE 4F 7F 74 04 10 24 41 42 50 21 00 09 04 58 24 &#254;Ot..$ABP!...X$
45 10 64 00 09 00 0C 40 00 80 50 80 59 54 13 A4 E.d....@.€P€YT.¤
14 0A 55 14 60 00 40 44 1C 00 44 00 0A 40 03 00 ..U.`.@D..D..@..
41 BA A&#186;

По логу ОРС :

[19.07.2016 8:34:01.390] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.2.9
[19.07.2016 8:34:01.390] Inf : Server:Cтарт конфигурации C:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\IRGA.mbp
[19.07.2016 8:34:01.656] Inf : Irga:Порт 2 открыт
[19.07.2016 8:34:01.656] TRACE : (COM2) Tx: [0003] 53 59 53
[19.07.2016 8:34:01.734] TRACE : (COM2) Rx: [0002] 53 88
[19.07.2016 8:34:01.734] TRACE : (COM2) Tx: [0009] FA FE 01 AD 52 FF 00 0F F0
[19.07.2016 8:34:01.781] TRACE : (COM2) Rx: [0004] 16 00 36 00

По первому запросу монитор показывает, что считано 17 байт, а ОРС - всего два. По второму запросу монитор показывает, что считано 242 байта, а ОРС - всего четыре. Как получить весь буфер чтения?

SCADAMaster
19.07.2016, 11:09
У вас судя по всему возникает разрыв пакета.
Выделите узел и задайте межсимвольный таймаут - 300-400 мс.

Alex Tulaev
19.07.2016, 11:35
Спасибо, заработало.

Alexandr Ryzhikov
08.08.2016, 11:08
Здравствуйте! У меня осуществляется считывание и запись параметра из OPC сервера в прибор ТРМ210. При первом изменении параметра, он записывается корректно, дальнейшее изменение ни к чему не приводит. В чем может заключаться проблема?
Тег записи:
-- Initialization
function OnInit()
end
-- Uninitialization
function OnClose()
end
-- Processing
function OnWrite()
-- ust, q=server.ReadTagByRelativeName("уставка");
ust, q=server.ReadCurrentTag();
ust2=ust;
dp_val, dp_q=server.ReadTagByRelativeName("dp");
if dp_q==OPC_QUALITY_GOOD and dp_val>=0 and dp_val<=3 then
ust=ust*10^dp_val;
server.WriteCurrentTagToDevice(ust, q); --правленное значение занесем в устройство
server.WriteCurrentTag(ust2, q); --неизмененное еще значение занесем в тег на opc-сервере
end;
end

SCADAMaster
08.08.2016, 11:33
Пришлите вашу конфигурацию.

Alexandr Ryzhikov
08.08.2016, 12:04
http://muonium.rgho.st/8gx4KwX62
Конфигурация. Еще есть проблема со считывание графиков с ТРМ132М, при включении их считывания сервер перестаёт отправлять запросы на все приборы, после остановки и запуска сервера выводится сообщение об ошибке COM порта. После перезапуска сервера ситуация повторяется сначала.
Заранее спасибо!

SCADAMaster
08.08.2016, 12:33
Почему у вас конфигурация mbc? У вас старая версия ОРС сервера?
Обновитесь до текущей 3.2.10 и проверьте на ней:
http://insat.ru/prices/info.php?pid=6944

Alexandr Ryzhikov
08.08.2016, 12:43
Извиняюсь, старый файл выбрал. Вот новый.
http://rgho.st/7QhDKFSYW

SCADAMaster
08.08.2016, 13:05
Укажите путь к тегу с проблемным скриптом.

Alexandr Ryzhikov
08.08.2016, 13:12
ТРМ210-уставка/уставка

SCADAMaster
08.08.2016, 13:23
Нет такого.
У похожего тип доступа стоит только на чтение.

Alexandr Ryzhikov
08.08.2016, 13:56
На скриншоте выделено.
25748

SCADAMaster
08.08.2016, 15:28
Попробуйте вначале скрипта записи добавить строчку:
if server.IsWriteFromScript( )==true then return; end;
Но в версии 3.2.10 эта функция работать перестала - мы с этим разберемся.

Alexandr Ryzhikov
08.08.2016, 16:10
Спасибо большое! Пока не заработало.

energvk
12.08.2016, 14:49
Добрый день! Возникли некоторые проблемы при опросе опс-сервером архивов. На объекте в программе плк забыл при формировании строки добавить символ =, в результате чего конец строки получается вида "#000512\N\R", вместо "#000=512\N\R"

Соответственно, скрипт


local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
local str1=string.sub(str,1,n-1 ); --выделяем строку после символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local k,z= string.find(str1, "=" ); --разбираем остальные элементы после символа "="
if k~=nil and z~=nil then
local str2=string.sub(str1,z+1); --символ найден - выделяем подстроку со значением
local str3=string.sub(str1,1,z-1); --символ найден - выделяем подстроку с номером
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
else
Correct=false;
TimeVal=nil;
break; --символ не найден - ошибка
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;

не обработает данные строки.
Так как объект удаленный, решил скорректировать код скрипта, получив


local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
local str1=string.sub(str,1,n-1 ); --выделяем строку после символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local str2=string.sub(str1,1,3); --выделяем подстроку со значением
server.Message("номер найден. sym=",str2);
local str3=string.sub(str1,4); --символ найден - выделяем подстроку с номером
server.Message("значение найдено. val=",str3);
if string.len(str3)<6 then --(для случаев некорректного получения переменной)
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;


Этот вариант кода не работает, хотя в терминале вижу корректные и номера и значения переменной в процессе обработки. Но запись при этом в тэги не происходит. Точнее записывается только если значение переменной (val) = 1. Значения же отличные от 1 не записываются
Что я делаю не так?

Кусок лога терминала



12-08-2016 13:33:09.878 объект.архив:значение найдено. val=32
12-08-2016 13:33:09.877 объект.архив:символ найден. sym=001
12-08-2016 13:33:09.877 объект.архив:значение найдено. val=2
12-08-2016 13:33:09.877 объект.архив:символ найден. sym=001
12-08-2016 13:33:09.877 объект.архив:значение найдено. val=16
12-08-2016 13:33:09.877 объект.архив:символ найден. sym=001
12-08-2016 13:33:09.877 объект.архив:значение найдено. val=2
12-08-2016 13:33:09.876 объект.архив:символ найден. sym=000
12-08-2016 13:33:09.876 объект.архив:str= 11:28:14#0002

2016.7.22 11:28:15#00116

2016.7.22 11:30:17#0012

2016.7.22 11:30:17#00132

2016.7.
12-08-2016 13:33:08.645 объект.архив:значение найдено. val=16
12-08-2016 13:33:08.644 объект.архив:символ найден. sym=001
12-08-2016 13:33:08.644 объект.архив:значение найдено. val=1
12-08-2016 13:33:08.644 объект.архив:символ найден. sym=001
12-08-2016 13:33:08.643 объект.архив:значение найдено. val=8
12-08-2016 13:33:08.643 объект.архив:символ найден. sym=001
12-08-2016 13:33:08.643 объект.архив:значение найдено. val=512
12-08-2016 13:33:08.643 объект.архив:символ найден. sym=000
12-08-2016 13:33:08.642 объект.архив:str=:27:10#000512

SCADAMaster
12.08.2016, 15:21
Проверяйте - записались ли они в таблицу. Добавьте дальше по программе - где происходит запись в теги server.Message, где значения пропадают.

energvk
12.08.2016, 16:13
добавил сообщений:




local n,l= string.find(str, "#" ); --флаг разбора символа " #"
if n~=nil and l~=nil then --если найден символ
server.Message("найден символ ","#");
local str1=string.sub(str,1,n-1 ); --выделяем строку до этого символа
if TimeVal==nil then --получаем время строки
NoErr,time=pcall(StrToTime,str1); --вызов функции преобразования в безопасном режиме
if NoErr==true and time~=nil then
TimeVal=time; --ошибки нет - сохраняем время
else
Correct=false; --ошибка - строка некорректная
break; --выходим из цикла
end;
else
local str2=string.sub(str1,1,3); --выделяем подстроку со значением
server.Message("номер найден, ",str2);
local str3=string.sub(str1,4); --символ найден - выделяем подстроку с номером
server.Message("значение найдено, val=",str3);
if string.len(str3)<6 then
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
server.Message("вставили элемент в таблицу - ", elem[str3+1]);
end;
end;
str=string.sub(str,l+1 ); --выделяем оставшийся кусок строки и дальше разбираем его
end;
until n==nil or l==nil; --выходим из цикла если разделитель не найден
return Correct,TimeVal,elem; --возвращаем найденные элементы
end;

function WriteToTag(InSrt,InTags,ToHDA) --функция записи значений в теги
local NoErr,TimeVal;
local Elem={};
NoErr,TimeVal,Elem=StringToElement(InSrt);
if NoErr==true and TimeVal~=nil then
local count=table.maxn(InTags);
if table.maxn(Elem)<count then count=table.maxn(Elem); end; --находим минимальное значение
for i=1,count,1 do
if Elem[i]~=nil then
local val;
--if InTags[i]=="int32" or InTags[i]=="uint32" or InTags[i]=="int16" or InTags[i]=="uint16"
--then --целые числа передаются в 16-ричном формате
--val = tonumber(Elem[i], 16) --преобазуем строку с 16-ричным числом в десятичное
--else
val=Elem[i];
server.Message("записываем значение в тэг, ", i);
server.Message("Значения=",server.TimeStampToString(TimeVal)," ", Elem[1]," ",Elem[2]);

--end;
if ToHDA==true then
server.WriteTagByNumberToHda(i-1,val,OPC_QUALITY_GOOD,TimeVal);
else
server.WriteTagByNumber(i-1,val,OPC_QUALITY_GOOD,TimeVal);
end;
end;
end;
server.Message("Значения=",server.TimeStampToString(TimeVal)," ", Elem[1]," ",Elem[2]);
end;
return TimeVal;--возвращаем значение времени
end;



В сообщении скриптов вижу следующее:



12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:30.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=16
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:29.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=32
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:28.000 nil nil
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=16
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:найден символ #
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:26.000 nil 001
12-08-2016 14:58:48.860 объект.архив:Значения=2016-08-05 08:57:26.000 nil 001
12-08-2016 14:58:48.860 объект.архив:записываем значение в тэг, 2
12-08-2016 14:58:48.860 объект.архив:вставили элемент в таблицу - 001
12-08-2016 14:58:48.860 объект.архив:значение найдено, val=1
12-08-2016 14:58:48.860 объект.архив:номер найден, 001
12-08-2016 14:58:48.859 объект.архив:найден символ #
12-08-2016 14:58:48.859 объект.архив:найден символ #
12-08-2016 14:58:48.859 объект.архив:str=16.8.5 8:57:26#0011

2016.8.5 8:57:28#00116

2016.8.5 8:57:29#00132

2016.8.5 8:57:30#00116

SCADAMaster
12.08.2016, 17:11
Вот тут вы что то напутали:
local str2=string.sub(str1,1,3); --выделяем подстроку со значением
server.Message("номер найден, ",str2);
local str3=string.sub(str1,4); --символ найден - выделяем подстроку с номером
server.Message("значение найдено, val=",str3);
if string.len(str3)<6 then
elem[str3+1]=str2; --вставляем в таблицу полученный элемент
server.Message("вставили элемент в таблицу - ", elem[str3+1]);
end;

str2 - выделяете начало строки, то есть номер, но затем работаете с ним, как будто это значение. Аналогично с str3.

energvk
13.08.2016, 14:10
Не знаю, код взят из оригинального скрипта

local k,z= string.find(str1, "=" ); --разбираем остальные элементы по символа "="
if k~=nil and z~=nil then
local str2=string.sub(str1,z+1); --символ найдет - выделяем подстроку со значением
local str3=string.sub(str1,1,z-1); --символ найден - выделяем подстроку с номером
elem[str3+1]=str2; --вставляем в таблицу полученный элемент

Он же рабочий, поэтому не пойму, что не так.

Всё, я понял что вы имеете ввиду, спасибо большое за подсказку

SCADAMaster
17.08.2016, 13:16
Спасибо большое! Пока не заработало.
Ошибка исправлена - обновитесь до текущей версии ОРС сервера.
Добавлять server.IsWriteFromScript( ) не нужно.

OlegGEORG
03.10.2016, 09:09
Добрый день!
Подскажите пожалуйста. Пишу скрипт на Луа с использованием побитовых операторов. В стандартном интерпретаторе под
Windows для Луа 5.1 отсутствуют библиотеки для работы с битами. Можно ли подключить вашу библиотеку к этому интерпретатору для проверки кода до вставки в OPC сервер (на-пример, кодом вычисляю число, print - проверяю число)?
Или как проверить тоже самое средствами сервера без запуска тегов?

SCADAMaster
03.10.2016, 09:53
Нет, вставить нашу библиотеку не получится.

OlegGEORG
05.10.2016, 07:53
Добрый день!
В одном из Ваших примеров по реализации собственных протоколов путем побитового сдвига получаете из 16-битного числа 32-битное. Мне нужно операции побитовых сдвигов производить с 8-битным числом, но данное число должно оставаться 8-битным. Мне нужно заранее объявить переменные 8-битным числом? Как это сделать?
Спасибо.

SCADAMaster
05.10.2016, 08:50
В Lua нельзя явно указать битность числа.
Но проблема решается очень просто - после сдвига примените маску по "Логическое И" с числом 255 (8 единиц).

OlegGEORG
06.10.2016, 09:12
Добрый день!
Мне необходимо поменять биты в 8-битном числе, т.е. 7 бит на место 0-бита, 6 бит на место 1-бита и т.д.
Правильный ли следующий код?
local a --число до перестановки бит
local b --нужное число после перестановки бит
for i=0,7,1 do --цикл по битам байта
c=bit.BitFromData(a,i)
b=bit.BitToData(b,c,(-1(i-7)))
return b
end

Спасибо.

SCADAMaster
06.10.2016, 09:49
Зачем -1 в bittodata?
Примерно так:
function OnInit()
local a=78 --число до перестановки бит
local b=0; --нужное число после перестановки бит
for i=0,7,1 do --цикл по битам байта
c=bit.BitFromData(a,i)
b=bit.BitToData(b,c,7-i)
end
server.Message("b=",b )
end

OlegGEORG
06.10.2016, 11:58
Спасибо большое!

OlegGEORG
13.10.2016, 09:36
Добрый день!
Можно ли функцией server.Message вывести число в двоичном виде? В справке информацию не нашел.
Спасибо

SCADAMaster
13.10.2016, 09:59
Готовой функции, преобразования нет. Примеры кода можно найти:
http://www.programmersforum.ru/showthread.php?t=78385

OlegGEORG
13.10.2016, 10:13
Спасибо. Жаль конечно. server.Message помогает отлаживать код.

energvk
13.10.2016, 11:18
Добрый день. Не планируется внести в сервер возможность сортировки тегов по адресам? Существующая функциональность перемещения тегов по дереву объекта очень сильно тормозит

SCADAMaster
13.10.2016, 11:33
Ну вообще она уже года 2 как есть.
На вкладке Таблица тегов можно отсортировать адреса.
Или вы имеете ввиду в режиме исполнения?

alexx751
21.11.2016, 16:48
Как извлечь время из OPC-HDA запроса от клиента, чтобы в скрипте запросить данные из источника за конкретный период, а не весь диапазон?

SCADAMaster
21.11.2016, 17:01
Наш ОРС сервер не поддерживает такой режим - есть некоторые проблемы при работе с ним.
Мы в наших ОРС серверах поступаем проще - на уровне устройства задается настройка глубины запроса данных, которую может задать пользователь.

energvk
21.11.2016, 17:34
Ну вообще она уже года 2 как есть.
На вкладке Таблица тегов можно отсортировать адреса.
Или вы имеете ввиду в режиме исполнения?

Пропустил Ваш ответ. Я имею ввиду при добавлении нового тега: то есть, к примеру, есть 250 тэгов в устройстве. Добавляю новый тэг(и) с адресом, например 112. В таблице тэгов сортирую по адресации и применив групповые операцию меняю остальную адресацию Это работает. Но в устройстве этот тэг остаётся последним, и, соответственно, чтобы он импортировался в скаду 112-м (для визуального удобства), а не 251 нужно в дереве устройства его довольно долго поднимать вверх. Ну или в скаде (там намного быстрее это происходит).

SCADAMaster
21.11.2016, 18:02
То есть вас интересует поднятие его вверх?
Здесь решения нет - контрол не поддерживает drag and drop. Поэтому только с помощью Shift + Вверх

alexx751
21.11.2016, 18:18
Наш ОРС сервер не поддерживает такой режим - есть некоторые проблемы при работе с ним.
Мы в наших ОРС серверах поступаем проще - на уровне устройства задается настройка глубины запроса данных, которую может задать пользователь.
Спасибо за ответ. Будем выкручиваться.

energvk
21.11.2016, 19:08
То есть вас интересует поднятие его вверх?
Здесь решения нет - контрол не поддерживает drag and drop. Поэтому только с помощью Shift + Вверх

Это я понял. Просто работает с большими тормозами

alexx751
30.11.2016, 13:30
Все таки есть или нет возможность отловить событие чтения HDA-тега клиентом?
Периодически читать весь массив значений как-то нехорошо:)

SCADAMaster
30.11.2016, 13:44
Нет, нельзя.
Читайте определенное количество записей при старте.
А дальше можно читать не весь архив, а только свежую часть - сохранить время последней считанной записи и читать с нее.

@ndrew
13.12.2016, 09:41
Добрый день!
Подскажите пожалуйста, есть ли возможность по значению дискретного тега включать в работу и выключать коммуникационный узел, отвечающий за GSM-модем? То есть, необходимо раз в час прочитать несколько значений с удаленного счетчика. Предполагаю, что при появлении этой необходимости, нужно включить узел в работу, чтобы модем установил соединение, прочитать значения в SCADA-систему, а затем выключить узел (модем через некоторое время разорвет соединение из-за отсутствия обмена данных). Попытался сделать это следующим образом:
В узле GSM-модема "Port" (COM-порт) в скрипт добавил функцию:
function Control(b)
if b==true then
server.SetNodeToOnOff(true);
else
server.SetNodeToOnOff(false);
end;
return "OK"
end
Также добавил вспомогательный программный узел - программное устройство - тег "server only" (это собственно флажок чтения данных из счетчика) со скриптом "после чтения тега":
function OnRead()
local res;

val,q=server.ReadCurrentTag();
res=server.RunFunctionFromNodeByName("Port","Control",1,val);

end

Но не работает такая конструкция...

SCADAMaster
13.12.2016, 11:07
Должна работать.
Нет необходимости выносить отдельный узел. Разместите server.SetNodeToOnOff() в тег типа ServerOnly, в скрипт "Перед записью". Тогда он будет исполнятся, даже если узел выключен.

@ndrew
13.12.2016, 11:56
Большое спасибо! Все заработало!

alexx751
14.12.2016, 17:00
OPC HDA возвращает качество тега 0x000400C0. Так и должно быть? В спецификациях что-то не нашел.

SCADAMaster
14.12.2016, 17:57
Вообще это хороший признак качества, но с каким-то оттенком.
Вы сами его формируете? Как вы его определили?

alexx751
14.12.2016, 20:26
Вот и я об этом. По идее должно быть C0, но это в принципе качество для OPC DA. Вообще OPC HDA качество какая-то мутная тема.
У нас используется несколько OPC HDA серверов разных производителей, все они возвращают при GOOD - C0.
На вашем сервере настроил HDA. Качество сам в скрипте формирую, по вашим примерам (C0). Скада (не MasterSCADA, другого производителя) все читает и пишет в свою БД, только качество BAD.
А 0x000400C0 я увидел под отладчиком, когда начал разбираться в чем дело (у нас есть исходники OPC HDA и OPC DA клиентов для используемой скада, уже не раз они выручали - почему-то несмотря на стандарты каждый программист OPC-сервера считает своим долгом привнести что-то своё).
Сами понимаете что для себя проблему решили, хотелось уточнить - может неправильно интерпретируем коды качества?

alexx751
15.12.2016, 13:38
Кажется разобрался.
0004 - необработанные (raw) данные, 00C0 - признак GOOD (как в OPC DA).

SCADAMaster
15.12.2016, 13:54
Да, все верно.

OlegGEORG
28.12.2016, 15:09
Добрый день.
В Руководстве по языку Lua 5.1 для MasterOPC Universal Modbus Server написано, что функция server.SendAndReceiveDataByMask в скрипте должна находиться на уровне узла (узла COM). В руководстве пользователя
при реализации собственных протоколов приведен пример для протокола Rnet, где данная функция расположена в теге.
Или я что-то путаю. Как сделать правильно? Правильно ли будет разместить эту функцию в скрипте узла, расчет CRC в скрипте устройства, а в тегах все остальное?

SCADAMaster
28.12.2016, 15:43
Функцию можно размещать где угодно.


Правильно ли будет разместить эту функцию в скрипте узла, расчет CRC в скрипте устройства, а в тегах все остальное?
Уж лучше тогда и функцию и расчет суммы на уровне устройства

OlegGEORG
02.01.2017, 15:27
Добрый день!
Не работает функция err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen).
Вот код в теге:
function OnRead()
-- инициилизация устройства
local send={1,2,3,4,5,6}; --кадр запроса
local Length=table.maxn(send); --вычисление длины запроса в байтах
local srcbuf="";
srcbuf=server.TableToString(send); --байты данных строки для посылки
server.Message("srcbuf-данные для передачи ",srcbuf);
local srclen=table.maxn(send); --количество байт данных с учетом байта CRC
server.Message("srclen-длина данных в байтах ",srclen);
local dstlen=20; --длина принимаемых данных
local err,len;
local buf="";
--запрос к устройству
server.Message("srcbuf-данные для передачи окончательные",srcbuf);
server.Message("srclen-длина данных в байтах окончательная ",srclen);
err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen); --посылаем и принимаем байты от устройства
--[[Входные параметры: srcbuf-данные для передачи, srclen-длина данных в байтах, dstlen-длина принимаемых данных.
err=TRUE при ошибке выполнения функции, buf – строка с принятыми данными (nil, если приема не было),
len – длина buf.--]]
--принят ответ. Проверим контрольную сумму
end

Вот лог:
[02.01.2017 18:23:51.230] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.2.20
[02.01.2017 18:23:51.231] Inf : Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\OPC_PRIBOR.mbp
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи 123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах 6
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи окончательные123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах окончательная 6
[02.01.2017 18:23:51.247] Inf : ПортCOM:Порт 1 открыт
[02.01.2017 18:23:51.247] TRACE : (COM1) Tx: [0006] 06 01 31 01 32 01
[02.01.2017 18:24:02.356] Inf : ПортCOM:Порт 1 закрыт
[02.01.2017 18:24:02.769] Inf : Server:Завершение работы

В порт уходят другие данные. В чем проблема не понятно.

OlegGEORG
02.01.2017, 15:30
Выше пример без CRC:
local srclen=table.maxn(send); --количество байт данных

SCADAMaster
02.01.2017, 16:14
Если нужно посылать в порт числа, то лучше использовать sendandrecivedatabymask.
Ознакомьтесь с этой документацией:
http://www.insat.ru/products/Universal_MasterOPC/MU_MasterOPC_Server_API_UG.pdf

OlegGEORG
03.01.2017, 09:54
Добрый день!
Да, server.SendAndReceiveDataByMask() работает. Хотел упростить себе задачу и не использовать
маски преобразования. Поэтому решил использовать server.SendAndReceiveData.
Тогда в каких случаях используется функция server.SendAndReceiveData, все-таки интересно?

OlegGEORG
03.01.2017, 10:11
И еще вопрос.
Код из примера:
local err,len,lenbuf;
local bufs=""; --строка принятых байт
err,dest,len,bufs,lenbuf=server.SendAndReceiveData ByMask...

Т.е. bufs - строка принятых байт. Раз это строка, то ее вроде можно сразу отправить на подсчет CRC.

Но в примере строку преобразуем в таблицу, а таблицу опять в строку для отправки на подсчет CRC:
--преобразование из строки в таблицу байт
local buf={}; --таблица принятых байт
for i = 1, lenbuf, 1 do
table.insert (buf,string.byte(bufs,i));
end
s = server.TableToString(buf); --вызов функции для подсчета контрольной суммы CRC=server.RunFunctionFromDevice("CRCsum",1,s,lenbuf-1); и т.д.

И вот строка s получается с нормальными данными, полученными от устройства.

И на самом деле, без этого двойного преобразования не работает. Принятые данные local bufs="" - не понятно что.
Т.е. получается - понятие "строка" имеет разные значения ?

OlegGEORG
03.01.2017, 10:27
Имеется ли к Modbus Universal MasterOPC Server конфигурация на Промышленный датчик (преобразователь) влажности и температуры воздуха ОВЕН ПВТ100? Ссылка на конфигурации для различных устройств на сайте insat.ru не работает.
Спасибо.

SCADAMaster
03.01.2017, 11:52
Т.е. получается - понятие "строка" имеет разные значения ?
Данный аргумент - это строка из всех символом принятых байт.
Для подсчета контрольной суммы, как правило, нужно использовать массив байт. А массивы между узлами не передаются, поэтому и преобразуются в строку. Посмотрите в документации пример 4 документации.


Имеется ли к Modbus Universal MasterOPC Server конфигурация на Промышленный датчик (преобразователь) влажности и температуры воздуха ОВЕН ПВТ100?

Готовой конфигурации нет, но учитывая что там всего 10 регистров, вы можете легко сделать ее самостоятельно штатными функциями сервера

OlegGEORG
07.01.2017, 16:02
Добрый день!
Веду опрос устройства с периодичностью 1 сек. тегом с помощью функции server.SendAndReceiveDataByMask
в скрипте - функция function OnRead(). Работает.
Для инициализации устройства для однократного выполнения тот же самый код записываю в тег
в функцию function OnInit(). Данные не отсылаются. Пробовал записать в функцию function OnInit() устройства,
тоже ничего.
Что делаю неправильно?

OlegGEORG
07.01.2017, 16:06
И, если можно, все-таки, в каких случаях используется функция server.SendAndReceiveData (спрашивал выше #454).

SCADAMaster
09.01.2017, 12:43
Добрый день!
Веду опрос устройства с периодичностью 1 сек. тегом с помощью функции server.SendAndReceiveDataByMask
в скрипте - функция function OnRead(). Работает.
Для инициализации устройства для однократного выполнения тот же самый код записываю в тег
в функцию function OnInit(). Данные не отсылаются. Пробовал записать в функцию function OnInit() устройства,
тоже ничего.
Что делаю неправильно?
Так нельзя делать, в этот момент порт еще не открыт.
Нужно все делать в цикле OnRead.
Создаете вне функций переменную, например Start инициализируете ее False. В OnRead проверяете - если false, то выполняете нужный вам запрос. Запрос корректно выполнен - взводим Start в true.

SCADAMaster
09.01.2017, 12:44
И, если можно, все-таки, в каких случаях используется функция server.SendAndReceiveData (спрашивал выше #454).
Когда нужно получить чистую строку, а уже потом парсить ее вручную.

OlegGEORG
09.01.2017, 15:50
Спасибо за ответы!

Metasys
18.01.2017, 08:38
Здравствуйте! В декабре 2016 купили Modbas OPC безлимитный. Используется MasterSCADA на 1000 точек - планируем расширение. На ПК используется WinXP - перейти на 7-ку нет возможности - основной контроль через OPC BRC Server Version IW-SCP 4_0, который работает только под XP. При установке и последующем запуске выдает сообщение "Точка входа в процедуру InterlockedCompareExchange64 не найдена". Вопрос - можно ли как нибудь заставить работать Ваш сервер под XP? Интересно, демо-версия устанавливается и работает без нареканий...
С уважением...

SCADAMaster
18.01.2017, 09:15
Демо версия той же версии? Или более ранняя? Попробуйте на текущей.
В связи с переходом на новый компилятор и прекращением поддержки Windows XP наш ОРС сервер более в ней не работает. Можно попробовать установить на XP последние доступные обновления - тогда может заработать.

Metasys
18.01.2017, 11:42
Спасибо, попробуем. А если под 7-кой попробовать для замены OPC BRC Server Version IW-SCP 4_0 Ваш мультипротокольный сервер? Этот OPC BRC Server Version IW-SCP 4_0 из IndraWorks. Modbus пригодится для другого оборудования.
С уважением...

SCADAMaster
18.01.2017, 12:06
А если под 7-кой попробовать для замены OPC BRC Server Version IW-SCP 4_0 Ваш мультипротокольный сервер?
Нам не известно что это такое, и по какому протоколу работает.

Metasys
18.01.2017, 18:20
28791
Это наш проект. Вместо первого на 32 точки куплен безлимитный. Второй зверек - стандартный OPC DA сервер. Находится через поиск - СКАДА его видит. В этой машине 14822 переменных - начальство хочет каждый чих писать с трендами и отчетами. Когда заказывали Modbus OPC server U никто не предупредил...

SCADAMaster
18.01.2017, 19:19
Так в чем вопрос?
Судя по скриншоту на Windows 7 он запустился.
Очень часто ПО разработанное для XP нормально работает на Windows 7 если выключить UAC или инсталлировать его не в Program Files.

Metasys
19.01.2017, 02:42
Это скриншот с домашнего ноута. На рабочей машине - Win XP. Каким компилятором пользуетесь? Буду копать в том направлении...

SCADAMaster
19.01.2017, 08:46
Компилятор Embarcadero RAD Studio

Metasys
19.01.2017, 17:46
Спасибо! Будем пробовать по всем направлениям. Если получится - планируем взять Вашу безлимитную MasterSCADA.

energvk
23.01.2017, 11:46
В приложении dll библиотека в архиве. Замените этой библиотекой ту что в папке
c:\Program Files\InSAT\MasterOPC Universal Modbus Server\


Только что скачал бесплатную версию сервера.
При установке выскакивает сообщение "Точка входа не найдена" и соответственно сервер не запускается. ОС - WinXP.
Вчем причина?

Аналогичная проблема. WinXP SP2.

28853

Скопировал dll проблему не решило.

SCADAMaster
23.01.2017, 12:02
Windows XP более не поддерживается. Используйте более современные ОС

OlegGEORG
23.01.2017, 12:28
Добрый день!
Преобразованием в скрипте получаю десятичное число float c 5 знаками после запятой, после записываю в тег.
Как преобразовать в число с одним знаком после запятой в скрипте?
Спасибо.

SCADAMaster
23.01.2017, 12:54
С помощью функции
math.floor(val*10)/10

energvk
23.01.2017, 13:08
Windows XP более не поддерживается. Используйте более современные ОС

К сожалению в данном случае это не возможно. Кстати этот же дистрибутив на SP3 нормально работал.

Может возможно установить более раннюю версию сервера для возможности работы?

SCADAMaster
23.01.2017, 13:09
Кстати этот же дистрибутив на SP3 нормально работал.

Может тогда просто установить обновления на XP до SP3?

energvk
23.01.2017, 14:03
На 3-м сервис паке у нас некорректно работает другое ПО

SCADAMaster
23.01.2017, 14:48
К сожалению других вариантов предложить не можем.
Старые версии ОРС серверов мы не собираем.

a_sergeevich
25.01.2017, 09:05
Пытаюсь прочитать через ОРС мдвв, но не получается, всё время в качестве пишет BAD. Конфигурацию использую готовую, т.е импортированную для мдвв.
Настройки мдвв:
Скорость обмена данными: 115200
Длина слова данных: 8
Тип контроля чётности: Отсутствует
Кол-во стоп битов: 1
Длина сетевого адреса: 8
Базовый адрес прибора: 16
Протокол обмена: Modbus-RTU
Максимальный сетевой тайм-аут: 0
Задержка ответа по RS-485: 2 мс

Настройки в ОРС: Узел <<COM RTU-Master>>:mdvv1
Включен в работу: True
Порт: 13
Скорость: 115200
Данные: 8
Контроль четности: Нет
Стоп-биты: 1
Межсимвольный таймаут: 0
Использовать ASCII: False
Использовать модем: False

Вот что пишет:
25-01-2017 11:01:04.716 mdvv1.МДВВ:Включен таймаут ошибки запроса 1
25-01-2017 11:01:04.716 МДВВ:Ошибка выполнения команды 3 в устройстве 16 от МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:03.684 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:02.653 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:01.623 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:01.623 mdvv1:Порт 13 открыт
25-01-2017 11:01:01.608 Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\mdvv1.mbp
25-01-2017 11:01:01.608 Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.0.0.7

МДВВ к ПК подключен через АС4 USB-RS485 адаптер.

Где копать ?

SCADAMaster
25.01.2017, 09:18
Порт открывает, но прибор не отвечает.
Подключитесь конфигуратором к МДВВ, проверьте еще раз все настройки в нем - адрес, скорость, честность, стоп-биты, протокол.
После этого отключите конфигуратор. Выключите питание прибора и включите снова - после этого проверяйте

a_sergeevich
25.01.2017, 12:31
всё заработало после выключения включения питания. Никогда бы не подумал, что надо выключать включать питание, чтобы настройки применились. Спасибо за помощь.

ASo
25.01.2017, 13:19
Совершенно не надо отключать модуль. Нажмите в конфигураторе кнопку "инициализация".

SCADAMaster
25.01.2017, 13:22
всё заработало после выключения включения питания. Никогда бы не подумал, что надо выключать включать питание, чтобы настройки применились. Спасибо за помощь.
Это особенность всех старых приборов ОВЕН (как МВА, МДВВ, МВУ, так и ТРМок)

energvk
26.01.2017, 12:54
К сожалению других вариантов предложить не можем.
Старые версии ОРС серверов мы не собираем.

А Multi-Protocol MasterOPC Server у вас вообще XP не поддерживается получается?

SCADAMaster
26.01.2017, 12:59
И Modbus и Multi-Protocol XP более не поддерживают. ОС снята с поддержки Microsoft и компиляторы перестают с ней работать.

energvk
27.01.2017, 10:03
Нет, Modbus то работает на sp3

SCADAMaster
27.01.2017, 10:48
50/50 - на многих не работает. Видимо зависит от свежести обновлений

Aleksandr_Sorokin
30.01.2017, 18:11
Добрый день!

Подскажите, пожалуйста. При опросе MasterOPC (32 тега) модуля Seneca Z203-1 все переменные (то есть считанные из разных регистров) всегда принимают одинаковые значение: при int16 - 16191, при int32 - 1061109567, при float - 0,7... Связь с модулем есть, обмен есть, качество "ОК", но какой бы регистр я не прочитал всегда одно и тоже значение во всех. Остальные приборы работают нормально. В чём может быть причина? Перепробовал все возможные форматы данных, виды передачи битов - результат не меняется. Приложил скрин обмена и документацию на модуль. Спасибо.

SCADAMaster
30.01.2017, 18:32
Прибор так возвращает.
Попробуйте указать адрес на 40081, а просто 80. Тип данных - Float, чередование старшим словом вперед.

Aleksandr_Sorokin
01.02.2017, 23:05
Прибор так возвращает.
Попробуйте указать адрес на 40081, а просто 80. Тип данных - Float, чередование старшим словом вперед.

Спасибо большое! Помогло. Производитель модуля ответил тоже самое.
На всякий случай для последующих соискателей: из адреса, указанного в документации, нужно отнять 40001. Оставшаяся цифра и будет правильным адресом регистра. Например, вместо адреса 40095 нужно задавать 94. Тип данных указан в документации. Чередование битов принял заданное сервером по умолчанию.

Ответ производителя:

"Dear Sir, I think the problem is the address register you are trying to read.

For example if you want to read Voltage measure in Floaat swapped format (32 bit) you have to read the addresses 40081-40082; these are equivalent to Holding Registers 80-81 or 81-82 .
Note. When you indicate an Holding Register you have to substract an offset equal to 40000, for Base 1 Master (or equal to 40001 for Base 0 Master), to the address indicate in Z203 Modbus mapping.

if you want to read an Integer (16 bit ) Voltage you have to read the address 40095 that is equal to Holding Register 94 or 95."

SCADAMaster
02.02.2017, 08:43
На всякий случай для последующих соискателей: из адреса, указанного в документации, нужно отнять 40001. Оставшаяся цифра и будет правильным адресом регистра. Например, вместо адреса 40095 нужно задавать 94. Тип данных указан в документации. Чередование битов принял заданное сервером по умолчанию.

Все описано здесь:
http://insat.ru/products/chasto-zadavaemye-vopros-po-modbus-opc.php?clear_cache=Y

Makc
21.02.2017, 15:58
Не могу удаленно найти OPC клиентом, Modbus Universal MasterOPC Server (установленный на вин2008сервер), с чем может быть связано? порты открыты.
В папке систем32 на вин2008 отсутствует OPCenum.exe,может быть связано с этим? на каком этапе учавствует OPCenum?

SCADAMaster
21.02.2017, 16:11
OPCEnum как раз используется при поиска ОРС сервера.
Нужно настраивать DCOM или использовать туннели.
Если используете MasterSCADA, то можно добавить ОРС сервер локально, а затем включить флаг "Удаленный ОРС сервер в режиме исполнения".

Makc
21.02.2017, 16:20
Т.е. если отсутствует OPCEnum на пк где стоит Modbus Universal MasterOPC Server я не найду его автоматически с удаленного ПК?
а где можно скачать OPCEnum?

SCADAMaster
21.02.2017, 16:43
Скачайте и установить OPC Core Components - в нем он есть.
После этого нужно будет настроить DCOM и для Enum и для Modbus OРС.
Инструкция по настройке прилагается к MasterSCADA:
c:\Program Files (x86)\InSAT\MasterSCADA\Doc\

Makc
21.02.2017, 19:46
Извините, а после установки Enum с ним никакой возни уже не будет? просто поставил, настроил DCOM для него и все должно заработать?

SCADAMaster
21.02.2017, 20:14
Да. Но настройка DCOM зачастую оказывается сложным действием

LordMazy
27.02.2017, 20:04
29761
Добрый день! Прошу помощи в настройке светодиодного табло ELX.Sh060. Прикладываю фото из технической документации.
Хотелось бы подключить его к вашему OPC и потом уже к МастерСкаде.
Т.к. функции не стандартные, то пытаюсь отправить команду через скрипт
local send={0x01,0x06,0x00,0x02,0x00,0x0001};
local sendmask={"byte","byte","byte","byte","byte","byte"};
err, data1, data2, data3, data4=server.SendAndReceiveDataByMask(0,6,sendmask , send,nil,0);

Также пробовал такую команду
local send={0x01,0x10,0x00,0x01,0x00,0x02,0x04,0x00, 0x11, 0x00, 0x11};
local sendmask={"byte","byte","byte","byte","byte","byte","byte","byte", "byte", "byte", "byte"};

Тег настроил как ServerOnly, тип данных int32, ReadWrite
Но в итоге даже не могу понять, устройство в сети или нет. Но команда уходит без ошибок (но она всегда уходит без ошибок, даже если выключить сеть)

SCADAMaster
28.02.2017, 09:05
В ОРС сервере посмотрите что происходит на вкладке "Запрос". Если уходящий запрос соответствует требованию документации, значит сделано все верно.
Если при этом устройство не отвечает, то нужно разбираться с ним - соединение, настройки и т.д. Возможна и ошибка в документации к прибору.

AlexF
03.03.2017, 10:39
Здравствуйте.
Подскажите пожалуйста как в "Multi-Protocol MasterOPC" сервере реализовать свой протокол с использованием "User SCRIPT" плагина. На С++ все понятно (есть пдф-ка, и делая по ней все получилось), но нужно с использованием скриптов. На вашем сайте не смог найти документацию по этому вопросу.

SCADAMaster
03.03.2017, 14:51
Есть документация к Modbus Universal:
http://www.insat.ru/products/Universal_MasterOPC/MU_MasterOPC_Server_API_UG.pdf
В Multi-Protocol все будет примерно тоже самое - там только нет функций из секции Modbus.

AlexF
03.03.2017, 14:52
Спасибо за информацию.

aculeus
28.03.2017, 12:01
Здравствуйте.

Подскажите, возможно ли настроить MasterOPC таким образом, чтобы данные с одного устройства передавать на другое?
(например тег Value 1 c PLC_1 передавать в тег Value 2 c PLC_2)
И если так можно делать, то где это настраивается в MasterOPC?
30255

SCADAMaster
28.03.2017, 12:57
Через скрипты.
Функции ReadTag и WriteTag.

D.Podolsckiy
07.04.2017, 10:56
Добрый день!

Подскажите пожалуйста, как реализовать данную конструкцию:



1.2.8. Запись регистров для установки числовых переменных ПроТекст

Для изменения числовых переменных ПроТекст необходимо записать 4 регистра памяти с адресами, указанными в таблице 1.7.

Таблица 1.7 Адреса регистров для изменения числовых переменных ПроТекст.

Адрес регистра Размерность Тип данных Значение

0x2030 2 байта unsigned short Тип переменной ПроТекст
0x2031 2 байта unsigned short Номер переменной ПроТекст
0x2032 4 байта зависит от переменной Значение переменной

Запись значения из регистра в память ПроТекст-переменной производиться
по признаку записи данных по адресу 0х2032 при условии, что были записаны данные в регистры 0х2030 и 0х2031.



возможно ли как то в скрипте реализовать такое?
тип переменной к примеру в теле скрипта указать, а номер переменой = номеру тега...

SCADAMaster
07.04.2017, 11:23
Да, можно. С помощью функции SendAndReciveDataByMask.