PDA

Просмотр полной версии : Как ускорить процесс опроса для мастера ModBus



AWA1971
10.10.2010, 13:46
Добрый день, господа форум! Вопрос в следующем: возможно ли ускорить процесс опроса мастером своих слэйвов путем исключения из списка опрашиваемых отдельные (к примеру - неработающие в настоящий момент) приборы.
К примеру: имеется 4 слэйва. Работают из них - 2. Чтобы не тратить время на опрос остальных (неработающих) делаю следующее:
1. Если модуль выходной (Register output module), то есть мастер передает данные слэйву, параметр "Work Mode" я назначаю "By value change". При этом передача начинается только после изменения переменных в мастере.
2. Если модуль входной (Register input module), то есть мастер принимает данные от слэйва, то...вот тут то я и завис.
РЭ читал, примеры смотрел, по форуму лазал, инет исследовал - ничего конкретного (или что то пропустил). Должны же быть для данного случая какие то варианты? Наведите на умную мысль, господа, или примером поделитесь.
Все-таки: как сделать так, что бы мастер ПРИНИМАЛ данные от слэйва ТОЛЬКО ТОГДА, когда он (слэйв) в работе или по какой-то определенной команде (условию)?

Малышев Олег
10.10.2010, 19:28
Ищите режим мастера by command. Все-таки: как сделать так, что бы мастер ПРИНИМАЛ данные от слэйва ТОЛЬКО ТОГДА, когда он (слэйв) в работе или по какой-то определенной команде (условию)
Мастер инициирует процесс обмена путем посылки команды. слейв отвечает на запрос.

AWA1971
11.10.2010, 10:03
Спасибо за ответ. Я читал в РЭ про этот вариант, но там действие этого режима описано ТАК, что, честно говоря, я мало что понял.

Мастер инициирует процесс обмена путем посылки команды. слейв отвечает на запрос.
Получается следующее: если я назначаю параметру "Work Mode" модуля "Register input module" режим "by command", то он с периодичностью, равной значению "Polling Time ms" сам посылает некую команду слэйву. И, как только он получит от него определенный ответ, начинает опрос переменных (принимает значения). Я правильно Вас понял?

Малышев Олег
11.10.2010, 12:34
Нет там написано то что написано. Т.е. Вы сами, без учета всяких polling by time определяете когда начать опрос. Т.е. опрос начинается в момент посылки в поле комманды значения FF

AWA1971
11.10.2010, 14:22
сделал попытку перечитать рэ. наваял следующее: (см.вложение). при симуляции подачи команды для опроса с самого мастера вроде все получается. но можно ли подавать команду на начало опроса со слэйва? что то типа "плк появился в сети". "живых" контроллеров у меня под рукой сейчас нет, поэтому хотелось бы подготовиться теоретически, прежде чем мучить приборы.
итак: на слэйве добавляю три 8-ми битовых модуля переменных (в реальности их будет на порядок больше). при этом мастер опрашивает только 16-ую (var2.0), которая переходит в состояние True сразу после загрузки плк-слэйв. после чего мастер начинает опрашивать все переменные этого слэйва.
такой фокус возможен или команду на начало опроса предписано давать только самому мастеру?

Andy
11.10.2010, 17:39
Нет там написано то что написано. Т.е. Вы сами, без учета всяких polling by time определяете когда начать опрос. Т.е. опрос начинается в момент посылки в поле комманды значения FF

А останавливается? Что замечено: при записи 254 обмен идет около 1с еще; если вешать пару протоколов на один порт - это грустно. Ибо не знаешь, в какой момент начинать обмен по новому протоколу. С доп. библиотеками-то понятно...

Малышев Олег
12.10.2010, 11:57
данная ситуация возникает когда количество запросов превышает пропускную способность шины - иначе говоря пока очередь запросов не пуста - мастер будет запрашивать. шина перегружена увеличьте интервал между запросами.

AWA1971
12.10.2010, 14:58
Постараюсь по-другому сформулировать вопрос.
Можно ли сделать так, чтобы слэйв САМ дал разрешение мастеру на свой опрос (подача питания, состояние переменной и т.д.). Может ли мастер понять непосредственно ОТ СЛЭЙВА, что его уже пора опрашивать, т.е. режим "Command by" модуля работал бы по команде ИЗ СЛЭЙВА?
Если "ДА", то как это реализовать. Если "НЕТ", то подскажите: как в коде изменить значение параметра "Polling Time" (примеров не нашел). Как вариант, хочу сделать так, чтобы период опроса в 1000ms (при отключенном слэйве) менялся при подаче на него питания (изменении переменной на TRUE) на 10 ms?

Филоненко Владислав
12.10.2010, 16:05
Нельзя, это не соответствует концепции мастер-славе.
Polling Time нехакерскими методами поменять нельзя.
P.S. Как и описано в документации, при пропадании связи с устройством его опрос постепенно замедляется до 20 раз.
При восстановлении связи темп опроса восстанавливается.

AWA1971
12.10.2010, 16:24
не порадовали, владислав, но за конкретный ответ - спасибо.

Логвиненко Андрей
12.10.2010, 16:57
Постараюсь по-другому сформулировать вопрос...
хочу сделать так, чтобы период опроса в 1000ms (при отключенном слэйве) менялся при подаче на него питания (изменении переменной на TRUE) на 10 ms?
By command вам в руки, и смотрим last address & last error. Если при опросе устройства master возвращает ошибку, то период посылок в командный канал устанавливаем большим, при появлении ответов устройства начинаем опрашивать быстрее.

AWA1971
13.10.2010, 08:34
Это что то типа (как шаблон):
IF Last address=1 AND Last error=0
THEN Command:=16#FF;
ELSE Command:=16#FE;
END_IF
Если не так, то можно небольшой пример по изменению времени опроса?

Логвиненко Андрей
13.10.2010, 10:50
Для одного устройства будет примерно так:

pollTime: TIME:=t#10ms;
del: TON;
DevAddress: WORD;
(* Объявляем в конфигурации *)
DevStart:BYTE;
LastAddress: DWORD;
LastError: WORD;


del( in:=DevStart=0 , pt:=pollTime);(* Новая посылка после обнуления командного канала *)
IF del.q THEN
del(in:=FALSE);
DevStart:=255;
END_IF
IF LastAddress=DevAddress THEN
IF LastError=0 THEN pollTime:=t#10ms;
ELSE pollTime:=t#1s; END_IF
END_IF

AWA1971
13.10.2010, 11:06
спасибо, андрей, за пример. придут плк, соберу всю схему - буду пробывать.

AWA1971
15.10.2010, 01:58
Вот, сподобился на следующий шедевр. Вроде пока работает...Может кому пригодится, а, может, кто и поизящней нарисует - так скиньте, я на "спасибо" не поскуплюсь 8).
Суть: несколько слэйвов (для примера - два). Мастером опрашивается только тот(те), который(е) "в работе", т.е. подключены и связь с ними установлена.
С остальными раз в секунду проверяется "контакт".

(*Конфигурация*)
LastAddress: DWORD;
LastError: WORD;
Command1:BYTE; (*1-ый девайс, Address1, Work mode:By command*)
Command2:BYTE; (*2-ой девайс, Address2, Work mode:By command*)

(*POU*)
VAR
LastError1, LastError2: WORD;
Timer1, Timer2:TON;
Pause:TIME:=t#1s;
END_VAR

CASE LastAddress OF
1: LastError1:=LastError;
2: LastError2:=LastError;
END_CASE

IF LastError1=0 THEN Command1:=255;
ELSIF LasrError1<>0 THEN Timer1(IN:=Command1=0,PT:=Pause);
IF Timer1.Q THEN Timer1(IN:=FALSE); Command1:=255; END_IF
IF LastAddress=1 THEN
IF LastError=0 THEN LastError1:=0; END_IF
END_IF
ELSE Command1:=254;
END_IF

IF LastError2=0 THEN Command2:=255;
ELSIF LasrError2<>0 THEN Timer2(IN:=Command2=0,PT:=Pause);
IF Timer2.Q THEN Timer2(IN:=FALSE); Command2:=255; END_IF
IF LastAddress=2 THEN
IF LastError=0 THEN LastError2:=0; END_IF
END_IF
ELSE Command2:=254;
END_IF

P.S. Даже в 2 ночи не проходит ощущение, что тут лишнего понагорожено...Но - работает же.