ВБА Эксель в автоматизации

Допустим, Вам досталась достаточно сложная математическая задача по работе с большим количеством данных, причем задача промышленного назначения и должна быть выполнена на ПЛК. Данную задачу проще разработать на языках C# или Visual Basic Application – в итоге рождается задача прототипирования. Такими задачами могут являться, например, задачи по аппроксимации данных в большом нелинейном массиве и нахождении коэффициентов линейной функции при условии приращения к прямой. Бывают и намного более простые задачи, которые также удобно визуализировать в программе MS EXCEL при помощи языка VBA, например, отчеты. Написание программ на VBA существенным образом снизит издержки, связанные с уточнением технического задания при производстве работ.

Бывают и намного более простые задачи, которые также удобно визуализировать в программе MS EXCEL при помощи языка VBA, например, отчеты. Написание программ на VBA существенным образом снизит издержки, связанные с уточнением технического задания при производстве работ. 

trend













Однако сразу встают вопросы, как именно и на чем разработать прототип модели кода, как перевести или конвертировать алгоритмы, выполненные на VBA, в паскалеобразный язык ST, на котором можно запрограммировать ПЛК таких брендов, как Siemens, Schneider Electric, Omron, Wago, Owen. Одновременно всплывают задачи с удаленным получением данных из ПЛК в EXCEL по протоколу Modbus TCP через интернет.

В той задаче, с которой имею дело (цель не раскрываю), был выбран ПЛК Wago 750-8202 с некоторым набором модулей ввода-вывода. Контроллер обеспечивает прием, обработку и архивирование информации в пределах 30000 переменных в формате REAL. Данные записываются в разные структурные типы данных с фиксацией событий по времени.

Встает вопрос: как такой объем данных перенести в EXCEL по интернету?

Ответ вполне банален – передаем частями, по аналогии с тем, как меняются надписи на вокзальном табло. Порцию прочли, строка сменилась и так до бесконечности, пока не передастся весь массив информации.

Наломали немало дров на настройке роутера и модема для проброски портов и создания устойчивого соединения с динамическим IP. Был использован DDNS (обращение к удаленному узлу по URL), при этом динамический адрес интернет устройства может меняться. На качестве связи и получении данных это не отражается. Использовался роутер Zyxel Kinetic и USB модем Мегафон. Со связью  МТС встретились серьезные проблемы и от нее пришлось отказаться. У нас открыты для постоянной работы ПЛК два порта: 2455 (Codesys) и 502 (Modbus TCP). При настройке ПЛК Wago стоит пользоваться инструкцией.

В качестве функции связи с удаленным ПЛК был использован платный апплет ActiveX, взятый на сайте http://modbustools.com/modbus_activex.html

VBA


















Работает и настраивается хорошо, правда ввиду своей триальности обменивается данными не более 60 минут и по истечении трех месяцев использования прекращает запускаться. Чистить реестр не пробовал, но переустановка Windows помогает однозначно.

MW












В данной таблице создана визуализация 100 регистров на чтение и 10 на запись. Апплет является  клиентской частью в протоколе обмена Modbus TCP (инициатор посылки пакетов). ПЛК является серверной частью протокола, отвечая на запросы удаленного клиента. В ПЛК создан буфер для удаленного обмена, который позволяет при смене строки в буфере менять все отправленные данные на следующие последовательно. Когда EXCEL регистрирует получение данных, он меняет значение строки в буфере. Таким образом, без лишней спешки мы обходим все значения накопленных данных.

(*Буфер интегрального массива*)

IF CMB.ROW=0 OR CMB.ROW=10001 THEN CMB.ROW:=1; END_IF;(*%MW12388*)

CMB.X:=CME.X[CMB.ROW];(*%MW12390*)

CMB.Y:=CME.Y[CMB.ROW];(*%MW12392*)

CMB.Z:=CME.Z[CMB.ROW];(*%MW12394.0*)

CMB.DY:=CME.DY[CMB.ROW];(*%MW12396*)

Ну и наконец, конвертация данных из полученных нами регистров в удобные и понятные многим значения в формате REAL, INT, BOOL

Использую функции, которые смог откопать на просторах интернета.

ROW1 = MW100 ‘Так пишем INT

x = TwoSIntToFloat(Val(MW102), Val(MW103)) ‘Так пишем REAL

Y = TwoSIntToFloat(Val(MW104), Val(MW105)) ‘Так пишем REAL

Z = CBool(MW106 And 1) ‘Так пишем BOOL

dy = TwoSIntToFloat(Val(MW108), Val(MW109)) ‘Так пишем REAL

Код функции для конвертирования из двух регистров в формат REAL:

Private Declare Sub CopyMemory Lib “kernel32” Alias “RtlMoveMemory” (Destination As Any, Source As Any, ByVal Length As Long)

‘Binary and single float conversion

‘A.Gamble 2006

‘Note – This code is based upon the ieee standards.

‘Some applications may require the word order flipping

Function TwoSIntToFloat(Wd1 As Integer, Wd2 As Integer) As Single

Dim bytArray(3) As Byte

‘Example use x = TwoSIntToFloat(16384,-15635)

‘Copy the memory area of both words to the memory area of our declared array of 4 bytes

‘We have to do this because all 4 bytes are stored consecutively in memory

CopyMemory bytArray(0), Wd1, 2

CopyMemory bytArray(2), Wd2, 2

‘Copy the memory area of the 4 byte array to the memory area of our float

CopyMemory TwoSIntToFloat, bytArray(0), 4

End Function

С операторами FOR & WHILE в языке ST (Codesys) стоит применять особые приемы. Так, например, для работы с большим количеством данных в массивах необходимо использовать функции. Если так не делать, то резко возрастает вероятность выдачи сообщений о переполнении объема оперативной памяти или об остановке контроллера. То есть для обработки данных циклическими функциями важно не переводить их в разряд временно накопленных данных. Кроме того, использовать циклические операторы следует только для операций по работе с массивами данных (оправданное применение).

#VBA, #VBAEXCEL, #автоматизация, #работасданными, #C#, #VisualBasicApplication, #ПЛК, #MSEXCEL, #EXCEL, #ST, #ModbusTCP


Если Вы не нашли то, что искали, сообщите об этом в комментарии

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

Ваш комментарий добавлен


Возврат к списку