пятница, 16 июля 2021 г.

OPC2EXCEL


Недавно для меня случилось открытие, что оказывается мой opc2web клиент, может запросто стать opc2excel клиентом - то есть показывает значения (к сожалению только показывать) с OPC сервера в таблице excel, с возможностью использования всех плюшек экселя. Вот есть видео как это может работать

Такая возможность на самом деле вполне очевидна, потому как по большому счету, этот opc2web клиент по сути преобразует OPC данные в JSON строку (opc2json если придерживаться установившихся наименований). Этот формат передачи данных довольно универсальный и может с легкостью использоваться почти в любом приложении и виде. Соответственно и принцип работы остается прежний: каждую секунду происходит запрос данных OPC у клиента (который по сути HPPT сервер, но для OPC это клиент) и клиент возвращает строку с данными в виде JSON. Теперь остается эту строку распарсить и красиво оформить чтобы было понятно что и где наблюдать. На скрине в начале видно что все значения друг за другом складываются в первую строку, а уже оттуда с помощью формул их можно поместить в другие ячейки, разукрасив их как угодно, добавить жирности, или применив условное форматирование. Нарисовать столбчатую диаграмму тоже не проблема - будет меняться так же в онлайн режиме. 

Делается все это при помощи vba макроса - запрос на получение тегов

Sub gettags()

Dim objHTTP, response
Dim Result() As String
Dim Val() As String

' получить данные с сервера (клиента)
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open "GET", "http://127.0.0.1:45455", False
objHTTP.Send

response = objHTTP.ResponseText
'удалить из строки все двойные ковычки
response = Replace(response, Chr(34), vbNullString)
' убрать последний символ } 
response = Left(response, Len(response) - 1)
' убрать первый символ { 
response = Right(response, Len(response) - 1)
'разбить строку запятыми на массив 
Result = Split(response, ", ")
' проходимся по массиву
For i = LBound(Result()) To UBound(Result())
    ' теперь каждый элемент массива разбиваем еще раз на массив используя двоеточие
    ' и меняем запятые на точки чтобы получились числа
    Val = Split(Replace(Result(i), ",", "."), ":")
    ' так как вторым элементом полученного находится значение которое нам нужно, его-то и помещаем в ячейку на странице
    ActiveSheet.Cells(1, i + 2).Value = Val(1)
Next i

End Sub

Теперь этот скрипт нужно запускать по таймеру, в эксель файле который указан в качестве примера под видео, есть этот скрипт. 

Куда интереснее было попробовать запускать этот скрипт с частотой больше 1 секунды, то есть например каждые 500мс. Такое сделать удалось, но проблема в том что оператор sleep заставляет зависать excel и в это время вообще никакие функции не доступны так что использовать такое нужно с осторожностью. Я например вырубал клиента, чтобы сломать цикл. Пример такого файла тут.

Комментариев нет:

Отправить комментарий