VBA EXCEL в автоматизации
VBA EXCEL - для чего это может быть нужно при производстве работ по автоматизации?
1. Если вам предстоит сделать сложную нейросеть, опирающуюся в вычислениях на прежние измерения
2. Если у заказчика нет совершенно денег, а что-то вроде SCADA создать все-таки необходимо. Иногда это подходит.
Допустим, Вам досталась достаточно сложная математическая задача по работе с большим количеством данных, причем задача промышленного назначения и должна быть выполнена на ПЛК. Данную задачу проще разработать на языках C# или Visual Basic Application – в итоге рождается задача прототипирования. Такими задачами могут являться, например, задачи по аппроксимации данных в большом нелинейном массиве и нахождении коэффициентов линейной функции при условии приращения к прямой. Бывают и намного более простые задачи, которые также удобно визуализировать в программе MS EXCEL при помощи языка VBA, например, отчеты. Написание программ на VBA существенным образом снизит издержки, связанные с уточнением технического задания при производстве работ.
Бывают и намного более простые задачи, которые также удобно визуализировать в программе MS EXCEL при помощи языка VBA, например, отчеты. Написание программ на VBA существенным образом снизит издержки, связанные с уточнением технического задания при производстве работ.
В той задаче, с которой имею дело (цель не раскрываю), был выбран ПЛК Wago 750-8202 с некоторым набором модулей ввода-вывода. Контроллер обеспечивает прием, обработку и архивирование информации в пределах 30000 переменных в формате REAL. Данные записываются в разные структурные типы данных с фиксацией событий по времени.
Встает вопрос: как такой объем данных перенести в EXCEL по интернету?
Ответ вполне банален – передаем частями, по аналогии с тем, как меняются надписи на вокзальном табло. Порцию прочли, строка сменилась и так до бесконечности, пока не передастся весь массив информации.
Наломали немало дров на настройке роутера и модема для проброски портов и создания устойчивого соединения с динамическим IP. Был использован DDNS (обращение к удаленному узлу по URL), при этом динамический адрес интернет устройства может меняться. На качестве связи и получении данных это не отражается. Использовался роутер Zyxel Kinetic и USB модем Мегафон. Со связью МТС встретились серьезные проблемы и от нее пришлось отказаться. У нас открыты для постоянной работы ПЛК два порта: 2455 (Codesys) и 502 (Modbus TCP). При настройке ПЛК Wago стоит пользоваться инструкцией. В качестве функции связи с удаленным ПЛК был использован платный апплет ActiveX, взятый на сайте modbustools . coм
(*Буфер интегрального массива*)
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) стоит применять особые приемы. Так, например, для работы с большим количеством данных в массивах необходимо использовать функции. Если так не делать, то резко возрастает вероятность выдачи сообщений о переполнении объема оперативной памяти или об остановке контроллера. То есть для обработки данных циклическими функциями важно не переводить их в разряд временно накопленных данных. Кроме того, использовать циклические операторы следует только для операций по работе с массивами данных (оправданное применение).
#VBAEXCEL, #VisualBasicEXCEL
Оставьте первый комментарий