PDA

Просмотр полной версии : Fast Counter - баг в овеновской документации или в моей голове?



vladimir_prg
11.06.2012, 07:15
Пытался разобраться с тем как работать с быстрыми счетчиками...
В овеновском рук-ве писано:
Модуль «Высокочастотный Счетчик» (Fast Counter) является модулем, заме-щающим модуль быстрых дискретных входов.
Счетчик считает количество импульсов, пришедших на быстрый дискретный вход за один цикл ПЛК. По завершению каждого цикла ПЛК значение в счетчике об-нуляется. Подсчет импульсов осуществляется по переднему (возрастающему) фронту импульса. Таким образом, для использования и обработки значения данного канала, необходимо считывать его каждый раз в начале цикла пользовательской программы. Например, ввести в программу дополнительную переменную, и в начале цикла передавать в эту переменную значение переменной, привязанной к счетчику.

Если счетчик обнуляется в конце цикла, то как же присваивать дополнительной переменной значение обнуленного счетчика в начале нового цикла ПЛК? Может все таки значение счетчика нужно считывать в конце цикла?

vladimir_prg
11.06.2012, 07:51
И чем занимается счетчик во время выполнения процессором сервисных функций после завершения цикла ПЛК? Ведь в это время также могут приходить импульсы.

Gans
11.06.2012, 09:39
Здравствуйте Владимир
В документации написано всё правильно да действительно так оно и работает!
Просто в программе необходимо к итоговой сумме счетчика (объявленного в программе) прибавлять значение из ПЛК-конфигурации В КАЖДОМ ЦИКЛЕ!!!

Например:
dwCounterImpuls1:=dwCounterImpuls1+iwdCounter1;

где dwCounterImpuls - это переменная объявленная в программе и есть итоговое значение счетчика импульсов.
iwdCounter1 - это переменная объявленная в ПЛК-конфигурации (Ваш быстрый дискретный вход).

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

lara197a
11.06.2012, 10:05
А в то время когда цикл окончен и к примеру выполняются сервисные функции или минимальное время цикла велико и контроллер просто стоит.В счетчике накапливаются данные для считывания в новом цикле.

vladimir_prg
11.06.2012, 10:56
Просто в программе необходимо к итоговой сумме счетчика (объявленного в программе) прибавлять значение из ПЛК-конфигурации В КАЖДОМ ЦИКЛЕ!!!


Да, это понятно, что нужно суммировать значение выхода счетчика в каждом цикле. Просто в док-ции пишется, что это нужно делать в начале цикла. (То есть в начале программы). А я считаю, что в конце программы. Так как за время выполнения программы счетчик может насчитать импульсы, которые обнулятся в конце цикла и будут не учтены.

Gans
11.06.2012, 12:25
Да, это понятно, что нужно суммировать значение выхода счетчика в каждом цикле. Просто в док-ции пишется, что это нужно делать в начале цикла. (То есть в начале программы). А я считаю, что в конце программы. Так как за время выполнения программы счетчик может насчитать импульсы, которые обнулятся в конце цикла и будут не учтены.
В документации наверно не совсем корректно написано. Данные счетчика из ПЛК-конфигурации перед началом цикла передаются в программу и обнуляются, а если в ходе выполнения цикла придут несколько импульсов Вы их получите в начале следующего цикла :-) В ходе цикла данные из ПЛК-конфигурации НЕ СЧИТЫВАЮТСЯ!!!

Выглядит это примерно так:
1. Данные собираются ПЛК-конфигурацией.
2. Передаются в программу.
3. Начинает выполнятся один цикл программы.
4. По окончанию цикла программы все расчетные значения передаются в ПЛК-конфигурацию.
6. Далее возвращаемся в пункт №1.

P. S. Начинается новый цикл программы даже если ПЛК-конфигурация не успела собрать ВСЕ ДАННЫЕ! Опрос датчиков температуры можно сделать и раз в пять секунд, а программа в ПЛК должна работать по чаще :-)

vladimir_prg
11.06.2012, 18:25
Как же не учтены, если Вам пишутто накопленное значение и прибавиться в начале цикла, а вот как раз если Вы будете присваивать в конце цикла, в Вашем присваивании не будут учтены те пришедшие импульсы во время исполнения Вашего кода

Во-первых, я обсуждаю официальную документацию, которая является эталоном описания алгоритма работы контроллера. Так как по идее исходит от того кто ЗНАЕТ, как работает контроллер, а не ДОГАДЫВАЕТСЯ.

Во-вторых, lara197a указал, про накопление значений после того как цикл закончен во время простоя и выполнение сервисных функций, (выполнение сервисных функций не входит в цикл контроллера).

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

Не совсем хорошо если ваши расчеты будут врать на несколько импульсов, только из-за того, что в документации не совсем точно описан алгоритм работы контроллера.

Алексей Дмитриев
14.06.2012, 20:23
Про что это все? Псевдоаппаратный счетчик у овна считает всегда и никуда не сбрасывается! Мало того - его сбросить невозможно даже если это нужно! Читайте его где хотите и когда хотите. Частота входных импульсов должна быть не выше 10 кГц, хотя это толком и не работает, реально меньше 5 кГц.

Иван Иванович С
22.09.2021, 08:39
Подскажите, пожалуйста, - у меня счетчик (Fast Counter) тоже не сбрасывается после обращения к переменной из Конфигурации. Ни в начале ни в конце цикла - просто копит до переполнения. Кто-нибудь решил эту проблему?

Валенок
22.09.2021, 14:30
............

A.Simonov
22.09.2021, 16:54
Подскажите, пожалуйста, - у меня счетчик (Fast Counter) тоже не сбрасывается после обращения к переменной из Конфигурации. Ни в начале ни в конце цикла - просто копит до переполнения. Кто-нибудь решил эту проблему?

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

Иван Иванович С
22.09.2021, 17:48
На сколько я помню сброс не предусмотрен.
Предполагается, что в коде проекта вы заводите свою переменную, и сбрасываете туда дельту показаний счетчика, между циклами ПЛК.

На ПЛК 160 счетчик сбрасывался сам при чтении переменной привязанной в конфигураторе, а теперь на ПЛК 160 [M02] пришлось сделать костыль с разностью значений между циклами. И при переполнении счетчика требуется еще контролировать чтобы кракозябра не получилась.

Валенок
22.09.2021, 17:53
.............

Иван Иванович С
22.09.2021, 18:13
Просто должно работать и так с аппаратным сбросом счетчика. Или не должно? Почему тогда это не появилось в описании переноса прошивки с ПЛК 160 на ПЛК 160 [M02]?

A.Simonov
23.09.2021, 10:44
пришлось сделать костыль с разностью значений между циклами.

Добрый день.

Это как раз не костыль.
Это правильная работа со счетчиком.

Вы просто пишете такой код:
ВашСчетчик := ВашСчетчик + (ПоказанияСчетчикаВЭтомЦикле - ПоказанияСчетчикаВПрошломЦикле);

При необходимости увеличения диапазона счетчика (до 4 294 967 295) можно сделать его типом DWORD и тогда код будет таким:
ВашСчетчик := ВашСчетчик + WORD_TO_DWORD(ПоказанияСчетчикаВЭтомЦикле - ПоказанияСчетчикаВПрошломЦикле);


И при переполнении счетчика требуется еще контролировать чтобы кракозябра не получилась.
Кракозябрам взяться не от куда. Допустим счетчик переполнился и мы имеет такие значения для расчета дельты:

ПоказанияСчетчикаВПрошломЦикле (Тип WORD) — 65500
ПоказанияСчетчикаВЭтомЦикле (Тип WORD) — 100

Посчитаем дельту, учитывая что оба значения типа WORD:
100 - 65500 = 100 + (0 - 65500 - 35) + 35 = 100 + (0 - 65535) + 35 = 100 + 1 + 35 = 136
т.е. 36 импульсов вызвали переполнение счетчика, и еще 100 сверху.

Пруф:
57137

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

Иван Иванович С
23.09.2021, 11:11
Спасибо большое!
Кракозябры пропали. В исходном проекте показания счетчика WORD сразу использовались для расчета с переменными REAL плюс домножение на масштабный коэффициент. Вынес расчет дельты между циклами в отдельную строчку где все промежуточные переменные перевел на WORD. А в оконном фильтре где завожу результат добавил WORD_TO_REAL и все стало красиво.

Просто странно - на старом ПЛК 160 счетчик сам сбрасывался. "Не было ни единого разрыва!"(с) ))))

Филоненко Владислав
23.09.2021, 11:50
Спасибо большое!
Кракозябры пропали. В исходном проекте показания счетчика WORD сразу использовались для расчета с переменными REAL плюс домножение на масштабный коэффициент. Вынес расчет дельты между циклами в отдельную строчку где все промежуточные переменные перевел на WORD. А в оконном фильтре где завожу результат добавил WORD_TO_REAL и все стало красиво.

Просто странно - на старом ПЛК 160 счетчик сам сбрасывался. "Не было ни единого разрыва!"(с) ))))

Ничего странного. В старом ПЛК использовался программный счётчик с максимальной частотой 3-10кГц. А в новом отдельный сопроцессор жесткого реального времени с частотой обработки сигналов до 500кГц. В первом случаем сброс успевал осуществляться за те 100 мкс, а сейчас за 1 мкс не успеет - вот и не сбрасывается

A.Simonov
23.09.2021, 12:01
Просто странно - на старом ПЛК 160 счетчик сам сбрасывался. "Не было ни единого разрыва!"(с) ))))

Немного изменили логику работы счетчика, видимо.
Не помню уже как раньше было :confused: Давно уже не работал с ПЛК в старом исполнении :)

P.S. В актуальной версии руководства по программированию (https://owen.ru/uploads/249/rp_plk1hh_m02__1-ru-75044-1.32_a4.pdf) работа описана именно так, как обсуждали выше.

Иван Иванович С
24.09.2021, 08:50
Ничего странного. В старом ПЛК использовался программный счётчик с максимальной частотой 3-10кГц. А в новом отдельный сопроцессор жесткого реального времени с частотой обработки сигналов до 500кГц. В первом случаем сброс успевал осуществляться за те 100 мкс, а сейчас за 1 мкс не успеет - вот и не сбрасывается

Вот - это то что я хотел понять! Спасибо большое!

У нас большой проект для серийного изделия давно написанный на аутсорсе под старый ПЛК 160. Теперь его самостоятельно портируем на ПЛК [M02], все сделали согласно "Инструкции по переносу". В итоге не заработали только счетчики. И библиотека SysComLib. ComService работает без проблем.

ОФФТОП:
SysComOpen не открывает порт RS-232. Открываем порт ComServiсe-ом. Но почему-то SysComWrite и SysComRead работают нормально по Port_Handle получаемым библиотекой ComService. Мы бы заменили полностью, но у нас особый протокол - не ModBus для порта RS-232. Структура формируется побайтно. Существует ли альтернатива SysLibCom?

capzap
24.09.2021, 09:13
Вот - это то что я хотел понять! Спасибо большое!

У нас большой проект для серийного изделия давно написанный на аутсорсе под старый ПЛК 160. Теперь его самостоятельно портируем на ПЛК [M02], все сделали согласно "Инструкции по переносу". В итоге не заработали только счетчики. И библиотека SysComLib. ComService работает без проблем.

ОФФТОП:
SysComOpen не открывает порт RS-232. Открываем порт ComServiсe-ом. Но почему-то SysComWrite и SysComRead работают нормально по Port_Handle получаемым библиотекой ComService. Мы бы заменили полностью, но у нас особый протокол - не ModBus для порта RS-232. Структура формируется побайтно. Существует ли альтернатива SysLibCom?

ComServiсe это надстройка над SysComLib для открытия/закрытия порта, можете открыть эту библиотеку и так же портировать, то что считаете необходимым из неё, либо пользоваться совместно и SysComLib и ComService
Альтернативой является UNM.lib (https://ftp.owen.ru/CoDeSys23/05_Library/01_Manuals/PID_Regulators.pdf)