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

capzap
26.05.2014, 12:34
RV9WFJ библиотека Mercury.lib, пытаюсь переделать для работы через SysLibCom. Сейчас просто экспортировал в проект, если сохранять как внешнюю библеотеку, вызывает данную ошибку, если как внутреннюю, то вроде не вызывает.
Длблюсь с ними дальше, особого результата пока нет. Особенно учитывая описание SysLibCom, когда при SysComSetSetings при установки должно возвращаться TRUE, а по факут примеров 0.....
Бред описания ? Бред ОВЕНовских контроллеров (прошивка) ? непонятно чему верить...
При чем находил пример для обмена с другим устройством и программой на SFC, там таки TRUE проверяют....

А Вы ради эксперемента посотрите как работает условие просто инт в состояниях ноль и один, а также такое же условие , только с принудительным преобразованием int_to_bool

melky
26.05.2014, 12:57
capzap что смотреть не понял, а по документации на SysLibCOM
SysComSetting
Данная функция типа BOOL, устанавливает скорость, число стоповых бит, контроль паритета,
таймаут, размер буфера и период опроса для последовательного порта. Требуемые параметры
передаются посредством указателя на структуру COMSETTINGS.
Возвращает TRUE при успешной установке параметров, иначе FALSE.

И куча примеров от ОВЕН, где наоборот, и даже кто-то на форуме писал, что при успехе таки 0...

amn
26.05.2014, 14:36
Вот тут говорят, что при ошибке будет -1.
http://www.owen.ru/forum/showthread.php?t=16787&p=132339&viewfull=1#post132339

melky
26.05.2014, 15:08
amn ага, уже понятнее тогда.
Тоже по поводу реализации опроса счетчиков Приходько написал, что с SysLibCom заморочки с временем цикла ПЛК иначе глюки. Насколько необходимо увеличить время цикла ?
Или реализовывать задержку таймерами ?

Darkmen999
26.05.2014, 16:03
Попробуйте к терминальной программе подключить портом Debug, в порт должна отладочная информация идти сразу после включения.
Большое спасибо за разъяснения. Чуть чуть не понял про терминальную программу. Точнее что это. Я и так подключаюсь к КДС портом Debug. Проект КДС это не терминальная программа? Я так понял?

capzap
26.05.2014, 17:17
amnПриходько написал, что с SysLibCom заморочки с временем цикла ПЛК иначе глюки.

Где Александр это писал и точно это про syslibcom, а не про UNM?

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

melky
26.05.2014, 19:17
capzap прямо тут и написано "Для корректной работы библиотеки SysLibCom необходимо было увеличивать время цикла, плюс вручную открывать и настраивать порт" (с)
http://www.owen.ru/forum/showthread.php?t=551&p=48013&viewfull=1#post48013

Ну, ComService и планировал использовать, просто вообще разбирался с SysLibCom

capzap
26.05.2014, 19:31
capzap прямо тут и написано "Для корректной работы библиотеки SysLibCom необходимо было увеличивать время цикла, плюс вручную открывать и настраивать порт" (с)
http://www.owen.ru/forum/showthread.php?t=551&p=48013&viewfull=1#post48013

Ну, ComService и планировал использовать, просто вообще разбирался с SysLibCom

Черт, где Валенок, поржать не с кем

amn
26.05.2014, 20:04
amn ага, уже понятнее тогда.
Тоже по поводу реализации опроса счетчиков Приходько написал, что с SysLibCom заморочки с временем цикла ПЛК иначе глюки. Насколько необходимо увеличить время цикла ?
Или реализовывать задержку таймерами ?

Раз уж экспериментируете, то попробуйте поставить мин цикл 0.

melky
26.05.2014, 23:34
capzap еще понял, что верить никому нельзя :)

capzap
27.05.2014, 04:20
capzap еще понял, что верить никому нельзя :)

Бибка делает запросы независимо от основного цикла и несколько дольше чем один цикл, поэтому увеличивать время чтоб дождаться выполнения работы функции слегка не корректно,но можно. Дата того поста за десятый год, может Александр только начинал осваивать эту бибку или неправильно выразился,ведь основной смысл того поста был о другой библиотеке

RV9WFJ
27.05.2014, 08:13
Большое спасибо за разъяснения. Чуть чуть не понял про терминальную программу. Точнее что это. Я и так подключаюсь к КДС портом Debug. Проект КДС это не терминальная программа? Я так понял?В WinXP она втроенная - HyperTerminal, в Win7 можете попробовать PuTTY или любую другую, которая показывает что в порт приходит.

RV9WFJ
27.05.2014, 08:18
capzap что смотреть не понял, а по документации на SysLibCOM
SysComSetting
Данная функция типа BOOL, устанавливает скорость, число стоповых бит, контроль паритета,
таймаут, размер буфера и период опроса для последовательного порта. Требуемые параметры
передаются посредством указателя на структуру COMSETTINGS.
Возвращает TRUE при успешной установке параметров, иначе FALSE.

И куча примеров от ОВЕН, где наоборот, и даже кто-то на форуме писал, что при успехе таки 0...Так описаний тоже несколько версий, последнее на русском языке в PDF вроде указывает что в ПЛК фирмы Овен все наоборот, потому что когда эту библиотеку в прошивку засовывали что-то там напутали и переделывать потом не стали чтоб совместимость сохранить со старыми прошивками.
P.S. Если не секрет то зачем такой мазохизм - переделывать библиотеку с UNM на SysLibCom. Вы же вроде писали что у вас не ПЛК63/73. Тогда чем вас UNM не устраивает, по возможностям он даже лучше для ПЛК100/110/150. Хотя я сам весь код на SysLibCom делаю, чтоб в любой ПЛК заливалось :-)

melky
27.05.2014, 09:07
RV9WFJ на объекте уже есть ABB, скорее всего добавляться будут они же, но может будет и ОВЕН, тут уж не мне решать, а манагерам да заказчику, я деньги не считаю.
У меня есть дома ПЛК100, на нем и тренеруюсь. как-то так...
На счет того, что это перепутка в ПЛК ОВЕН учту....

ЕвгенийД
27.05.2014, 12:57
Как происходит обмен информацией ПЛК с ИП320. ИП320 мастер - считывает определенные ячейки памяти подготовленные программой ПЛК и размещает на экране эти данные?
Я правильно понимаю?

ЕвгенийД
27.05.2014, 19:32
Подскажите что я не верно делаю. ПЛК110-60 через RS232 соединен с панелью ИП320 (мастер) пример "Передача строки Ascii-символов из ПЛК на ИП320". Соединение устанавливается. Строчка не выводится.
13100
1310113102

amn
27.05.2014, 22:12
ЕвгенийД, по сети в ИП320 строку передать нельзя. Почитайте в документации "Конфигурирование панели оператора.pdf" стр. 13 про динамический текст.

swarog_87
28.05.2014, 06:21
Уважаемые форумчане помогите начинающему!!! Пробую в MasterScada запускать и контролировать фазу двигателя с помощью плк100 и пускателя, только не смейтесь код простой
PUSK и alarm переменные float Modbus(slave)
DO-выход плк
DI-вход плк
Codesys
IF PUSK1>0 THEN DO1:=TRUE;
END_IF
IF PUSK1=0 THEN DO1:=FALSE;
END_IF

IF DI1=TRUE THEN alarm1:=0;
END_IF
IF DI1=FALSE THEN alarm1:=1;
END_IF
IF DO1=FALSE THEN alarm1:=0;
END_IF
Внимание проблема в том что мне надо останавливать двигатель с кнопки стоп и с MasterScada
Как снять сигнал с выхода плк при нажатие по кнопки стоп без подсоединения её к другому входу плк?

ЕвгенийД
28.05.2014, 08:09
В примере на диске идущем с ИП320 указан пример допускающий передачу текста.

amn
28.05.2014, 16:15
ЕвгенийД, Вы ничего не перепутали? Пример в каком файле и номер страницы укажите.

amn
28.05.2014, 17:03
Внимание проблема в том что мне надо останавливать двигатель с кнопки стоп и с MasterScada
Как снять сигнал с выхода плк при нажатие по кнопки стоп без подсоединения её к другому входу плк?

С трудом, но догадываюсь, что Вы хотите использовать для включения и выключения выхода один вход ПЛК. Если это так, то можно использовать следующий код


VAR_INPUT
in:BOOL; (*вход: кнопка включения/выключения выхода*)
END_VAR
VAR_OUTPUT
q:BOOL; (*выход*)
END_VAR
VAR
a:BYTE:=170; (*маска для прокручивания 10101010*)
R_TRIG1: R_TRIG;
END_VAR

-------
R_TRIG1(CLK:= in); (*отлавливаем момент нажатия на кнопку*)
IF R_TRIG1.Q THEN
a:=ROL(a,1); (*прокручиваем маску по кольцу на 1 бит*)
END_IF
q:=a.0; (*выходу присваиваем нулевой бит маски*)

melky
28.05.2014, 18:07
swarog_87 а просто сделать на Д-триггере ?
в оскат библиотеке FF_DRE называется. Кнопку завести на вход CLK, с Q на инверсный D и на включение мотора. На вход R подать сигнал по аварийному отключению.
Вход разделить путем ИЛИ с переменной из скады, или на ресет, если необходимо только останавливать без запуска.

ЕвгенийД
28.05.2014, 18:33
ЕвгенийД, Вы ничего не перепутали? Пример в каком файле и номер страницы укажите.
пример с диска с ИП320 "Передача строки Ascii-символов из ПЛК на ИП320" В посте 2987 я приложил сканы.

RV9WFJ
28.05.2014, 20:45
Внимание проблема в том что мне надо останавливать двигатель с кнопки стоп и с MasterScada
Как снять сигнал с выхода плк при нажатие по кнопки стоп без подсоединения её к другому входу плк?Из кода совершенно не понятно какая переменная к чему и зачем в Slave у вас Real используется а не BOOL. Отвечая на ваш вопрос, наверно как-то так: IF DI OR ModBusSlaveDI THEN PUSK:=FALSE END_IF А вообще посмотрите описание ФБ SR и RS из библиотеки Util.lib

Lyohsha
29.05.2014, 07:44
модуль МУ110-6У. можно ли все выхода (ЦАП-ы) запитать от одного источника питания?

satana
29.05.2014, 15:14
Привет! Интересует ПОЧЕМУ при работе программы в режиме "эмуляции" в визуализации все кнопки работают, а при соединении с плк перестают работать? При том, что ползунки и проч работают нормально.
Заранее спасибо!
P.S.: ПЛК 110-32, конфигурация та же. Интерфейс tcp/ip.

Валенок
30.05.2014, 03:06
Небось кнопы к входам ПЛК прилепили

satana
30.05.2014, 09:35
Благодарю. Истина, как всегда, на поверхности:D

Александр_АСК
31.05.2014, 20:23
Здравствуйте.
Имеется оборудование которое при включении дает сигнал на соответствующий вход ПЛК, есть визуализация в которой оператор выбирает причину включения оборудования (этот этап самый простой и его уже реализовал), но возник следующий вопрос: как сделать сохранение в excel данных в виде: оборудование № | время вкл(как взять время ПК?) | время выкл | причина (желательно чтобы текстом указывалась) (например: оборудование№1 | 20.01 | 20.58 | тех.обслуживание) ?
и как организовать сохранение отчета каждый день в файл с названием даты(скажем сегодня в 23.59 создается файл 31.05.14.xls, завтра 01.06.14.xls).

Yegor
01.06.2014, 11:10
а) Журналирование в ПЛК (http://owen.ru/forum/showthread.php?t=16563) — CSV-файл пишется на контроллере, периодически выкачивается на компьютер. Эксель разумеет CSV.

б) Писать свою программу под винду, которая модбасом будет считывать данные с контроллера и делать те же CSV-файлы (просто) или даже готовые .xls (посложнее).

AndreyCh73
03.06.2014, 08:17
Что значит сообщение, которое появляется после загрузки программы из ПК в ПЛК (Онлайн - Подключение).13149

melky
03.06.2014, 13:50
Как соорудить динамический массив байт в FB, чтобы на входе задавать размер массива ?

Валенок
03.06.2014, 13:52
SysMemAlloc'ом

melky
03.06.2014, 14:05
Валенок не совсем понимаю, как его применить. "служит для динамического выделения памяти"
Может я неправильно выразил задачу. надо внутри блока иметь ХХ: ARRAY [0..Y] OF BYTE
число Y задавать на входе блока.

Валенок
03.06.2014, 14:13
xx : pointer to array[0..65000] of byte;
y : word;

xx := sysmemalloc(y-1);
if p <> 0 then
....
xx^[..] :=..
....
sysmemfree(xx,y-1);
else
//ёк
end_if

capzap
03.06.2014, 14:14
В бибку оскат загляните, там такая ситуевина встречается вместе с решением

melky
03.06.2014, 14:38
Валенок спасибо. я так понимаю 65000 необязательно ставить, а применять максимально нужный мне размер ?

Валенок
03.06.2014, 14:47
Без разницы. Нельзя только обращатся за пределы выделенного.

melky
03.06.2014, 15:05
Валенок блин, в эмуляторе работать не будет ?

Валенок
03.06.2014, 15:36
Как и все syslib...
PS
Алгоритмы можно на PLCWin отгонять

melky
11.06.2014, 11:05
Не понимаю, почему после сброса ПЛК запись через SysLibCom работает, а после полного прохождения цикла перестает работать ?
Код вида:
1:
(*Отсылаем команду*)
t1;
byte_write:=SysComWrite(DeviceNumber, ADR(command), command_len, 0);

IF byte_write=command_len THEN
stat:=2;
(*Запуск таймера ожидания ответа*)
t1(IN:=TRUE , PT:=timeout );
t1;
END_IF
После одного прохода byte_write становится равным 0 хоть тресни. Не пойму, куда копать...

Валенок
11.06.2014, 11:12
А кто ж кроме вас видел все остальное ?
Например, забыли сбрасывать таймер

melky
11.06.2014, 11:36
Валенок, все остальное это библиотека Mercury.lib от Овена и переделка ее под SysLibCom вместо UNM.

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

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

Примеры работы с SysLibCom так же брал Овеновские.

Yegor
11.06.2014, 12:07
потом открывается опять портА зачем его закрывать и повторно открывать? Всё-таки лучше б вы показали, как именно перевели этот mercury.lib. Приёмник данные считывает хотя бы в это время?


byte_write:=SysComWrite(DeviceNumber, ADR(command), command_len, 0);

IF byte_write=command_len THENТак не совсем правильно писать, потому что в буфере порта может не оказаться свободного места для данных в объёме command_len. Нужно суммировать ответы SysComWrite пока они не достигнут command_len, а к адресу своего буфера эту сумму добавлять:
nbytes_written := nbytes_written + SysComWrite(dev, ADR(command) + nbytes_written, command_len - nbytes_written, 0);

IF nbytes_written = command_len THEN ...

melky
11.06.2014, 12:34
Yegor ADR(command) + nbytes_written, command_len - тут билиберда, при условии, что command_len число известное. мы сдвигаем адрес буфера команды, а ее длину оставляем неизменную.
ага, тоже уже заметили :)

Говорю же, переделывал, поэтому и не трогал открытие и закрытие порта.
На мои художества, не относящиеся к Меркурию, не обращайте внимания, можно удалить. Может свежим взглядом станет ясно, что не так.

За код не пинайте, он практически полностью от ОВЕН.
Странность в том, что все заложенные в программе CASE с учетом входа Fixed проходят только один раз, потом стопориться на case 1: блока Test_Channel

ПЛК-100 Р-М используется для тестирования.

Опытным путем определил, что зависает порт, поэтому останавливается цикл опроса.
1. отключил FB Close_port
2. будучи подключенным к проекту из Codesys ручками заставляю закрыть и потом открыть порт, цикл продолжается.
3. попытки использовать Fixed так же приводят к останову...
мда уж, толи руки кривые, толи лыжи не едут :(

Обновил вложение.

bladerunner
17.06.2014, 16:31
Подскажите, пожалуйста, как инициализировать глобальные переменные? Где-то вроде бы говорилось, что они инициализируются в ноль, но в эмуляторе пишет INVALID: 16x67...

Валенок
17.06.2014, 16:36
16#67, 2#10001

alex55
17.06.2014, 20:12
Валенок-гений математики и не только!

bladerunner
17.06.2014, 21:39
16#67, 2#10001
Эээ, а подробнее можно, пожалуйста...
Спасибо

Валенок
18.06.2014, 00:17
А что такое 16x67 ?

bladerunner
18.06.2014, 00:57
А что такое 16x67 ?

Есть глобальная переменная M. Сейчас она нигде не используется.
В визуализации я вывел ее значение. Показывается "INVALID: *** 16#67 ***" (см. картинку).

13303

capzap
18.06.2014, 06:12
Есть глобальная переменная M. Сейчас она нигде не используется.
В визуализации я вывел ее значение. Показывается "INVALID: *** 16#67 ***" (см. картинку).

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

Ренат)
18.06.2014, 09:25
добрый день , как сгладить колебания в переменной ? если можно наиболее развернуто дайте ответ ..

bladerunner
18.06.2014, 09:31
Считаете что стало понятнее, может у Вас это строковая переменная с таким текстом,а Вы над нами смеетесь, проект выложите чтоб можно было воспроизвести такой результат у себя

Чудеса... Я скопировал файл в другую папку и в ней этой ошибки не возникает. При этом в старой ошибка по-прежнему есть.... Rebuild all не помогает.
Файл прилагаю.

capzap
18.06.2014, 09:54
Чудеса... Я скопировал файл в другую папку и в ней этой ошибки не возникает. При этом в старой ошибка по-прежнему есть.... Rebuild all не помогает.
Файл прилагаю.

так вроде не сложный элемент, удалите и создайте новый, неужто не поможет

swarog_87
18.06.2014, 13:21
swarog_87 а просто сделать на Д-триггере ?
в оскат библиотеке FF_DRE называется. Кнопку завести на вход CLK, с Q на инверсный D и на включение мотора. На вход R подать сигнал по аварийному отключению.
Вход разделить путем ИЛИ с переменной из скады, или на ресет, если необходимо только останавливать без запуска.

Спасибо но я правда использую язык ST тк я там описываю входы выходы мдвв

Валенок
18.06.2014, 23:52
добрый день , как сгладить колебания в переменной ? если можно наиболее развернуто дайте ответ ..
Реферат ?..

melky
20.06.2014, 18:31
Обновил вложение в посте
http://www.owen.ru/forum/showthread.php?t=10555&p=139568&viewfull=1#post139568

Избавился от ComServise, сделал по аналогии с другими FB, однозначное закрытие порта и повторное открытие, потому что если открыть, то происходили чудеса с зависанием порта, счетчик переставал отвечать вообще.
Сейчас вроде работает.
Вопрос в другом, CASE 300, отвечает за считывание массивов энергий за месяц (NumMass=3) и в коде есть проверка на ошибочный ответ от счетчика. В случае если месяц не равен от 1 до 12 (с января по декабрь) параметр Mount то счетчик тупо не отвечает и даже не дает ответа по ошибке.
Кто работал с библиотеками Mercury.lib когда они были через UNM, у вас та же ситуация ?

kukla100
21.06.2014, 13:57
Как на языке CFC можно реализовать Д-триггер для переменных типа: INT, REAL, WORD ?

Валенок
21.06.2014, 14:03
Видимо примерно так как и придать им цвет.

melky
21.06.2014, 23:04
kukla100 а что в итоге вы хотите получить ? может SEL спасет ?

kukla100
22.06.2014, 04:11
kukla100 а что в итоге вы хотите получить ? может SEL спасет ?

Просто с приятелем обсуждали последний наш проект, а в КДС2.3 в библиотеках его нет. Вот и задумались, а как это можно сделать? Если по простому то "MOVE" с "R_TRIG" как бы подходит, а если нужен RESET? То как тогда? Вот и всё.

Вот ещё вопрос, как при изготовлении своей библиотеки в КДС2.3 можно привязать картинки к блокам? К примеру, что бы получилось как у RS-триггера, BLINK и т.д.

melky
22.06.2014, 11:32
kukla100 так при ресете через тот же MOVE запишите 0 или 1 или все, что угодно, хоть первичное значение.
чистый D тригер это булевая переменная, есть в оскатовской бибке, называется FF_DRE

kukla100
22.06.2014, 12:14
kukla100 так при ресете через тот же MOVE запишите 0 или 1 или все, что угодно, хоть первичное значение.
чистый D тригер это булевая переменная, есть в оскатовской бибке, называется FF_DRE

Где эту бибку взять? А насчёт картинок не знаете как сделать?

kukla100
22.06.2014, 12:17
А с ресетом вот, что получилось.

petera
22.06.2014, 15:16
А с ресетом вот, что получилось.Круто получилось:confused:
Только зачем так сложно?
Почему не так?
13352

ЗЫ. А еще можно использовать "Действия"
13353

petera
22.06.2014, 15:56
Вот еще вариант использования Действий для установка, например, максимального или минимального значения
13354

kukla100
22.06.2014, 16:12
Да, так много лучше. Всё время забываю, что с програмным продуктом общаюсь:p

ЕвгенийД
23.06.2014, 19:45
Помогите разобраться с проектом. Должен считывать данные с МВ по 485 и выдавать сообщения об аварии, если отличается от нуля. При соединении с ПЛК110 через USB все работает. После записи проекта в ПЛК - пишет на ИП320 "потеря связи" МВ физически при отладке не подключен.

kukla100
25.06.2014, 18:57
Подскажите как сделать преобразование. У меня сигнал от "0" до "6" как его пребразовать в 4-20мА на аналоговом выходе контроллера ПЛК160

Yegor
25.06.2014, 19:12
Разделить на 6, умножить на 16, прибавить 4.

31kip
27.06.2014, 12:02
Здравствуйте форумчане, пытаюсь победить ПЛК-73. Нарисовал в CFC простую схемку терморегулятора с выводом температуры на экран, сам алгоритм работает нормально, а вот с датчиком беда при подключении контроллера показывает какие то непонятные цифры вместо реальной температуры, настройки уже несколько раз проверял все верно, намой взгляд:confused:13391

Валенок
27.06.2014, 13:29
физически подключен неправильно

31kip
27.06.2014, 13:42
Спасибо большое, моя ошибка

31kip
27.06.2014, 15:05
Подскажите еще пожалуйста, есть ли где либо примеры работы с клавиатурой ПЛК не в СТ а в CFC? в СТ нашел, но никак не могу их преобразить для CFC.

Laguna
27.06.2014, 19:06
имеется плк63 и МУ110-6У
в конфигураторе ПЛК для 63го адрес вбил = 100, МУ110 не конфигурировал (1.по идее должны быть настройки по умолчанию?)
в CFC пытаюсь отправить единицу (10В на выход МУ110), но чтото не получается, му110 на выходах нули :(. подключение как по схеме, 0 и 24В беру с выхода ПЛК 24вольтового. что не так? о_О
проект прикрепил (вырезал всё кроме обмена с му110)

Dimon62
27.06.2014, 20:02
Всем коллегам доброго времени суток! Ребята, вот такой вопрос. Имеется ПЛК160 и панель оператора СП270. Создал проект. Записал его в ПЗУ контроллера. Все работает при включении контроллера (все замечательно). Далее попробовал внести изменения в проект (добавил строчку в конфигурацию (ветку) одну). Произошла ошибка... Типа потеря связи... Далее вернул все на место (удалил из проекта добавочную запись). Теперь не могу связаться с контроллером. При подключении онлайн, выдается сообщение "Ошибка 0# типа ошибка связи, произошло отключение". Не могу дальше работать с проектом. Что такое могло произойти? Проект компилируется и ошибок нет. Ноутбук связан с ПЛК по протоколу етзернет.
Ранее (еще раз повторяюсь) записал этот проект в память ПЛК и он работает.
Недавно была такая же ситуация. "0# ошибка связи, произошло отключение". Думал железо барахлит (или косяк какой либо).
Ездил в сервис-центр "ОВЕН". ПЛК проверили на стенде. Работает как часы швейцарские. Проблем нет. Ребята дали заключение. Сам наблюдал проверку тестов.
Потом решили проверить мой проект. Ну да. Моя ошибка оказалась (я новичок извините, тонкостей не знаю). Добавил лишний модуль "Статистика" в проекте. Он то и глючил (при чем ошибок не выдавал зараза...) Главное компилятор ошибок не выдает ни каких. А выскакивало сообщение "Потеря связи..." Удалили лишний модуль из проекта и все заработало вроде.
А на работе один хрен, периодически выскакивает такое сообщение...
Вчера целый день отработал и все на ура. Потом (после добавления строчки) все встало колом. Ошибок нет (компилятор компилит все). Что такое? В чем засада? Понимаю, что железка, вроде как не проблемная.
Кодесис стоит 2.3.9.44.
При желании могу сбросить свой проект на рассмотрение. Просто в данный момент его под рукой нет. Все на работе осталось...
Спасибо!

Абросимов Олег
28.06.2014, 01:32
Подскажите еще пожалуйста, есть ли где либо примеры работы с клавиатурой ПЛК не в СТ а в CFC? в СТ нашел, но никак не могу их преобразить для CFC.

Объясните в чем конкретно проблема? Может смогу чем помочь

31kip
28.06.2014, 11:27
Да проблема , наверное, совсем простая для опытных пользователей CoDeSes, мне нужно чтобы запуск/остановка алгоритма производился с кнопки старт/стоп на лицевой панели ПЛК-73, программа уже написана, только писал я ее для ПР-110, там все работает(вместо кнопок использовал один из входов, работает как кнопка).А теперь стоит задача для адаптации ее к ПЛК. С языком ST практически не знаком, если можно какой то простой примеров CFC каким образом я могу получать "еденицу" при нажатии кнопки СТАРТ/Стоп. Пересмотрел массу документации и примеров в ST но никак не могу понять как использовать BYTE или DWORD, да и вообще нужно ли их использовать.

FPavel
28.06.2014, 19:14
Так я обрабатывал нажатия кнопки для ПЛК100

(*
На входе:
bButtonStartStop - объявляется в конфигурации ПЛК - добавляется модуль Button и ему присваивается такое имя
На выходе:
xButtonPush : BOOL; - обработанное антидребезгом состояние конпки
rtrig_Button : R_TRIG; - одиночный импульс при нажатии на кнопку

*)
(*----------------------------------------------------------------------------------------------------------------------------------*)
(* переменные для обработки нажатия кнопки *)
(*----------------------------------------------------------------------------------------------------------------------------------*)
xButtonPush : BOOL; (* обработанное антидребезгом состояние конпки *)
ton_ButtonPush : TON; (* кнопка нажата - после антидребезга *)
tof_ButtonRelease : TOF; (* кнопка отпущена - после антидребезга *)
rs_ButtonStatus : RS; (* кнопка нажата или отпущена - управляется от состояний нажата/отпущена *)
rtrig_Button : R_TRIG; (* одиночный импульс при нажатии на кнопку *)
(*-------------------------------------------------------------------------*)
(* Кнопка Старт/Стоп *)
(*-------------------------------------------------------------------------*)
(* Проверка нажатия кнопки bButtonStartStop с подавлением дребезга *)
ton_ButtonPush(in:=bButtonStartStop, pt:=t#20ms);
tof_ButtonRelease(in:=bButtonStartStop, pt:=t#20ms);
rs_ButtonStatus(SET:=ton_ButtonPush.q, reset1:=NOT tof_ButtonRelease.Q);
rtrig_Button(clk:=rs_ButtonStatus.Q1);
xButtonPush:=rs_ButtonStatus.Q1;

Для понимания удобно нарисовать в виде схемы.

petera
28.06.2014, 21:24
Да проблема , наверное, совсем простая для опытных пользователей CoDeSes, мне нужно чтобы запуск/остановка алгоритма производился с кнопки старт/стоп на лицевой панели ПЛК-73, программа уже написана, только писал я ее для ПР-110, там все работает(вместо кнопок использовал один из входов, работает как кнопка).А теперь стоит задача для адаптации ее к ПЛК. С языком ST практически не знаком, если можно какой то простой примеров CFC каким образом я могу получать "еденицу" при нажатии кнопки СТАРТ/Стоп. Пересмотрел массу документации и примеров в ST но никак не могу понять как использовать BYTE или DWORD, да и вообще нужно ли их использовать.
13395
При каждом нажатии кнопки СТАРТ/СТОП (KBD.5:=TRUE, т.е. если KBD:=32) переменная Pusk(BOOL) будет менять свое состояние на противоположное.

ЗЫ. То же самое, но на языке ST
13396

Абросимов Олег
29.06.2014, 14:41
13397

13398

13399

Таким образом у меня реализовано включение релейного выхода нажатием кнопки F1 дольше одной секунды

31kip
30.06.2014, 09:33
13395
При каждом нажатии кнопки СТАРТ/СТОП (KBD.5:=TRUE, т.е. если KBD:=32) переменная Pusk(BOOL) будет менять свое состояние на противоположное.

ЗЫ. То же самое, но на языке ST
13396

А как мне указать что KBD.5:=TRUE, т.е. если KBD:=32? то есть что именно при 32 клавиатуры а не при каком другом ее значении, получается мне нужно присвоить KBD.5 значение 32, а как это сделать в CFC я не пойму, принцип действия понимаю, а конкретно реализацию никак:confused:

31kip
30.06.2014, 09:40
13397

13398

13399

Таким образом у меня реализовано включение релейного выхода нажатием кнопки F1 дольше одной секунды

вот в этом примере четко прописано key_f1:word:=1; а в самой блок-схеме только вход KBD, как указать что в данном случае KBD:key_F1:word:=1?

Абросимов Олег
30.06.2014, 11:36
Я неправильный вариант, отправил
13404

13405

petera
30.06.2014, 11:36
А как мне указать что KBD.5:=TRUE, т.е. если KBD:=32? то есть что именно при 32 клавиатуры а не при каком другом ее значении, получается мне нужно присвоить KBD.5 значение 32, а как это сделать в CFC я не пойму, принцип действия понимаю, а конкретно реализацию никак:confused:
Пятый бит переменной KBD устанавливается при нажатии кнопки на панели контроллера, его устанавливает сам контроллер:), в программе его устанавливать не надо, просто использовать этот бит и все.
Для справки другие биты переменной KBD
13403
Т.е. при одновременном нажатии нескольких кнопок в переменной KBD будут единицы в разных разрядах. Но даже если нажать ПУСК и ВВОД, то все равно KBD.5:=TRUE.
Если вопрос о том, как проверить в эмуляторе, то нужно переменной KBD присвоить значение прямо в конфигурации (щелкнуть на переменной и ввести нужное значение.

Абросимов Олег
30.06.2014, 11:39
Единственно, что обратил внимание, при выполнении программы, у меня значение key_f1 периодически меняется с 1 в 0 и обратно, то есть приходится ловить момент, когда она в 1, чтобы замкнуть вход. Это баг конкретного плк или что?

petera
30.06.2014, 12:13
Пятый бит переменной KBD устанавливается при нажатии кнопки на панели контроллера, его устанавливает сам контроллер:), в программе его устанавливать не надо, просто использовать этот бит и все.
Для справки другие биты переменной KBD
13403
Т.е. при одновременном нажатии нескольких кнопок в переменной KBD будут единицы в разных разрядах. Но даже если нажать ПУСК и ВВОД, то все равно KBD.5:=TRUE.
Если вопрос о том, как проверить в эмуляторе, то нужно переменной KBD присвоить значение прямо в конфигурации (щелкнуть на переменной и ввести нужное значение.
Добавлю видео пример

http://youtu.be/zrCz4cA9E58

31kip
30.06.2014, 13:40
УрААААААААААААААААААААААААААААААА!!!! Заработало!!! Спасибо большое за детальные ответы, и огромное терпение к моим вопросам.

ЕвгенийД
01.07.2014, 13:34
Помогите сделать связь с MB110 c ПЛК по 485 интерфейсу.
настройки ПЛК сделал ModBus master. Настройки МВ оставил по умолчанию.
Помогите - неделю уже бьюсь!

Василий Кашуба
01.07.2014, 18:54
Помогите сделать связь с MB110 c ПЛК по 485 интерфейсу.
настройки ПЛК сделал ModBus master. Настройки МВ оставил по умолчанию.
Помогите - неделю уже бьюсь!
На ПЛК, лучше выложить программу, а на MB110, можно и скрин с установленными параметрами.

Nts
02.07.2014, 13:54
это только экстрасенсы по фотографии могут определить что\где когда и почему.
мало информации.проект нужен и файл настроек модуля,чтобы Вам смогли что-то вразумительное ответить.
Какой модуль?Например если МВ110-16ДН, то ему надо указывать протокол обмена.Если вы ему заводские настройки оставили,то он связываться не будет.У него по дефолту протокол ОВЕН стоит на сколько я помню.

31kip
02.07.2014, 15:44
Подскажите пожалуйста, что делаю не так, пытаюсь сделать так чтобы после включения выхода, ПЛК-73 переключался с одного экрана на другой, с соответствующей надписью "пуск".

ЕвгенийД
02.07.2014, 17:33
[QUOTE=Василий Кашуба;140580]На ПЛК, лучше выложить программу, а на MB110, можно и скрин с установленными параметрами.[/QUOTE
Программа и конфигурация МВ во вложении.
При наличии на входах МВ любого нолика включается сигнализация и по нажатию кнопки SB1 на ИП320 выводится соответствующее сообщение. после вывода всех сообщений программа ожидает когда все сигналы придут в норму - в 1 и начинается новый цикл отработки аварий.
Сейчас у меня с МВ в программе только нолики. На деле на входе МВ 0х80.

petera
02.07.2014, 19:56
Программа и конфигурация МВ во вложении.
При наличии на входах МВ любого нолика включается сигнализация и по нажатию кнопки SB1 на ИП320 выводится соответствующее сообщение. после вывода всех сообщений программа ожидает когда все сигналы придут в норму - в 1 и начинается новый цикл отработки аварий.
Сейчас у меня с МВ в программе только нолики. На деле на входе МВ 0х80.
Если не читать РЭ на приборы, то всегда будет

Помогите - неделю уже бьюсь!13462
13462
А что у Вас? Почему номер регистра 0?
13463
Кроме того есть примеры применения модулей.

kolyan
03.07.2014, 16:21
Подскажите пожалуйста, что делаю не так, пытаюсь сделать так чтобы после включения выхода, ПЛК-73 переключался с одного экрана на другой, с соответствующей надписью "пуск".

Какого выхода? Q5?
Изъясняйтесь яснее!

31kip
03.07.2014, 16:43
Какого выхода? Q5?
Изъясняйтесь яснее!

да Q5. а вообще я только начинаю изучать CoDeSys и для меня важно понять принцип выполнения, перечитал кучу литературы и столкнулся с тем что написано в ST по мере воплощения стараюсь адаптировать ST в CFC но не всегда получается(например как в этом случае), уже пробовал работу с экраном прописывать отдельным функциональным блоком в ST. но в связи моими скудными познаниями в программировании получается очень много ошибок в написании.

kolyan
03.07.2014, 17:21
да Q5. а вообще я только начинаю изучать CoDeSys и для меня важно понять принцип выполнения, перечитал кучу литературы и столкнулся с тем что написано в ST по мере воплощения стараюсь адаптировать ST в CFC но не всегда получается(например как в этом случае), уже пробовал работу с экраном прописывать отдельным функциональным блоком в ST. но в связи моими скудными познаниями в программировании получается очень много ошибок в написании.

Учитесь, читайте, смотрите чужие примеры - их на форуме множество!
И совет: переходите на ST.
Замучаетесь на CFC работать с экранами.

Tayon
04.07.2014, 01:50
В архиве программа для панели
В программе 4 подпрограммы
CONNECT - проверка связи с модулями
PLC_PRG - трансляция значений для прямой индикации
SM-AL - обобщение аварий (создание аварий по группам)
ALARM_N - аварии не включения вентустановок, не открытия заслонок
(это не окончательный вариант, причесываю, добавляю)
И собственно проблема с ALARM_N - его цикл доходит до 4 секунд..
приточек 16, вытяжек 48, на каждую по 2 аварии (с выдержкой времени)
не включение в течении 5-10 секунд - авария,
не открытие клапана в течении 90-120 секунд авария,
естественно для каждой аварии проверяются условия...

Как можно уменьшить время цикла, или сделать его прерывание для опроса модулей.

Заранее спасибо за критику и предложения!!

Подмечу сразу, работаю со словами целиком (то есть передаю с порта на порт), ИБО уже 10 изменение по вентиляции (раньше вытяжки приточки были по порядку), что они еще придумают...

Yegor
04.07.2014, 07:36
Tayon, начнём с ликбеза по логическим выражениям. Вот так не пишут:
IF OUTP51.0=TRUE AND IN51.4=FALSE THENЭто тавтология и лишний код. Следует писать так:
IF OUTP51.0 AND NOT IN51.4 THENВ условиях вообще не должны встречаться слова true и false. Сама конструкция if это уже проверка на true, и вы «проверяете проверку на true на true». Для проверки на false есть отрицание not.

Сжимаем дальше. Вот ваш код опять:
IF OUTP51.0=TRUE AND IN51.4=FALSE THEN AL1.0:=TRUE; ELSE AL1.0:=FALSE; END_IF
TONP9R(IN := AL1.0, PT:= TN);
ALARM1.0 :=TONP9R.Q;А вот как следует:
TONP9R(IN := OUTP51.0 AND NOT IN51.4, Q => ALARM1.0);Параметр PT можно задать один раз в объявлениях:
TONP9R: TON := (PT := T#3s);И вообще, если что-то можно задать в объявлениях, лучше это сделать.

Но больше всего поражает, конечно, количество таймеров. Их можно заменить массивом типа TIME, и в этот массив заносить временные метки по соответствующим условиям:
currentTime := TIME();
timestamps[N] := SEL(OUTP51.N AND NOT IN51._N_, currentTime, timestamps[N]);Дальше в цикле забивать маску аварий:
ALARM1.N := currentTime - timestamps[N] > TZ;Только аккуратнее с переполнением на 50-е сутки.

Ещё в несколько раз эту подпрограмму можно ускорить, если принять во внимание, что допуски в 10 и 90 секунд это намного больше среднего цикла ПЛК. Значит, необязательно каждый раз проверять все механизмы, и можно разбить их на несколько групп. Скажем, проверять штук 5-10 за проход.

В общем, циклы, группирование и логика без тавтологий и лишних промежуточных переменных.

31kip
04.07.2014, 08:15
Учитесь, читайте, смотрите чужие примеры - их на форуме множество!
И совет: переходите на ST.
Замучаетесь на CFC работать с экранами.

В этом то и проблема, что примеры все в ST, огромное множество, но все в ST!!! Я же просил подсказки в том как реализовать работу с экранами на CFC. И скажите kolyan зачем вы спрашивали "какой выход, Q5" или какой другой, если не желаете помочь?

kolyan
04.07.2014, 08:25
В этом то и проблема, что примеры все в ST, огромное множество, но все в ST!!! Я же просил подсказки в том как реализовать работу с экранами на CFC. И скажите kolyan зачем вы спрашивали "какой выход, Q5" или какой другой, если не желаете помочь?

А что значит "помочь"?
Написать за Вас программу?
Если бы Вы постарались и поискали на форуме - там были примеры на CFC.
Посмотрели бы, почитали, тогда, может - и вопросы появились бы...
А таким образом - ничему не научитесь, ИМХО.

31kip
04.07.2014, 08:37
Я не прошу написать за меня программу, форум, конечно, весь я не перечитал, да это и невозможно, а те темы которые меня интересуют я пересмотрел все и ответа нигде не нашел.А вопрос я задал вполне конкретный: каким образом мне связать выход q5 с SetWorkScreen? может есть какой то функциональный блок, который я не доставляю или нужно ввести какую то переменную. А вы вместо того чтобы ответить на конкретный вопрос занимаетесь нравоучением. И каким это "таким" образом я ничему не научусь?

31kip
04.07.2014, 08:38
Если вы знаете где есть примеры работы с экранами на CFC дайте пожалуйста ссылку.

kolyan
04.07.2014, 08:49
Я не прошу написать за меня программу, форум, конечно, весь я не перечитал, да это и невозможно, а те темы которые меня интересуют я пересмотрел все и ответа нигде не нашел.А вопрос я задал вполне конкретный: каким образом мне связать выход q5 с SetWorkScreen? может есть какой то функциональный блок, который я не доставляю или нужно ввести какую то переменную. А вы вместо того чтобы ответить на конкретный вопрос занимаетесь нравоучением. И каким это "таким" образом я ничему не научусь?

1).Никто нравоучениями не занимается. Я выразил лишь своё мнение.
Самостоятельно осваивал кодесис, поэтому знаю про что говорю.

2). Нажмите на SetWorkScreen правой кнопкой мыши. Выберите En\Eno. У блока появится вход для разрешения его работы (En). Туда и вставьте Q5.

3).Вот Вам пример работы с экранными функциями ПЛК-63:
-скачайте этот проект:
http://www.owen.ru/forum/attachment.php?attachmentid=5027&d=1320818701
-Зайдите в PLC_PRG,
-Затем кликните 2 раза на STEP6.
Там находится пример.
Описание здесь:

http://www.owen.ru/forum/showthread.php?t=11341&page=3

Пост №26.

31kip
04.07.2014, 09:21
вот за это огромное человеческое СПАСИБО. Умом я понимаю как нужно сделать, а вот в конкретной реализации сталкиваюсь с проблемами. CoDeSys тоже изучаю самостоятельно и подсказать некому, поэтому и обращаюсь на форум с вопросами, которые продвинутым пользователям могут казаться простыми и глупыми(может они таковыми и являются). И согласитесь ведь второй пункт вашего ответа не был готовой программой, а мне не хватало именно этого)))) Еще раз спасибо за подсказку и примеры.

ЕвгенийД
04.07.2014, 09:28
Кроме того есть примеры применения модулей.
Спасибо, все получилось!

Для отладки соединения с RS485, ПЛК - ЕКОН нужно соединять кабелем кроссовер?

Tayon
04.07.2014, 09:35
Огромное спасибо Yegor! Вы просто открыли мои глаза
Не помню откуда у меня эта любовь, скорее привычка сравнивать true/false...

А параметр PT я планировал вынести на панель, так как наблюдается дикий разношерст с приводами, от 90 до 180 секунд. и по вентустановкам уже мои автоматику обвязали, а частотников нет, движки еще от NED, все знают их проблемы пуска... (работа снимается дифф. манометром по перепаду давления)

А таймеров много ибо с массивами TIME работать не приходилось..


И еще один вопрос к уважаемым форумчанам.
Есть такая структура сети:
13488

Подскажите как грамотно организовать обмен между 3 "пультами". С переменными которые служат сугубо для индикации проблем никаких, они разбегаются как дерево A->B->C D->D
но как быть с дискретными?

Я предпологаю: A->B->C->D->E->A;

И надо мастерить конструкции типа:


IF A=B AND E<>B THEN B:=A
IF A=B AND C<>B THEN A:=B

В таком роде...

Может кто то сталкивался с подобной проблемой и подскажет ключик к её решению?
Заранее благодарен

capzap
04.07.2014, 09:38
CoDeSys тоже изучаю самостоятельно и подсказать некому, поэтому и обращаюсь на форум с вопросами, которые продвинутым пользователям могут казаться простыми и глупыми(может они таковыми и являются).

Знаете как это выглядит со стороны: " я не профессионал, но буду запускать котельную самостоятельно"

31kip
04.07.2014, 09:49
Ну по поводу профессионализма я бы поспорил, а по поводу запуска котельной-оператор не должен знать все принципы построения автоматики и внутренние алгоритмы ее работы, но при этом он ее запускает и работает!!! И если я слабо разбираюсь в CoDeSys это не значит что ничего не понимаю в автоматике и в принципах ее построения.

capzap
04.07.2014, 09:59
Ну по поводу профессионализма я бы поспорил, а по поводу запуска котельной-оператор не должен знать все принципы построения автоматики и внутренние алгоритмы ее работы, но при этом он ее запускает и работает!!! И если я слабо разбираюсь в CoDeSys это не значит что ничего не понимаю в автоматике и в принципах ее построения.

так не оставляйте здесь такие сообщения, что новичек в КДС и т.п.

есть относительно небольшой документ http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf, где расписано всё, включая использование EN/ENO, остальное может неполучаться только из-за отсутствия расположенности к логическому мышлению

Валенок
04.07.2014, 10:23
а по поводу запуска котельной-оператор не должен знать все принципы построения автоматики и внутренние алгоритмы ее работы
Оператор обязан знать причинно-следственные связи этой котельной как минимум - а это и есть "принципы построения автоматики", иначе на кой этот оператор ? Тыкать в кнопы по принципу "нажмем и посмотрим, если чо - звоним Петровичу ?" Пусть лучше подметает вокруг. Хотя нет, тут тоже думать надо - листву в кучу гребсти в уголок или на сквознячок

Yegor
04.07.2014, 13:53
Подскажите как грамотно организовать обмен между 3 "пультами".А откуда вообще такая витиеватая структура взялась? Зачем два контроллера? СП270 в качестве мастера ещё не отваливалась (а то она любит)?

Tayon
04.07.2014, 15:24
взялась она от того что наши строители "не смогли" построить обьект вовремя, в итоге,
1 сентября сдается эта часть (садик с начальной школой)
потом школа, наверно декабрем
а потом комплекс (где и стоит компьютер)
естственно что заказчик хочет видеть все в таких этапах, и в последствии на постоянной основе
Сп270 отваливается, но я обычно боролся перезагрузкой по питанию. Панель меняет с переодичностью раз в 5-10секунд переменную (конроллер следит), как только тишина, сброс по питанию панели.. конечно все это написано моим корявым языком:D

Садик лепил из того что было, вот и попалась СП270, леченая, но живенькая.

вот волею судеб получишся змей горыныч о трех головах, а головы все разные;)

Надеюсь что решение найдется

kukla100
06.07.2014, 10:23
С помощью какой библиотеки можно организовать архивирование событий, аварий и т.д. ?

Валенок
06.07.2014, 11:41
например syslibfile

Darkmen999
06.07.2014, 14:04
Сижу, балуюсь в кдс, пытаюсь натренировать логическое мышление. Недавно возник маленький вопрос, который сбил меня с толку.
Допустим имеется кнопка без самофиксации и какой нибудь агрегат. При нажатии на кнопку должен заработать агрегат, при повторном нажатии агрегат выключается. Короче пуск и стоп посредством одной кнопки. Сигнал с кнопки идет на оба входа RS-триггера. Перед входом reset триггера думаю использовать декрементный счетчик с уставкой 2. Т.е при повторном нажатии на кнопку активируется сброс триггера и произойдет выключение агрегата.
Прошу поделиться советом, может есть другое более простое решение.
Заранее спасибо.

melky
06.07.2014, 14:13
FF_DRE из oscat библиотеки, вот тут на миниатуре видно http://www.owen.ru/forum/showthread.php?t=17629&p=140875&viewfull=1#post140875
как раз стоит кнопочный выключатель (переменная tenbON) которая включает/выключает.
Ловите отдельно.

Darkmen999
06.07.2014, 14:26
melky
Большое спасибо, попытаюсь разобраться. Но как понять, как устроен сам данный функциональный блок из библиотеки? Как самому реализовать программно включение и выключение одной кнопкой? Тут моя логика полностью страдает.
Открыл файл библиотеки, и..язык ST...пытаюсь разобраться, но не доходит...

melky
06.07.2014, 15:16
Darkmen999 а так ли важно, как внутри функционирует обычный D-Trigger, который при инверсии на вход CLK превращается в Т-триггер ?
в любом справочнике по микросхемам можно посмотреть логику работы Д-триггера. ставьте готовый блок в свою программу на CFC и применяйте.
Вы же не вдаетесь в подробности работы OR, AND, NOT ?
так и тут, стандартный Д-триггер.
Другой вопрос разбираться с функциями специфическими, не описанными в справочниках.

На ST можно реализовать и без использования FB, просто используя входную переменную кнопки и дополнительно переменную в программе. Да и на CFC тоже можно, только зачем ?

petera
06.07.2014, 15:24
Сижу, балуюсь в кдс, пытаюсь натренировать логическое мышление. Недавно возник маленький вопрос, который сбил меня с толку.
Допустим имеется кнопка без самофиксации и какой нибудь агрегат. При нажатии на кнопку должен заработать агрегат, при повторном нажатии агрегат выключается. Короче пуск и стоп посредством одной кнопки. Сигнал с кнопки идет на оба входа RS-триггера. Перед входом reset триггера думаю использовать декрементный счетчик с уставкой 2. Т.е при повторном нажатии на кнопку активируется сброс триггера и произойдет выключение агрегата.
Прошу поделиться советом, может есть другое более простое решение.
Заранее спасибо.


melky
Большое спасибо, попытаюсь разобраться. Но как понять, как устроен сам данный функциональный блок из библиотеки? Как самому реализовать программно включение и выключение одной кнопкой? Тут моя логика полностью страдает.
Открыл файл библиотеки, и..язык ST...пытаюсь разобраться, но не доходит...
Посмотрите несколько страниц назад без счетчиков или RS триггеров :)
http://www.owen.ru/forum/showthread.php?t=10555&p=140405&viewfull=1#post140405

http://www.owen.ru/forum/showthread.php?t=10555&p=140471&viewfull=1#post140471

Или аналогично http://www.owen.ru/forum/showthread.php?t=13655&p=94449&viewfull=1#post94449
13509
То же самое, но на ST
13510

kukla100
06.07.2014, 16:39
например syslibfile

Тогда поставим вопрос по другому, как организовать архивирование событий, аварий и т.д. с помощью этой библиотеки ?
Думаю вообщем то нет смысла забивать данными память ПЛК, надо попробывать "ОВЕН МСД200".

Darkmen999
06.07.2014, 17:17
melky
Спасибо. Просто забыл про существование T и D триггеров. Ведь они же двухступенчатыми являются.

petera
Посмотрел скриншоты, беру на заметку данную хитрость, спасибо.)

Tayon
07.07.2014, 17:34
А массив на столько меток времени будет шустрее чем таймеры?

я подправил свой "код", и разбил через CASE эффект 500-700 милисекунд, против 6000 изначальных!

Спасибо за пинок в нужную сторону:)

Yegor
08.07.2014, 08:42
А массив на столько меток времени будет шустрее чем таймеры?Ну, вы как минимум избавитесь от расходов на вызовы внешних процедур.

AlNik
09.07.2014, 13:40
Здравствуйте! Если не жалко. Как назначить retain и записать в нее значение с другой переменной по команде в среде OWEN Logic. Спасибо откликнувшимся.

Валенок
09.07.2014, 23:03
Здравствуйте! Если не жалко..
Какая-то странная формулировка.На всякий - retain'ы в ПЛК. Owen Logic в ПР
http://www.owen.ru/forum/forumdisplay.php?f=34

kukla100
10.07.2014, 04:15
Скажите почему в первом варианте всё работает, а во втором не хочет. Причём в КДС3 второй вариант работает без проблем.

AlNik
10.07.2014, 05:03
Великодушно простите Валенок. С поиска попал не в ту ветку. Всего доброго. Спасибо...

capzap
10.07.2014, 10:20
Скажите почему в первом варианте всё работает, а во втором не хочет. Причём в КДС3 второй вариант работает без проблем.

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

Yegor
10.07.2014, 11:42
зачем нужен такой расчет если в итоге на выходе получаются определенные константыЗачем нужны эти каскады, когда есть MUX?

kukla100
10.07.2014, 11:52
Конечно так лучше. Ни как привыкнуть не могу, что КДС не урезанка какая нибудь.

kukla100
13.07.2014, 06:44
Имеем таргеты от "ваго" как их установить в ручную, ни каких установщиков нет? Где вообще в КДС храняться таргеты?

capzap
13.07.2014, 09:21
Имеем таргеты от "ваго" как их установить в ручную, ни каких установщиков нет? Где вообще в КДС храняться таргеты?

:) какое это имеет отношение к форуму ОВЕНа

petera
13.07.2014, 09:42
Имеем таргеты от "ваго" как их установить в ручную, ни каких установщиков нет? Где вообще в КДС храняться таргеты?
Таргеты хранятся в папке "C:\CoDeSys\Targets".
Установщик таргетов есть в самом КДС. Утилита называется "InstallTarget". Установка таргетов подробно описана в руководстве любого контроллера ОВЕН
Вот выдержка из РП ПЛК160
13611
------------------------
13612

kukla100
14.07.2014, 04:05
:) какое это имеет отношение к форуму ОВЕНа

Крупный обьект переводили на "ОВЕН" (2-ПЛК160, 3-154), ну и достался подержанный "ваго" не проподать же добру.
Установщик я уже нашёл, установил, ругаеться лицензии мол у тебя на этот ПЛК нет. "ваго" на свалку!!

a_sergeevich
15.07.2014, 23:10
Уважаемые профи, пожалуйста подскажите. Написал небольшую тренировочную программку для отработки работы с дискретными входами выходами ПЛК. Кратко смысл проги, подаём сигнал на 1 и 2 входы получаем сработку 1 и 2 выходов, подаём сигнал на 3 и 4 входы получаем сигнал на 3 выходе, а также устанавливаем сигнал на 4 выходе, который остаётся даже после снятия сигнала на 3 и 4 входе. Сигнал на 4 выходе снимается только после подачи сигнала на 5 вход. При подаче сигнала на 6 вход должны сработать 1, 2, 3, 4 выходы. Проблема заключается в том, что пока в программе нету блока: "При подаче сигнала на 6 вход должны сработать 1, 2, 3, 4 выходы", всё работает идеально, но как только добавляю в программу блок: "При подаче сигнала на 6 вход должны сработать 1, 2, 3, 4 выходы", у меня перестают срабатывать все остальные блоки, т.е я подаю сигнал на 1 вход, должен сработать 1 выход, но он перестаёт срабатывать, в кодесисе синим выделяется, что сигнал до выхода доходит, но сам выход при этом молчит. Всё проверяю на реальном ПЛК150-U-L.
Программу прилагаю. Не могу понять в чём загвоздка, первый раз с таким сталкиваюсь.

amn
15.07.2014, 23:49
Обратите внимание, что каждый блок пронумерован и они выполняются в программе последовательно согласно своих номеров. Когда Вы добавили 6 вход он у Вас выполняется в программе последним. Вот его значения и являются результатом работы программы. Так что предыдущие значения уже перезаписаны последним блоком.

a_sergeevich
16.07.2014, 06:20
Обратите внимание, что каждый блок пронумерован и они выполняются в программе последовательно согласно своих номеров. Когда Вы добавили 6 вход он у Вас выполняется в программе последним. Вот его значения и являются результатом работы программы. Так что предыдущие значения уже перезаписаны последним блоком.
И как эту проблему можно решить ? Если перенести этот блок в начало то тогда он начинает моросить, т.е перестают срабатывать 1,2,3 выходы. Блин засада короче.

amn
16.07.2014, 08:57
Надо стараться делать так, чтобы выходу делать присвоение в одном месте. Для этого предусмотрите все условия одновременного поступления сигнала с разных входов. Почитайте где-нибудь в Интернете про таблицу истинности сразу будет понятнее.

a_sergeevich
16.07.2014, 17:17
Надо стараться делать так, чтобы выходу делать присвоение в одном месте. Для этого предусмотрите все условия одновременного поступления сигнала с разных входов. Почитайте где-нибудь в Интернете про таблицу истинности сразу будет понятнее.
Всё, использую приведённую вами концепцию, решил проблему. Спасибо за помощь.

drvlas
25.07.2014, 00:13
Что-то у меня с головой... Тыщи лет использовал язык SFC (довольно примитивно) и в нем всегда было настроено "Использовать МЭК-шаги". Теперь вдруг о-па! В новой программе не могу работать с МЭК-шагами (например, пользоваться внутренней переменной "время работы шага").
Породил новый проект со старого по шаблону. Тот же набор бибилиотек. Те же настройки в "опции" проекта. Конечно же, стоит галочка "Использовать МЭК-шаги". Галочка стоит, а рядом (если открыть свойства шага) пункт меню "Связать действие" - не активен.

С чего бы это?

petera
25.07.2014, 04:47
Что-то у меня с головой... Тыщи лет использовал язык SFC (довольно примитивно) и в нем всегда было настроено "Использовать МЭК-шаги". Теперь вдруг о-па! В новой программе не могу работать с МЭК-шагами (например, пользоваться внутренней переменной "время работы шага").
Породил новый проект со старого по шаблону. Тот же набор бибилиотек. Те же настройки в "опции" проекта. Конечно же, стоит галочка "Использовать МЭК-шаги". Галочка стоит, а рядом (если открыть свойства шага) пункт меню "Связать действие" - не активен.

С чего бы это?
В КДС программа на SFC может одновременно содержать как упрощенные так и МЭК шаги
Включение/выключение опции "Использовать МЭК-шаги" не изменяет тип ранее созданных шагов, а только переключает редактор в режим создания новых шагов соответствующего типа. Ранее созданные шаги не изменяют своего типа.
Т.е. при выключенном "Использовать МЭК-шаги" можно добавлять простые шаги, если затем включить "Использовать МЭК-шаги", то последующие шаги будут создаваться как МЭК шаги. Затем можно выключить "Использовать МЭК-шаги" и опять добавлять простые шаги.
Таким образом если вся программа должна быть написана на МЭК-SFC,то опция "Использовать МЭК-шаги" должна быть включена еще до добавления самого первого шага.

drvlas
25.07.2014, 07:49
Йолы-палы...

В КДС программа на SFC может одновременно содержать как упрощенные так и МЭК шаги
Я-то это прекрасно знал.


Включение/выключение опции "Использовать МЭК-шаги" не изменяет тип ранее созданных шагов, а только переключает редактор в режим создания новых шагов соответствующего типа. Ранее созданные шаги не изменяют своего типа.
А вот это не учел!


Таким образом если вся программа должна быть написана на МЭК-SFC,то опция "Использовать МЭК-шаги" должна быть включена еще до добавления самого первого шага.Да нет, я всего-то навсего убил пару шагов и создал новые. И ведь сразу видно: когда новые МЭК-шаги создаешь, редактор услужливо тулит рядом привязанное действие! Блин! Давно не создавал новые программы, вот и потерял нюх. Хотя... Какой там нюх... Скорее, как в присказке "Не знал, не знал, да и забыл" :)

Спасибо, дорогой petera! Всегда был восхищен твоими адекватными и очень точными советами. И понятными для таких... э... специалистов, как я.

Поделюсь на радостях: это я ноутбуком гвозди забиваю. Подробнее - на ветке (http://www.owen.ru/forum/showthread.php?t=17785&p=142082#post142082) программируемых реле. Тоже хотел в вопросах новичков разместить, но потом хорошее название для темы придумал, так что сопцтвенную тему и завел.

drvlas
25.07.2014, 08:56
Совершенно новый вопрос.
Как-то отложилось у меня в дурной башке, что в КДС можно перейти с одного поддерживаемого языка на другой автоматически. Кто-нить делал трансляцию проекта? Потому что мои поиски привели меня к печально известному разбитому корыту. Та трансляция, что в меню Project -> Translate into other languages, это всего лишь перевод комментов.

Та что, отак вот и нет автоматических средств трансляции проекта (или хоть отдельного POU) со, скажем, SFC на FBD?

capzap
25.07.2014, 10:06
Совершенно новый вопрос.
Как-то отложилось у меня в дурной башке, что в КДС можно перейти с одного поддерживаемого языка на другой автоматически. Кто-нить делал трансляцию проекта? Потому что мои поиски привели меня к печально известному разбитому корыту. Та трансляция, что в меню Project -> Translate into other languages, это всего лишь перевод комментов.

Та что, отак вот и нет автоматических средств трансляции проекта (или хоть отдельного POU) со, скажем, SFC на FBD?
нажмите на одном из ПОУ правой кнопкой и выберите конвертация

drvlas
25.07.2014, 10:42
и выберите конвертацияСпасибо! Это оно.
Жаль только, что SFC-модули как раз и не позволяют такое сотворить. Эх...
Зато интересно было посмотреть, во что превращаются ST-программы! особенно прикол оператор присваивания (когда справа нет вычислений, ну, например, bRun:=FALSE).

Что ж, если уж так нравиттся SFC, то вначале на нем, потом, вручную - на знакомом ST, а уж с него автоматом на FBD. Наверное, это правой рукой левое ухо через затылок :)

Ответ понятен, спасибо!

olegik7711
25.07.2014, 12:52
Здравствуйте. Ребята, подскажите пожалуйста, естть ли в языке ST возможность округления числа (скажем REAL) до 3-го знака после зяпятой. Если есть, напишите пожалуйста как!

petera
25.07.2014, 13:46
Здравствуйте. Ребята, подскажите пожалуйста, естть ли в языке ST возможность округления числа (скажем REAL) до 3-го знака после зяпятой. Если есть, напишите пожалуйста как!
1.Использовать стандартную функцию TRUNC(). Правда она не округляет, а просто отбрасывает оставшиеся знаки
2. Если нужно именно округление, то функция ROUN() из библиотеки OSCAT
Вот ее код

FUNCTION ROUND : REAL
VAR_INPUT
in : REAL;
N : INT;
END_VAR
VAR
DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,100 0000.0,10000000.0;
X: REAL;
END_VAR
X :=DECADES[LIMIT(0,N,8)];
ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;

Василий Кашуба
25.07.2014, 13:54
Здравствуйте. Ребята, подскажите пожалуйста, естть ли в языке ST возможность округления числа (скажем REAL) до 3-го знака после зяпятой. Если есть, напишите пожалуйста как!
Умножить на 1000 перевести в "INT", потом снова перевести в "REAL" и разделить на 1000.

Валенок
25.07.2014, 14:01
Умножить на 1000 перевести в "INT", потом снова перевести в "REAL" и разделить на 1000.
)) Округлите так, например, 33.4459

Dimooon
25.07.2014, 14:40
Здравствуйте, как вывести на панель Ип-320 тревогу об обрыве или замыкании накоротко с термометра сопротивления Pt100 с модуля МВ110-8А. Тут, в руководстве, даны значения регистров статуса для разных исключительных ситуаций , но как это правильно сделать на CFC- даже примерно не представляю... Подскажите пжс,

amn
25.07.2014, 19:46
0xF00C - короткое замыкание, в десятичном виде - 61452.
0xF00D - обрыв датчика, в десятичном виде - 61453.

Если панель мастер, то в ПЛК делаем слэйв, создаем первый регистр для аварий (назовем его alarm) (если надо можно и не один). Создаем в самом начале нужное количество регистров для аварий панели (чтобы проще было считать биты, в этом случае стартовый бит списка тревог панели будет равен 0). Допустим у нас один регистр, назовем его alarm. Каждый бит этого регистра будет соответствовать определенной аварии.

Если хотите, чтобы обрыв и КЗ были одной аварией в программе пишете:

если статус = 61452 или статус = 61453, то
alarm.0:= true.

В панели в списке тревог для бита 0 пишете соответсвующий текст в поле содержания тревоги.
Когда панель считает регистр аварий и увидит установленный бит тут же выдаст список тревог с этой аварией.

Dimooon
28.07.2014, 15:10
а сам "статус" откуда брать?

S.A.D.
28.07.2014, 15:30
поскольку новый поиск упрямо не собирается искать словосочетания вынужден спрашивать:
Можно ли как-то из программы изменить IP адрес ПЛК (в частности ПЛК160)?

capzap
28.07.2014, 15:35
поскольку новый поиск упрямо не собирается искать словосочетания вынужден спрашивать:
Можно ли как-то из программы изменить IP адрес ПЛК (в частности ПЛК160)?

Переписать файл в котором сохранены настройки сети

amn
28.07.2014, 15:39
а сам "статус" откуда брать?

Вы же сами в вопросе написали :


Тут, в руководстве, даны значения регистров статуса для разных исключительных ситуаций

Вот и читаем этот регистр со статусом из прибора по сети.

S.A.D.
28.07.2014, 16:08
Переписать файл в котором сохранены настройки сети
а в каком файле лежит адрес и в каком виде оно там?

capzap
28.07.2014, 16:21
Покапайтесь сами в плк или на форуме поищите

petera
28.07.2014, 16:22
а в каком файле лежит адрес и в каком виде оно там?
Посмотрите здесь http://www.owen.ru/forum/showthread.php?t=17746&p=141678&viewfull=1#post141678
Пример изменения IP адреса с экрана СП270. Во вложении есть программа для ПЛК, работает с файлом "local_addres.dat"

Dimooon
28.07.2014, 16:32
Я немного путаю понятия " регистр статуса" и "значения регистра статуса". Где они отображаются, эти значения, чтобы их оттуда взять и сравнить с числами 61452 и 61453 , чтобы потом бит в алярме установился?

S.A.D.
28.07.2014, 16:43
Посмотрите здесь http://www.owen.ru/forum/showthread.php?t=17746&p=141678&viewfull=1#post141678
Пример изменения IP адреса с экрана СП270. Во вложении есть программа для ПЛК, работает с файлом "local_addres.dat"

спасибо. по видимому то что нужно)

amn
28.07.2014, 16:53
Dimooon, регистр статуса это регистр в приборе. Адреса в руководстве посмотрите. В этот регистр записывается код исключительной ситуации. Если там значение 0, то все в порядке, а если другое значение, то смотрите там же в руководстве что это код означает. Это значение надо сначала прочитать из прибора. Обычно это делается вместе с чтение самого значения. То есть читаем сразу все регистры групповым запросом за один раз, а потом берем из прочитанного то, что нужно. Так быстрее опрос происходит.

Dimooon
28.07.2014, 17:07
Я понял, спасибо. А как потом сбрасывать значение TRUE на выходе MOVE? Контроллер сбрасывать?

Dimooon
28.07.2014, 17:18
Я что-то недопонял.... Это не так надо делать

Dimooon
29.07.2014, 15:53
amn,Вот так вроде работает

cpuanton
02.08.2014, 09:53
как подключить простое твердотельное реле 3-32в к овен плк 150! ничего не пойму. объясните пожалуйста куда его цеплять

RV9WFJ
03.08.2014, 09:38
Для начала полностью модел ПЛК150 написать.

melky
03.08.2014, 10:06
cpuanton обычную твердотелку только на К или Р выход. На выходе К можно ШИМ сделать. На Р тоже можно, но счелкать будет постоянно и неизвестно надолго ли

imaks
04.08.2014, 03:06
Добрый день
Не знаю, как правильно в поиске написать вопрос, по этому задам его тут - какое максимальное количество строк или же объем программы может быть выполнен ПЛК 100. И какая зависимость времени выполнения цикла программы от ее объема?
Встали перед выбором - дописать программу в уже имеющийся контроллер, либо же заморочиться и поставить второй контроллер, и уже по средствам модулей объединить их в одну систему.

capzap
04.08.2014, 07:50
Добрый день
Не знаю, как правильно в поиске написать вопрос, по этому задам его тут - какое максимальное количество строк или же объем программы может быть выполнен ПЛК 100. И какая зависимость времени выполнения цикла программы от ее объема?
Встали перед выбором - дописать программу в уже имеющийся контроллер, либо же заморочиться и поставить второй контроллер, и уже по средствам модулей объединить их в одну систему.

можно от сюда что то подчерпнуть http://www.owen.ru/forum/showthread.php?t=13446

drvlas
04.08.2014, 08:36
можно от сюда что то подчерпнутьНу, у меня ответ попроще. В моих (довольно однообразных) программах размер кода порядка 200+ кБ (SFC+ST), время цикла полтора десятка миллисекунд. И какое-то внутреннее ощущение, что уже не хочется увеличивать объем. Бездоказательно...

Валенок
04.08.2014, 10:01
И какая зависимость времени выполнения цикла программы от ее объема?

Никакой абсолютно.

Програма 1 (маленькая, 3 строки)
1|while true do
2| ;
3|end_while


Программа 2 (большая, 1000 строк)
1|case step of
2| 0: i:=i+1;
3| 1: i:=i+1;
4| 2: i:=i+1;
..
998| 996: i:=i+1;
999| 997: i:=i+1;
1000|end_case

Сравните время выполнения


PS
Причем увеличив код 2й, можно уменьшить время выполнения, например

case step of
0..100:
case step of
0: ..
..
100:..
end_case
101..200:
case step of
101: ..
..
200:..
end_case
... и т.д.

Yegor
04.08.2014, 13:52
Причем увеличив код 2й, можно уменьшить время выполнения, напримерЧот я сомневаюсь. По-хорошему в кейсе и так branch table (http://en.wikipedia.org/wiki/Branch_table), быстрее уже некуда и разбивать его незачем.

Валенок
04.08.2014, 15:55
)) Может быть. Сейчас нет возможности, но конверт в IL наглядно покажет - таблица или цепочка cmp/jamp

Хотел показать : размер и скорость несвязанные непосредственно свойства

Yegor
04.08.2014, 17:39
Да, насчёт отсутствия корреляции согласен.

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

MrNobody
05.08.2014, 16:50
Я понимаю, что примеров туча по подключению модулей МУ110, напишу сюда, чтобы не плодить тем.
Очень прошу помочь с подключением модуля МУ 110-16 К к ПЛК 110-32 по протоколу Owen по интерфейсу RS485.
Привожу скрины подключения.
13924
13925
в программе присваиваю единицу выходу, но в результате на приборе ничего нет.

Nts
05.08.2014, 17:14
есть разница между словом Listen и Write ?
вот так надо: (Work Mode по конкретной задаче-или циклически или двойной режим Both)

MrNobody
05.08.2014, 17:36
есть разница между словом Listen и Write ?
вот так надо: (Work Mode по конкретной задаче-или циклически или двойной режим Both)
сделал всё по примеру, всё равно не работает

MrNobody
07.08.2014, 13:19
Подскажите, а можно ли для МЭ110-220 3М, на вход Ua и Un подать 220В?

lara197a
07.08.2014, 13:21
Подскажите, а можно ли для МЭ110-220 3М, на вход Ua и Un подать 220В?

http://www.owen.ru/catalog/modul_vvoda_parametrov_elektricheskoj_seti_me110_2 203m/23367284

MrNobody
07.08.2014, 16:15
http://www.owen.ru/catalog/modul_vvoda_parametrov_elektricheskoj_seti_me110_2 203m/23367284
спасибо. Нет так нет

melky
07.08.2014, 17:05
MrNobody ну почему НЕТ сразу ? вы на модуль заводите либо 220В либо через трансформаторы напряжения более высокое напряжение.
Вторую схему подключения смотрите внимательнее...

Единственное, это необходимость трансформаторов тока, если он выше 5А. в РЭ должно быть указано.

melky
07.08.2014, 17:38
Вопрос по подсчету времени работы/не работы с переходом через сутки. В какую сторону копать ?

capzap
07.08.2014, 17:55
функция TIME() чем не подходит

melky
07.08.2014, 18:04
capzap просто считать полное время, когда было отключено/включено понятно, эта же функция может считать время во сколько ?

capzap
07.08.2014, 18:13
хотите сказать, что такой код не посчитает работу вплоть до 49 суток?
VAR
flag : BOOL;
oldFlag : BOOL;
foo : DWORD;
bar : DWORD;
tik : TIME;
END_VAR

IF flag AND NOT oldFlag THEN
foo := TIME_TO_DWORD(TIME());
ELSIF flag THEN
bar:=TIME_TO_DWORD(TIME())-foo;
tik:=DWORD_TO_TIME(bar);
END_IF;
oldFlag:=flag;

olegik7711
07.08.2014, 18:16
1.Использовать стандартную функцию TRUNC(). Правда она не округляет, а просто отбрасывает оставшиеся знаки
2. Если нужно именно округление, то функция ROUN() из библиотеки OSCAT
Вот ее код

FUNCTION ROUND : REAL
VAR_INPUT
in : REAL;
N : INT;
END_VAR
VAR
DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,100 0000.0,10000000.0;
X: REAL;
END_VAR
X :=DECADES[LIMIT(0,N,8)];
ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;

Извините, что с опозданием, но все же большое спасибо!

Yegor
07.08.2014, 20:10
хотите сказать, что такой код не посчитает работу вплоть до 49 суток?Ограничение в 49 суток намекает на излишнюю точность. Проще и надёжнее считать секунды или даже минуты:
VAR sectrig: R_TRIG;
running: BOOL;
END_VAR
VAR RETAIN
uptime: DWORD := 0;
END_VAR

sectrig(CLK := TIME_TO_DWORD(TIME()) MOD 1000 > 500);
uptime := uptime + BOOL_TO_DWORD(sectrig.Q AND running);

capzap
07.08.2014, 20:50
речь шла о перескоке через полночь (может это какой то проект для золушки ), поэтому посчитав время с типом данных TIME и по окончанию события получить с помощью бибки syslibtime текущее время, можно получить дату окончания и с помощью разности узнать начало события в реальных часах

melky
07.08.2014, 23:08
Ну мне собственно нужно фиксировать время включ/отключ, то есть отключилось в 10.45 06 августа 2014 года, включилось в 0.32 07 августа 2014
Отсюда и переход через сутки, ну и общее время посчитать.
Да, и включенное состояние может быть гораздо больше 49 суток.

RV9WFJ
08.08.2014, 04:22
Почитайте http://prolog-plc.ru/docs/TimeExperience.pdf

capzap
08.08.2014, 04:58
Ну мне собственно нужно фиксировать время включ/отключ, то есть отключилось в 10.45 06 августа 2014 года, включилось в 0.32 07 августа 2014
Отсюда и переход через сутки, ну и общее время посчитать.
Да, и включенное состояние может быть гораздо больше 49 суток.

Начальная формулировка была какая,вроде подсчет времени упоминался, если просто фиксация начала и конца,то достаточно и одной библиотеки времени, только в плк реальное время очень неточно идет, непонравиться опять Вам

melky
08.08.2014, 09:09
capzap и подсчет и фиксация, все, что связано со временем. На счет точности времени, будет ваш код для ntp сервера времени. У меня дома Mikrotik стоит, который может им выступить. Тут не проблема вроде раз в сутки делать корректировку времени

cpuanton
12.08.2014, 04:21
cpuanton обычную твердотелку только на К или Р выход. На выходе К можно ШИМ сделать. На Р тоже можно, но счелкать будет постоянно и неизвестно надолго ли


да уже понял. у меня Р. вот засада. просто рву питание тупо на реле. ну посмотрим надолго или не надолго. выходов 4 штуки.... ) нужен только 1. вот по очереди всех их прикончу.

RV9WFJ
13.08.2014, 06:16
Да на долго вам их хватит. Там omron реле стоит, тока практически не будет через него.

sklipa
13.08.2014, 07:04
Заранее прошу простить, не знаю где задать вопрос. Установил Codesys 2.3.99 для ознакомления - на XP пока вопросов нет, а на 7 не выделяются графические элементы рамкой, например для копирования или перемещения группой.

cpuanton
14.08.2014, 03:59
Ребята! Как подключить поплавковый датчик ПДУ-1.1 к ОВЕН ПЛК 150 АМ? там всего 2 провода торчит на датчик.

capzap
14.08.2014, 04:17
Ребята! Как подключить поплавковый датчик ПДУ-1.1 к ОВЕН ПЛК 150 АМ? там всего 2 провода торчит на датчик.

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

melky
14.08.2014, 17:34
Вопрос по таймеру. Если расположить таймер внутри программы, чтобы срабатывал раз в секунду (иное время) и вызывать ее из основной программы каждый цикл, как правильно в СТ прописать параметры ?
Вот пример кода, или это неправильно ? TM - таймер, tr1 это R_TRIG

TM(In:=start_tmr,pt:=t#1s);
start_tmr:=TRUE;
tr1(clk:=TM.Q);
IF tr1.Q THEN
A:=A+IN/X;
start_tmr:=FALSE;
END_IF

Или надо как-то иначе ?

приборист
14.08.2014, 17:59
Я вот так делаю:

TM(pt:=t#1s);
TM.in:=TRUE;
tr1(clk:=TM.Q);
IF tr1.Q THEN
A:=A+IN/X;
TM.in:=false;
END_IF

Ну или вот так (если просто через определенное время выполнять действия):

TM(in:=NOT TM.q, pt:=t#1s);
IF TM.q THEN
A:=A+IN/X;
END_IF

melky
14.08.2014, 20:05
приборист меня в некоторой степени волнует, какова будет погрешность измерения при увеличении времени цикла программы ?
Может лучше раз в секунду вызывать программу расчета по событию самого ПЛК в конфигурации ? тогда погрешность должна снизиться

lara197a
14.08.2014, 21:03
Измерения чего?
Время цикла к скорости обработки сигнала АЦП не имеет ни какого отношения. и в ПЛК примерно 0.5 сек на канал.

melky
14.08.2014, 22:17
приборист не фурычит ни мой пример таймера, ни ваш. Не пойму где проблема. IN таймера всегда true.
Таймер ВНУТРИ другой программы, наверное это важно...
прибор МЭ110-224.1М - мультиметр однофазный. с какой скоростью измеряет он мне фиолетово (указано менее 1 секунды). Мне с него раз в секунду надо читать для расчета.
С прибора я читаю в основной программе в каждом цикле, ну или сколько успевает ПЛК через конфигуратор, это мне тоже фиолетово.
мне просто нужно один из параметров пересчитывать строго раз в секунду, даже если он не успел обновиться из прибора.

melky
14.08.2014, 22:48
не въеду, как в задачи кинуть программу.
PLC_PRG должен быть с приоритетом 0 и свободный ?
моя программа, циклическая 1 с, есть вход и выход. my_prg(IN:= , OUT=> ):
а как передать на вход переменную из PLC_PRG и как обратно забрать выходную переменную ???

lara197a
14.08.2014, 23:02
обычно такие переменные(in-out) используют в функциональных блоках или функциях.
вам проще объявить эти переменные глобальными.

Валенок
15.08.2014, 00:24
мне просто нужно один из параметров пересчитывать строго раз в секунду, даже если он не успел обновиться из прибора.
Полюбопытствую, зачем такая строгость ?

capzap
15.08.2014, 07:05
melky видимо еще не обращал внимание что часы в контроллере точностью не отличаются

melky
15.08.2014, 08:51
capzap часы будут корректироваться раз в сутки. NTP сервером будет Mikrotik
Валенок хотелка, чтобы беря данные из однофазного мультиметра считать киловатт_часы и значения были близки к показаниям счетчика, просто чтобы смотреть на панели не бегая на улицу, ну и смотреть сколько сгорело за сутки, за месяц. Потом скаду прикручу, чтобы графики строила.

Описание Конфигурации задач скудненькое. Так и не понял вчера как передать переменные из одной программы в другую. Даже назначив их глобальными. Входная переменная почему-то всегда 0.
Сделал вчера через FB, работает. Но хотелось бы сделать именно через вызов программы, а что-то лыжи не поехали.

Глобальные переменные вроде являются Retain или нет ?

petera
15.08.2014, 11:02
приборист не фурычит ни мой пример таймера, ни ваш. Не пойму где проблема. IN таймера всегда true.
Таймер ВНУТРИ другой программы, наверное это важно...

Все "фурычит", даже без конфигуратора задач.:rolleyes:
14073 14072

melky
15.08.2014, 11:35
petera спасибо, так заработало. Видимо что-то не так делал сперва.
А вопрос по поводу как правильно делать через конфигуратор задач остается... можно ли передавать параметры в программу и возвращать обратно и как правильно это делать ?

capzap
15.08.2014, 11:47
petera спасибо, так заработало. Видимо что-то не так делал сперва.
А вопрос по поводу как правильно делать через конфигуратолр задач остается... можно ли передавать параметры в программу и возвращать обратно и как правильно это делать ?

Чтоб это понять в документации написано, более широко может быть в инструкции по использованию скоростного счетчика

petera
15.08.2014, 12:02
petera спасибо, так заработало. Видимо что-то не так делал сперва.
А вопрос по поводу как правильно делать через конфигуратор задач остается... можно ли передавать параметры в программу и возвращать обратно и как правильно это делать ?
Например, как было сказано выше, через глобальные переменные.
14074 14075
Здесь X и IN глобальные переменные для передачи значений в циклическую программу. А результат ее работы в главной программе берется путем обращения к переменной "А" по имени PRG2.А, хотя ее тоже можно было сделать глобальной.

melky
15.08.2014, 13:03
Странно, вроде вчера через глобальные делал точно так же, и не заработало, видать спал уже, сейчас набросал пример и все вроде как завелось.
Может как-то влиять, что я переменную из Modbus сразу назначил глобальной ?
Ну и вот для примера, разница подсчета видна. В первом случае в другой программе с таймером.
Во втором случае вызов каждую секунду из конфигуратора задач. В начале пути опрос через конфигуратор опережает. но значения повторяются, а дальше видно, что значения во втором случае выше. Переменная kwt и kwt1.

Валенок
15.08.2014, 13:48
что я переменную из Modbus сразу назначил глобальной ?
Смущает эта фраза. Переменная из модбас сама по себе глобальная без назначений.


Глобальные переменные вроде являются Retain или нет ?
Ретайн это то, что объявлено как ретайн + область io


беря данные из однофазного мультиметра считать киловатт_часы и значения были близки к показаниям счетчик
Имхо, для большей точности и здравого смысла расчеты нужно делать только в момент прихода ))).
Интеграл := интеграл + значение*dt. Остальное время можно курить бамбук.

petera
15.08.2014, 13:49
Странно, вроде вчера через глобальные делал точно так же, и не заработало, видать спал уже, сейчас набросал пример и все вроде как завелось.
Может как-то влиять, что я переменную из Modbus сразу назначил глобальной ?
Ну и вот для примера, разница подсчета видна. В первом случае в другой программе с таймером.
Во втором случае вызов каждую секунду из конфигуратора задач. В начале пути опрос через конфигуратор опережает. но значения повторяются, а дальше видно, что значения во втором случае выше. Переменная kwt и kwt1.
1. Любые объявления переменных в конфигурации, в том числе и в модуле Modbus, являются глобальными по умолчанию. Т.е. их не нужно объявлять глобальными где-либо еще.
2. В эмуляции будет так, как Вы и описываете, разница будет постепенно увеличиваться. При загрузке в ПЛК разницы быть не должно. Возможна разница только на значение одного вычисления из-за асинхронного вызова подпрограмм.

ЗЫ. К стати в примере из http://www.owen.ru/forum/showthread.php?t=10555&p=143814&viewfull=1#post143814

...Ну или вот так (если просто через определенное время выполнять действия):

TM(in:=NOT TM.q, pt:=t#1s);
IF TM.q THEN
A:=A+IN/X;
END_IF

Ошибка должно быть так

TM(in:=NOT TM.q, pt:=t#1s);
IF NOT TM.q THEN
A:=A+IN/X;
END_IF

melky
15.08.2014, 14:05
Валенок и как понять, что случился "приход" ? если отталкиваться, что читаю по modbus
petera на последней картинке IF TM.Q Then и работает, если поставить IF NOT то считаться будет в течение всей секунды, разве нет ?

petera
15.08.2014, 14:13
petera на последней картинке IF TM.Q Then и работает, если поставить IF NOT то считаться будет в течение всей секунды, разве нет ?
Так смотря какой таймер. Если как в моих примерах TP или TOF, то должно быть "IF NOT TM.q THEN". Если таймер TON, то правильно так, как в оригинале.

Валенок
15.08.2014, 16:05
как понять, что случился "приход" ?

var
pre : real;
приход : bool;

приход := ai <> pre; //Косвенный, но верный. Если юзаете через б-ки то там факт прихода напрямую
pre := ai;

Если переживаете про постоянное значение (на реальном процессе никогда не будет, для эмуляции пойдет) - прикрутите таймер

var
t : ton := (pt :=заведомо больше цикла опроса);

t(in:= not приход);
приход:=ai <> pre or t.q;
pre:=ai;

if приход then
интеграл := интеграл + ai * time_to_real(time() - t) / 1000;
t := time();
end_if

PS
И, кстати, отсутствие прихода - косвенный признак обрыва связи с модулем

var
connect : tof := (in:= true, pt := 3..10 циклов опроса);

connect(); //игнорим на старте - ведь еще не успели связатся
connect.in := приход;
if not connect.q then
..
end_if

melky
15.08.2014, 16:57
Валенок спасибо, попробую и по приходу. Просто правильнее в любом случае делить на период опроса, иначе мы не кВт часы получим, а что-то эфемерное...
Ведь приход может быть как раньше секунды, так и позже секунды и как тогда программировать время ?
Суть. кВт час = (при опросе раз в секунду) мощность(в кВт)/3600
Хотя наверное 3600 можно превратить в переменную, зависящую от времени опроса, только формула будет посложнее.

capzap
15.08.2014, 17:01
Валенок спасибо, попробую и по приходу. Просто правильнее в любом случае делить на период опроса, иначе мы не кВт часы получим, а что-то эфемерное...
Ведь приход может быть как раньше секунды, так и позже секунды и как тогда программировать время ?
Суть. кВт час = (при опросе раз в секунду) мощность(в кВт)/3600
Хотя наверное 3600 можно превратить в переменную, зависящую от времени опроса, только формула будет посложнее.
в оскат библиотеке есть нечто подобное только там связано с кубами в час, Вы бы изучили её, ведь почти вё что здесь было показано в примерах там имеется

melky
15.08.2014, 17:15
Имеете ввиду FLOW_METER ?

capzap
15.08.2014, 17:19
это ПОУ вроде наоборот, из производительности получает суммирующее значение

petera
15.08.2014, 20:02
Валенок спасибо, попробую и по приходу. Просто правильнее в любом случае делить на период опроса, иначе мы не кВт часы получим, а что-то эфемерное...
Ведь приход может быть как раньше секунды, так и позже секунды и как тогда программировать время ?
Суть. кВт час = (при опросе раз в секунду) мощность(в кВт)/3600
Хотя наверное 3600 можно превратить в переменную, зависящую от времени опроса, только формула будет посложнее.
Сама суть ошибочная.
"(при опросе раз в секунду) мощность(в кВт)/3600" - так Вы мгновенную мощность получите, а не количество потребляемой энергии.
Ведь само определение
«кВт⋅ч» (мощность, умноженная на время). Написание «кВт/ч» (киловатт в час), часто употребляемое во многих СМИ и даже иногда в официальных документах, неправильно. Такое обозначение соответствует изменению мощности в единицу времени (что обычно никого не интересует), но никак не количеству энергии.
Ежели все таки хотите использовать ежесекундные значения мощности, то код программы, вызываемой раз в секунду должен быть не такой как у Вас
kwt:=kwt+(IN/3600000);
а такой
summa:=summa+IN;
kwt:=summa/3600000;

melky
15.08.2014, 21:22
petera вы написали две одинаковых формулы, только по разному считающих.
если сделать по приходу, то вместо 3600 необходимо ввести и расчет периода. данные будут еще точнее и потом делить на 1000, так как прибор дает в Вт, а нам надо в кВт.
типа *1/период расчитанный относительно 1 часа

Валенок
15.08.2014, 22:41
Ведь приход может быть как раньше секунды, так и позже секунды и как тогда программировать время ?
Между приходами - неизвестность. Вычислять что либо при неизвестности - рукоблудие. Реальность - приход данных.


если сделать по приходу, то вместо 3600 необходимо ввести и расчет периода. данные будут еще точнее и потом делить на 1000, так как прибор дает в Вт, а нам надо в кВт.
Так расчет времени я Вам и предложил.
S Ai * dt, где dt = time() - t
Кстати, странно, что никто не предложил трапеции для максимально достижимой точности в данном железе.


if pre <> ai then
интеграл := интеграл + (pre + ai) / 2 * time_to_real(time()-t) / 1000;
pre := ai;
t := time();
end_if

Валенок
15.08.2014, 22:56
в оскат библиотеке есть нечто подобное
)))) в оскате видимо есть всё. Но иногда написать - быстрее, чем прочитать список того что есть.

melky
16.08.2014, 19:39
Замерил сегодня показания счетчика и ПЛК при использовании таймера опроса раз в 1 с в программе. За 2 часа набегает разница в 0,08 сотых кВт часа.
За сутки набежит примерно 1 кВт час, за месяц соответственно 30. Многовато.
Буду пробовать следующие варианты.

Валенок
16.08.2014, 23:03
разница в 0,08 сотых кВт часа.
Погрешность лучше описывать в %.
"За сутки набежит примерно 1 кВт час" - это 0 на Красноярской ГЭС
И начните хотя бы с погрешности самого МЭ.

melky
16.08.2014, 23:35
Валенок погрешность МЭ +- 0,5% вроде
Соврал, по активной мощности +- 1 %

PROGRAM Kwt_hours
VAR
kwt_summ: REAL;
kwt: REAL;
prihod: BOOL;
tm: TON;
END_VAR
TM(in:=NOT tm.q, pt:=t#1.5S);
prihod:=kwt <> activeP OR tm.Q;
kwt:=activeP;
IF prihod THEN
kwt_summ:=kwt_summ+kwt/(3600/(TIME_TO_REAL(tm.et)/1000))/1000;
tm.IN:=FALSE;
END_IF

Решил использовать ET таймера, а не time(), которое дает время от начала запуска. Единственное, может не правильный сброс таймера ???
Кстати в примерах t: ton и тут же time_to_real(time()-t) - что же тут t ?

melky
18.08.2014, 09:33
Вопрос по циклу ПЛК.
выставил когда-то мин 10 мс, на данный момент по статистики выполнение в 100 мкс - 9-10, свободно из расчета 1 мкс - 9ххх (так понимаю в районе 9 мс).
Свободное время учитывается во времени цикла ?, то есть программа отработала за 1 мс , 9 мс курит и начинается новый цикл ?

Валенок
18.08.2014, 10:38
что же тут t
очепятка. Пусть будет t0 : time;

то есть программа отработала за 1 мс , 9 мс курит и начинается новый цикл ?
Да. Новый цикл начинает по окончанию текущего, но не ранее МинЦ
В IF таймер надо явно сбрасывать tm(in:=false), иначе фигня какая-то получается периодом
И тогда нет смыcла в "not tm.q", просто true

melky
18.08.2014, 11:20
Валенок с таймером сообразил, просто делал сброс чуть по другому.

Так а как коррелируется тогда time_to_real(time() - t0) вот здесь
интеграл := интеграл + ai * time_to_real(time() - t0) / 1000;
t := time();
К соотношению часа ?
приход стал равен 1, мы считали время и отняли 0 (самый первый опрос) и потом запомнили время в переменной t0. И что у нас в расчете за первый опрос, если ПЛК не перегружался ? или такого косяка не должно быть при обновлении программы или просто вносит необходимость выполнять перезапуск ?
Ну и все равно необходимо вычислять соотношение периода опроса к часу. если раз в секунду опрос, то это 1/3600, если 0,5 с то 1/7200 и т.д.

Глупый вопрос, опрос переменной из Modbus контроллер выполняет только в начале/конце цикла основной программы ?
И еще один, таймер ведь будет сброшен физически только на следующем цикле программы ?

приборист
18.08.2014, 11:54
ЗЫ. К стати в примере из http://www.owen.ru/forum/showthread.php?t=10555&p=143814&viewfull=1#post143814

Ошибка должно быть так

TM(in:=NOT TM.q, pt:=t#1s);
IF NOT TM.q THEN
A:=A+IN/X;
END_IF

Если таймер это TON, то я подразумевал подсчет при срабатывании таймера. Т.е. каждую секунду производится сложение.


И еще один, таймер ведь будет сброшен физически только на следующем цикле программы ?
Таймер должен сбросится при проходе цикла через его инициализацию, т.е. TM(in:=NOT TM.q, pt:=t#1s);

P.S.
Уже прочитал))

P.P.S.
Кстати, по поводу цикла контроллера.
Был объект - упаковщик.
Необходимо было по метке на пленке, тормозить саму пленку.
В теории все просто - увидел метку послал сигнал на тормоз, пленка остановилась.

Так вот ПЛК110 постоянно останавливал пленку в разных местах (+-1см), хотя программа была из одной строки, и в теории цикл всегда одинаковый, метка видится хорошо, но остановка плавала.
Бились над этим долго, перешли на схему от Итальянцев, с использованием реле для остановки - все стало тютелька в тютелюку. (Но остановкой уже заведует реле, а не ПЛК)

capzap
18.08.2014, 12:00
Непомню уже с чем было связано, но я сперва проверяю условие на выход таймера, а после него само выполнение таймера (про ton говорю, др. не пользуюсь)

melky
18.08.2014, 12:18
Вот и я думаю, что все же лучше опрашивать через конфигуратор задач строго раз в секунду, все же от накопления погрешности от цикла программы избавляемся.

Yegor
18.08.2014, 12:40
я думаю, что все же лучше опрашивать через конфигуратор задач строго раз в секунду, все же от накопления погрешности от цикла программы избавляемся.Программу надо писать так, чтобы результаты её исполнения не зависели от равномерности и периодичности её вызова (в разумных пределах). Вы хотите лечить симптомы, на мой взгляд.

melky
18.08.2014, 13:02
Yegor программа будет со временем расти. Мне вот интересно, таймеры в CDS являются системными или работают строго по циклам программы ? они вообще учитывают время перекура цикла ?

Так вот и интересно, насколько влияет опрос вызова таймера в каждом цикле.

Валенок
18.08.2014, 14:25
Таймеры никак не привязаны к циклам. Например ton поднимается при вызове, но не ранее чем прошло заданный интервал времени. Не ранее.
Минц 100мс, ton.pt 150мс => Отработка ton через 200мс. При этом в ET будет [U]150.[/U
Так как проверять не хочется, то при
период:=time()-t0;
t0:=time();
период не зависит от PT таймера.

melky
18.08.2014, 14:37
Блин, перезалил удаленно программу, на всякий случай сделал "Создание загрузочного проекта" и ресетнул ПЛК. Оба модуля ввода отвалились :(
Питание передернуть смогу только приехав домой. Вопрос, вылечить удаленно можно ?

Валенок может немного не так выражаюсь.
Вот пример. Минц=10 мс
Есть команды ТМ(in:=true, pt:=t#1s)
и есть условие IF TM.Q Then
бла-бла-бла
TM(in:=false)
End_if

Когда сбросится в данном случае таймер ? - сразу ?, а запустится он когда ? - только на чтении строки ТМ(in:=true, pt:=t#1s) ?, то есть между сбросом и запуском пройдет целый цикл ?

Yegor
18.08.2014, 17:01
Питание передернуть смогу только приехав домой.А как же WHILE TRUE DO ; END_WHILE без записи в загрузочный проект? Собака гавкнет — питание передёрнется.

melky
18.08.2014, 17:06
Yegor а подробнее можно, а то ниче непонятно :) то, что речь о watch_dog понимаю, но как использовать ?

Например если по какой-то причине модуль висит с аварией на борту, а перегрузка будет только у ПЛК, а модули висят по питанию паралельно ? Добавлять реле по питанию на всё ?
Оба модуля настроены через конфигуратор.

Валенок
18.08.2014, 17:28
Да. Если ловить наиболее строгие интервалы ton'ом, нужно делать
[CODE]t(in:=true,..., et => период);
if t.q or ... B then
t(in:=false);
t(in:=true); //здесь же !!!
..
end_if
Но все это фигня если учесть заявленную точность + оцифровка до 1с

melky
18.08.2014, 17:53
Валенок спасибо.

Новая программа каким-то образом не соответствует опросу модулей ? конфигурацию при этом не менял. Переменные в программе вроде тоже не менял. Чудеса...
Действительно, МЭ висел с ошибкой связи, 8АС только индикатор питания. Перезагрузка ПЛК ни к чему не приводила.
Не должно же такого быть ?

melky
21.08.2014, 17:39
Вопрос по датчикам. Вот есть датчики, показания с них прыгают, например датчик 0-10В, смотришь по программе 2,33-2,38-2,42-2,35 и так далее.
То же с датчиком 4-20 мА, 8,36-8,43-8,35 ну и в том же духе...

Как бы их фиксировать, чтобы они не скакали ? Увеличивать время опроса не предлагать, так как все равно не помогает.
Есть какие-то библы для "выравнивания" показаний датчиков ?

capzap
21.08.2014, 17:45
а фильтрация не помогает?

melky
21.08.2014, 17:50
capzap так а что делает фильтрация ? сократит количество скачков или она иначе работает ?

Постоянная времени для эспоненциального фильтра
Ограничение скорости изменения измеряемого сигнала (пиковый фильтр)

Имеется ввиду поиграться с настройками этих параметров ?

capzap
21.08.2014, 18:35
конечно надо всё попробовать, ведь неизвестно же в чем характер помехи

fotonboxx
25.08.2014, 00:02
Добрый день!

Как в CFC или ST сделать следующее:
1. Если значение с аналогового входа меньше определенной уставки в течение некоторого времени (единицы секунд, точность не важна), то выполнить определенное действие, при этом нужно не блокировать основной поток, т.е. "получить значение со входа, подождать 10 секунд, опять получить значение", а в это время контроллер более ничем не занят не подходит.
2. Чем и как считать время наработки (логической единицы на одном из входов)?

Заранее спасибо за ответы!

Василий Кашуба
27.08.2014, 23:29
Добрый день!

Как в CFC или ST сделать следующее:
1. Если значение с аналогового входа меньше определенной уставки в течение некоторого времени (единицы секунд, точность не важна), то выполнить определенное действие, при этом нужно не блокировать основной поток, т.е. "получить значение со входа, подождать 10 секунд, опять получить значение", а в это время контроллер более ничем не занят не подходит.
2. Чем и как считать время наработки (логической единицы на одном из входов)?

Заранее спасибо за ответы!
Вы лучше напишите подробное ТЗ, а не ваш алгоритм работы, так как решений может быть много, а результат один и тот же.