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

Запись значений в контроллеры


| 1 | 2 | Last
Author Message
Written on: 19. 01. 2009 [13:14]
kvser
Виталий Харин
Topic creator
registered since: 16.10.2008
Posts: 14
Здравствуйте!

К примеру рассмотрим какой-нибудь контроллер модуля Modbus с 1 параметром "R:0:wr:par:parametr".
Хочется в визульной среде при нажатии на кнопку b1 записать в регистр (параметр "R:0000:wr:par:parametr".) значение 1, при нажатии кнопки b2 - значение 2.
Также при этом хочется, чтобы каждый час по таймеру записывалось в этот регистр значение 0.
Какие есть варианты реализации этого?
Я пока не понял каким образом передать в модуль Modbus значение параметра для записи, так чтобы он[модуль] сформировал команду записи значения для какого-либо регистра и отправил ее непосредственно физическому контроллеру.
Written on: 19. 01. 2009 [21:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
kvser wrote:

К примеру рассмотрим какой-нибудь контроллер модуля Modbus с 1 параметром "R:0:wr:par:parametr".
Хочется в визульной среде при нажатии на кнопку b1 записать в регистр (параметр "R:0000:wr:par:parametr".) значение 1, при нажатии кнопки b2 - значение 2.
Также при этом хочется, чтобы каждый час по таймеру записывалось в этот регистр значение 0.
Какие есть варианты реализации этого?

В демо БД полно примеров подобных ситуаций. А в целом пишется скрипт для виджета контейнера кнопок или самих кнопок где обрабатываются события http://diyaorg.dp.ua/oscadawiki/Doc/KoncepcijaSredyVizualizacii?v=4zp&#h778-1 от них типа:
//Event process
while(true)
{
ev_wrk = strParse(event,0,"\n",off);
if( ev_wrk == "" ) break;
if( ev_wrk == "BtPress:/b1" ) modBusPrmA = 1;
else if( ev_wrk == "BtPress:/b2" ) modBusPrmA = 2;
else ev_rez+=ev_wrk+"\n";
}
Где атрибут modBusPrmA создаётся в виджете со свойством "Конфигурация" "Выходная или Полная связь" http://diyaorg.dp.ua/oscadawiki/Doc/KoncepcijaSredyVizualizacii?v=4zp&#h781-1. После этого во вкладке "Связи" он связывается с атрибутом нужного параметра контроллера.
А по таймеру, можно устанавливать в томже скрипте анализируя время функциями Special.FLibSYS.tmTime() и Special.FLibSYS.tmDate() http://diyaorg.dp.ua/oscadawiki/Doc/FLibSYS?v=6at&#h378-3.

Learn, learn and learn better than work, work and work.
Written on: 20. 01. 2009 [09:15]
kvser
Виталий Харин
Topic creator
registered since: 16.10.2008
Posts: 14
roman wrote:

Где атрибут modBusPrmA создаётся в виджете со свойством "Конфигурация" "Выходная или Полная связь" http://diyaorg.dp.ua/oscadawiki/Doc/KoncepcijaSredyVizualizacii?v=4zp&#h781-1. После этого во вкладке "Связи" он связывается с атрибутом нужного параметра контроллера.


Аааа...значение атрибута modBusPrmA передается в параметр контроллера при помощи "Связи". Получается что DAQ.Modbus при изменении параметра контроллера(при получении события или еще как) передаст в шину команду изменения регистра соответствующего устройства?

roman wrote:

А по таймеру, можно устанавливать в том же скрипте анализируя время функциями Special.FLibSYS.tmTime() и Special.FLibSYS.tmDate() http://diyaorg.dp.ua/oscadawiki/Doc/FLibSYS?v=6at&#h378-3.


Понятно, но я бы хотел использовать запись по таймеру на стороне сервера, где бы не было графических примитивов. Возможно?
Written on: 20. 01. 2009 [12:24]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
kvser wrote:

Аааа...значение атрибута modBusPrmA передается в параметр контроллера при помощи "Связи". Получается что DAQ.Modbus при изменении параметра контроллера(при получении события или еще как) передаст в шину команду изменения регистра соответствующего устройства?

При записи в атрибут modBusPrmA отличного от исходного значения новое значение пойдёт по связи в контроллер.

kvser wrote:

Понятно, но я бы хотел использовать запись по таймеру на стороне сервера, где бы не было графических примитивов. Возможно?

Конечно. Выбирайте:
- http://diyaorg.dp.ua/oscadawiki/Doc/JavaLikeCalc
- http://diyaorg.dp.ua/oscadawiki/Doc/BlockCalc
Или в целом: http://diyaorg.dp.ua/oscadawiki/Doc/SredaProgr

Learn, learn and learn better than work, work and work.
Written on: 21. 05. 2009 [07:33]
fLegmatik
Азат Газизов
registered since: 19.02.2009
Posts: 16
Уже долгое время вникаю, но никак не могу реализовать простое управление включением/выключением выхода ПЛК. Сам ПЛК уже запрограммирован на нужную функциональность (управление выходом осуществляется не только со скада-системы, но физически кнопками по месту). Переменная по модбас хорошо читается и записывается, это можно наблюдать на вкладке Атрибуты (addr:/sub_DAQ/mod_ModBus/cntr_plc/prm_electro/a_out1). Однако установить полноценную желаемую связь с модулем СВУ по разным причинам не удаётся. Поскольку уже есть близкая тема, не буду создавать новую.
roman wrote:
В демо БД полно примеров подобных ситуаций.

Когда начинаешь двигаться по параметрам в дереве демо БД, рано или поздно натыкаешься на матмодель ОУ, что немного сбивает с толку.
roman wrote:
А в целом пишется скрипт для виджета контейнера кнопок

Пример "одна кнопка - одна модбас-переменная" довольно прост. Хочется универсальности с использованием виджетов, какую мы видим в демонстрации. Попробую описать свою задачу и своё видение решения, как бы велико это описание ни было. Возможно, при таком описании сам найду ошибки и неработающие связи. (Впрочем, много букв в маленькое окошко редактирования сообщения на этом форуме трудно вписать.)

Задача. Имеется несколько объектов, состояние которых описываются булевскими переменными (вкл/выкл), а именно электроприводы, если кому интересно. Требуется отобразить эти объекты и их состояние на мнемосхеме. При выборе одного из объектов сбоку должна открываться панель управления с кнопками "Пуск", "Стоп" и статусными индикаторами "Вкл", "Выкл". Что делают кнопки, думаю, объяснять не надо.

Наиболее простое решение, на мой взгляд, заключается в переделке алгоритмов управления демонстрационными КШ под свои нужды. Однако, как я говорил выше, КШ в демопроекте представлены моделями (апериодическим звеном), на входы которых отправляются команды и с выходов снимается состояние. Так же отличие моей задачи заключаются в следующем: у выхода ПЛК никакие промежуточные значения не учитываются, время срабатывания привода оператору абсолютно не интересно.
Учитывая вышесказанное, я решил отказаться от использования модулей BlockCalc и JavaLikeCalc, читая и отправляя переменные сразу в Modbus.

Шаг первый. Рисуем виджет, визуально похожий на объект управления. При рисовании одну из областей закрашиваем цветом fillColor (вернее не указываем цвет), другую -- c1. Цвет с1 будет показывать фокус на данном объекте, а обычная заливка -- состояние вкл-выкл. Кроме того, для этого виджета на вкладке Обработка создаём атрибут st_on (тип Логический, обработка Да, конфигурация Полная связь, конфигурационный шаблон "Параметр|st_on"). Для c1 указываем тип Цвет, обработка Да, конфигурация Нет, конфигурационный шаблон "" (ничего не пишем).
На этой же вкладке текст программы на языке JavaLikeCalc.JavaScript:
[код]c1=(focus && c1=="white") ? "gray" : "white";
if( st_on != EVAL_BOOL ) fillColor = st_on ? "green" : "red";[/код]

Окажу помощь в организации связи OpenSCADA <--modbus--> Овен ПЛК.
xmpp:ag@jabber.ufanet.ru
[Сообщение редактировалось 65535 раз(а), в последний раз 19.01.2038 в 03:14.]
Written on: 21. 05. 2009 [07:50]
fLegmatik
Азат Газизов
registered since: 19.02.2009
Posts: 16
Чтобы открывалась панель управления, в закладке Атрибуты созданного виджета в Обработке событий прописываем ws_FocusIn:icon_eek.gifpen:/pg_control/pg_ElCadr

Шаг второй. Имеющийся pg_ElCadr награждаем виджетами com_start, st_on, st_off (копии соответственно com_open, st_open, st_close), изменив на них надписи. Кнопка Стоп уже присутствует.
На вкладке Обработка по образу prmOpenSt создаём атрибут prmOnSt, единственное отличие в поле конфигурационный шаблон (Параметр|st_on).
Модифицируем текст программы, добавляя строчки.

TYPOSCRIPT
...
else if( prmCom != EVAL_BOOL || prmOpenSt != EVAL_BOOL || prmOnSt != EVAL_BOOL )
{
  com_start_en = com_stop_en = (prmOnSt != EVAL_BOOL);
  st_on_en = st_off_en = (prmOnSt != EVAL_BOOL);
...
 
    else if( ev_wrk == "ws_BtPress:/com_stop" )
    {
      prmOnSt = false;
      messPut("OP:user",2,"Электропривод '"+prmShifr+"'. Режим : СТОП : ");
    }
    else if( ev_wrk == "ws_BtPress:/com_start" )
    {
      prmOnSt = true;
      messPut("OP:user",2,"Электропривод '"+prmShifr+"'. Режим : ПУСК : ");
    }
...
 
  if( st_on_en ) st_on_color = prmOnSt ? "green" : "gray";
  if( st_off_en ) st_off_color = prmOnSt ? "grey" : "red";
}


[This article was edited 1 times, at last 21.05.2009 at 07:50.]

Окажу помощь в организации связи OpenSCADA <--modbus--> Овен ПЛК.
xmpp:ag@jabber.ufanet.ru
[Сообщение редактировалось 65535 раз(а), в последний раз 19.01.2038 в 03:14.]
Written on: 21. 05. 2009 [08:06]
fLegmatik
Азат Газизов
registered since: 19.02.2009
Posts: 16
Шаг третий. Кажется, теперь можно закинуть свой виджет на страницу мнемосхемы. У этой страницы на закладке Связи появляется строка privod1.st_on, в которую мы прописываем адрес той самой булевой переменной, передаваемой по модбас (addr:/sub_DAQ/mod_ModBus/cntr_plc/prm_electro/a_privod1).
На мой взляд, на этом работа заканчивается. Однако же при запуске проекта и выборе объекта в лучшем случае я вижу его мигание (фокус), появляется панель управления, на которой пишется название объекта (Shifr), однако кнопки пуск, стоп и индикаторы отсутствуют. Что я мог упустить или не так написать?

Кстати, если кто-то решится взглянуть на проект. Я не могу понять, почему весь лог забивается строкой "4|/WorkStation/sub_UI/mod_VCAEngine/wlb_originals/wdg_Document/ | Ошибка исполнения инструкции: Ошибка компиляции: Ошибка символа, syntax error, unexpected ERR, pos: (1,icon_cool.gif-(1,39)."

[This article was edited 1 times, at last 21.05.2009 at 08:07.]

Окажу помощь в организации связи OpenSCADA <--modbus--> Овен ПЛК.
xmpp:ag@jabber.ufanet.ru
[Сообщение редактировалось 65535 раз(а), в последний раз 19.01.2038 в 03:14.]
Attachment

Written on: 22. 05. 2009 [06:17]
fLegmatik
Азат Газизов
registered since: 19.02.2009
Posts: 16
Так, проблему с отображением элементов управления вкл/выкл/пуск/стоп на панели управления удалось решить. Оказалось, требуется ещё один шаг по редактированию /prj_AGLKS/pg_control/pg_ElCadr в добавок к упомянутому во втором шаге /wlb_Main/wdg_ElCadr . Если в библиотечный виджет мы добавили атрибут prmOnSt, конфигурационный шаблон которого записан в виде "Параметр|st_on", то в проектном виджете это поле надо поправить на "<page>|st_on". Почему автор демопроекта не записал это поле в таком виде сразу в библиотеку, чтобы не пришлось править одно и то же в двух разных местах, решительно не понятно: либо по недосмотру, либо по злому умыслу, либо ничего в этом случае не работает.

Кстати, после обнаружения этой загвоздки я накатал ещё одну тему о непростых кровно-родственных отношениях библиотечных виджетов и их детишек в проектах.
http://oscada.org.ua/index.php?id=24&L=1&tx_mmforum_pi1[action]=list_post&tx_mmforum_pi1[tid]=60 -- ужасный урл отказался помещаться в тег [урл]. Видимо, надо подкрутить апачевский modrewrite для typo3, чтобы сделать адреса человекомашинопонятными.

Но на этом ещё не все дела закончены. Хоть виджеты и видны, но они не отображают состояния реальных объектов и не управляют ими. Где-то какой-то связи не хватает. Ищу.
________________________
Боюсь, последние мои сообщения на этом форуме отпугнут начинающих проектировщиков тем, что представят OpenSCADA чрезвычайно усложнённой, а они ещё даже линукс не ставили, чтоб начать изучение открытого проекта. Но никто и не говорил, что опенскада проста. На самом деле я не поэтому начал подробное описание своих действий вплоть до щелчков мыши. Я надеюсь, что кто-нибудь оптимизирует эти записи, выкинув излишнее действия и добавив нехватающие, и включит эту инструкцию в пособие по (быстрому старту в) OpenSCADA. А то ведь по отдельным модулям документация подробная, а вот как связать их между собой переменными -- ни слова. Например, что означает столбец "конфигурационный шаблон" в таблице атрибутов на закладке Связи, я представляю крайне смутно.

[This article was edited 1 times, at last 22.05.2009 at 07:52.]

Окажу помощь в организации связи OpenSCADA <--modbus--> Овен ПЛК.
xmpp:ag@jabber.ufanet.ru
[Сообщение редактировалось 65535 раз(а), в последний раз 19.01.2038 в 03:14.]
Attachment

Written on: 22. 05. 2009 [18:02]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
fLegmatik wrote:

Если в библиотечный виджет мы добавили атрибут prmOnSt, конфигурационный шаблон которого записан в виде "Параметр|st_on", то в проектном виджете это поле надо поправить на "<page>|st_on". Почему автор демопроекта не записал это поле в таком виде сразу в библиотеку, чтобы не пришлось править одно и то же в двух разных местах, решительно не понятно: либо по недосмотру, либо по злому умыслу, либо ничего в этом случае не работает.

Потому что этот кадр в других местах может использоваться не для динамического связывания. Например, в группе контуров.

fLegmatik wrote:

На самом деле я не поэтому начал подробное описание своих действий вплоть до щелчков мыши. Я надеюсь, что кто-нибудь оптимизирует эти записи, выкинув излишнее действия и добавив нехватающие, и включит эту инструкцию в пособие по (быстрому старту в) OpenSCADA. А то ведь по отдельным модулям документация подробная, а вот как связать их между собой переменными -- ни слова. Например, что означает столбец "конфигурационный шаблон" в таблице атрибутов на закладке Связи, я представляю крайне смутно.

Вам этого недостаточно? http://wiki.oscada.org.ua/Doc/VCAEngine?v=cxw#h668-12
А QuickStart планируется после версии 0.6.4, потому как некоторые вещи сейчас ещё дополняются.

Learn, learn and learn better than work, work and work.
Written on: 08. 06. 2009 [05:20]
fLegmatik
Азат Газизов
registered since: 19.02.2009
Posts: 16
fLegmatik wrote:

Шаг третий. Кажется, теперь можно закинуть свой виджет на страницу мнемосхемы. У этой страницы на закладке Связи появляется строка privod1.st_on, в которую мы прописываем адрес той самой булевой переменной, передаваемой по модбас (addr:/sub_DAQ/mod_ModBus/cntr_plc/prm_electro/a_privod1).
Вот в чём была моя ошибка. Вместо addr:/sub_DAQ/mod_ModBus/cntr_plc/prm_electro/a_privod1 надо было выбрать prm:/ModBus/plc/electro/privod1 . Теперь желаемая цель достигнута, можно сказать, до внедрения остаётся всякая мелочёвка.
fLegmatik wrote:

Кстати, если кто-то решится взглянуть на проект. Я не могу понять, почему весь лог забивается строкой "4|/WorkStation/sub_UI/mod_VCAEngine/wlb_originals/wdg_Document/ | Ошибка исполнения инструкции: Ошибка компиляции: Ошибка символа, syntax error, unexpected ERR, pos: (1,8 )-(1,39)."


Окажу помощь в организации связи OpenSCADA <--modbus--> Овен ПЛК.
xmpp:ag@jabber.ufanet.ru
[Сообщение редактировалось 65535 раз(а), в последний раз 19.01.2038 в 03:14.]
| 1 | 2 | Last



16105