Это не нормально, но это ожидаемо в случае со стандартным опрашивателем. Подробнее — экспортируйте конфигурацию и выкладывайте её сюда.
Вид для печати
Как вариант проверить через библиотеку можно? Экспорт конфигурации в приложении
Вложение 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