PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

drvlas
07.06.2016, 19:57
Хм... Хоть и не понял, но принимаю. Не понял вот что: где именно занимаються єти самьіе 2 POU? В компилированной программе, я думаю, код покладут 1 раз, а под каждую реализацию ФБ вьіделят просто кусок памяти. Не?

capzap
07.06.2016, 20:03
Хм... Хоть и не понял, но принимаю. Не понял вот что: где именно занимаються єти самьіе 2 POU? В компилированной программе, я думаю, код покладут 1 раз, а под каждую реализацию ФБ вьіделят просто кусок памяти. Не?

ну может он посчитал, что экземпляры каким то образом учитываются, не обращайте внимание, он еще динамически не создавал ПОУ

drvlas
07.06.2016, 20:10
Так что, функции - фтопку? Тока для возвращаемьіх значений?

Владимир Ситников
07.06.2016, 20:13
Хм... Хоть и не понял, но принимаю. Не понял вот что: где именно занимаються єти самьіе 2 POU? В компилированной программе, я думаю, код покладут 1 раз, а под каждую реализацию ФБ вьіделят просто кусок памяти. Не?

Грубо, компилятор внутри создаёт таблицу всех блоков кода.
Из ФБ получается 2 внутренних блока кода (уже в скомпилированном виде): http://forum.codesys.com/viewtopic.php?t=53#p122
Возможно, им так было проще сделать, и решили, что "256 ФБ хватит каждому".


INDEXOF
Возвращает внутренний индекс POU.
Пример ST:
var1 := INDEXOF(POU2);

drvlas
07.06.2016, 20:45
Интересная дискуссия автора с самим собой...
Ну ладно, так я напрасно ввязался в количество POU. Допустим, в 256 укладусь.
Все же, есть ли хоть что-нибудь еще, что сделает мою жизнь хуже при тотальном переходе на ФБ?
Вот я так понимаю: и там, и там есть скомпилированньій код. Локальная память на ФБ отводится не так, как на функцию (потому его удобнее отлаживать? Не?). Вот одно отличие.
Далее. Если я говорю о переходе от функции у ФБ, то значит, что я не предполагал порождать множество єкземпляров. Значит, тут разница между ФБ и функцией тоже исчезает.
И... всьо. Моих познаний больше не хватает.

Да, чтобьі не вставать дваждьі. А что за фигня бьівает, что при отладке вдруг я не могу поставить точку останова в ФБ? Причем я не вижу закономерности. То вдруг позволяет, то нет. При єтом я, конечно, открьіваю єкземплярьі... Я не разбирался специально, но раз уж тут тема ФБ, дай, думаю, спрошу.

capzap
07.06.2016, 21:05
vladimirisitnikov был прав, только что проверил, получится создать только 236 ФБ при одной бибке standart и без исключения неиспользуемого

Alex256
08.06.2016, 14:52
Народ, подскажите пожалуйста, где можно скачать библиотеку ПЛК_ПЧВ.lib, используемую автором в этом ролике https://www.youtube.com/watch?v=X8no0PFBhy8 (6:08)?

_Mikhail
08.06.2016, 15:09
Народ, подскажите пожалуйста, где можно скачать библиотеку ПЛК_ПЧВ.lib, используемую автором в этом ролике https://www.youtube.com/watch?v=X8no0PFBhy8 (6:08)?
Держи библиотеку http://www.owen.ru/forum/attachment.php?attachmentid=24839&stc=1

Alex256
09.06.2016, 11:14
Спасибо большое!

Александр067
11.06.2016, 18:06
Здравствуйте, помогите разобраться; есть три ТРМ 201 подключенные к ПЛК 160 по RS 485 протокол Modbus RTU
Настройки RS 485 :24916
Адреса в ТРМах 1,2,3 и соответственно такие же в universal modbus device.
При подключении такая картина 24917
опрашивается только один прибор.
Я так понял сюда надо значение вводить24918

Николаев Андрей
11.06.2016, 18:54
http://www.owen.ru/forum/showthread.php?t=13584
Есть пример подключения ТРМ202. Все по аналогии.

Александр067
11.06.2016, 19:06
Спасибо,сейчас попробую. Еще хотел узнать, я в ТРМах поменял адреса которые были по умолчанию и поставил 1,2,3. Это не могло повлиять на связь с ними ?

capzap
11.06.2016, 19:32
Спасибо,сейчас попробую. Еще хотел узнать, я в ТРМах поменял адреса которые были по умолчанию и поставил 1,2,3. Это не могло повлиять на связь с ними ?

Вы убедились что после сброса питания в них остались заданные адреса?

Артемыч01
12.06.2016, 11:59
всем привет , написал программу на языке Ld :
PROGRAM PLC_PRG
VAR
TP1: TON;
TP2: TON;
RS: RS;
T1: BOOL;
END_VAR
VAR_INPUT
PUSK: BOOL;
END_VAR
VAR_OUTPUT
STOP:BOOL;
ZASL: BOOL;
END_VAR
проблема в том что не получается написать на языке st ,можете помочь ?
задача : Зерно через заслонку 1 норией 2 подается на метательный транспортер 3.

Василий Кашуба
12.06.2016, 13:28
всем привет , написал программу на языке Ld :
PROGRAM PLC_PRG
VAR
TP1: TON;
TP2: TON;
RS: RS;
T1: BOOL;
END_VAR
VAR_INPUT
PUSK: BOOL;
END_VAR
VAR_OUTPUT
STOP:BOOL;
ZASL: BOOL;
END_VAR
проблема в том что не получается написать на языке st ,можете помочь ?
задача : Зерно через заслонку 1 норией 2 подается на метательный транспортер 3.
Если знакомы со схемами, то проще писать программы на CFC.

Александр067
12.06.2016, 21:01
Вы убедились что после сброса питания в них остались заданные адреса?

Да я сразу перезагрузил их и проверил. Мне непонятно что такое функция (hex) и как регистр прописывать.

capzap
13.06.2016, 06:56
Да я сразу перезагрузил их и проверил. Мне непонятно что такое функция (hex) и как регистр прописывать.

по отдельности каждый прибор отвечает мастеру?

славаолд
14.06.2016, 11:10
Товарищи подскажите такую вещь. Подходит ли СМИ-2 светодиодный индикатор для отображения напряжения снимаемое с потенц. 0-10В. (тип представления- REAL) ПУТЬ: потенц- далее в плк на вход в проект где преобразуется в INT с помощью real_to_int - и на сми думаю она то что надо? есть ли у кого примеры по этой теме--проблемка такая как увидеть преобразования переменной на выходе

Александр067
14.06.2016, 12:54
Здравствуйте, есть вопрос по аналоговым выходам (контроллер ПЛК160). В настройках конфигурации указано 4-20мА программно подаю на выход 11мА собираю цепь по типу <У> и <А> выдает 15 мА, а если собираю схему по типу <И> ток 6.3 мА напряжение=24 В, сопротивление 100 Ом. Подскажите пожалуйста что может быть не так.

24946 24947

petera
14.06.2016, 13:14
Здравствуйте, есть вопрос по аналоговым выходам (контроллер ПЛК160). В настройках конфигурации указано 4-20мА программно подаю на выход 11мА собираю цепь по типу <У> и <А> выдает 15 мА, а если собираю схему по типу <И> ток 6.3 мА напряжение=24 В, сопротивление 100 Ом. Подскажите пожалуйста что может быть не так.

24946 24947

Весьма своеобразное обращение с контроллером. Как это "собираю цепь по типу <У> и <А> .... собираю схему по типу <И>"
Если ПЛК имеет в марктровке букву "И", то какого лешего схема по типу "<У> и <А>".
А если ПЛК - "У" или "А" тогда зачем ему схема по тпу "И" ?
Если ПЛК - "А", то как он сможет работать в режиме выхода 4-20 мА?

Александр067
14.06.2016, 13:50
Весьма своеобразное обращение с контроллером. Как это "собираю цепь по типу <У> и <А> .... собираю схему по типу <И>"
Если ПЛК имеет в марктровке букву "И", то какого лешего схема по типу "<У> и <А>".
А если ПЛК - "У" или "А" тогда зачем ему схема по тпу "И" ?
Если ПЛК - "А", то как он сможет работать в режиме выхода 4-20 мА?

Да вы правы контроллер работает по типу "А" но все равно не понятно почему он выдает 15мА вместо 11-ти.

petera
14.06.2016, 14:09
Да вы правы контроллер работает по типу "А" но все равно не понятно почему он выдает 15мА вместо 11-ти.

Блин, какие миллиамперы! Вы так сожжете выход ПЛК! Ведь он предназначен для вывода напряжения 0-10В, а не тока. Выход по напряжению не допускает низкоомную нагрузку, сопротивление нагрузки должно быть десятки кОм, но не как не 100 Ом.

Зы. Хотя я наверно не прав. У меня в "бумажном" руководстве написано
И - ток 4-20
А - напряжение 0 -10
У - универсальный
А на сайте А и У - наоборот!

Александр067
14.06.2016, 14:17
Блин, какие миллиамперы! Вы так сожжете выход ПЛК! Ведь он предназначен для вывода напряжения 0-10В, а не тока. Выход по напряжению не допускает низкоомную нагрузку, сопротивление нагрузки должно быть десятки кОм, но не как не 100 Ом.

В руководстве написано А - универсальные, ток от 4 до 20 мА, напряжение от 0 до 10 В. Что не так ? Я мультиметром замерял ток 15 мА показывает. У меня контроллер ПЛК160 24 А.М

славаолд
14.06.2016, 19:17
добрый вечер товарищи... У кого есть опыт использования панели индикации овен (сми) для отображения числа . тип int. на входе плк ТИП REAL на выходе плк INT/ конечно использую табличную ф-ю REAL_TO_INT но хотелось на выходе просмотреть ... что можно подцепить в эмуляторе на выходе этой функции... так чтобы задал значение на входе ... а на выходе появилась цифирь... А потом можно смело к плк подключить сми

Tomade
20.06.2016, 09:55
Заказали ПЛК 110-60. Изучил язык CFC по ознакомительному видеокурсу Кирилла Гайнутдинова.
Но вот застрял на алгоритме создания и сохранения функционального блока: нигде не нашёл - ни в документации, которую можно скачать с сайта, ни в Сети - понятного для чайника объяснения.
Пожалуйста, приведите любой простейший пример создания функционального блока (или дайте ссылку) на CFC.

ASo
20.06.2016, 10:02
Что конкретно Вы хотите сделать?

Tomade
20.06.2016, 10:13
Хочу оформить фрагмент программы, к которому буду неоднократно обращаться, в виде функционального блока.

31kip
20.06.2016, 10:22
Заказали ПЛК 110-60. Изучил язык CFC по ознакомительному видеокурсу Кирилла Гайнутдинова.
Но вот застрял на алгоритме создания и сохранения функционального блока: нигде не нашёл - ни в документации, которую можно скачать с сайта, ни в Сети - понятного для чайника объяснения.
Пожалуйста, приведите любой простейший пример создания функционального блока (или дайте ссылку) на CFC.

На PLC_PRG щелкнуть правой кнопкой мыши - добавить объект - выбрать "функциональный блок" и присвоить ему имя. Далее работаешь как с обычной программой, только создаешь входные и выходные переменные(при объявлении указать var_input или var_output соответственно). а вот как дать ссылку я не знаю, могу в личку сбросить пример.

31kip
20.06.2016, 10:38
25043250442504525046 а дальше в программе вставляешь элемент и называешь его именем функционально блока))

Tomade
20.06.2016, 10:54
Попробовал по вашей подсказке создать простейший (потолочный) функциональный блок. При компиляции программа не заругалась, но когда в режиме эмуляции запустил на выполнение (нажал F5), то получил такое сообщение (см. вложения). Почему?

31kip
20.06.2016, 11:07
покажите проект, по фото ничего не понятно

smk1635
20.06.2016, 11:09
Попробовал по вашей подсказке создать простейший (потолочный) функциональный блок. При компиляции программа не заругалась, но когда в режиме эмуляции запустил на выполнение (нажал F5), то получил такое сообщение (см. вложения). Почему?

По тому что блок назван PLС_PRG. Измените название на другое.

Tomade
20.06.2016, 11:51
По тому что блок назван PLС_PRG. Измените название на другое.
Изменил название. Сообщение об ошибке тоже изменилось, теперь оно такое: "Проект должен быть корректен для подключения".
Предположил, что это от того, что создавал функциональный блок сам по себе, без открытого рабочего проекта.
Тогда создал простейший проект и уже в нём - функциональный блок. Но теперь в режиме эмуляции невозможно изменять значения входных переменных блока.
Кто-бы написал пошаговую инструкцию для чайника... как создавать, как сохранять, в какую библиотеку...

smk1635
20.06.2016, 13:26
Проект выложите что сделали.

Tomade
20.06.2016, 13:38
Проект выложите что сделали.
Выкладываю. Вопросы такие:
1. Для функционального блока создаётся новое окно, в котором невозможно отлаживать ФБ в режиме эмуляции. Как же его отлаживать?
2. В пределах проекта, в котором ФБ создан, этот ФБ можно вызывать. А куда и как этот ФБ следует сохранить, чтобы его можно было вызывать в любых проектах?

petera
20.06.2016, 14:19
Выкладываю. Вопросы такие:
1. Для функционального блока создаётся новое окно, в котором невозможно отлаживать ФБ в режиме эмуляции. Как же его отлаживать?
2. В пределах проекта, в котором ФБ создан, этот ФБ можно вызывать. А куда и как этот ФБ следует сохранить, чтобы его можно было вызывать в любых проектах?

2. Проект-->Экспорт... Выбрать нужный(нужные) ФБ и нажать ОК. В том проекте, где понадобятся эти ФБ Проект-->Импорт...
1.
Как-то так

https://www.youtube.com/watch?v=5Di6a9zOKwc

Tomade
21.06.2016, 09:18
Разобрался. Всем спасибо, и особенно - petera

LuckLake
21.06.2016, 11:16
Необходимо выдать на один из выходов ПЛК110.32-M ределенное число прямоугольных (бинарных) импульсов с периодом 150 мкс. Я попыталась реализовать при помощи таймера, но из-за использования переменной типа TIME получается период 2 мс (задает интервал длительности импульса и паузы). Можно ли использовать дробное число? Или другой тип?
Я нашла упоминания про блок ШИМ, но не знаю, где его найти и как использовать. Это ведь программный элемент?

YuriBel
21.06.2016, 13:05
Если у вас контроллер из нового семейства (М02), то пожалуй стоит проштудировать вот эту ветку:
http://www.owen.ru/forum/showthread.php?t=22169
Если контроллер старый, то не уверен, что это получится вообще, и уж точно не получится из основного цикла ПЛК.

death132
24.06.2016, 17:25
Всем здравствуйте! Начинаю осваивать ПЛК Овен. Сейчас в работе ПЛК110-32РМ.
Подключил ПЛК(master) с панелью оператора СП307(slave) по RS-485, протокол MODBUS rtu. Оператор выбирает какой механизм включить на дисплее, ПЛК переодически считывает из панели биты состояния, вкл/откл выходы. Все хорошо, все работает.
Нужно из панели периодически считывать текущее время(PSW[300]-[306] ), вдруг оператор его изменил, и устанавливать это время в ПЛК, для корректного формирования своих лог файлов (какой механизм сколько работал и когда).

Сталкнулся со следующей проблемой:
В конфигураторе ПЛК добавляю Universal ModBus Device, добавляю в него 7 регистров, устанавливаю команду читать и период опроса 10сек (10000 мс).
Полусаю: считывает 1 регистр, проходит 10 сек, считывает другой регистр (не обязательно по порядку), прроходит 10 сек, и т.д....

КАК СДЕЛАТЬ ЧТО БЫ ПЛК СЧИТЫВАЛ ВСЕ 7 РЕГИСТРОВ ЗА 1 ЦИКЛ???

Т.Е. прочитал 7 регистров, прошло 10 сек, проситал опять все 7 регистров и т.д.
период опроса менял, таймаут тоже, без результатно....

25142

Пробовал настроить Universal ModBus Device by command - все тоже самое. 1 команда - 1 регистр, 1 команда - другой регистр (не обязательно по порядку).

Подскажите в чем дело? Или так и должно быть?

RV9WFJ
25.06.2016, 06:39
Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.

capzap
25.06.2016, 07:33
Дело в том, что PLC Configuration не умеет делать групповые запросы.

и для кого тут форумчане делились опытом, как использовать модуль строка

death132
25.06.2016, 08:57
Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.

ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!

Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.

На мой взгляд все логично=) А вот не тут-то было!!!!!

конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно 299!!! циклов (запусков Read10s_PRG). 299 КАРЛ :confused:
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:

IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)


get1_modbus: MB_RD_HOLD_REGS

get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
cmpl будет TRUE когда get1_modbus получит данные.
НО
получит она их через 13 циклов (запусков Read10s_PRG ) 13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.


PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Ну и напоследок
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)

petera
25.06.2016, 10:26
ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!

Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.

На мой взгляд все логично=) А вот не тут-то было!!!!!

конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно 299!!! циклов (запусков Read10s_PRG). 299 КАРЛ :confused:
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:

IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)


get1_modbus: MB_RD_HOLD_REGS

get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
cmpl будет TRUE когда get1_modbus получит данные.
НО
получит она их через 13 циклов (запусков Read10s_PRG ) 13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.


PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Ну и напоследок
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)
Зачем одно и тоже по всем веткам форума писать?

capzap
25.06.2016, 10:32
ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!

Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.

На мой взгляд все логично=) А вот не тут-то было!!!!!

конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно 299!!! циклов (запусков Read10s_PRG). 299 КАРЛ :confused:
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:

IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)


get1_modbus: MB_RD_HOLD_REGS

get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
cmpl будет TRUE когда get1_modbus получит данные.
НО
получит она их через 13 циклов (запусков Read10s_PRG ) 13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.


PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Ну и напоследок
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)

1) А заглянуть во внутренности COM_SERVICE и поправить нужное или написать свое ПОУ открытия порта внимательно читая доки на syslibcom было не досуг?
2) Ну ради экспериментов можно конечно ознакомиться с плкашной многозадачностью, но чувствуется не до конца Вы разобрались
3) про напоследок, Вы серьезно считаете что открыли Америку?

death132
25.06.2016, 17:24
1) А заглянуть во внутренности COM_SERVICE и поправить нужное или написать свое ПОУ открытия порта внимательно читая доки на syslibcom было не досуг?
2) Ну ради экспериментов можно конечно ознакомиться с плкашной многозадачностью, но чувствуется не до конца Вы разобрались
3) про напоследок, Вы серьезно считаете что открыли Америку?

Если читали первое сообщение то видели что это мой первый опыт с ПЛК, потому и просил помощи, и вопрос задал в теме для новичков! До заглядывания во внутренности библиотек и исправления их под свои нужды я еще не дорос. Тем более задача на первый взгляд была элементарной: читать несколько регистров 1 запросом очень редко. Не думал что для этого нужны танцы с бубном.

А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???

death132
25.06.2016, 17:29
и для кого тут форумчане делились опытом, как использовать модуль строка

Строку читать пробовал, но приходило каждый раз одно и то же, хотя данные должны были меняться. Разбираться не стал, послушал разумного совета petera и RV9WFJ. Задача решена, пусть и абсолютно другим способом.

death132
25.06.2016, 17:30
Зачем одно и тоже по всем веткам форума писать?
Не думал что так оперативно и там и там ответят. Больше не буду.

capzap
25.06.2016, 18:59
А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???
а смысл помогать, Вам сказали что панель лучше мастером, Вы уже поменяли подход, завтра например Валенок скажет, что лучше нету когда панель слейв, опять станете переходить?
И мой совет это не тыканье носом,а рекомендация изучить как пишется код, проанализировать в каком месте возникает задержка открытия порта

Oleg387
27.06.2016, 13:25
Здравствуйте. Подскажите как скачать программу из ПЛК 110

Andrew_Stranger
27.06.2016, 22:30
Никак не скачать

RV9WFJ
28.06.2016, 07:45
Здравствуйте. Подскажите как скачать программу из ПЛК 110
Если исходники туда не залили, то никак.
Если залили то в CS меню Файл -> Открыть проект -> Загрузить проект из ПЛК. Предварительно выбрать нужный таргет контроллеру.

ohwow
07.07.2016, 15:33
Здравствуйте. Подскажите как при отключении ПЛК100 обнулялись переменные?

capzap
07.07.2016, 16:11
Здравствуйте. Подскажите как при отключении ПЛК100 обнулялись переменные?

подождать 10 минут или по инверсии бита питания запустить бесконечный цикл

ohwow
08.07.2016, 08:49
подождать 10 минут или по инверсии бита питания запустить бесконечный цикл

Подскажите поподробнее как это сделать на языке CFC

capzap
08.07.2016, 09:35
Всмысле, как подождать 10 минут?

ohwow
08.07.2016, 10:06
Нет, вариант с ожиданием 10 минут мне не подходит.
Ситуация вот какая: если я отключаю ПЛК от питания в момент когда реле замкнуты, то при включении ПЛК обратно, у меня эти реле возвращаются в замкнутое состояние.
Как нужно: При включении ПЛК реле были разомкнуты

Andrew_Stranger
08.07.2016, 12:09
А зачем так дергать питание на ПЛК?

Serega_80
10.07.2016, 12:26
Приветствую всех! Есть контроллер ПЛК73, базовая конфигурация, т.е. на интнрфейсной плате отсутствуют RS485 и RS232. Мне необходимо соединить ПЛК с панелью ИП320. Скажите, правильно ли я понял, что это можно сделать через интерфейс RS232 Debug? И второй вопрос. В Codesys 2.3 в меню конфигурации ПЛК у меня неактивна строчка "добавить подменю" (см. вложение). Должна ли быть активна эта строчка? Почему она неактивна? target-файл для ПЛК73 версии 2.01

RV9WFJ
11.07.2016, 05:56
правильно ли я понял, что это можно сделать через интерфейс RS232 Debug?
Нельзя

В Codesys 2.3 в меню конфигурации ПЛК у меня неактивна строчка "добавить подменю" (см. вложение). Должна ли быть активна эта строчка? Почему она неактивна? target-файл для ПЛК73 версии 2.01
Чтобы добавить подменю, кликать надо на меню, а не на ПЛК. И добавить его можно в свое меню, а не в системное

Serega_80
11.07.2016, 09:11
Уважаемый RV9WFJ, во-первых, вопрос о подключении через RS232 Debug я задал не просто так, а потому что прочел об этом в FAQе (см. вложение). Из этого я подумал, что нужен другой кабель, не тот, который идет в комплекте с ПЛК73, но можно этот кабель распаять самостоятельно, без перемычки, упоминаемой в FAQе. Во-вторых, извиняюсь, я неправильно обозвал пункт для добавления Modbus. Правильно он называется "Добавить подэлемент". Прикладываю второе вложение, называемое "Настройка и подключение ИП320 к ПЛК". Это часть статьи Гайнутдинова Кирилла, расположенной по адресу: http://ftp.owen.ru/index.html/AiP/32/aip0108s7-9.pdf. В ней показано, как добавить подэлемент. Во вложении я выделил этот абзац. Вот этот пункт ("добавить подэлемент") у меня и неактивен.

ASo
11.07.2016, 09:55
Приведенное Вами относится к ПЛК1** и подобным, но не относится к ПЛК63 и особенно ПЛК73.
Добавлять параметры в них можно только в 3 слота, RS-232 Debug в ПЛК73 для работы по протоколу MODBUS использовать не возможно.

Serega_80
11.07.2016, 11:20
Понял. Значит, нужно устанавливать интерфейсную плату для связи с ИП320. Спасибо!

Артемыч01
14.07.2016, 16:19
здравствуйте , в чём достоинства и недостатки плк 110 и 150 если их сравнить ?

_Mikhail
14.07.2016, 16:39
здравствуйте , в чём достоинства и недостатки плк 110 и 150 если их сравнить ?
Это абсолютно разные ПЛК. что именно интересует?

Panalexfix
14.07.2016, 18:12
Доброго времени суток!!!
Подскажите как сделать или где прочитать!!!
Необходимо сделать 32bit-ную переменную из разных булевых переменных(это и входы выходы плк и программные переменные) для передачи их в мастерскаду(экономия количества переменных. Их в демо версии 32 а у меня реалов 25 и булевых куча) из плк. Вопрос в том что в плк в модбас слейве есть только 4 байта а в модбас мастере 32 bits output\input module (оба дворд) как собрать из булевых в один 32 битный (дворд)?

amn
14.07.2016, 19:18
Попробуйте через точку.

var_dword: dword;
var_bool1: bool;
var_bool2: bool;
...
var_bool31: bool;
_______________

var_dword.0:=var_bool0;
var_dword.1:=var_bool1;
var_dword.2:=var_bool2;
...
var_dword.31:=var_bool31;

Eugene.A
14.07.2016, 19:22
Их в демо версии 32 а у меня реалов 25
Сначала прочитайте, как подсчитываются точки в Мастерскаде. Ваш номер не прокатит.

Panalexfix
15.07.2016, 07:55
Попробуйте через точку.

var_dword: dword;
var_bool1: bool;
var_bool2: bool;
...
var_bool31: bool;
_______________

var_dword.0:=var_bool0;
var_dword.1:=var_bool1;
var_dword.2:=var_bool2;
...
var_dword.31:=var_bool31;

Спасибо буду пробовать!!

xoxa
20.07.2016, 09:11
Здравствуйте, как в Codesys задать массив, пределы которого определяются переменными, что то вроде такого:
massiv : array [A..B] of int; где A и B можно было бы задавать самому?

capzap
20.07.2016, 09:16
Здравствуйте, как в Codesys задать массив, пределы которого определяются переменными, что то вроде такого:
massiv : array [A..B] of int; где A и B можно было бы задавать самому?

в оскат такое есть, можете посмотреть примеры там. Смысл заключается в том, что создаете глобальную константную переменную и подставляете её в объявлении массива

xoxa
20.07.2016, 09:21
Пардон, а что за зверь оскат?

capzap
20.07.2016, 09:22
http://www.oscat.de/index.php?option=com_jdownloads

xoxa
20.07.2016, 09:24
Нашёл про оскат, буду читать.

xoxa
20.07.2016, 12:46
Большое спасибо за подсказку, в ресурсах в глобальных переменных создал объект Constants, в этом объекте создал параметр массива и все заработало.

capzap
20.07.2016, 13:07
Большое спасибо за подсказку, в ресурсах в глобальных переменных создал объект Constants, в этом объекте создал параметр массива и все заработало.

про глобальное положение это я про оскат говорил чтоб легче искать было, можно VAR CONSTANT и внутри ФБ так же объявить, тоже работает

xoxa
20.07.2016, 19:36
Еще один вопрос возник касаемо возможностей Codesys 2: Возможно ли скопировать целиком одну строку массива в другую без использования конструкции For i := 0 до A...?

amn
20.07.2016, 20:25
У Вас одномерный массив строк? Тогда просто присваивайте mas[1]:=mas[2]. Можно присваивать элементам массива любые значения того же типа.

xoxa
21.07.2016, 20:35
Буду пробовать присваиванием. Есть еще вопрос: Еесли выход/вход ПЛК типа dword, возможно ли эти входы/выходы интерпритировать в виде массива типа bool без конструкции вида my_var.x:=y ? а сразу перевести dword в массив?

amn
21.07.2016, 21:27
Еесли выход/вход ПЛК типа dword Вы ничего не путаете?

xoxa
21.07.2016, 22:22
У меня на ПЛК fastwel есть выходной параметр диагностики типа dword, т.е. это не физический выход, а внутренний выходной параметр, по которому можно оценивать состояние модулей контроллера. Извиняюсь, что не сразу сформулировал влпрос корреткто. Но суть такая, чтобы было можно интерпритировать этот dword, как массив, по которому можно было бы оценивать состояние модулей ПЛК. Например, при отображении 524287, все 19 модулей рабочите, при 516095 не рабочий модуль 14-й.

amn
21.07.2016, 22:43
Создайте функциональный блок из 19 строчек, в котором перекиньте все биты данного параметра в массив.

xoxa
21.07.2016, 23:07
это должно быть что-то вроде такого: array[0] := dword.0;
и так 19 раз?

amn
21.07.2016, 23:31
Именно так. Только не совсем понятен смысл все это загонять в массив, если можно через точку иметь ту же информацию с данного параметра. Тем более, что в массиве, даже если он объявлен как BOOL для каждого элемента отводится 1 байт, т.е. размер будет в 8 раз больше.

xoxa
22.07.2016, 11:41
В целом необходимо, чтобы при наличии параметра диагностики типа dword определять номера не рабочих модулей ПЛК.

Александр067
22.07.2016, 19:01
Всем привет ))) подскажите пожалуйста в таком моменте ; есть небольшой алгоритм который управляет пневмоцилиндром который в свою очередь должен трясти решетку с определенной частотой для этого я использовал функциональный блок blink (генератор прямоугольных импульсов) после тридцати ударов тряска должна остановиться и на выходе должен быть "0" а там почему то "1".
Вот 25510
Почему так происходит?

amn
22.07.2016, 19:17
Это блинк такой глючный. Попробуйте заменить на этот (http://www.owen.ru/forum/showthread.php?t=23891&p=206557&viewfull=1#post206557)

Andrew_Stranger
22.07.2016, 20:08
Выход с блинка надо пропустить через and, ,туда же ton завести.

Александр067
23.07.2016, 11:24
Выход с блинка надо пропустить через and, ,туда же ton завести.

Я так и сделал , но все же вопрос остался поэтому и написал. Ладно попробую поменять его. Спасибо за ответы.

capzap
23.07.2016, 11:29
Я так и сделал , но все же вопрос остался поэтому и написал. Ладно попробую поменять его. Спасибо за ответы.

а если на хосте нажать ЛКМ, из контекстного меню выбрать пункты порядок=>в соответствии с потоком данных, ситуация разве не поменяется?

Александр067
23.07.2016, 13:13
а если на хосте нажать ЛКМ, из контекстного меню выбрать пункты порядок=>в соответствии с потоком данных, ситуация разве не поменяется?

Я не понял можно поподробнее ?

capzap
23.07.2016, 13:23
Я не понял можно поподробнее ?

на Вашем скрине у каждого квадратика в правом верхнем углу стоит порядковый номер выполнения, поэтому сперва присваивается переменной значение с выхода блока, а потом выполняется сам блок

Andrew_Stranger
23.07.2016, 18:51
Я так и сделал , но все же вопрос остался поэтому и написал. Ладно попробую поменять его. Спасибо за ответы.
В справке об этом написано.

Примечание: При переходе ENABLE в FALSE, выход OUT остается в том состоянии, в котором он был в этот момент. Если вам необходимо чтобы выходная переменная сбрасывалась в FALSE при ENABLE равном FALSE, то используйте выражение "OUT AND ENABLE" на выходе (т.е. добавьте блок AND на выход и на второй вход подайте ENABLE) .

Эдуард_Н
24.07.2016, 12:28
Сейчас у меня к ОРС-серверу привязаны переменные которые используются и панелью (в слейве просто добавлен TCP к уже имеющемуся RS-232).
Вопрос, как по правильному к проекту прициплять верхний уровень?

Ekach1987
24.07.2016, 14:44
Добрый день форумчане. Помогите пожалуйста с проблемой. Нужно создать тренд в КДС по сигналу с термопары через блок Овен мв 110-8А. Блок и контроллер я настроил. В КДС, в разделе конфигурации ПЛК, создал модбас мастер и real input module. Получил адрес входа - %ID7.1.0.0. При подключении к ПЛК в этом же разделе я вижу данные с термопары (отображается в той же строчке, где прописан адрес %ID7.1.0.0). Затем решил начать с простого, просто отобразить данную температуру в разделе Визуализация через элемент Индикатор. Выставил в настройках индикатора выставил величину шкалы, так же в разделе Переменная\Шкала, в строке Переменная прописал адрес входа %ID7.1.0.0. Когда все загружаю в контроллер индикатор не показывает нужную температуру, а просто показывает в хаотичные хначения. Что я делаю не так?

Ekach1987
24.07.2016, 15:01
Добрый день форумчане. Помогите пожалуйста с проблемой. Нужно создать тренд в КДС по сигналу с термопары через блок Овен мв 110-8А. Блок и контроллер я настроил. В КДС, в разделе конфигурации ПЛК, создал модбас мастер и real input module. Получил адрес входа - %ID7.1.0.0. При подключении к ПЛК в этом же разделе я вижу данные с термопары (отображается в той же строчке, где прописан адрес %ID7.1.0.0). Затем решил начать с простого, просто отобразить данную температуру в разделе Визуализация через элемент Индикатор. Выставил в настройках индикатора выставил величину шкалы, так же в разделе Переменная\Шкала, в строке Переменная прописал адрес входа %ID7.1.0.0. Когда все загружаю в контроллер индикатор не показывает нужную температуру, а просто показывает в хаотичные хначения. Что я делаю не так?

allex609
24.07.2016, 19:16
Добрый день.

Столкнулся впервые с программированием ПЛК ОВЕН, в азах примерно разобрался, возник вопрос следующего характера: как можно вывести в цикле сработавшие входа, к примеру у меня сработали 1, 2, 3 входа, в HMI под это дело отведено одно окошко с 1 переменной выходной (так надо), необходимо показать сначала 1, потом 2, потом 3, и дальше в цикле заново? Заранее благодарю за советы

allex609
24.07.2016, 19:26
Добрый день форумчане. Помогите пожалуйста с проблемой. Нужно создать тренд в КДС по сигналу с термопары через блок Овен мв 110-8А. Блок и контроллер я настроил. В КДС, в разделе конфигурации ПЛК, создал модбас мастер и real input module. Получил адрес входа - %ID7.1.0.0. При подключении к ПЛК в этом же разделе я вижу данные с термопары (отображается в той же строчке, где прописан адрес %ID7.1.0.0). Затем решил начать с простого, просто отобразить данную температуру в разделе Визуализация через элемент Индикатор. Выставил в настройках индикатора выставил величину шкалы, так же в разделе Переменная\Шкала, в строке Переменная прописал адрес входа %ID7.1.0.0. Когда все загружаю в контроллер индикатор не показывает нужную температуру, а просто показывает в хаотичные хначения. Что я делаю не так?

Добрый день

Попробуйте присвоить какой либо переменной значение входа, к примеру так Temp AT %ID0.0.0:REAL;
Затем в строке Переменная пишите PLC_PRG.Temp, где PLC_PRG - название вашей программы в POU. Должно помочь

Ekach1987
25.07.2016, 10:07
Allex609, Спасибо, все заработало. Интересный нюанс - с дискретными входами можно управлять прямо через адрес, а с аналоговыми через тег

ОксанаН
25.07.2016, 10:51
Добрый день! Мой первый проект в CodeSys, помогите пожалуйста решить проблему.
Необходимо считать скорость вращения колеса. Один оборот - один импульс.
ПЛК 150 U-M, прошивка 2.10.8, таргет 2.10, все настройки по умолчанию.
Пробую два алгоритма: считать время между импульсами и количество импульсов за промежуток времени.
До 10Гц количество импульсов считает стабильно, после 12 начинает пропускать.


TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*)

IF TRIG1.Q THEN Y:=Y+1;
END_IF

TON1(IN:=NOT TON1.Q,PT:=T#2s);
IF TON1.Q THEN
KOL_OB:=Y;
Y:=0;
END_IF

Andrew_Stranger
25.07.2016, 12:43
Может стоит с временем фильтрации поиграться.

ОксанаН
25.07.2016, 13:31
Спасибо за совет, уменьшение времени существенно помогло, но не до конца, раз-два в минуту считает один лишний импульс.

petera
25.07.2016, 14:00
Добрый день! Мой первый проект в CodeSys, помогите пожалуйста решить проблему.
Необходимо считать скорость вращения колеса. Один оборот - один импульс.
ПЛК 150 U-M, прошивка 2.10.8, таргет 2.10, все настройки по умолчанию.
Пробую два алгоритма: считать время между импульсами и количество импульсов за промежуток времени.
До 10Гц количество импульсов считает стабильно, после 12 начинает пропускать.


TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*)

IF TRIG1.Q THEN Y:=Y+1;
END_IF

TON1(IN:=NOT TON1.Q,PT:=T#2s);
IF TON1.Q THEN
KOL_OB:=Y;
Y:=0;
END_IF
Почему время у таймера 2s? Ведь по условию "Один оборот - один импульс".

Вариант

VAR
TRIG1: R_TRIG;
D_IN1: BOOL;
INT1: INT;
old: TIME;
new: TIME;
Period: TIME;
Kol_v_Sec: REAL;
END_VAR

TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*)
CASE INT1 OF
0: IF TRIG1.Q THEN
old:=TIME();
INT1:=1;
END_IF;
1: IF TRIG1.Q THEN
new:=TIME();
Period:= new - old;
Kol_v_Sec:=1000/TIME_TO_REAL(Period);
INT1:=0;
END_IF;
END_CASE

ОксанаН
25.07.2016, 14:26
Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.

petera
25.07.2016, 14:28
Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.

Можно попробовать ФБ FREQ_MEASURE
25532

Владимир Ситников
25.07.2016, 14:34
Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.

А каков "период стабильности нужен"? Иначе говоря: "если скорость вращения изменилась, то через какое время усреднённое значение должно совпасть с новой скоростью"?

Попробуйте экспоненциальное сглаживание (http://www.owen.ru/forum/showthread.php?t=23057&p=192195&viewfull=1#post192195)

В простейшем слуаче -- просто скопируйте как в том проекте-примере (http://www.owen.ru/forum/showthread.php?t=23057&page=2&p=192163&viewfull=1#post192163).
В основном цикле просто подсчёт импульсов, а во вспомогательной программе -- усреднение.

Как часто запускать программу и какой "усредняющий" интервал ставить -- зависит от конкретной задачи.

Владимир Ситников
25.07.2016, 14:41
Можно попробовать ФБ FREQ_MEASURE
25532

Да, freq_measure тоже обсуждали (http://www.owen.ru/forum/showthread.php?t=23057&p=192234&viewfull=1#post192234) и при его использовании нужно справку хорошенько смотреть. Например при "periods=1 этот блок вырождается в простое 1/время_между_импульсами". Или то, что максимальное значение periods равно 10, т.е. больше чем по 10 импульсам усреднять уже невозможно и т.п.

ОксанаН
25.07.2016, 15:14
Спасибо, сейчас попробую разобраться. "Период стабильности" должен быть не более 2-х секунд, в идеале 1.

vai
25.07.2016, 15:45
Добрый день. Подскажите, как (на CFC) реализовать принудительный сброс булевой переменной в false раз в минуту.

Владимир Ситников
25.07.2016, 16:37
Спасибо, сейчас попробую разобраться. "Период стабильности" должен быть не более 2-х секунд, в идеале 1.
Если так часто, то можно попробовать сглаживать каждый интервал.

Т.е.

Period := new-old; (* т.е. время, прошедшее с прошлого раза, в миллисекундах *)
a := 1.0 - EXP(-Period / 200.0); (* тут 200.0 мс это как раз период усреднения -- его можно менять *)
avg_period := a*Period + (1.0-a)*avg_period; (* тут накапливается усреднение *)

rate := 1000/avg_period; (* что выводить в случае "деления на ноль" предлагаю рассмотреть отдельно *)


Вот пример, как оно может выглядеть: https://docs.google.com/spreadsheets/d/1DyBgCH-cyGu5R4crAURZ24H9LK1rkQ7uJk4EahgJc0A/edit?usp=sharing
Видно, что при увеличении константы результат сглаживания меняется более плавно, но медленнее.

Если характерная частота -- 5-20Гц, то, судя по графику, значение 200 должно неплохо работать. За секунду-полторы оно "выходит на режим", и потом несильно колбасится.

Василий Кашуба
25.07.2016, 18:07
Добрый день. Подскажите, как (на CFC) реализовать принудительный сброс булевой переменной в false раз в минуту.
Попробуйте ФБ BLINK.

capzap
25.07.2016, 19:19
Добрый день. Подскажите, как (на CFC) реализовать принудительный сброс булевой переменной в false раз в минуту.как то так можно

amn
25.07.2016, 21:42
Добрый день.

Столкнулся впервые с программированием ПЛК ОВЕН, в азах примерно разобрался, возник вопрос следующего характера: как можно вывести в цикле сработавшие входа, к примеру у меня сработали 1, 2, 3 входа, в HMI под это дело отведено одно окошко с 1 переменной выходной (так надо), необходимо показать сначала 1, потом 2, потом 3, и дальше в цикле заново? Заранее благодарю за советы

Если еще актуально, набросал программку с комментариями.

Papagun78
26.07.2016, 08:36
Здравствуйте.
Разбираю программу, писаную неизвестным мне программистом. Есть обмен данными по RS-485 через стандартную сеть модбас мастер. Впервые столкнулся с настройкой передачи данных "By command". Интуитивно понимаю что это значит, но не могу понять где находится эта самая команда, по которой происходит обмен данными. Никакого описания принципа работы этого метода я не нашёл. Подскажите если кто сталкивался с подобным или владеет теорией.

amn
26.07.2016, 08:47
Смотрите описание в "Руководстве пользователя ПЛК". Открываете документ и в поиске забиваете "by command".

capzap
26.07.2016, 08:50
Здравствуйте.
Разбираю программу, писаную неизвестным мне программистом. Есть обмен данными по RS-485 через стандартную сеть модбас мастер. Впервые столкнулся с настройкой передачи данных "By command". Интуитивно понимаю что это значит, но не могу понять где находится эта самая команда, по которой происходит обмен данными. Никакого описания принципа работы этого метода я не нашёл. Подскажите если кто сталкивался с подобным или владеет теорией.
из документа http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf

By command – «по команде»: если в переменной Status модуля архивации записана специальная команда, то происходит либо старт архивации, либо ее остановка (0x00FE – «стоп», а 0x00FF – «старт»).

kashtan713
26.07.2016, 13:11
Добрый день! помогите пожалуйста. стоит такая задача: есть клапан, есть газоанализатор. с помощью контроллера необходимо поддерживать определенную концентрацию газа. Знаю, что есть ПИД регуляторы, но они для меня пока что сложны. Поэтому решил написать такую схему: газоанализатор измеряет концентрацию, если она ниже нужной то срабатывает клапан и работает в течении 5сек. проходит 2 сек. если концентрация остается ниже требуемой опять срабатывает клапан. и так до тех пор, пока не установится нужная концентрация. после, как концентрация упадет, цикл заново начинается.
Проблема в том, что не знаю как в программе задать цикличность, чтобы газоанализатор постоянно измерял и давал команды и как задать задержку в двух секундах. (см вложение) 25566

allex609
26.07.2016, 15:49
Огромное спасибо, пойду пробовать!
Если еще актуально, набросал программку с комментариями.

vai
26.07.2016, 17:16
Как правильно объявить массив из 5 номеров? я пишу
listNum: ARRAY[0..4] OF STRING(11):=0('1111111111'),1('2222222222'),2('333 3333333'),3('4444444444'),4('5555555555');
выдает ошибку неверное начальное значение.

capzap
26.07.2016, 18:42
Как правильно объявить массив из 5 номеров? я пишу
listNum: ARRAY[0..4] OF STRING(11):=0('1111111111'),1('2222222222'),2('333 3333333'),3('4444444444'),4('5555555555');
выдает ошибку неверное начальное значение.
непробовали автообъявлением воспользоваться?

Andrew_Stranger
26.07.2016, 18:55
Добрый день! помогите пожалуйста. стоит такая задача: есть клапан, есть газоанализатор. с помощью контроллера необходимо поддерживать определенную концентрацию газа. Знаю, что есть ПИД регуляторы, но они для меня пока что сложны. Поэтому решил написать такую схему: газоанализатор измеряет концентрацию, если она ниже нужной то срабатывает клапан и работает в течении 5сек. проходит 2 сек. если концентрация остается ниже требуемой опять срабатывает клапан. и так до тех пор, пока не установится нужная концентрация. после, как концентрация упадет, цикл заново начинается.
Проблема в том, что не знаю как в программе задать цикличность, чтобы газоанализатор постоянно измерял и давал команды и как задать задержку в двух секундах. (см вложение) 25566
Blink вас спасет.

vai
27.07.2016, 08:44
непробовали автообъявлением воспользоваться?
мм а это как? через ф2?

amn
27.07.2016, 09:00
Как правильно объявить массив из 5 номеров? я пишу
listNum: ARRAY[0..4] OF STRING(11):=0('1111111111'),1('2222222222'),2('333 3333333'),3('4444444444'),4('5555555555');
выдает ошибку неверное начальное значение.

listNum: ARRAY[0..4] OF STRING(11):='1111111111', '2222222222', '3333333333', '4444444444', '5555555555';

vai
27.07.2016, 10:16
amn, спасибо за подсказку. Я уже допенькал до такого варианта - все работает.

Anton441
27.07.2016, 13:37
Добрый день.
Подскажите где можно взять ФБ таймера с возможностью остановки счёта? В какой библиотеке искать? Таймеры нужны как с задержкой включения, так и с задержкой выключения. Заранее благодарен.

amn
27.07.2016, 14:48
Посмотрите здесь (http://www.owen.ru/forum/showthread.php?t=15833&p=119816&viewfull=1#post119816), может подойдет.

ifromkz
28.07.2016, 04:24
Здравствуйте! Помогите чайнику разобраться! Есть ТРМ10-Д.У.ТР и датчик ДТС035Л-РТ100.В3.250! Подключил так: контакт на ДТС 1 к контакту на ТРМ 1 и так далее. Контакт 4 ДТС по экрану к земле... Выбираю в меню ТРМ10 пункт b1-0 и вибираю параметр 02. Выхожу из меню, а на экране 0.0.0.0. Если в меню поставить тип датчика 04 (ТХК) то на экране показывает температуру, но она не совсем верная и медленно растет.... Объясните на пальцах какие контакты из четырех на датчике нужно подключить к прибору и к каким контактам прибора... Спасибо!

ifromkz
28.07.2016, 07:19
Спасибо техподдержке!!!

kashtan713
28.07.2016, 11:38
Blink вас спасет.

Спасибо большое! Выручили! :)

Эдуард_Н
03.08.2016, 06:06
В КДС 2.3 есть в UMD Command.
Вот это переменной можно включать\выключать опрос.
кто ни будь может про это рассказать, желательно с примером?

amn
03.08.2016, 19:27
кто ни будь может про это рассказать, желательно с примером?
Из РЭ на ПЛК 110 и 160:

Ilya177
04.08.2016, 12:46
Здравствуйте! Возникла такая проблема.
Создал одномерный массив из 4 элементов. в PLC_PRG.

PROGRAM PLC_PRG

VAR
current: INT;
aa: ARRAY [1..4] OF INT:=2,5,6,7;
END_VAR
Каждый его элемент нужно привязать к элементам в визуализации.
Но в ассистенте ввода отображается только первый элемент массива.
Т.е. какая-то проблема с адресацией.
После привязки конкретного элемента программа просто выдает ошибку c доступом к несуществующему адресу
Хотя она не жалуется на обычные переменные.
25702
Такая ситуация.

Гарчев Евгений
04.08.2016, 13:31
Здравствуйте! Возникла такая проблема.
После привязки конкретного элемента программа просто выдает ошибку c доступом к несуществующему адресу
Хотя она не жалуется на обычные переменные.
25702
Такая ситуация.
А как Вы привязываете нужный Вам элемент массива? Имя Pou указываете, в котором объявлен массив? Например, (PLC_PRG.aa[3]).

amn
04.08.2016, 19:40
Здравствуйте! Возникла такая проблема.
Создал одномерный массив из 4 элементов. в PLC_PRG.

Каждый его элемент нужно привязать к элементам в визуализации.
Но в ассистенте ввода отображается только первый элемент массива.
Т.е. какая-то проблема с адресацией.
После привязки конкретного элемента программа просто выдает ошибку c доступом к несуществующему адресу
Хотя она не жалуется на обычные переменные.
25702
Такая ситуация.

Скорее всего у Вас в программе где-то используется нулевой элемент массива. Попробуйте в объявлении массива изменить ARRAY [1..4] на ARRAY [0..3].

Гарчев Евгений
05.08.2016, 12:40
Скорее всего у Вас в программе где-то используется нулевой элемент массива. Попробуйте в объявлении массива изменить ARRAY [1..4] на ARRAY [0..3].

Это не поможет, в CDS, действительно, есть проблема, что при объявлении массива, в ассистенте ввода отображается только первый элемент этого массива, остальные необходимо прописывать вручную.

Ilya177
05.08.2016, 13:45
С передачей на визуализацию разобрался. Спасибо с этим, товарищи Гарчев Евгений и Amn.
Только вот оказалась еще одна проблема:
Я не могу передать элемент массива в свою функцию:

onoff(switch:=PLC_PRG.a[0]);
Вроде оно передается так.

Вот сама функция:

FUNCTION Onoff : BOOL
VAR_IN_OUT
switch: BOOL;
END_VAR
VAR
can_change: BOOL;
END_VAR

can_change := TRUE;
IF (switch) THEN switch := FALSE;
can_change := FALSE;
END_IF;
IF ((NOT switch) AND (can_change)) THEN switch := TRUE;
END_IF;
RETURN;

При передаче возникает ошибка доступа к несуществующему адресу..
массив 'A' является булевым

kvr15
05.08.2016, 15:27
Подскажите пожалуйста возникнут ли у меня проблемы с обменом данными, если:
Проект: 5 контроллеров,ОРС-сервер,Скада. На скаду выводится всё необходимое из этих ПЛК,но мне необходимо чтобы все эти ПЛК между собой обменивались некоторым кол-вом переменных.
Вопрос: как отразиться на моей системе если для каждого плк создать обмен с другими плк по протоколу Modbus TCP, если помимо всего у каждого плк есть ещё обмен с другими устройствами по Modbus RTU и со скадой через ОРС-сервер.
25714

amn
05.08.2016, 20:05
Я не могу передать элемент массива в свою функцию
...
При передаче возникает ошибка доступа к несуществующему адресу..
массив 'A' является булевым

Похожий вопрос с функцией уже был на форуме в этой теме (http://www.owen.ru/forum/showthread.php?t=23498&p=199070&viewfull=1#post199070)


Подскажите пожалуйста возникнут ли у меня проблемы с обменом данными, если:
Проект: 5 контроллеров,ОРС-сервер,Скада. На скаду выводится всё необходимое из этих ПЛК,но мне необходимо чтобы все эти ПЛК между собой обменивались некоторым кол-вом переменных.
Вопрос: как отразиться на моей системе если для каждого плк создать обмен с другими плк по протоколу Modbus TCP, если помимо всего у каждого плк есть ещё обмен с другими устройствами по Modbus RTU и со скадой через ОРС-сервер.
25714

Посмотрите в этой теме (http://www.owen.ru/forum/showthread.php?t=24915&p=216632&viewfull=1#post216632)

Валенок
07.08.2016, 00:33
Вот сама функция:
На сам вопрос вроде ответили. По самой функции же - чего много букв. Почему не просто:
switch := not switch;
?

evgeni293
09.08.2016, 14:42
Доброго времени суток.
Как заставать считать "ch" не c 0, а с 10 например. И получить в итоге
ch=10, ch=11, ch=12...

Извиняюсь за довольно глупый вопрос.

IF Pusk1=TRUE THEN
IF P1>Pust THEN
IF (TIMER + T#1S)<TIME() THEN
TIMER:=TIME();
Ch:=ch+1;
END_IF

ELSE IF P1<=Pust THEN
IF (TIMER + T#1S)<TIME() THEN
TIMER:=TIME();
Ch:=ch-1;
END_IF
END_IF
END_IF
END_IF
IF Pusk1=FALSE THEN IF ch>0 THEN
IF (TIMER + T#1S)<TIME() THEN
TIMER:=TIME();
Ch:=ch-1;
END_IF

ELSE IF ch<0 THEN
IF (TIMER + T#1S)<TIME() THEN
TIMER:=TIME();
Ch:=ch+1;
END_IF
END_IF
END_IF
END_IF
IF ch=0 THEN alarm:=TRUE;
ELSE alarm:=FALSE;
END_IF

IF sbros=TRUE THEN ch:=0;

END_IF

Валенок
09.08.2016, 17:12
А чо это ?

evgeni293
09.08.2016, 17:58
А чо это ?

так сказать регулирование частоты ПЧ в зависимости от давления(без пид-регулятора)

Ilya177
10.08.2016, 13:05
Доброго времени суток, спасибо всем за то, что тогда помогли!
Вот произошла очередная странность:
каким-то образом глобальный функциональный блок current_time типа RTC
искажает значения соседней инициализированной структуры d_h.


VAR_GLOBAL
current_time: RTC;
d_h: delay_h:=(delay:=500, 2500, 100);
END_VAR

Вроде же все нормально?

PLC_PRG:

current_time(EN:=TRUE, PDT:=DT#2016-01-01-00:00);
d_h.delay[1];

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

Вот, кстати, тип d_h:

TYPE delay_h :
STRUCT
state: ARRAY [0..max_st] OF BOOL;
delay: ARRAY [0..max_st] OF UDINT;
current: ARRAY [0..max_st] OF TIME;
target: ARRAY [0..max_st] OF TIME;
END_STRUCT
END_TYPE

Валенок
10.08.2016, 16:31
так сказать регулирование частоты ПЧ в зависимости от давления(без пид-регулятора)
А можете без кода описать идею ?

Валенок
10.08.2016, 16:32
каким-то образом глобальный функциональный блок...
искажает значения соседней инициализированной структуры..
Да ладно. Поставьте обратно запятую в 9й строке кода

Ilya177
11.08.2016, 06:55
Не совсем понял где тут не хватает запятой : )

capzap
11.08.2016, 07:10
Не совсем понял где тут не хватает запятой : )

код выложите, покажем

Ilya177
11.08.2016, 07:20
глобальные переменные:

VAR_GLOBAL CONSTANT
max_st: INT:=2;
END_VAR

VAR_GLOBAL
current_time: RTC;
d_h: delay_h:=(delay:=500, 2500, 100);
END_VAR



Это весь код. Компилятор вроде на синтаксис не жаловался

capzap
11.08.2016, 07:38
и что это? как выглядит структура, что из себя представляет ФБ

Ilya177
11.08.2016, 08:00
опа. Каким-то чудом. (Видимо, после перезагрузки) Оно заработало!

pikvikone
11.08.2016, 11:58
Добрый день подскажите как решить элементарный вопрос, я хочу запускать программу с помощью кнопки в визуализации. у меня 2 программы и я вызываю вторую из PLC_PRG. а я хочу чтоб это было с кнопки в визуализации.

PLC_PRG
PROG_1 -------> с помощью кнопки START после нажатия кнопки чтоб выполнялся алгоритм этой программы.

petera
11.08.2016, 18:18
Добрый день подскажите как решить элементарный вопрос, я хочу запускать программу с помощью кнопки в визуализации. у меня 2 программы и я вызываю вторую из PLC_PRG. а я хочу чтоб это было с кнопки в визуализации.

PLC_PRG
PROG_1 -------> с помощью кнопки START после нажатия кнопки чтоб выполнялся алгоритм этой программы.

Например так
25779

Валенок
11.08.2016, 20:08
опа. Каким-то чудом. (Видимо, после перезагрузки) Оно заработало!
Просто запятая встала на свое место

pikvikone
11.08.2016, 20:13
Например так
25779

ЗА целый день додумался как сделать))) появился другой вопрос как выключать)))) но все равно спасибо))

Валенок
11.08.2016, 20:21
появился другой вопрос как выключать)))))
А еще раз кликнуть по кнопе - не ?

pikvikone
11.08.2016, 20:25
А еще раз кликнуть по кнопе - не ?
не выключаеться)) пробывал)

Валенок
11.08.2016, 20:36
Значит надо делать как petera предложил, а не то над чем сутки думал..

pikvikone
11.08.2016, 20:40
вот код попробуй.
PLC_PRG
PROG_1

PLC_PRG
VAR
START:BOOL;
END_VAR;

IF START THEN
PROG_1();
END_IF;

PROG_1
VAR
LAMP:BOOL;
TEMP:INT;
TEMP2:INT;
END_VAR;

IF TEMP > TEMP2 THEN
LAMP:=TRUE;
ELSIF TEMP < TEMP2 THEN
LAMP:=FALSE;
END_IF;

При нажатии кнопки старт в визуализации запускает программа PROG_1. В программе выполняеться условие если температура 1 больше чем температура 2 то лампочка вкл иначе если температура 1 меньше чем температура 2 то лампочка выкл.

Попробуй это написать и кнопкой Start вкл и выключить программу.

pikvikone
11.08.2016, 20:41
Значит надо делать как petera предложил, а не то над чем сутки думал..

Выше цитата попробуй я также сделал как pereta.

Валенок
11.08.2016, 20:50
Зачем мне что-то делать ? Я не новичок в КДС
Клик по кнопе (от petera) реверсирует переменную по которой отрабатывает прога. Читаем второе слово после галки.
Абсолютно побоку что там с темп-рами. Если нигде больше не трогаешь эту переменную - по кнопе и стартует и встает.

Выложи полный проект, а не кусочек. За кулисами можно много чего написать

pikvikone
11.08.2016, 21:09
ок
на лови посмотри как лампочка расцикливаеться.

Валенок
11.08.2016, 21:10
Даже смотреть не буду ))
Начну издалека. Ты женат ?


PS
Не выдержал - посмотрел. Зря. То что и думал ))

Валенок
11.08.2016, 21:29
Опять сутки чтоль на раздумья ?
Я это того, не напрашиваюсь ))))

pikvikone
11.08.2016, 21:29
Даже смотреть не буду ))
Начну издалека. Ты женат ?


PS
Не выдержал - посмотрел. Зря. То что и думал ))

К чему вопрос :? нет не женат мне еще рано молодой я. И что ты ожидал :? кнопка зацикливаеться не спорю но переменная фолсе не возврощает))

Валенок
11.08.2016, 21:32
А какая переменная не возврощает ?

pikvikone
11.08.2016, 21:34
А какая переменная не возврощает ?

ON она после того как зацикливаеться кнопка. всеравно имеет значение TRUE. либо делать отдельный IF если START FALSE то все рубить. перечеслять через запятую.

Валенок
11.08.2016, 21:36
Вводная :
Ты женат. Жена дома постоянно гладит белье/одежду
Иногда ты звонишь ей с работы и говоришь - мы сейчас идем в театр. Встречаемся у ево входа.
Вопрос :
Какое ее первое действие ? (малярные работы не в счет)

pikvikone
11.08.2016, 21:38
Вводная :
Ты женат. Жена дома постоянно гладит белье/одежду
Иногда ты звонишь ей с работы и говоришь - мы сейчас идем в театр. Встречаемся у ево входа.
Вопрос :
Какое ее первое действие ? (малярные работы не в счет)

Посмотреть в зеркало или заглянуть в шкаф что одеть. а если есть ребенок то и позвонить маме или подруге попросить посидеть с ребенком))

pikvikone
11.08.2016, 21:41
Вводная :
Ты женат. Жена дома постоянно гладит белье/одежду
Иногда ты звонишь ей с работы и говоришь - мы сейчас идем в театр. Встречаемся у ево входа.
Вопрос :
Какое ее первое действие ? (малярные работы не в счет)

отлучусь ток не скучай есть еще вопрос ответишь, будет вобще хорошо.

Валенок
11.08.2016, 21:44
Все таки женись..

еще рано молодой я
Она выключает утюг.

Обрати внимание. Переменная БЫТЬ_ДОМА = FALSE, но выходное действие программы - выполняется.
Если бы она действовала по твоему алгоритму - сорвалась бы (за детьми/у маме) и .... Ты б на роботу пошел в прожженых штанах.

petera
12.08.2016, 03:11
вот код попробуй.
PLC_PRG
PROG_1

PLC_PRG
VAR
START:BOOL;
END_VAR;

IF START THEN
PROG_1();
END_IF;

PROG_1
VAR
LAMP:BOOL;
TEMP:INT;
TEMP2:INT;
END_VAR;

IF TEMP > TEMP2 THEN
LAMP:=TRUE;
ELSIF TEMP < TEMP2 THEN
LAMP:=FALSE;
END_IF;

При нажатии кнопки старт в визуализации запускает программа PROG_1. В программе выполняеться условие если температура 1 больше чем температура 2 то лампочка вкл иначе если температура 1 меньше чем температура 2 то лампочка выкл.

Попробуй это написать и кнопкой Start вкл и выключить программу.

Разве кнопка Start не вкл/выкл вызов программы PROG_1()?.
Ответ - и включает и выключает. А ведь вопрос был именно об этом. Кто же знал, что Вы вздумаете включать в этой программе некую переменную LAMP.
Если программа не вызывается (запрещена кнопкой Start), то кто будет выключать лампу? Программа-то не вызывается и проверка температуры больше не выполняется, все внутренние переменные в программе или ФБ сохраняются до следующего их вызова. А самопроизвольно переменные не могут изменяться.
Таким образом Вам нужно не "вкл и выключить программу", а просто само условие переместить в программу

PLC_PRG
VAR
START:BOOL;
END_VAR;

PROG_1(START:= start);


PROG_1
VAR
LAMP:BOOL;
TEMP:INT;
TEMP2:INT;
END_VAR;
VAR_INPUT
START: BOOL;
END_VAR

IF IN >= temp AND START THEN
ON:=TRUE;
ELSE
ON:=FALSE;
END_IF;

Только в PROG_1 вместо ВСЕЙ ЛАБУДЫ С IF/ELSIF достаточно одой строчки
ON:=IN >= temp AND START;

https://www.youtube.com/watch?v=ZhJXeVhW81M

pikvikone
12.08.2016, 08:33
Разве кнопка Start не вкл/выкл вызов программы PROG_1()?.
Ответ - и включает и выключает. А ведь вопрос был именно об этом. Кто же знал, что Вы вздумаете включать в этой программе некую переменную LAMP.
Если программа не вызывается (запрещена кнопкой Start), то кто будет выключать лампу? Программа-то не вызывается и проверка температуры больше не выполняется, все внутренние переменные в программе или ФБ сохраняются до следующего их вызова. А самопроизвольно переменные не могут изменяться.
Таким образом Вам нужно не "вкл и выключить программу", а просто само условие переместить в программу

PLC_PRG
VAR
START:BOOL;
END_VAR;

PROG_1(START:= start);


PROG_1
VAR
LAMP:BOOL;
TEMP:INT;
TEMP2:INT;
END_VAR;
VAR_INPUT
START: BOOL;
END_VAR

IF IN >= temp AND START THEN
ON:=TRUE;
ELSE
ON:=FALSE;
END_IF;

Только в PROG_1 вместо ВСЕЙ ЛАБУДЫ С IF/ELSIF достаточно одой строчки
ON:=IN >= temp AND START;

https://www.youtube.com/watch?v=ZhJXeVhW81M

А если условий много ? то тогда как быть на каждый IF AND START писать ?

Валенок
12.08.2016, 10:07
А если условий много ? то тогда как быть на каждый IF AND START писать ?
В общем - да. Как вариант - выделяешь состояние НЕТ_СТАРТА, а там приводишь все в нужное состояние

pikvikone
12.08.2016, 10:22
Помогите реализовать на ST такое выражение. Каждое N-количество часов устройство включается. когда температура устройства достигла температуры N то устройство выключается. и цикл повторяется. я чет голову себе уже сломал, хотел использовать блинк но чет не получаеться.
PLC_PRG
VAR
TIME LOW:TIME; время паузы
TIME HIGHT:TIME; Время запуска
TEMP_REAL:REAL; (Температура уставки)
TEMP_SET:REAL; (Реальная температура)
OUT:BOOL;(Устройство)
END_VAR;

IF TIME LOW >= TIME HIGHT THEN
OUT:TRUE;
ELSIF TEMP_REAL >= TEMP_SET THEN
OUT:FALSE;
END_IF;

Немогу догнать как сделать с помошью одной уставки чтобы каждые N часов включалось. достигла температуры выключалось. прошло N количество времени устройство вкл. и тд...

Leon665
12.08.2016, 10:36
Здравствуйте. Только начинаю свое знакомство с ПЛК Овен. У меня вопрос заключается в следующем, как мне связать резестивный датчик температуры, подключенный в аналоговому входу, с аналоговых выходом 0-10V? заранее спасибо за ответ.

Валенок
12.08.2016, 10:47
..Каждое N-количество часов устройство включается... когда температура устройства достигла температуры N то устройство выключается. и цикл повторяется....
Есть много способов все записать в одну строку...

Валенок
12.08.2016, 10:58
Здравствуйте. Только начинаю свое знакомство с ПЛК Овен. У меня вопрос заключается в следующем, как мне связать резестивный датчик температуры, подключенный в аналоговому входу, с аналоговых выходом 0-10V? заранее спасибо за ответ.

1.Выяснить в РЭ - как видишь т-ру (Ai)
2.Выяснить в РЭ - как устанавливать выход (Ao)
3.Описать и использовать функцию F, прототип вызова который предположительно F(IN : real) : real; а строка вызова Ao := F(Ai);

Есть вопросы по п.1 и 2 ?

pikvikone
12.08.2016, 11:54
Есть много способов все записать в одну строку. Но
1. Мы автоматчики - а значит смотрим немного вперед
2. Точим под простое расширение если чо



фб/прог устройство
var_input
темпра : ....
ok : bool; //с девайсом
var_output
q : bool;
var
состояние : (облом, курит, греет);
t : ton;
.......
if not ok then
состояние := облом;
end_if

case состояние of
облом:
if ok then
t(in := false);
состояние := курит;
end_if

курит:
ton(in := true, pt := ...);
if ton.q and темпра < мин then
t(in := false);
состояние := греет;
end_if

греет:
t(in := true, pt := ...); //контроль предельного времени - как бонус
if темпра > макс or t.q then
t(in := false);
состояние := курит;
end_if
end_case

q := состояние = греет;

PS
деньги - мне, цветы в машину (C)

немогу понять а зачем 3 состаяния :? либо он выключен либо влючен. бла проблема выставить время включения по циклу. я просто еще не сталкивался с этим. сфера ПЛК для меня новая.

krollcbas
12.08.2016, 12:21
Павел, Валенок тебе раскрыл основную суть построения конечного автомата состояния.
Таким образом можно построить достаточно сложную модель любого технологического процесса.

Расписания делаются в привязке к системному времени. Здесь на форумах не раз это описывалось - поищи.
На мой личный взгляд твоя основная проблема не в том, что ты не обладаешь приемами программирования, а в том, что ты не умеешь излагать что именно ты хочешь сделать. Читаю твои сообщения и не могу проследить четкую логическую цепь.
1. Определись с сигналами (таблицы ввода-вывода)
2. Опиши алгоритмы (http://lapshinvr.ru/algoritm.html) каким угодно графическим языком
3. Опиши защиты (более приоритетные условия)
4. Опиши альбом видеокадров и продумай что именно у тебя будет HMI

Вся эта работа может быть создана за 10 дней (приблизительно), включая эти документы.
Документы+прикладное обеспечение ПЛК+прикладное обеспечение Weintek = 100т.р

pikvikone
12.08.2016, 13:26
Павел, Валенок тебе раскрыл основную суть построения конечного автомата состояния.
Таким образом можно построить достаточно сложную модель любого технологического процесса.

Расписания делаются в привязке к системному времени. Здесь на форумах не раз это описывалось - поищи.
На мой личный взгляд твоя основная проблема не в том, что ты не обладаешь приемами программирования, а в том, что ты не умеешь излагать что именно ты хочешь сделать. Читаю твои сообщения и не могу проследить четкую логическую цепь.
1. Определись с сигналами (таблицы ввода-вывода)
2. Опиши алгоритмы (http://lapshinvr.ru/algoritm.html) каким угодно графическим языком
3. Опиши защиты (более приоритетные условия)
4. Опиши альбом видеокадров и продумай что именно у тебя будет HMI

Вся эта работа может быть создана за 10 дней (приблизительно), включая эти документы.
Документы+прикладное обеспечение ПЛК+прикладное обеспечение Weintek = 100т.р

Ну вот Слав)) и тут ты вставил свое)) Дай я знания себе нарою и это все мог бы в лс написать.

И я на форуме не пишу конечной цели. а даю типичные примеры. то что я делаю потом другое.

Валенок
12.08.2016, 17:09
И я на форуме не пишу конечной цели. а даю типичные примеры..
Так и я привел типовой пример.
Тупой гистерезисный переключатель с циклом описывается в одну строку, например

ton(in := T < макс and (ton.q or T < мин), PT ..., q => q);
но поверь, это скучно и главное - одноразово.


а зачем 3 состаяния :? либо он выключен либо влючен. .
Стандартное черно-белое заблуждение. Датчик может выйти из строя, нагреватель тоже - включен, а не греет. А самодиагностика, а + еще нагреватель да с другой мощностью...
Со светофором, пжста - в песочницу.


сфера ПЛК для меня новая.
А причем тут ПЛК ? В ПК - тоже самое

pikvikone
13.08.2016, 20:47
Так и я привел типовой пример.
Тупой гистерезисный переключатель с циклом описывается в одну строку, например

ton(in := T < макс and (ton.q or T < мин), PT ..., q => q);
но поверь, это скучно и главное - одноразово.


Стандартное черно-белое заблуждение. Датчик может выйти из строя, нагреватель тоже - включен, а не греет. А самодиагностика, а + еще нагреватель да с другой мощностью...
Со светофором, пжста - в песочницу.


А причем тут ПЛК ? В ПК - тоже самое


Валенок где можно скачать, примеры готовых проектов не только ФБ а целый комплекс с визуализацией. ?

Эдуард_Н
14.08.2016, 20:23
Так понимаю сюда надо единицу подать что бы начать опрос?

Валенок
14.08.2016, 22:36
255 или 254. Где-то в РЭ

Эдуард_Н
15.08.2016, 04:00
255 или 254. Где-то в РЭ

255 и 254 это что? И в каком РЭ смотреть?

capzap
15.08.2016, 06:44
255 и 254 это что? И в каком РЭ смотреть?

так на свою картинку взгляните, там написано только в 16-чной системе

Эдуард_Н
16.08.2016, 04:02
так на свою картинку взгляните, там написано только в 16-чной системе

Спасибо, а руководство это какое можно посмотреть?

Эдуард_Н
16.08.2016, 04:39
Спасибо, а руководство это какое можно посмотреть?

Нашёл где это описывается. Ещё раз спасибо capzap.

Demon444
16.08.2016, 15:19
Здравствуйте! Подскажите новичку: имеем ПЛК 150 + ИП320(RS-232, ИП MASTER), визуализация проги - CODESYS HMI. Проект работает полгода уже. Но понадобилось подключить ИП320, в связи с этим вопрос: как сделать, чтобы можно было менять значение одной переменной (уставка) и с ип320 и с визуализации CODESYS HMI? Сделать по отдельности - проблем нет: в CODESYS HMI ставим галочку "ввод в переменную" и все работает и изменяется, если просто с ип 320 - тоже нет проблем, а как совместить вместе чтобы работало? Заранее спасибо!

petera
16.08.2016, 15:38
Здравствуйте! Подскажите новичку: имеем ПЛК 150 + ИП320(RS-232, ИП MASTER), визуализация проги - CODESYS HMI. Проект работает полгода уже. Но понадобилось подключить ИП320, в связи с этим вопрос: как сделать, чтобы можно было менять значение одной переменной (уставка) и с ип320 и с визуализации CODESYS HMI? Сделать по отдельности - проблем нет: в CODESYS HMI ставим галочку "ввод в переменную" и все работает и изменяется, если просто с ип 320 - тоже нет проблем, а как совместить вместе чтобы работало? Заранее спасибо!
Т.е. еще одну ИП320, к уже существующей(ПЛК 150 + ИП320(RS-232, ИП MASTER))?

melky
16.08.2016, 15:39
Demon444 необходимо добавить промежуточные переменные и контроль их равенства, ну и соответственно проверять какая изменилась и менять другую.
По крайней мере у меня не получилось, чтобы панель и переменная Modbus могла делать это одновременно...

petera
16.08.2016, 15:47
Если есть свободный порт у ПЛК, то просто в существующем слейве добавить этот порт. И все, без всяких программных проверок будет работать на аппаратном уровне http://www.owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969
Естественно вторую панель подключить к этому новому порту.

Demon444
16.08.2016, 17:56
Спасибо за ответ и за ссылку.панель ип320 одна)).буду пробовать через сравнивание переменных.

petera
16.08.2016, 18:19
Спасибо за ответ и за ссылку.панель ип320 одна)).буду пробовать через сравнивание переменных.

А что с кем сравнивать?
Панель одна и мастер, значит в слейве ПЛК есть некие переменные, в которые пишете из панели. Именно эти переменные используйте(они же глобальные по умолчанию) в визуализации кодесиса, а не какие-то особенные. Их же и в программе используйте. Вот и все.

ЗЫ.
Например так
25829

beliy120586
17.08.2016, 11:11
Люди добрые, тут ранее один пользователь задавал вопрос и не получил ни одного ответа.
К сожалению, меня сейчас одолевает тот же вопрос.

Имеем в наличии модуль вывода МУ110-224.8И, два привода регулировочных клапанов с управлением 4-20мА. Модуль МУ110 запитываем постоянкой 24В от 1го источника напряжения, приводы клапанов запитываем постоянкой 24В от 2го источника напряжения.

Вопрос 1: От какого источника можно запитать выхода модуля МУ110 - который питает сам модуль или который питает привода.
Вопрос 2: Он в принципе вытекает из первого. Можно ли все выходы модуля МУ110 питать от одного источника напряжения.
Вопрос 3: Можно ли всю описанную выше систему запитать от одного источника напряжения 24В.

Помогите разобраться. Набираюсь опыта в этих делах.

Эдуард_Н
17.08.2016, 13:04
255 или 254. Где-то в РЭ
Написано, что 254 отключает, при нуле опрос идёт своим чередом. У меня 254 отключает, после этого прописываю ноль, а включаться опрос не хочет. Получается, что для включения опроса надо кратковременно прописать 255?

evgeni293
17.08.2016, 16:19
А можете без кода описать идею ?

Скажем так. при нажатии кнопки ПУСК у нас начинает частотный преобразователь вращать двигатель с частотой=10 Гц. Дальше уже в зависимости от Давления до насоса(его крутит движок с частотником) у нас частота либо увеличивается либо уменьшается (в пределах от 10 до 50 ГЦ).Снова нажимаем кнопку ПУСК(получается отключаем ) и частота у нас плавно опускается до 0. Проблема в том, что при запуске частота должна быть равна 10.

Валенок
17.08.2016, 22:59
... при нажатии кнопки ПУСК ... с частотой=10 Гц. Дальше уже в зависимости от Давления ...(в пределах от 10 до 50 ГЦ).Снова нажимаем кнопку ПУСК....и частота у нас плавно опускается до 0. Проблема в том, что при запуске частота должна быть равна 10.

............

Валенок
17.08.2016, 23:18
Написано, что 254 отключает, при нуле опрос идёт своим чередом. У меня 254 отключает, после этого прописываю ноль, а включаться опрос не хочет. Получается, что для включения опроса надо кратковременно прописать 255?
Написано где-нить что нужно писать 0 ?

Валенок
17.08.2016, 23:20
..Вопрос 1:..Вопрос 2: ..Вопрос 3:...
В1.Любого
В2-3.Да

Валенок
17.08.2016, 23:21
Demon444 необходимо добавить промежуточные переменные и контроль их равенства, ну и соответственно проверять какая изменилась и менять другую.
По крайней мере у меня не получилось, чтобы панель и переменная Modbus могла делать это одновременно...
Идея - правильная. Странно что не получилось

beliy120586
18.08.2016, 11:17
В1.Любого
В2-3.Да

Благодарствую!

evgeni293
18.08.2016, 13:17
function block FC
var_input
press : bool; (*кнопа*)
actual, set_point : real; (*бар, датчик и уставка*)
kp,tn,tv : real; (*подобрать*)
end_var
var_output
start : bool; (*на вход-старт FC*)
freq : real; (*Гц*)
end_var
var
fix : r_trig;
active : bool;
pid : pid; (*util.lib*)
end_var
--------------------
fix(clk := press);
active := fix.q xor active;
start := active or freq > 0;
pid(
actual := sel(active, set_point + 1, actual),
set_point := set_point,
kp := sel(active, 1, kp),
tn := sel(active, 1, tn),
tv := sel(active, 0, tv),
y_min := sel(active, 0, 10),
y_max := 50,
y => freq
);


А можно прокомментировать эту часть кода?

var_output
start : bool; (*на вход-старт FC*)
freq : real; (*Гц*)
end_var
var
fix : r_trig;
active : bool;
pid : pid; (*util.lib*)
end_var
--------------------
fix(clk := press);
active := fix.q xor active;
start := active or freq > 0;
pid(
actual := sel(active, set_point + 1, actual),
set_point := set_point,
kp := sel(active, 1, kp),
tn := sel(active, 1, tn),
tv := sel(active, 0, tv),
y_min := sel(active, 0, 10),
y_max := 50,
y => freq
);

Валенок
18.08.2016, 14:21
при запуске частота должна быть равна 10 ( при нажатии кнопки ПУСК у нас начинает частотный преобразователь вращать двигатель с частотой=10 Гц)
Дальше уже в зависимости от Давления ... частота либо увеличивается либо уменьшается (в пределах от 10 до 50 ГЦ).
отключаем - частота у нас плавно опускается до 0.

Как и описали
Какую часть если привели всё ?

melky
18.08.2016, 16:08
Валенок не получилось без сравнения и промежуточной переменной. Так как при записи по сети Modbus и одновременной записи значения из панели что-то кого-то перезатирал.
Когда добавил промежуточную переменную то все стало нормально.

evgeni293
18.08.2016, 16:56
Как и описали
Какую часть если привели всё ?

fix : r_trig;
active : bool;
pid : pid; (*util.lib*)
end_var
--------------------
fix(clk := press);
active := fix.q xor active;
start := active or freq > 0;
pid(
actual := sel(active, set_point + 1, actual),
set_point := set_point,

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

Валенок
18.08.2016, 17:30
Валенок не получилось без сравнения и промежуточной переменной. Так как при записи по сети Modbus и одновременной записи значения из панели что-то кого-то перезатирал.
Когда добавил промежуточную переменную то все стало нормально.
Да я имел в виду что с промежуточной переменной - правильное направление, и не понял почему с ней-то не получилось ))

Валенок
18.08.2016, 17:43
fix(clk := press);
могу дать рыбу - об'яснить. Ну лучше научись ее ловить - см. хэлп, standart.lib, r_trig

active := fix.q xor active;
Активе - это вкл/выкл с реверсом по кнопе - как и хотели

start := active or freq > 0;
не обязательный выход коли нет спец. сигнала СТАРТ на ЧП

actual := sel(active, set_point + 1, actual),
здесь и далее ... sel(active, .....) - обман пида чтоб всегда одинаково мягонько опустил в 0 при отключении (active = false) вне зависимости от чего-либо. Есно что со всеми параметрами (KP,TN,TV) можно играть

set_point := set_point,
ну это и есть уставка давления. Можно константу запилить.

PS
Тому кто будет говорить про зависание этого пида передайте привет и пожелание учиться, учится ...

evgeni293
19.08.2016, 07:37
могу дать рыбу - об'яснить. Ну лучше научись ее ловить - см. хэлп, standart.lib, r_trig

Активе - это вкл/выкл с реверсом по кнопе - как и хотели

не обязательный выход коли нет спец. сигнала СТАРТ на ЧП

здесь и далее ... sel(active, .....) - обман пида чтоб всегда одинаково мягонько опустил в 0 при отключении (active = false) вне зависимости от чего-либо. Есно что со всеми параметрами (KP,TN,TV) можно играть

ну это и есть уставка давления. Можно константу запилить.

PS
Тому кто будет говорить про зависание этого пида передайте привет и пожелание учиться, учится ...

Передам, спасибо)

Demon444
19.08.2016, 12:54
petera, сделал так как вы посоветовали - проще и надежней, просто объявив глобальной. Странно что сам не догадался. Спасибо!

LuckLake
22.08.2016, 16:56
По ТЗ, в нашей документации должен быть представлен текст программы в IL или ST. Не получается конвертировать один из POU (SFC). Эту проблему можно как-нибудь обойти?
25898

capzap
23.08.2016, 07:08
По ТЗ, в нашей документации должен быть представлен текст программы в IL или ST. Не получается конвертировать один из POU (SFC). Эту проблему можно как-нибудь обойти?
25898

написать ручками это поу на st

LuckLake
23.08.2016, 11:21
написать ручками это поу на st

Цепочка очень длинная, с кучей условий. Документация нужна, чтобы показать заказчику, он все равно в программе не разбирается. Так можно ли действовать как-то еще, а не переписывать все заново?

petera
23.08.2016, 12:55
Цепочка очень длинная, с кучей условий. Документация нужна, чтобы показать заказчику, он все равно в программе не разбирается. Так можно ли действовать как-то еще, а не переписывать все заново?

Если не разбирается, то дайте ему то, что есть. Какая ему разница на ST или SFC. Внесите в ТЗ изменения и согласуйте с Заказчиком, что по техническим причинам необходим язык SFC. Разве эти действия запрещены законом?

ВиталийАТ
23.08.2016, 18:52
ПД100 в датчике 3 контакта + 1 контакт земля. В инструкции ни полслова про это: только на 2 + земля и 4 информационных. Как правильно подключать?

d_dmitry
24.08.2016, 00:27
Здравствуйте, синхронизировал время ПЛК с NTP, как правильно установить часовой пояс? GMT offset? Понятно что для Москвы это часы +3, но тогда при синхронизации в 23:00 +3 будет 26, надо прибавлять день +1, а если это конец месяца то и месяц, а в месяцах разное количество дней. Есть возможность прибавить к системному времени 3*60*60+1000 миллисекунд?

capzap
24.08.2016, 06:45
Здравствуйте, синхронизировал время ПЛК с NTP, как правильно установить часовой пояс? GMT offset? Понятно что для Москвы это часы +3, но тогда при синхронизации в 23:00 +3 будет 26, надо прибавлять день +1, а если это конец месяца то и месяц, а в месяцах разное количество дней. Есть возможность прибавить к системному времени 3*60*60+1000 миллисекунд?

а что за плк у Вас, который синхронизируется с ntp? И почему Вы прибавляет тысячу в место умножения?

d_dmitry
24.08.2016, 12:48
а что за плк у Вас, который синхронизируется с ntp? И почему Вы прибавляет тысячу в место умножения?
ПЛК 100, синхронизирую программно, за основу кстати взял Ваш код, + это опечатка, конечно нужно умножать. Вчера весь день провозился, но так и не нашел способа задать смещение системного времени.

melky
24.08.2016, 13:37
а вы синхронизируйте время после 0 часов, смысл делать это каждые 5 минут и тем более цикл...

d_dmitry
24.08.2016, 15:20
а вы синхронизируйте время после 0 часов, смысл делать это каждые 5 минут и тем более цикл...
Я синхронизирую время раз в сутки и при запуске контроллера

capzap
24.08.2016, 15:38
ПЛК 100, синхронизирую программно, за основу кстати взял Ваш код, + это опечатка, конечно нужно умножать. Вчера весь день провозился, но так и не нашел способа задать смещение системного времени.

ну тогда осталось прочитать руководство к библиотеке SysLibTime_RU.pdf и сообразить как системное время в миллисекундах упаковать в тип данных SysTime64

d_dmitry
24.08.2016, 15:53
ну тогда осталось прочитать руководство к библиотеке SysLibTime_RU.pdf и сообразить как системное время в миллисекундах упаковать в тип данных SysTime64

Я Вам больше скажу, я еще почитал Библиотека SysLibTime.doc и там написано, что SysTime64 содержит время с момента загрузки ПЛК в миллисекундах, а это не совсем то, что мне нужно.

Валенок
25.08.2016, 22:09
Упакуйте UINT в строку вида DT, из строки сделайте DT, сдвиньте на нужный TIME, и обратно выпакуйте из строки. Каждый цикл это делать не надо, а работает как куранты

d_dmitry
25.08.2016, 23:16
Упакуйте UINT в строку вида DT, из строки сделайте DT, сдвиньте на нужный TIME, и обратно выпакуйте из строки. Каждый цикл это делать не надо, а работает как куранты Спасибо! Думал так сделать, но мне показалось, что слишком длинное решение, думал что есть путь короче))))

Валенок
26.08.2016, 00:38
думал что есть путь короче))))
Не поверишь - нет. Если, канешна, не считать времени потраченного на рысканье по оскатам и т.п.
Standart.lib, 15-20 строк (в основном копи-пасте). Тупо и надежно.

Paveldr
26.08.2016, 16:16
День добрый. Занимаюсь ПЛК73 не давно, вот такой вопрос. Не могу понять. Вот система состоит из ПЛК73 и 5-х ПД100 (-200 +200, 4...20мА). Все подключили через БП (24В) и резистор 100Ом (все как инструкции). В ПЛК также настроил тип порта 4...20мА. ПЛК показания видит при чем очень большие (49,2 В), хотя на входе мультиметр показывает (1,12В) и соответственно 8 мА. И в CodeSys так же на порте 0.

melky
26.08.2016, 16:25
Paveldr может 49,2 это в диапазоне -200 +200 а не "В"

Ryzhij
26.08.2016, 16:31
День добрый. Занимаюсь ПЛК73 не давно, вот такой вопрос. Не могу понять. Вот система состоит из ПЛК73 и 5-х ПД100 (-200 +200, 4...20мА). Все подключили через БП (24В) и резистор 100Ом (все как инструкции). В ПЛК также настроил тип порта 4...20мА. ПЛК показания видит при чем очень большие (49,2 В), хотя на входе мультиметр показывает (1,12В) и соответственно 8 мА. И в CodeSys так же на порте 0.Что-то у Вас с масштабированием не так. При объявленной Вами шкале -200..+200 (кстати, чего? Каких инженерных единиц? Ну, не Вольт же, как Вы написали) ток в 8 mA соответствует показаниям 1/4 шкалы, т.е. -100 инженерных единиц.

Paveldr
26.08.2016, 17:59
Диапазон датчика -200 +200 Па. Учитывая что датчик ни к чему не подключен (в смысле магистралям высокого давления), он должен выдавать примерно середину (0 Па) или около 8 мА.

Сергей0308
26.08.2016, 19:18
Диапазон датчика -200 +200 Па. Учитывая что датчик ни к чему не подключен (в смысле магистралям высокого давления), он должен выдавать примерно середину (0 Па) или около 8 мА.

Странно, я наивно полагал, что середина диапазона 4-20мА - 12мА!
И 20мм(2см) водяного столба, как-то язык не поворачивается назвать высоким давлением, хотя разумеется всё в мире относительно!

petera
26.08.2016, 20:36
День добрый. Занимаюсь ПЛК73 не давно, вот такой вопрос. Не могу понять. Вот система состоит из ПЛК73 и 5-х ПД100 (-200 +200, 4...20мА). Все подключили через БП (24В) и резистор 100Ом (все как инструкции). В ПЛК также настроил тип порта 4...20мА. ПЛК показания видит при чем очень большие (49,2 В), хотя на входе мультиметр показывает (1,12В) и соответственно 8 мА. И в CodeSys так же на порте 0.

Да все нормально показывает. Только вольты не надо на входе измерять, а нужно мультиметр в режиме измерения тока включить в разрыв цепи датчика, т.е. последовательно с датчиком и измерить ток.
В ПЛК показания не в вольтах, а в процентах от 0 до 100. 4мА - 0%, 20мА - 100%.
Если датчик не подключен к измеряемой среде, т.е. показания ~ 0 Па, т.е в ПЛК показания должны быть в районе 50%, что и наблюдаете - "ПЛК показания видит при чем очень большие (49,2 В)". Только это не вольты, а 49,2%. А в идеале должно было быть 50%.
И как верно было замечено ток от датчика в этом случае д.б примерно 12мА.

ЗЫ. Ток Вы измерили косвенным способом ( I=U/R) по падению напряжения на образцовом резисторе - на входе мультиметр показывает (1,12В). Ток у Вас получается 11,2 мА, если конечно резистор 100 Ом и прецизионный, а не абы какой, первый попавшийся.

Paveldr
29.08.2016, 04:04
Да все нормально показывает. Только вольты не надо на входе измерять, а нужно мультиметр в режиме измерения тока включить в разрыв цепи датчика, т.е. последовательно с датчиком и измерить ток.
В ПЛК показания не в вольтах, а в процентах от 0 до 100. 4мА - 0%, 20мА - 100%.
Если датчик не подключен к измеряемой среде, т.е. показания ~ 0 Па, т.е в ПЛК показания должны быть в районе 50%, что и наблюдаете - "ПЛК показания видит при чем очень большие (49,2 В)". Только это не вольты, а 49,2%. А в идеале должно было быть 50%.
И как верно было замечено ток от датчика в этом случае д.б примерно 12мА.

ЗЫ. Ток Вы измерили косвенным способом ( I=U/R) по падению напряжения на образцовом резисторе - на входе мультиметр показывает (1,12В). Ток у Вас получается 11,2 мА, если конечно резистор 100 Ом и прецизионный, а не абы какой, первый попавшийся.

Да действительно резистор не очень возможно из-за него погрешность. Понятно на счет шкалы в ПЛК (насчет %). Не понятно как эти значения получить в Codesys? При подключенном ПЛК, значения с порта = 0 (пытаюсь поднять давление, значение не меняется)(тип датчика задан).

petera
29.08.2016, 06:21
Не понятно как эти значения получить в Codesys? При подключенном ПЛК, значения с порта = 0 (пытаюсь поднять давление, значение не меняется)(тип датчика задан).

Что за порт такой? и куда делось - "ПЛК показания видит при чем очень большие (49,2 В)"?

ЗЫ
Резистор должен быть обязательно точным (0,1%) и термостабильным, С2-28В

Paveldr
29.08.2016, 06:37
Что за порт такой? и куда делось - "ПЛК показания видит при чем очень большие (49,2 В)"?

ЗЫ
Резистор должен быть обязательно точным (0,1%) и термостабильным, С2-28В

Порт №3 на ПЛК73 (контакты AI3-2 и AI-R), в самом ПЛК через конфигуратор выдает значение 49,2 (без буквы "В" - это было мое ошибочное мнение), но самая главная проблема Codesys не видит значение порта?

Ryzhij
29.08.2016, 09:31
самая главная проблема Codesys не видит значение порта?В конфигураторе переменную этому аналоговому входу назначили?

Paveldr
29.08.2016, 10:19
В конфигураторе переменную этому аналоговому входу назначили?

Да разумеется. Вот все параметры.
26059
26060
26061
26062

petera
29.08.2016, 11:36
Этих картинок не достаточно.
Вангую, что Вы еще и в разделе объявления переменных написали, что-то типа
DP11 AT %ID0.2.4: REAL;
26064
А этого делать нельзя. Имя переменной должно быть либо в конфигурации, либо в разделе объявления переменных.
Потому, что для программы это две различные переменные.
Локальная - в разделе объявления переменных
Глобальная - в конфигурации.

Если имена локальной и глобальной переменной совпадают, то программа ВСЕГДА использует ЛОКАЛЬНУЮ переменную.

Paveldr
30.08.2016, 07:19
Этих картинок не достаточно.
Вангую, что Вы еще и в разделе объявления переменных написали, что-то типа
DP11 AT %ID0.2.4: REAL;
26064
А этого делать нельзя. Имя переменной должно быть либо в конфигурации, либо в разделе объявления переменных.
Потому, что для программы это две различные переменные.
Локальная - в разделе объявления переменных
Глобальная - в конфигурации.

Если имена локальной и глобальной переменной совпадают, то программа ВСЕГДА использует ЛОКАЛЬНУЮ переменную.

Спасибо проверил глобальные и локальные имеют разные имена. А проблема была в сгоревшем кабеле USB - COM (причем какбы связь с прибором устанавливалась и при изменении проекта загружалась в ПЛК), поменял кабель и все значения начали отображаться в CodeSys.
Спасибо за консультацию.

pikvikone
30.08.2016, 16:28
Форумчани, скажите пожалуйста у меня такой косяк немогу понять. почему у меня значение не записывается в AO сигнал.

вот код



oa(
IN:=AO_1 ,
IN_MIN:=0,
IN_MAX:=100 ,
OUT_MIN:=0 ,
OUT_MAX:=32768 ,
OUT=>,
ERROR=> );
ao_1:=REAL_TO_WORD(oa.OUT);

temp_delta_real:= TEMP_K1 - TEMP_GI1;

CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF temp_delta_real > temp_delta_3x THEN
AO_1:=5;
step_3x:=2;
END_IF;
2:
IF Ton_3x.Q THEN
step_3x:= 1;
END_IF;
3:
IF temp_delta_real <= temp_delta_3x THEN
AO_1:=0;
END_IF;
END_CASE;

TON_3x(IN:=(STEP_3x =0), PT:= time_3x);

Не работает уже чет голова не варит.

capzap
30.08.2016, 16:34
а Вы считаете, что АО_1 и ао_1 это разные переменные?

pikvikone
30.08.2016, 18:33
а Вы считаете, что АО_1 и ао_1 это разные переменные?

Нет интрпретации верхнего и нижнего регистра нету в codesys. почему не задаються значения)

capzap
30.08.2016, 18:36
Нет интрпретации верхнего и нижнего регистра нету в codesys. почему не задаються значения)

где они должны задаваться? Это весь код проекта?

pikvikone
30.08.2016, 18:44
где они должны задаваться? Это весь код проекта?

это кусок. 3х ходового.

pikvikone
30.08.2016, 18:44
если поможете скину проект.

capzap
30.08.2016, 18:55
это кусок. 3х ходового.

oa(
IN:=AO_1 ,
IN_MIN:=0,
IN_MAX:=100 ,
OUT_MIN:=0 ,
OUT_MAX:=32768 ,
OUT=>,
ERROR=> );
ao_1:=REAL_TO_WORD(oa.OUT);
начиная с первой строчки ao.IN:=AO_1
во второй AO_1 := ao.OUT;
где здесь логика, приходящее значение от нуля до ста процентов пропорционально изменяете и присваиваете обратно этой же переменной, далее если выполняется какое то условие то опять присваиваете ей значение от нуля до пяти



2:
IF Ton_3x.Q THEN
step_3x:= 1;
END_IF;
...
TON_3x(IN:=(STEP_3x =0), PT:= time_3x);вот интересно а когда выполниться условие во втором кейсе?

pikvikone
30.08.2016, 19:29
начиная с первой строчки ao.IN:=AO_1
во второй AO_1 := ao.OUT;
где здесь логика, приходящее значение от нуля до ста процентов пропорционально изменяете и присваиваете обратно этой же переменной, далее если выполняется какое то условие то опять присваиваете ей значение от нуля до пяти

вот интересно а когда выполниться условие во втором кейсе?

ааааа простите туплю) я на вход пытался задать что и на выход) туплю маленько)) тоесть мне еще одна переменная типа word нужна для алгоритма))

schnaps
01.09.2016, 13:14
Здравствуйте! имеется ПЛК110 и пара модулей МВ110-8А и МВ110-8АС
процессор опрашивает их по протоколу OWEN
Подскажите пожалуйста, как можно программно определить, что конкретный модуль отвалился со связи?
значение LAST_ERROR = 81 в переменных программного модуля OWEN[MASTER] не подходит, так как оно характеризует отвал любого из модулей

capzap
01.09.2016, 13:42
значение LAST_ERROR = 81 в переменных программного модуля OWEN[MASTER] не подходит, так как оно характеризует отвал любого из модулей

а чем не устроила переменная Last address?

Эдуард_Н
01.09.2016, 14:09
Здравствуйте! имеется ПЛК110 и пара модулей МВ110-8А и МВ110-8АС
процессор опрашивает их по протоколу OWEN
Подскажите пожалуйста, как можно программно определить, что конкретный модуль отвалился со связи?
значение LAST_ERROR = 81 в переменных программного модуля OWEN[MASTER] не подходит, так как оно характеризует отвал любого из модулей

http://www.owen.ru/forum/showthread.php?t=10555&page=509&p=211167&viewfull=1#post211167

schnaps
02.09.2016, 05:30
спасибо большое!