Подскажите пожалуйста, как правильно передать массив из плк в скаду используя только 1, ну или несколько тегов.
Подскажите пожалуйста, как правильно передать массив из плк в скаду используя только 1, ну или несколько тегов.
Счетчик надо как-бы "возвращать" из скады , дабы как-то засинхронизировать обмен.
И не побайтно , а поэлементно и сразу скажу процесс очень не быстрый .
Данные в OPC обновились , а (зачем в скаду массив передавать - наверное чтобы загнать его в SQL ) так вот надо время на обмен между скада и ОРС и на запись в б.д.
Дополню. Надо задействовать два тега. Через один передавать в SKADA элемент массива, а через другой номер передаваемого элемента. SKADA должна подтверждать номер принятого элемента.
Элемент массива и его номер должны быть в одном теге иначе фокусов с синхронизацией не избежать. Ведь OPC может опрашивать теги в любом порядке, может группой, а может по одному, потом СКАДА с этого OPC данные тоже может получать по разному, может сама читать, а может по подписке получать при обновлении и тут порядок не гарантируется. А когда тег один то и проблем нет Хотя тут чувствуется желание извратится и сэкономить на лицензиях ).
В общем я бы использовал такой подход:
берем тег c размером 2,4 или 8 байт (желательно целочисленного типа, а то кто его знает что там с ним могут OPC сервер со скадой сделать).
затем в части битов храним номер элемента
1 бит используем как признак запроса
а остальные биты используем для данных.
например: есть массив из 127 элементов типа Byte и его нужно передавать.
Тогда объявляем один тег типа word. Первые 7 бит в нем номер элемента в массиве, 8 бит - признак запроса от скады, а оставшиеся 8 бит данные.
Тогда опрос со стороны скады будет выглядеть так - она в этот тег записывает номер нужного ей элемента и в восьмом бите выставляет 1 - признак запроса со стороны скады, а оставшиеся биты обнуляет.
И далее скада ждет когда в этом теге появится этот же номер элемента со сброшенным признаком опроса (т.е. в 8 бите будет 0). Ну и далее уже обрабатывает полученные данные. Тут только надо предусмотреть, что в этом теге может оказаться другой номер, например 0 т.к. контроллер мог перезапуститься или еще чего.
Контроллер же тоже анализирует регистр соответствующий этому тегу и ждет когда в нем появится признак опроса от скады и затем размещает в него нужные данные с их номером и сброшенным признаком опроса. Тут еще нужно предусмотреть что могут запрашивать данные которых нет (например у контроллера массив 64 байта а запрашивают 68 байт и т.п.).
Так же если массив не однобайтного типа а двух и более (например, word, float), то при передаче нужно как то вводить дополнительную защиту от модификации передаваемых данных или использовать теги с большим размером. Иначе может быть следующее, например, передаем по байтам 2 байтный тип типа word. Передали первый байт, собрались передавать второй и в этот момент этот элемент массива меняется. И скада, получив второй байт, получит какую то фигню в место нормального значения.
А вообще это геморой вот так передавать данные.
ps
Да вообще для передачи архивов есть же opc hda или нужно именно через opc da такое сделать
Сменить скаду, например на винсс, там одним тегом может выступать массив простых типов данных