Это не нормально, но это ожидаемо в случае со стандартным опрашивателем. Подробнее — экспортируйте конфигурацию и выкладывайте её сюда.
Вид для печати
Как вариант проверить через библиотеку можно? Экспорт конфигурации в приложении
Вложение 18582
Вооот... На каждый register input (output) module отводится свой 100-миллисекундный интервал (который вы потом поставили на 10). Соответственно, каждый отдельный регистр у вас записывался/считывался не чаще, чем каждые 100 × 6 = 600 мс. И нет, запросы даже по смежным регистрам не группируются — всё отдельными запросами. Это вы ещё легко отделались, т.к. у вас лишь одно устройство на порту. Когда их несколько, то начинается битва за порт. Такова стратегия опроса по умолчанию.
Что можно сделать помимо библиотеки... Ну, частоту вы уже попробовали повысить. В более сложных сценариях можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров. Ещё там есть активируемые вручную модули (которые state) — ими тоже можно спланировать опрос по-своему.
Всё понятно, спасибо большое за разъяснение.
Не подскажите чуть подробнее?Цитата:
В более сложных сценариях можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров.
Фишка с "можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку. А это не наш случай.
Самый простой способ
1. поместить регистры "управляющая команда на ПЧ" и "задание частоты" в отдельные UMD с WorkMode - By value change, т.е. запись в ПЧ будет только при изменении значения регистров в программе.
2. Все остальные input регистры оставить в третьем UMD для которого оставить WorkMode - By poll time
Вложение 18584
Модбас предусматривает групповое чтение регистров, но в Овено-Кодесисе оно реализуется только для чтения в строковый тип.
Например, надо читать сразу 20 смежных регистров, и часто. Добавляем String input module, в параметрах указываем подходящую функцию (Read Holding Registers), номер первого регистра и сколько надо прочитать в байтах (один регистр — два байта, то есть ставим 40). Подписываем эту строку как-нибудь типа ModbusRawInput. Дальше пользуемся функцией SysMemCpy из библиотеки SysLibMem, чтобы раздербанивать байты этой строки в переменные программы:... и так далее по карте регистров. То есть смысл в том, чтобы взять все регистры одной охапкой с устройства, а уже потом их разобрать.Код:SysMemCpy(ADR(T0_Setpoint), ADR(ModbusRawInput) + 0, SIZEOF(T0_Setpoint));
SysMemCpy(ADR(T1_Setpoint), ADR(ModbusRawInput) + 2, SIZEOF(T1_Setpoint));
Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?
И поЭто же всё равно через библиотеку только решается, правильно?Цитата:
"можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку.
Пересекаться? Каким образом? Делайте столько UMD, сколько пожелаете и для каждого могут быть свои настройки WorkMode.
Это делается без библиотек, на стандартной конфигурации, например http://www.owen.ru/forum/showthread....l=1#post141316Цитата:
И по
Это же всё равно через библиотеку только решается, правильно?
Yegor и petera большое спасибо за подробные и понятные разъяснения.Цитата:
petera
Цитата Сообщение от energvk Посмотреть сообщение
Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?
Пересекаться? Каким образом? Делайте столько UMD, сколько пожелаете и для каждого могут быть свои настройки WorkMode.
И по
Это же всё равно через библиотеку только решается, правильно?
Это делается без библиотек, на стандартной конфигурации, например http://www.owen.ru/forum/showthread....l=1#post141316
Сегодня, 10:19
energvk
Цитата Сообщение от petera Посмотреть сообщение
Фишка с "можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку. А это не наш случай.
Самый простой способ
1. поместить регистры "управляющая команда на ПЧ" и "задание частоты" в отдельные UMD с WorkMode - By value change, т.е. запись в ПЧ будет только при изменении значения регистров в программе.
2. Все остальные input регистры оставить в третьем UMD для которого оставить WorkMode - By poll time
Вложение 18584
Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?
И по
"можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку.
Это же всё равно через библиотеку только решается, правильно?
Сегодня, 10:14
Yegor
Модбас предусматривает групповое чтение регистров, но в Овено-Кодесисе оно реализуется только для чтения в строковый тип.
Например, надо читать сразу 20 смежных регистров, и часто. Добавляем String input module, в параметрах указываем подходящую функцию (Read Holding Registers), номер первого регистра и сколько надо прочитать в байтах (один регистр — два байта, то есть ставим 40). Подписываем эту строку как-нибудь типа ModbusRawInput. Дальше пользуемся функцией SysMemCpy из библиотеки SysLibMem, чтобы раздербанивать байты этой строки в переменные программы:
Код:
SysMemCpy(ADR(T0_Setpoint), ADR(ModbusRawInput) + 0, SIZEOF(T0_Setpoint));
SysMemCpy(ADR(T1_Setpoint), ADR(ModbusRawInput) + 2, SIZEOF(T1_Setpoint));
... и так далее по карте регистров. То есть смысл в том, чтобы взять все регистры одной охапкой с устройства, а уже потом их разобрать.
Всем привет! Учу по книжке) Подскажите пожалуйста куда вписывать это выражение что ниже, чтобы вызвать ресет для функционального блока????? ЗАРАНЕЕ БЛАГОДАРЕН!
Выражение:
Inst.Reset(in:= FALSE);
Erg:= Inst.out;
Ф-ний блок:
FUNCTION_BLOCK Counter
VAR_INPUT
in:BOOL;
END_VAR
VAR_OUTPUT
out:INT;
END_VAR
--------------------------
IF in THEN
out:=out+1;
ELSE
out:=out-1;
END_IF
Не видно связи выражения с представленным функциональным блоком (сокращенно ФБ). Если хотите обнулить переменную out в ФБ Counter, то Вам надо в этом блоке добавить вход reset. И уже на него подавать сигнал для сброса.
FUNCTION_BLOCK Counter
VAR_INPUT
in:BOOL;
reset:bool;
END_VAR
VAR_OUTPUT
out:INT;
END_VAR
--------------------------
IF reset THEN
out:=0;
ELSIF in THEN
out:=out+1;
ELSE
out:=out-1;
END_IF
------
для обнуления вызываем блок
Counter(reset:=true);
В этом случае на выходе блока будет все время 0, пока не вызовем блок с параметром false.
Counter(reset:=false);
Вложение 18591
Короче как зделать так?
если Вы действительно хотите изучать КДС, то повторно отправляю Вас к документации, а если ради прикола, то займитесь чем нибудь другим, например пойдите в дворники.
под тем рисунком, что Вы тут выложиди ясно и понятно написано как вызывается действие - через точку в случае если вызов идет из родителя, а если внутри самого ПОУ то просто как функция без аргументов
Вообще то я никого не оскорблял и не посылал в дворники как вы. Я нормально спросил культурно, а вы снова говорите на языке программирования. Я понимаю у вас там стаж много лет вы думаете что любому человеку доступны ваши слова без наглядного примера, но не все люди одинаковы не все понимают легко, некоторым надо показать тогда они понимают и двигаются дальше. А вы сразу в дворники. Эта стандартная книжка не сильно доступно обьясняет ели на то пошло и начинающий челове к не понимает теряется....
По какой книжке Вы учитесь? Советую для начала найти в инете и почитать книгу
Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования сразу отпадет куча вопросов.
Подскажите как проще всего побайтно записывать двухбайтовую переменную типа WORD. Возможно есть встроенная функция, желательно в FBD?
Получается только побитово, через указание номера бита после точки.
У меня получается не очень эстетично:
Вложение 18593
Оформите отдельным функциональным блоком — будет эстетично.
Подскажите что я не так сделал? показываю пример Вложение 18604 Вложение 18603 почему равенство не работает?
А кнопочку "Старт" нажимали?Вложение 18605
Да нажимал:) вот при запуске как есть Вложение 18607 если можно скинте проектик
Спасибо:) оказалось что нужно было нажать Ctrl+F7Вложение 18608
Здравствуйте, помогите пожалуйста. После загрузки программы в контроллер, не виден ход времени переменных типа тайм, хотя видно что цикл отрабатывается, т.е. понятно потому что происходит кратковременное мигание выходного сигнала согласно программе. так же согласно программе после определенного времени, должен включится светодиод, (дискретный выход) на контроллере плк100. но он не включается
В режиме эмуляции ход времени виден.
Нашел ошибку. Нужно было зафиксировать значение, а не записать. :-)
Здравствуйте, подскажите пожалуйста. В Codesys в параметрах связи создал SERIL MODEM, где указал INIT-ATZ, DIAL- ATDT+номер телефона, Timeout-30c, Port-3, скорость 9600. все остальное оставил по умолчанию. Подключил настроенный модем IRZ к компьютеру, подключаюсь, выдается ошибка связи #0, в чем может быть проблема?
Подскажите какой есть функциональный блок который слаживает несколько значений водно?
ПРИМЕР: Подключены три счетчика расходомера жидкости параллельно, чтоб повысить пропускаемую способность, но нужно с трёх счётчиков суммировать значение водно.
Ответ в вопросе.
Вот первый пример но он не катит из-за того что возможно из двух-трёх счётчиков одновременно будет сигнал Вложение 18729 а вот второй более подходит но тоже тоВложение 18730 подскажите а лучше скриншот
Спасибо. Вот я сделал набросок ну и всё работает Вложение 18763