PDA

Просмотр полной версии : MasterOPC Server : запуск внешней программы.



dimaby
13.02.2013, 19:49
Здравствуйте, у меня вопрос по MasterOPC Universal Modbus Server.
Наши интеграторы обратились в отдел АСУ за помощью : они давно работают с MasterSCADA и хотят подключить к ней теплосчетчики модели ТЭМ-104 производства Республика Беларусь. Проблема в том, что эти приборы очень простые и не умеют работать по modbus или какому-то другому распространенному протоколу. Для связи с ПК используется RS-232 и свой протокол обмена. В комплекте с прибором идет своя программа для получения данных с прибора.
Т.е. через MasterOPC Universal Modbus Server просто так взять показания не получится. Для внутренних нужд предприятия в свое время мы разработали программу на Delphi, которая снимает показания с прибора, также как это делает программа от производителя. Поэтому для интеграции теплосчетчика и MasterOPC мы планировали следующую схему
1) при начале опроса MasterOPC с помощью встроенного скриптового языка запускает нашу программу.
2) наша программа снимает показания и записывает их во временный текстовый файл.
3) MasterOPC считывает показания и заносит их в нужные тэги, а затем удаляет временный файл.
4) MasterSCADA «видит» тэги и показывает то что надо на монитор
При этом com-порт MasterOPC вообще не использует. С ним работает только наша программа.
Проблема возникла на шаге 1. Насколько я понял, единственный способ запустить внешнее приложение в MasterOPC это функция os.execute(command). Проблема в том, что при запуске видно черное окно консоли. И это очень неудобно, потому что оно может загораживать нужную информацию. Я понимаю, что это особенность Lua, которая используется в качестве скриптового языка и фактически, когда я вызываю

os.execute(command)в систему приходит

cmd /C commandи поэтому от окошка консоли никак не избавиться.
Собственно вопрос: можно ли как-то запускать внешнее приложение в скрытом режиме? Или может быть можно использовать COM-объекты в MasterOPC? Мы бы тогда просто написали com-wrapper для приложения и проблема была бы исчерпана.
Вариант переписать программу с Delphi на Lua пока не рассматривается из-за сильной громоздкости протокола.
Я пробовал подключить к MasterOPC модули для Lua - LuaCOM и WinApi, но они у меня даже не захотели нормально подключаться. Может я что-то дела не так или использовал не ту версию.

SCADAMaster
13.02.2013, 20:21
А протокол известен? Не удобнее ли поддержать протокол непосредственно в ОРС сервере?
У нас есть специальная документация где описывается как реализовывать собственные протоколы. Никаких дополнительных библиотек при этом использовать не потребуется - есть специальные встроенные функции.
Напишите нам на support - мы вышлем вам эту документацию. Несколько наших клиентов уже успешно поддержали собственные протоколы, при этом не имея глубоких знаний программирования.

dimaby
13.02.2013, 20:35
Да. Известен, иначе как бы мы его реализовали на delphi. :)
У нас тут уже вечер, так что развернуто его описать смогу только завтра. В двух словах: данные считываются прямо из памяти, т.е.
1) формируем пакет-запрос, а именно - тип комманды, откуда и сколько памяти нужно считать, хитрорасчитанная контрольная сумма.
2) в результате получаем ответ - тоже пакет, из него надо вычленить служебные данные и сам кусок памяти прибора. Затем проверяем контрольную сумму и если все ок, то опять переходим к пункту 1, чтобы считать очередной кусок памяти.
За раз память считать нельзя, потому что размер максимальный размер пакета равен 256 байтам.
Считать только нужный байт тоже не получится, потому что память считывается только по смещениям кратным определенной величине - я уже не помню сколько - завтра надо глянуть в исходники.
После того как память считали, из неё хитрой битовой арифметикой и таблица смещения вычленяем нужные данные.
Ну а кроме этого, нужно реализовать работу с GSM модемом.

Переделывать все это на Lua, когда есть апробированное решение на delphi пока не хочется.

SCADAMaster
13.02.2013, 21:00
Переделывать все это на Lua, когда есть апробированное решение на delphi пока не хочется.
Это вариант:


1) при начале опроса MasterOPC с помощью встроенного скриптового языка запускает нашу программу.
2) наша программа снимает показания и записывает их во временный текстовый файл.
3) MasterOPC считывает показания и заносит их в нужные тэги, а затем удаляет временный файл.
4) MasterSCADA «видит» тэги и показывает то что надо на монитор
При этом com-порт MasterOPC вообще не использует. С ним работает только наша программа.

Скорее всего будет сложнее в реализации, и менее надежным.
Вам стоит сначала рассмотреть вариант поддержки протокола в ОРС.

dimaby
13.02.2013, 21:07
Скорее всего будет сложнее в реализации, и менее надежным.
Вам стоит сначала рассмотреть вариант поддержки протокола в ОРС.
Не совсем понимаю, каким образом его поддерживать? Написать полностью свой opc-сервер или можно как-то интегрироваться с MasterOPC. Но я пока не представляю как осуществлять последнее.

SCADAMaster
14.02.2013, 05:59
В нашем ОРС сервере, есть специальные функции для работы с последовательным портом. Используя их, можно легко поддержать собственный протокол.
То есть вы используете наш Modbus OPC Server, реализуете на скриптах свой протокол и используете в дальнейших проектах.
Напишите нам письмо на support - мы дадим вам документацию.

dimaby
14.02.2013, 09:11
Ok, а какой e-mail у суппорта, потому что ни в about ни выше я его не вижу.

SCADAMaster
14.02.2013, 10:03
support (собака) insat.ru

dimaby
14.02.2013, 10:04
Спасибо. Попробуем.