PDA

Просмотр полной версии : Массив через OPC



Columbariy
11.12.2013, 16:39
Подскажите пожалуйста, как правильно передать массив из плк в скаду используя только 1, ну или несколько тегов.:confused:

IVM
11.12.2013, 18:47
Подскажите пожалуйста, как правильно передать массив из плк в скаду используя только 1, ну или несколько тегов.:confused:
Побайтно. Организуйте в ПЛК счетчик переданных байт и передавайте пока не передадите весь массив. В SKADA надо будет сделать разборку принятых байт.

Sergey666
12.12.2013, 09:03
Счетчик надо как-бы "возвращать" из скады , дабы как-то засинхронизировать обмен.
И не побайтно , а поэлементно и сразу скажу процесс очень не быстрый .
Данные в OPC обновились , а (зачем в скаду массив передавать - наверное чтобы загнать его в SQL :o) так вот надо время на обмен между скада и ОРС и на запись в б.д.

IVM
12.12.2013, 09:15
Дополню. Надо задействовать два тега. Через один передавать в SKADA элемент массива, а через другой номер передаваемого элемента. SKADA должна подтверждать номер принятого элемента.

kfvniiz
13.12.2013, 02:46
Элемент массива и его номер должны быть в одном теге иначе фокусов с синхронизацией не избежать. Ведь OPC может опрашивать теги в любом порядке, может группой, а может по одному, потом СКАДА с этого OPC данные тоже может получать по разному, может сама читать, а может по подписке получать при обновлении и тут порядок не гарантируется. А когда тег один то и проблем нет;) Хотя тут чувствуется желание извратится и сэкономить на лицензиях ).

В общем я бы использовал такой подход:
берем тег c размером 2,4 или 8 байт (желательно целочисленного типа, а то кто его знает что там с ним могут OPC сервер со скадой сделать).
затем в части битов храним номер элемента
1 бит используем как признак запроса
а остальные биты используем для данных.
например: есть массив из 127 элементов типа Byte и его нужно передавать.
Тогда объявляем один тег типа word. Первые 7 бит в нем номер элемента в массиве, 8 бит - признак запроса от скады, а оставшиеся 8 бит данные.
Тогда опрос со стороны скады будет выглядеть так - она в этот тег записывает номер нужного ей элемента и в восьмом бите выставляет 1 - признак запроса со стороны скады, а оставшиеся биты обнуляет.
И далее скада ждет когда в этом теге появится этот же номер элемента со сброшенным признаком опроса (т.е. в 8 бите будет 0). Ну и далее уже обрабатывает полученные данные. Тут только надо предусмотреть, что в этом теге может оказаться другой номер, например 0 т.к. контроллер мог перезапуститься или еще чего.

Контроллер же тоже анализирует регистр соответствующий этому тегу и ждет когда в нем появится признак опроса от скады и затем размещает в него нужные данные с их номером и сброшенным признаком опроса. Тут еще нужно предусмотреть что могут запрашивать данные которых нет (например у контроллера массив 64 байта а запрашивают 68 байт и т.п.).
Так же если массив не однобайтного типа а двух и более (например, word, float), то при передаче нужно как то вводить дополнительную защиту от модификации передаваемых данных или использовать теги с большим размером. Иначе может быть следующее, например, передаем по байтам 2 байтный тип типа word. Передали первый байт, собрались передавать второй и в этот момент этот элемент массива меняется. И скада, получив второй байт, получит какую то фигню в место нормального значения.

А вообще это геморой вот так передавать данные.

kfvniiz
13.12.2013, 02:48
ps
Да вообще для передачи архивов есть же opc hda или нужно именно через opc da такое сделать

capzap
13.12.2013, 07:16
Сменить скаду, например на винсс, там одним тегом может выступать массив простых типов данных