PDA

Просмотр полной версии : вопросы начинающего



Flomaster
10.07.2007, 17:51
доброго времени суток всем!
некоторое время назад появилась необходимость программирования контроллера плк-150. сам я программист, но в программировании контроллеров - новичок, поэтому хочу вкратце обрисовать задачу и задать пару вопросов.
задача заключается в том, что необходимо при помощи контроллера запускать какое-либо оборудование. к дискретным входам контроллера подключены выключатели. и оборудование должно запускаться при определенной комбинации положений переключателей.

вопрос №1. как отследить изменение сигнала(статуса) дискретного входа (т.е. определить, что на каком-то входе выключатель был включен или выключен), чтобы потом выполнить проверку положения всех переключателей и при необходимости запустить оборудование? пытался разобраться с триггерами дискретных входов, но при добавлении двух и более триггеров вылетает ошибка 3454 при компиляции проекта.

вопрос №2. т.к. количество подключаемого оборудования может изменяться, для удобства адаптации программы к количеству оборудования возникла идея создать массив структур. каждый элемент массива будет соответствовать одной единице оборудования и описываться структурой. вот собственно вопрос: можно ли добавить в эту структуру поле, которое было бы привязано, например, к определнному дискретному выходу контроллера? т.е. при необходимости я мог бы обратиться к дискретному выходу контроллера через это поле структуры и подать на дискретный выход какой-либо сигнал?

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

Филоненко Владислав
10.07.2007, 18:36
1. Анализируя изменения значений байта дискретных входов (сравнение с сохр. значением)

2. Посмотрите синтаксические элемент AT. ели не поможет, то выход, если создать функцию/функц. блок, к-й бы анализировал номер выхода и значение из структуры, а затем переключал бы его.

3. Библиотека SysLibTime, создаёте файл и ведёте в нем лог, как и на любой др. платформе с файловой системой.

P.S. Рекомендую до начала экспериментов прошиться самой свежей прошивкой, установить таргеты и нов. версию среды разработки - многие вопросы отпадут сами

Nekit
10.07.2007, 20:30
По поводу п.2 делал такое следующим образом:
Создавал функциональный блок отвечающий за управление одним устройством. Те переменные которые должны соответствовать входам\выходам объявляются как конфигурационные или "шаблонные" т.е. объявление типа
VAR
xMyVar %I*: BOOL;
END_VAR
далее создаем массив экземпляров функциональных блоков (размер массива соответствует числу подключенных устройств).
Далее находим на вкладке Resources список глобальных переменных Variable_Configuration или создаем его если его нет (любое имя, тип переменных VAR_CONFIG END_VAR). Там определяем какая переменная какого ФБ к какому входу выходу должна быть привязана по схеме
Имя_программы.имя_экземпляра_ФБ.имя_переменной AT %IX0.0: BOOL;

Теперь при изменении количества устройств необходимо только изменить размер массива и доопределить конфигурационные переменные.
Вот и все.

Удачи.

Flomaster
11.07.2007, 03:13
to Nekit: спасибо, попробую сделать аналогично.

to Филоненко Владислав: по вопросу 3 буду разбираться и экспериментировать. Теперь по вопросу 1. Изначально была следующая мысль. Например основная программа разрабатывается на языке POU SFC и представляет собой цикл. Тогда в одном из блоков нужно считывать состояние дискретного входа и сравнивать его с предыдущим. Ну, а дальше уже дело техники. Я так понял, что Вы в своем ответе на мой вопрос имели в виду именно такую схему?

Малышев Олег
11.07.2007, 09:16
По вопросу № 3 - поправка не SysLibTime а SysLibFile.
SFC - это машина состояний. Чем то напоминает сеть Петри.
В любой момент времени одно (или несколько при использовании параллельных разветвителей) состояний активны. После активного состояния идет переход. Если он выполняется (условие истинно), следущее состояние становится активным. Для каждого состояния можно задать действия выполняемые при определенных условиях (например вход в состояние, выход, пока активно).

Филоненко Владислав
11.07.2007, 14:43
to Nekit: спасибо, попробую сделать аналогично.

to Филоненко Владислав: по вопросу 3 буду разбираться и экспериментировать. Теперь по вопросу 1. Изначально была следующая мысль. Например основная программа разрабатывается на языке POU SFC и представляет собой цикл. Тогда в одном из блоков нужно считывать состояние дискретного входа и сравнивать его с предыдущим. Ну, а дальше уже дело техники. Я так понял, что Вы в своем ответе на мой вопрос имели в виду именно такую схему?

п3. Только заметил, библиотека не SysLibTime, а SysLibFile
п1. Именно эту.

Nekit
11.07.2007, 21:20
По поводу п.1 в PLCConfiguration можно добавить подмодуль Триггер. Он связывается с каким либо входом настраивается фронт срабатывания (передний, задний, или что необходимо в нашем случае оба фронта) и все дальше обявляем переменную по адресу выхода триггера и контролируем ее если 1 то произошло переключение, если 0 то нет. мне кажется так логичнее, да и код уменьшается. При использовании триггеров из standart.lib тоже самое только придется R и F триггеры придется включать параллельно для фиксирования обоих фронтов, а в конфигураторе все удобно и просто (в очередной раз спасибо программерам ОВЕН за заботу).


Удачи.

Flomaster
12.07.2007, 17:26
Спасибо всем за ответы! Процесс пошел. Пока не очень быстро, как хотелось бы, но начал вникать в процесс работыс контроллером:-)
Только вот непонятно, почему не удается создать больше одного триггера? Компилятор начинает ругаться и выдавать ошибку 3454 :-(((
В принципе, можно обойтись и без триггера, только при этом придется анализировать значение на нужном входа. А используя триггер сразу будет известно, менялось значение или нет. Вообще изначально я считал, что в CoDeSys есть так обработчики событий - как в визуальных средах типа Builder или Visual Studio (например, событие нажатия на кнопку). Думалось, что и здесь есть нечто аналогичное: изменилось значение на дискретном входе - вызвалось событие. А в обработчеке собятия уже можно всё, что угодно сделать.

Николаев Андрей
12.07.2007, 17:55
уберите галочку контроля, которая обозначена на вложенной картинке

Игорь Петров
12.07.2007, 18:31
...я считал, что в CoDeSys есть так обработчики событий...изменилось значение на дискретном входе - вызвалось событие.

При желании так можно. Нужно использовать конфигуратор задач.
1) Сделать циклическую задачу и не забыть в нее вставить PLC_PRG
2) Наделать задач, вызываемых по событиям (Triggered by event) и связать с ними соотв-е программы, событие – любая глобальная логическая переменная.

Однако:
1) Это не есть общепринятый метод программирования на языках МЭК.
2) Выигрыша по скорости нет.
3) Можно запутаться в последовательности событий.

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

Flomaster
13.07.2007, 03:00
уберите галочку контроля, которая обозначена на вложенной картинке

а это не повлияет на корректную работу программы?

Филоненко Владислав
13.07.2007, 08:00
галочка не выход, а прятание головы в песок.
просто установите среду разработки 2.3.8.1 - там эта проблема решена

Flomaster
16.07.2007, 07:47
Создал я, значит, функциональный блок, который описывает одно устройство. В программе создается вектор MyVector таких функциональный блоков, длина которого равна количеству устройств. В состав блока входят AT-переменные привязанные к входам и выходам ПЛК. Когда я пытаюсь обратиться из какой-либо точки программы к такой переменной, например MyVector[1].MyOutput, выдается ошибка 4020.

Выход MyOutput описан в разделе Variable_Configuration: PLC_PRG.MyVector[1].MyOutput AT %QX1.0: BOOL;.
Вот, собственно, вопрос: как правильно обратиться к такой переменной?

Малышев Олег
16.07.2007, 07:55
Описание ошибки:
<
4020
"Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

Замените первый операнд переменной, имеющей доступ на запись.
>
Видимо где -то в программе есть присвоение значения этой переменной.

Flomaster
16.07.2007, 08:27
Описание ошибки:
<
4020
"Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

Замените первый операнд переменной, имеющей доступ на запись.
>
Видимо где -то в программе есть присвоение значения этой переменной.

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

Малышев Олег
16.07.2007, 09:36
Скорее всего компилятор берет выражение PLC_PRG.MyVector[1].MyOutput AT %QX1.0 не как декларацию а как обращение.
Видимо нужно объявить массив указателей на ФБ. Потом объявить экземпляры ФБ например fb_1:myFB;...fb_n:myFB

Привязывать как fb_1.MyOutput AT %QX1.0: BOOL
и проинициализировать массив указателей на fb.

Игорь Викторович, возможно есть не такой корявый метод?

Филоненко Владислав
16.07.2007, 09:45
Описание ошибки:
<
4020
"Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

Замените первый операнд переменной, имеющей доступ на запись.
>
Видимо где -то в программе есть присвоение значения этой переменной.

Да, тут только доступ по указателю - это защита от дурака.

Nekit
16.07.2007, 19:29
Объявляем в ФБ
VAR
MyOutput: AT %Q*: BOOL;
END_VAR
А Variable_Configuration определяем
VAR_CONFIG
PLC_PRG.MyVector[1].MyOutput AT %QX1.0 : BOOL;
END_VAR
и поидее все работает, правда на ОВЕН непробовал но поидее должно быть также.

Flomaster
17.07.2007, 02:39
Объявляем в ФБ
VAR
MyOutput: AT %Q*: BOOL;
END_VAR
А Variable_Configuration определяем
VAR_CONFIG
PLC_PRG.MyVector[1].MyOutput AT %QX1.0 : BOOL;
END_VAR
и поидее все работает, правда на ОВЕН непробовал но поидее должно быть также.

Вот именно, что на этом этапе всё работает. А вот если попытаться в теле основной программы обратиться к MyVector[1].MyOutput, чтобы на выход подать, например, TRUE, то компилятор выдает ошибку. Сейчас попробую через указатель достучаться к переменной.

Flomaster
18.07.2007, 04:33
всё, получилось! через указатели нормально работает! вот еще вопрос один появился. планируется использовать в связке с плк-150 модуль мдвв. самого модуля пока нет. где бы почитать, как работать с его входами/выходами? и можно ли как-нибудь сэмулировать присутствие модуля?

Малышев Олег
18.07.2007, 07:39
Модуль поддерживает протоколы Modbus,Овен и DCON. Проще всего эмулировать modbus slave - программ довольно много и добавляется в конфигурации двумя щелчками мышки. Что бы получить описание параметров прибора попросите по электронной почте тех.поддержку выслать паспорт и РЭ.

Crusash
07.10.2009, 12:17
Тоже столкнулся с ошибкой 4020
решить её через указатель удалось, но мне это не кажется правильным...
плодить FB или создавать Действие для PRG - выглядеть тоже не совсем...
Может в настройках есть какаянить галочка чтобы инструкцией
PRG.variable:=value;
можно было задать значение переменной какой то подпрограммы?
читать то мы их гогем...

Crusash
07.10.2009, 12:42
ой, сам допёр...
достаточно переменную обьявить в Var_input...

Toxa74
11.03.2015, 19:23
Да, тут только доступ по указателю - это защита от дурака.


Столкнулся с подобной задачей. Не могу победить. Подскажите, пжлст, что делаю не так.

1. Создал функциональный блок fbGate.
В нем 1 пин выход, 1 вход
VAR
pin_in AT %I*: BOOL;
pin_out AT %Q*: BOOL;
END_VAR

2. В Global_Variables создал
pGates: ARRAY[0..1] OF POINTER TO fbGate; (* Массив указателей *)
Gate_1 : fbGate; (* экземпляр 1*)
Gate_2: fbGate; (* экземпляр 2*)

3. В VAR_CONFIG описал пины:
Gate_1.pin_out AT %QX2.1.2 : BOOL;
Gate_1.pin_in AT %IX1.0.0: BOOL;
Gate_2.pin_out AT %QX2.1.3 : BOOL;
Gate_2.pin_in AT %IX1.0.1: BOOL;

4. В PROGRAM PLC_PRG инициализировал указатели

pGates[0] :=ADR(Gate_1);
pGates[1] :=ADR(Gate_2);

5 Далее обращаюсь к пременной
pGates[0]^.pin_out:= TRUE;

Компилятор ругается Ошибка 4020!

Валенок
11.03.2015, 20:43
Ну в 5 пишем в типа private

lara197a
11.03.2015, 20:50
зачем вам указатели?
используйте символьную адресацию.
Указатель нужен если только к примеру вам требуется менять значение доступное только для чтения.
к примеру обнулить или установить значение в подмодуле скоростного счетчика или энкодера.
А просто так можно и без указателей с символом работать.
По крайней мере из Вашего объяснения я не увидел необходимости в указателе.