EnglishУкраїнськаmRussian
Login/New
Topic with many replies

Интеграция с WinCC


| 1 | 2 | Last
Author Message
Written on: 21. 06. 2016 [08:07]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
Доброго дня Всем :D

Возникла у меня необходимость интеграции с WinCC. Если упростить - то схема следующая:
1) На нижнем уровне PLC с Isagraf 3.22.
2) Далее Openscada (управление на уровне насосной)
3) На верхнем уровне (центральный диспетчерский пункт) WinCC.

В первом приближении получилось, список "подводных камней" Ниже:

1) параметры соединения с узлом данных "Scads". WinCC может выступать только мастером, соответственно потребовалось организовать Входящий транспорт по протоколу MODBAS. Тут только одна маленькая засада - адрес транспорта нужен в 1-й моде, что то типа TCP:10.2.2.125:8888:1 (если брать моду соединения по умолчанию :0 - не работает)
2)Аналоговый параметр - потребовался свап слов. Можно было это сделать со стороны скады, но проще оказалось со стороны WinCC, там в свойствах соединения можно поставить птицу - swap word in float.
3) Ну Modbas адреса соответственно у wincc начинаются с 0
4) При обработки битов обнаружился зеркальное соответствие. Т.е. бит 0 в Scada соответствует ,биту 15 в winCC
5) Транспортных протоколов сделал 2 (один на 12 slave, другой на 13). Идея такая - информация параметрическая идет по 12 slave всегда, а по 13 идет управление, которое возможно будет отключатся при выборе источника управления - Насосная/ЦДП. В общем прокатило.

Единственно - что напрягло, пытался через tmTime(1) получить время в микросекундах, что бы временные параметры зафиксировать, но она у меня возвращает время только в секундах.
Written on: 21. 06. 2016 [10:01]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"Petr2off" wrote:

1) параметры соединения с узлом данных "Scads". WinCC может выступать только мастером, соответственно потребовалось организовать Входящий транспорт по протоколу MODBAS. Тут только одна маленькая засада - адрес транспорта нужен в 1-й моде, что то типа TCP:10.2.2.125:8888:1 (если брать моду соединения по умолчанию :0 - не работает)

Тот клиент просто не любит разрывов соединений после каждого запроса.

"Petr2off" wrote:

2)Аналоговый параметр - потребовался свап слов. Можно было это сделать со стороны скады, но проще оказалось со стороны WinCC, там в свойствах соединения можно поставить птицу - swap word in float.

Документацию внимательно читаем и просто указываем нужный порядок регистров: http://wiki.oscada.org/Doc/ModBus#h592-9

"Petr2off" wrote:

3) Ну Modbas адреса соответственно у wincc начинаются с 0

У всех они так начинаются.

"Petr2off" wrote:

4) При обработки битов обнаружился зеркальное соответствие. Т.е. бит 0 в Scada соответствует ,биту 15 в winCC

В OpenSCADA стандартный порядок бит для регистра.

"Petr2off" wrote:

Единственно - что напрягло, пытался через tmTime(1) получить время в микросекундах, что бы временные параметры зафиксировать, но она у меня возвращает время только в секундах.

Примеры не смотрим:
JAVASCRIPT
utm = 0; tm = SYS.time(utm);


Learn, learn and learn better than work, work and work.
Written on: 21. 06. 2016 [13:00]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
Насчет везде начинается с 0. Это не совсем так. В Isagraf начинается с 1, И там у меня опечаточка выскочила, извиняюсь. В WinCC тоже с 1.

Про смену слов я читал, просто проще это оказалось сделать в WinCC.

Про SYS.time. Во первых я ориентировался на описание функции tmTime в библиотеке, А во вторых, я попробовал использовать SYS.time как Вы предложили. Ничего не изменилось. Возвращаются секунды.
Written on: 21. 06. 2016 [21:20]
IrmIngeneer
Константин \m/
Contributor
Sponsor
registered since: 16.09.2010
Posts: 185
"Petr2off" wrote:

...
Про SYS.time. Во первых я ориентировался на описание функции tmTime в библиотеке, А во вторых, я попробовал использовать SYS.time как Вы предложили. Ничего не изменилось. Возвращаются секунды.


Попробовал выводить кнопкой в виджет Text значение utm по приведенному Романом рецепту. Если период вычисления страницы стоит 1000 мс - выдает трехзначные числа. Если ставлю период 10 мс - шестизначные.
Written on: 22. 06. 2016 [06:45]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
У меня период стоял 100 мс, попробовал 10 - эффект тот же. Причем в 2-х вариантах.

1) В контейнере ставил 100 и 10 мс, в окне (-1)
2) В окне выставлял 100 и 10 мс.

даже такой экзотический вариант попробовал - в контейнере 10мс, в окне 100 мс.

А у Вас какая версия Scada ? У меня 0.8.

Хотя в принципе конечно не так уж и важно, отсечки по числу циклов работают.
Written on: 22. 06. 2016 [07:22]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
В догонку, значения у меня возвращает 10 значное. Для проверки я написал виджетик, через поле задается число циклов. По кнопке старт фиксируется начало отчета. Потом на каждом цикле счетчик уменьшается на 1, считывается текущее время. Пишется в текстовое поле. Все изменения идут с шагом 1 сек, независимо от частоты виджета. Хотя сам виджет выполняется безусловно с заданной частотой. Т.е. задаешь счетчик 10 - через секунду процесс завершится - разница во времени - 1 сек. (последняя цифра). Задаешь счетчик 50 - в поле 5 раз значение сменится. и остановится на 5 сек.
Written on: 22. 06. 2016 [08:51]
IrmIngeneer
Константин \m/
Contributor
Sponsor
registered since: 16.09.2010
Posts: 185
"Petr2off" wrote:

А у Вас какая версия Scada ? У меня 0.8.

Хотя в принципе конечно не так уж и важно, отсечки по числу циклов работают.


Думаю, действительно, версия не сильно важна. У меня билд 2385, крайний вроде.

Сделал в обработчике так:
JAVASCRIPT
utm = 0;
TX_Test_text = "Sec " + Special.FLibSYS.tmTime(utm) + " mSec " + utm;


В тектовом поле выводятся и секунды, и милисекунды.

[This article was edited 1 times, at last 22.06.2016 at 09:59.]
Written on: 22. 06. 2016 [10:51]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"IrmIngeneer" wrote:

Сделал в обработчике так:
JAVASCRIPT
utm = 0;
TX_Test_text = "Sec " + Special.FLibSYS.tmTime(utm) + " mSec " + utm;


В тектовом поле выводятся и секунды, и милисекунды.

Микросекунды, utm от usec!

Learn, learn and learn better than work, work and work.
Written on: 10. 07. 2016 [12:58]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
По времени разобрался, я почему то считал - что оно возвращается через значение функции, а тут процесс немного навороченей оказался, миллисекунды в параметре возвращаются. Но у меня с первого раза ничего не получается, карма наверно попорчена.

Немного о второй серии интеграции с Сименс. Начал делать следующий шаг. Т.е. предполагается что Сервер скады, будет играть роль технологического гэтвэя, разделяя сетку САУ ТП (10) и сетку WINCC (168) соответственно я туда аж 3 сетевых карты впихал. Одна на сетку 168, две других на 10 сетки (10.2.*.* и 10.3.*.*) там дублирование доступа к модулям УСО идет. Ну в общем то с разделением получилось. Но при этом у меня естественно отвалился АРМ локальный, который в 10 сетке сиди, они стали по MOdbus протоколу конфликтовать. Решил я тогда локальный АРМ сделать как станцию сервера по 10- сетки, и уперся в трабл. Не хочет у меня второй входящий транспорт организовываться, говорит - порт занят. :(. Что меня несколько удивило - до этого у меня на одной карте работало 2 транспорта (правда разных - входящий и выходящий). Завтра думать буду как лучше выкручиваться, Еще одну карту сажать не охота.
Written on: 02. 08. 2016 [13:31]
Petr2off
Владимир Петров
Topic creator
registered since: 08.07.2015
Posts: 38
Каюсь, наговорил лишнего. Запустился у меня второй транспорт на том же интерфейсе. Виноват, надо читать внимательно до буквы и мелкий шрифт тоже. В оправдание скажу что слаб я зрением. Просто в строке коннекта задал порт, который не прописан в /etc/services. Сменил порт и заработало. :D
| 1 | 2 | Last



2800