Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Языки программирования контроллеров  (Прочитано 14296 раз)

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #15 : 16 Февраля 2017, 22:54:14 »

просто на закладке "глобал-вариейбл":

VAR_GLOBAL RETAIN PERSISTENT
  SomeSruct : typeSomeStruct;
END_VAR

 Ух, задача для хвоста :) Попробую разобраться в этой наскальной надписи и ее применения  :)


И, это... А нельзя вместо sp1 просто вписать название нужной переменной из ретейна?

А так я пробовал, ругается чертяка :-[

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #16 : 16 Февраля 2017, 23:06:56 »
Один из вариантов поиска Проект->Глобальный поиск, выбираете всё и жмёте ОК, ищите что нужно будет поиск по всему проекту.

Переменная уставка в SubMenu какой тип имеет оперативный или конфигурационный? Чтобы сохранялось в конфигураторе нужен тип Конфигурационный.  Как часто меняется уставка оператором и откуда? Из меню конфигурации или из рабочего режима?

Переменная имеет тип "Операционный". Меняется на панели ПЛК при выборе "конфигурация"-......

Не, можно конечно по "умолчанию" выставить уставки и голову не греть, но так как я вдобавок "изучаю" то хочется разобраться :)

 А еще варианты есть? Я наверное проект выложу. Я его лепил по образу "обучающего" + гнул под свои потребности. Так вроде бы все работает, за исключением RETAINa. Может раздолбете его в пух и перья  ;D

TOPans

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #17 : 17 Февраля 2017, 15:46:15 »
Переменная имеет тип "Операционный". Меняется на панели ПЛК при выборе "конфигурация"-......
 А еще варианты есть? Я наверное проект выложу. Я его лепил по образу "обучающего" + гнул под свои потребности. Так вроде бы все работает, за исключением RETAINa. Может раздолбете его в пух и перья  ;D

Если я правильно вас понял чтобы поменять уставку вы на ПЛК73 зажимаете кнопку ВВОД появляется меню там ищете Конфигурация потом вашу переменную и меняете уставку? Если это так то достаточно просто выбрать тип конфигурационный для переменной в SubMenu. (Желательно почитайте инструкцию к ПЛК73 по отличию оперативных от конфигурационных параметров)

Если хотите поизвращаться есть более тупой но рабочий вариант с оперативными параметрами.
Цитировать
PROGRAM PLC_PRG
VAR
   START: BOOL;
   SP1: UINT; (*ПЕРЕМЕННАЯ В SUBMENU*)
END_VAR
VAR RETAIN
   SP1_RET: UINT;
END_VAR

(*В первом цикле программы после старта записываем переменную из ретайна в переменную из SubMenu*)
IF NOT START THEN
   SP1:=SP1_RET;
   START:=TRUE;
END_IF

(*После в каждом цикле присваиваем значение переменной из SubMenu в Ретайн переменную
можно добавить условие по изменению значения и т.д.
IF SP1_RET<>SP1 THEN*)
SP1_RET:=SP1;


« Изменён: 17 Февраля 2017, 15:48:55 от TOPans »

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #18 : 17 Февраля 2017, 17:57:06 »
Огромное спасибо Вам TOPans и Teodor

Вот вычитал ::)

Введенные с передней панели ПЛК или по сети значения конфигурационных па-раметров сохраняются в EEPROM, и при выключении питания будут сохранены.

Значения оперативных параметров сохраняются в ОЗУ, и при выключении пита-ния последнее значение параметра не будет сохранено. При включении питания зна-чение параметра примет значение, установленное по умолчанию.

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #19 : 18 Февраля 2017, 10:23:03 »
Кстати, вот сам проект. Посмотрите, может нормальные прогеры делают не так?
Я еще недопонимаю как выстроить "правильную иерархию" т.е есть какая то стандартная иерархия типа: тех задание (уставки с панели, пид регулятор, аварии... и тд.), потом уже самому додумывать что еще надо чтобы работало КАК НАДО!

 Вы как уже бывалые, какие стандартные или обязательные функции в проектах используете (понятно ,что есть зависимость от направления проекта)?

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #20 : 18 Февраля 2017, 21:56:41 »

VAR_GLOBAL RETAIN PERSISTENT
  SomeSruct : typeSomeStruct;
END_VAR

Это типа такого, т.е таблица в каких режимах работает сохранение переменной.
И самое главное :)

Внимание:

* Если локальная переменная объявлена как VAR RETAIN, то она будет размещена в энергонезависимой области как глобальная.

* Если локальная переменная функционального блока объявлена VAR RETAIN, то все его данные целиком помещаются в  энергонезависимую область памяти, но обслуживаться как VAR RETAIN будет только данная переменная.

* Если локальная переменная функции объявлена VAR RETAIN, то это не дает никакого эффекта. Переменная не будет помещена в энергонезависимую область памяти! Аналогичное объявление PERSISTENT также не дает желаемого эффекта!

« Изменён: 18 Февраля 2017, 22:47:26 от lecsa »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #21 : 28 Февраля 2017, 12:51:36 »
Пока есть одно основательное замечание... PLC_PRG не надо использовать как место для свалки кода.

Создавайте по программе/ФБ для каждой задачи/подзадачи. А вот уже эти программы и вызывайте из PLC_PRG типа myProg(); Если в подпрограмме необходимо задать параметры (VAR_INPUT) то собсно myProg(Param1,Param2...). Только не забывайте, что локальные переменные программы не зависят от того кто и зачем ее вызвал. Программы есть только 1 экземпляр. Если есть несколько независимых паралельных процессов (например обработка аварий), то лучше пользоваться функциональными блоками.

Например, инициализация. Создайте PLC_INIT и там разберитесь с предстартовой подготовкой, а ее замените строкой  PLC_INIT().

IF NOT starting THEN - так вы сами себя запутываете. Инициализируйте ее в TRUE  и скидывайте :)

Два регулятора в одном блоке - некрасиво смотрятся. 2 отдельных програмки позволят нагляднее понять что и когда вы делаете. Например ваш DECODE_FLOAT выполняется 2 раза. А если блоков будет 30? Потому интереснее было бы сотворить ФБ У которого были бы входящие и выходящие параметры, которые уже и расписать по нужным переменным.

Тут мы вспоминаем о структуре данных. В DataTypes определить структуры для входов и выходов из ПИД регулятора, создать структуру пид-регулятор с входами-выходами, создать струкруру регулятор с обозначенным в ней ФБ пид-регулятора и структурой пид-регулятор.  Создать структуру регуляторы из массива структур регулятор... :)

Теперь, мы можем, например, создать прогу- "управление", там запустить в цикле фб нужных пид регуляторов, передав ему в VAR_IN_OUT всю структуру входов/выходов.

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

ton2(in:=TRUE,pt:=t#1000ms);   - очень плохая привычка....

   ton1: TON :=(PT:=t#1s);
   ton2: TON :=(PT:=t#1s);
Избавит вас от указания PT каждый раз.

Вместо ton2(in:=TRUE,pt:=t#1000ms);   просто ton2.IN:=TRUE;
и в самом конце - ton2();

Зачем такие сложности? Пока вы не вызовете ФБ, никакие изменения в его вн. переменные роли не играют. Исполняется ФБ раз за цикл, посему к-во его вызовов не изменит факта работы, а путаницу внести может. Например тот же таймер надо сбросить для рестарта. Сброс-установка In двумя вызовами в одном цикле, сброса НЕ произведет, а принять решение о остановке таймера могут и несколько независимых событий.

Сори что сумбурно, просто тут надо на пальцах показывать. :) По вашему конкретному проекту точечно не помогу т.к. не имею ни таргетов, ни либ от вашего ПЛК :)
« Изменён: 28 Февраля 2017, 15:40:54 от Teodor »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #22 : 28 Февраля 2017, 16:03:46 »
Я еще недопонимаю как выстроить "правильную иерархию" т.е есть какая то стандартная иерархия типа: тех задание (уставки с панели, пид регулятор, аварии... и тд.), потом уже самому додумывать что еще надо чтобы работало КАК НАДО!

Иерархию желательно строить соответственно структуры реального объекта и действий над ним.

Например вот из живого проекта:
 glBoilerroom.HWS.Block_CD.NodeT31_T32.Pump.head2.PumpStatus.Direction

Котельня - ГВС - Ветка - Узел - Насос - Голова - Параметр - Направление

Весьма наглядно демонстрирует что это вообще за параметр и что с ним дальше делать: Направление вращения второй головы насоса узла Т3'-T3" ветки СД системы ГВС котельни. ... Проверяем все ли правильно (не перепутаны ли фазы) и либо просто отправляем параметр в скаду, либо ставим насос в аварию.

Отдельно строим иерархии данных сторонних устройств (например регистры для скады)
Устройства - устройство[экземпляр] - тип регистра (R/RW) - регистры.

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #23 : 03 Марта 2017, 10:36:29 »
Спасибо за развернутый ответ. Чувствуется акула программирования, я только головастик. Мне бы пока разобраться с примитивом.

 Вот допустим, продолжаю мытарства с RETAIN. Панель запоминает в конфигурации значения переменных а если вводить через визуализацию, то нет (не запоминает) пишет по моему оперативно. Варианты которые были тут выше с записью из ретаина в оперативные панели,  пока у меня не срабатывают. Наверное ваш вариант с указателями надо изучить.

 Вот мне скинули наводку:

Смысл в том, что в окне визуализации нужно будет вводить значения не в конфигурационную переменную, а в промежуточную. Затем промежуточную переменную с помощью функции "SAVE_PARAMETER" записывать в конфигурационную переменную.

 Я пока завис на промежуточной оперативной, так и не нашел как ее создать. Начал копать в сторону макроса с MOVE, чтоб в него писать временное значение, но когда прикручиваю "SAVE_PARAMETER" то возникают ошибки " невозможно преобразовать один формат данных в формат "SAVE_PARAMETER" . проблема именно с форматом "SAVE_PARAMETER" .
 Так что как то так.

TOPans

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #24 : 03 Марта 2017, 20:11:33 »
Вот допустим, продолжаю мытарства с RETAIN. Панель запоминает в конфигурации значения переменных а если вводить через визуализацию, то нет (не запоминает) пишет по моему оперативно. Варианты которые были тут выше с записью из ретаина в оперативные панели,  пока у меня не срабатывают.

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #25 : 03 Марта 2017, 20:26:53 »
TOPans
Я это читал, уже закрылся на этот вопрос но тут старшие товарищи опять меня взбодрили  ;D

http://www.owen.ru/forum/showthread.php?t=10555&page=585    мои рыдания с сообщения 5844 
« Изменён: 03 Марта 2017, 20:30:30 от lecsa »

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #26 : 21 Марта 2017, 14:42:11 »
Возник вопрос по сети.
 У моего ПЛК 73 есть 2 порта RS (485/232 по Модбас, Овен) , в конфигурации имеются настройки.
Теперь мне нужно считывать/записывать значения переменных через ОПС на скаду.
 Теперь вопрос:  Как организовать сие действие? Какого то представление в последовательности я не нашел.
В других контроллерах (ПЛК110) там можно в конфигурации создать ветвь МОДБАС и в нее добавить переменные. А в мой переменные в RS не добавить  (просто порт)
 Мои мысли такие: Надо из библиотеки в программе создать МОДБАС  и каким то образом прикрутить переменные. Смотрел по примерам (ПЛК110) они используют ARRAY
 т.е массив. 
 У меня еще не переварился массив. Как я понял - это блок в котором я могу создать минипрограмму, присвоить входы/выходы и обращаться к ним. Вот только то что в квадратных скобках я так и не допонял. Это какая то разрядность (кол -во столбцов?)
« Изменён: 21 Марта 2017, 15:13:53 от lecsa »

TOPans

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #27 : 21 Марта 2017, 21:56:59 »
Я ПЛК73 в связке с ОПС не использовал но думаю тут всё просто.
По факту в ПЛК73 ветвь SubMenu и есть "аналог" ветви Modbus Slave из ПЛК110.
Но здесь необходимо чётко указывать нужно ли видеть переменную по модбас или нет .т.е. нужно поставить галочку Протокол модбас и в соответствии с диапазоном задать адрес переменной. Для переменных типа UINT диапазон 344-511. Для Real 90-286. На картинках более понятно будет.
Также есть возможность чтения всех переменных одним махом т.е. группой но есть проблема в описании к ПЛК очень криво всё описано методом тыка определили что групповое чтение начинается с адреса 4182.
Изначально все порты в ПЛК73 сконфигурированы как Slave вам только в параметрах RS1 и RS2(настраиваете тот к которому подключен ОПС) необходимо задать скорость, чётность и адрес который вам необходим. Далее просто опрашиваем через ОПС ПЛК73 по адресам которые мы выставили на переменных.
« Изменён: 21 Марта 2017, 22:00:08 от TOPans »

lecsa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #28 : 22 Марта 2017, 10:36:27 »
Спасибо, я что то до этого не допер. Теперь понятно.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Языки программирования контроллеров
« Ответ #29 : 22 Марта 2017, 12:45:59 »
Как же все у овена через ж... зад... Насколько в Ваго это проще... Открыл мастера, добавил девайс, добавил диапазоны данных для чтения/записи, частоту опроса. Мастер сгенерил код, переменные/массивы ВСЕ. Надо считать, считал, надо записать записал.

Я тут часто не мог понять о чем вы вообще :) Пока не увидел 110 барана в действии. Это кошмар...

Кста, есть 110 баранчик и МВ110-8А модули (пока 3). В конфигураторе прописываются девайсы и их переменные/регистры. Есть там возможность считать все данные с модуля одним массивом вордов? Дабы обойтись 3-мя запросами вместо 56*3?