PDA

Просмотр полной версии : Проблема опроса контроллером ПЛК110-М02 в режиме Master по протоколу Modbus RTU



Енот
01.04.2019, 09:19
Коллеги,добрый день!!! Подскажите пожалуйста как решить данную проблему: пытаюсь опросить по протоколу Modbus RTU контроллером ПЛК 110-М02 в режиме Master два Slave-устройства с адресами 100 и 101, интерфейс 485-2. При чем в устройство с адресом 100 необходимо еще и записать данные в один регистр. В начале использовала библиотеки для записи и опроса по Modbus RTU. Но данные все время "прыгают". Удалила все библиотеки (думала, что проблема в них), сделала необходимые настройки в Конфигурации ПЛК, пытаюсь считать и записать данные, но проблема не исчезла, данные все равно "прыгают". Прочитав все рекомендации, что нашла на форуме сделала следующее: изменила Max timeout на 250 мс, Polling tme на 100 мс, Framing time на 30 мс, но это не помогло. Физически устройств нет, поэтому к ПЛК подключаюсь с помощью программы Modsim.

Филоненко Владислав
01.04.2019, 09:49
В протоколе Modus мастер не может определить, на какой запрос ему пришёл ответ (только по номеру функции). поэтому если опрашиваь 2 регистра на одном приборе по очереди и прибор тормозит - мастер будет путать данные.
Framing time на 30 мс - Framing time нужен для slave устройств на ПЛК, если ПЛК опрашивает ПК. Во всех остальных случаях рекомендую =0, за исключением мультипротокольных сетей, что экзотика.

melky
01.04.2019, 09:55
Это как это мастер не может определить от кого запрос ? слейв же посылает в ответе свой же адрес ???? Что-то новое о протоколе Modbus еще будет ?

Енот
01.04.2019, 10:04
Владислав, так что делать в данном случае? Я не совсем понимаю. Даже, если убрать Framing time до 0, ничего не изменяется.

melky
01.04.2019, 10:05
ага, слейв такой: меня о чем-то спросили ?, та ну нафик, я уставший :)

Енот
01.04.2019, 10:13
Видимо, пора начать молиться Богам.... Овен не осилит считывание нескольких регистров, как я понимаю....)

smk1635
01.04.2019, 10:16
Минимальный цикл сколько стоит?

Попробуйте увеличить.

Енот
01.04.2019, 11:03
Уважаемая Enot'иха (изменила, Удалила, нашла, сделала), вы б проект свой выложили. Глядишь, и помогутъ.[/QUOTE]
Я почему-то не могу выложить проект... пишет, что недостаточно прав...( не мой день (((((((

melky
01.04.2019, 11:17
Енот возможно сообщений на форуме не хватает. Не сразу можно что-то выкладывать.

Енот
01.04.2019, 11:23
Печаль(((( я уже который день сижу над этим проектом: задача простейшая..... а не работает. С помощью библиотек могу спокойно считать с двух устройств данные, если добавляю библиотеку на запись одного регистра, то начинается свистопляска.... Такое ощущение, что ПЛК не может одновременно считать и записать данные в одно слейв-устройство..... беда(

Енот
01.04.2019, 11:32
библиотеки 2, касаемо modbus: "mb_rd_hold_regs" на считывание регистров и библиотека "mb_wr_sng_reg" на запись параметра. Если я пытаюсь только считать данные с помощью библиотеки "mb_rd_hold_regs", то проблем нет, добавляю библиотеку "mb_wr_sng_reg", начинают "прыгать" данные. Удалила все библиотеки, это не помогло, теперь и при считывание функцией 3 начались проблемы.....

Rask
01.04.2019, 11:40
Видимо, пора начать молиться Богам.... Овен не осилит считывание нескольких регистров, как я понимаю....)

Столько сарказма, может просто у Вас руки кривые?
По теме: начните с простого: новый проект, конфигурация, 1 устройство, 1 регистр запись и т.д
Могет эмулятор некорректно работает, замените.

Енот
01.04.2019, 11:49
Столько сарказма, может просто у Вас руки кривые?
По теме: начните с простого: новый проект, конфигурация, 1 устройство, 1 регистр запись и т.д
Могет эмулятор некорректно работает, замените.

Нет никакого сарказма, прошу прощения, если кого обидела. И проект создавала новый, и устройства физические подключала - не первый проект делаю, просто до этого не было задачи в записи. Считывание работает - проблем нет.
А руки кривые, даже спорить не буду) только вот не у меня одной проблема такая возникает...

Енот
01.04.2019, 11:51
Ну зачем вы так с дамой ? И думаете мо2 по 485 не кривоват ? ну-ну
Совет "начать с простого" - поддерживаю. Только запись - есть ?

И что-то с понятиями не так ("библиотеки 2,"...)

Так я и переделала проект: убрала все библиотеки... настраиваю через конфигуратор ПЛК...
Ладно, всем спасибо... буду просто "методом тыка" делать, как обычно....

Енот
01.04.2019, 11:52
[QUOTE=Валенок;302445]Ну зачем вы так с дамой ? И думаете мо2 по 485 не кривоват ? ну-ну
Совет "начать с простого" - поддерживаю. Только запись - есть ?

только запись через библиотеку работает абсолютно корректно.

Филоненко Владислав
01.04.2019, 12:38
Это как это мастер не может определить от кого запрос ? слейв же посылает в ответе свой же адрес ???? Что-то новое о протоколе Modbus еще будет ?

Прочитайте мой ответ внимательнее, пожалуйста.

Филоненко Владислав
01.04.2019, 12:39
o-о-о !! Адрес, функция, регистр, их кол-во. А самое главное, опрос - последовательный. Слейвы сами вдруг начинают чо-то слать ?


Ваш мастер ?

Любой мастер. Если ответ придёт после истечения таймаута и посылки нового - будет нежданчик

Филоненко Владислав
01.04.2019, 12:41
Владислав, так что делать в данном случае? Я не совсем понимаю. Даже, если убрать Framing time до 0, ничего не изменяется.

в таком случае остаётся 2 варианта:
1. Увеличивать таймаут до пропадания путаницы
2. ввводить логический анализ - т.е. чередовать команды 3 и 4 в посылках. Большая часть slave трактуют 3 и 4 как обращение к одному и тому же значению, но мастер сможет определить, что в ответе неожидаемый номер команды и отбросить его.
Чтобы чередовать - создавайте запросы с разными номерами команд. В конфигурации есть возможность, через библиотеки тем более

Филоненко Владислав
01.04.2019, 12:43
Владислав, так что делать в данном случае? Я не совсем понимаю. Даже, если убрать Framing time до 0, ничего не изменяется.

И самое главное, на форуме есть юмористы-затейники, сегодня 1 апреля, кризис, так сказать. А в темах для флёйма им скучно. Будьте осторожны к исполнению их рекомендаций. Обуют на лету.

Филоненко Владислав
01.04.2019, 14:00
Встречал с таймаутом до 300мс. ТРМ-мы страдали таким. Ряд вариантов МХ.

Филоненко Владислав
01.04.2019, 14:23
"...то зачем ему делать таймаут 250мс ?" (C) Моя

Валенок, без обид, но что-то Вы отклонились от дискуссии куда то не туда.

Енот
01.04.2019, 14:52
в таком случае остаётся 2 варианта:
1. Увеличивать таймаут до пропадания путаницы
2. ввводить логический анализ - т.е. чередовать команды 3 и 4 в посылках. Большая часть slave трактуют 3 и 4 как обращение к одному и тому же значению, но мастер сможет определить, что в ответе неожидаемый номер команды и отбросить его.
Чтобы чередовать - создавайте запросы с разными номерами команд. В конфигурации есть возможность, через библиотеки тем более

Мое слейв-устройство поддерживает только две функции: 3-ю на чтение, 6-ую на запись. Как быть в данной ситуации?((((
Не совсем понимаю, почему, например в ПЛК Сименс, я не чередую запросы, а просто прописываю функцию, которой считываю, 3-ю, начальный адрес и количество регистров, и там нет никаких проблем.... В чем разница ? объясните мне, бестолковой?((((

Филоненко Владислав
01.04.2019, 14:55
С этим же устройством на тех же настройках? Обычно проблем подключить модуль через конфиурацию - 3 щелчка мыши.
Проблемы начинатся с нестандартными slave.

Енот
01.04.2019, 15:09
Ожидаемо. А про "одновременно" не рассказали.
Если проект не крепится, вы пряма сюды код запилите (только выкиньте все не про обмен)

Библиотека одна, функции разные ))) пардон) если использую функцию библиотечную на чтение, то все работает, если в этот же проект добавляю функцию на запись, то начинается "сдвиг данных". так и в конфигураторе не работает даже считывание и запись по одному регистру(регистры,естественно разные, но одно устройство), там разные функции используются 3-я и 6-я.

Енот
01.04.2019, 15:11
С этим же устройством на тех же настройках? Обычно проблем подключить модуль через конфиурацию - 3 щелчка мыши.
Проблемы начинатся с нестандартными slave.

я Сименсом подключаюсь к этому же слейв-устройству (те же настройки), спокойно считываю и записываю данные - проблем нет. Овеном не получается(((

Енот
01.04.2019, 15:16
вот "кусок" программы с функциями библиотечными:
(*Номер последнего запроса-вычисляется только при вхождении в границы действующего количества слэйвов*)
IF SlaveNumber<=KolSlave THEN
StopNumber[PN][SlaveNumber]:=StartNumber[PN][SlaveNumber];
ELSE
StartNumber[PN][SlaveNumber]:=0;
StopNumber[PN][SlaveNumber]:=0;
END_IF

(*Опрос устройства*)
IF Number[PN]>=StartNumber[PN][SlaveNumber] AND Number[PN]<=StopNumber[PN][SlaveNumber] THEN
IF FirstScan=0 THEN
FirstScan:= 1;
END_IF
SN:=Number[PN]-StartNumber[PN][SlaveNumber]+1;

(*Формирование послок*)
FOR i:=1 TO 1 DO
(*МADIO*)
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].DevAddr:=Address;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].FirstAddr:=0;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].Quantity:=3;
END_FOR

(*МADIO*)
MB_RD_HOLD_REGS[PN](
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=MB_SLAVE_SETTING[PN][Number[PN]].DevAddr ,
FirstAddr:=MB_SLAVE_SETTING[PN][Number[PN]].FirstAddr ,
Quantity:=MB_SLAVE_SETTING[PN][Number[PN]].Quantity ,
ComHandle:=PN ,
TimeOut:=t#1000ms ,
Buffer:=Buffer[PN] ,
Complete=>MB_SLAVE_SETTING[PN][Number[PN]].Complete ,
Exception=>MB_SLAVE_SETTING[PN][Number[PN]].Exception ,
ByteCnt=>MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt );
(*Перевод Byte в Word, переход на следующий Number[PN]*)
IF MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt=MB_RD_HOLD_REGS[PN].Quantity*2 THEN
FOR i:=1 TO MB_SLAVE_SETTING[PN][Number[PN]].Quantity DO
ByteToWord(Byte01:=Buffer[PN][(i-1)*2+1] , Byte02:=Buffer[PN][(i-1)*2] , Word01=>Data_MADIO[i] );
END_FOR
END_IF
(***Преобразование в BOOL***)
FOR i:=1 TO 3 DO
WordToBool(
Word01:=Data_MADIO[i],
BoolArray=>Data_MADIO_BOOL_temp);
FOR j:=1 TO 16 DO
Data_MADIO_BOOL[j+(i-1)*16]:=Data_MADIO_BOOL_temp[j];
END_FOR
END_FOR
END_IF
(*запись*)
IF write_modbus_singl.Complete THEN
value[1]:=DataMADIOWrite[1];
END_IF

write_modbus_singl(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=100 ,
RegAddr:=5 ,
ComHandle:=2 ,
TimeOut:=t#100ms ,
Value:= value[1],
Complete=>COMPL ,
Exception=>EXCEP);

(*1 группа выходов*)
DataMADIOWrite[1].0:=0;
DataMADIOWrite[1].1:=0;
DataMADIOWrite[1].2:=0;
DataMADIOWrite[1].3:=0;
DataMADIOWrite[1].4:=0;
DataMADIOWrite[1].5:=0;
DataMADIOWrite[1].6:=0;
DataMADIOWrite[1].7:=0;
DataMADIOWrite[1].8:=MADIO_DO[1];
DataMADIOWrite[1].9:=MADIO_DO[2];
DataMADIOWrite[1].10:=MADIO_DO[3];
DataMADIOWrite[1].11:=MADIO_DO[4];
DataMADIOWrite[1].12:=MADIO_DO[5];
DataMADIOWrite[1].13:=MADIO_DO[6];
DataMADIOWrite[1].14:=MADIO_DO[7];
DataMADIOWrite[1].15:=MADIO_DO[8];

Енот
01.04.2019, 16:42
Сколько портов заюзано и кто на каком ?
Запись ничем не отличается от чтения с точки зрения хождения пакетов.
Порт - туалет. Все кто туда - стоят в одной очереди и ждут пока там - complete

все порты используются, это в проекте с библиотеками, в данной части программы 2-й порт.
Я сейчас создала новый проект, без использования библиотек и других портов, чисто на считывание 1-го регистра и запись одного регистра (пятого). Записывает без проблем, считать не могу, происходит "сдвиг данных". что он там сдвигает, если я считываю один регистр? таймаут опроса 500 мс. я уже не понимаю как настраивать ПЛК 110((((

melky
01.04.2019, 17:18
Очень странный мастер, если за время таймаута не пришел ответ, то нечего его больше ждать, переходим к следующему запросу хоть того же слейва хоть следующего.

Енот
01.04.2019, 17:54
singl функции лучше не использовать, групповые функции вполне себе работают и с одним регистром

я так понимаю singl функция - это как раз 6-я функция записи. если я возьму групповую. то там функция записи уже другая, разве нет? мое слейв-устройство поддерживает только 6-ую функцию для записи...

Енот
01.04.2019, 17:59
Порт - он последовательный. И опрос нужно делать так же. У Вас - блок записи никак не связан с чтением.
Грубый пример :


case step of
0:
читаем(...);
if читаем.complete then
...
step := 1;
end_if

1:
пишем(...);
if пишем.complete then
...
step := 0;
end_if
end_case

PS
А сингл или еще чего - побоку

PS
И чего вообще опрашиваете и чего хотите записывать ?

я использовала функцию "case", но все равно не работало( понимая, что могу что-то не так написать в программе, создала именно пустой проект и пытаюсь считать с регистр №1 данные и записать данные в регистр №5 слейв-устройства с адресом 100 через конфигуратор ПЛК, уже без библиотек. Не получается: только чтение 1-го регистра или только запись одного регистра работают. Складывается такое ощущение, что в один слейв я не могу и считать и записать данные в режиме Master, или я что-то делаю не так(
Слейв устройство: модули ввода-вывода Мадио.

Енот
01.04.2019, 18:04
Порт - он последовательный. И опрос нужно делать так же. У Вас - блок записи никак не связан с чтением.
Грубый пример :


case step of
0:
читаем(...);
if читаем.complete then
...
step := 1;
end_if

1:
пишем(...);
if пишем.complete then
...
step := 0;
end_if
end_case

PS
А сингл или еще чего - побоку

PS
И чего вообще опрашиваете и чего хотите записывать ?

и как тогда формировать эту последовательность, если используешь конфигуратор ПЛК, а не библиотеки? чтоб он сначала записал, а потом считал ? Может чушь спрашиваю, но действительно не понимаю....

Енот
01.04.2019, 18:19
Оно там - само.
Как смогет

не может оно там само ((( только считывание работает, или только запись....

Енот
01.04.2019, 18:35
Может. Должно ))
1.Выкиньте (отключите на хрен) мадио
2.Пустой проект
3.Соединицца, заводской сброс
4.Отключицца
5.Соедините 485-1 и 485-2 (два проводочка по 2...3 см или пара скрепок - есть ?)
6.На 485-2 сделайте слейв. Хотя бы 1 регистр
7.На 485-1 конфигураторного мастера где есть 1 R и 1 W
8.Проект/очистить все
9.В онлайне наблюдаем результат юзая все 3 (три) ячейки
?

Вы думаете я так не делала ?)) Мадио выкинула уже давно... соединяюсь через Modsim
правда через один 485-2....
все равно не работает... реально, готова богам молиться....

Енот
01.04.2019, 19:06
Вы не поняли. Выкиньте вообще все кроме ПЛК. И модсим тоже выкиньте. И по пунктам.
Результаты?

хм... так не пробовала... к ПЛК смогу подключиться только завтра - обязательно попробую...

Енот
01.04.2019, 19:29
А сказала что пробывала.
"фантазер, ты меня называла..."

Хорошо выспаться желаю))

так, скорее всего, работать будет.... потому как сравнительно давно, я подключалась к модулю ввода-вывода Овен: и входы и выходы удавалось и считать,и записать...
но Мадио-то не работает....)))) и, как я понимаю, есть проблемы при подключении ПЛК к Modsim? это странно для меня....

надо действительно переварить это все, и завтра со свежей головой уже подключаться...

Енот
02.04.2019, 14:10
1. Сначала добиться связи аля-ля лупбэк через конфигуратор
2. Потом то же - но библитекой
3. После подцепить реальный модуль и добиться связи юзая возможности библиотек которых просто нет в конфигураторе

Если через либы не удасцца установить связь - возвращайте мадии афторам и пошлите их в....или на.... Но иметь право на посыл можно только после выполнения 3-го пункта

Сегодня прямо с утреца, создала новый проект, с библиотеками, без всякого лишнего "мусора", и вуаля: все работает. Даже не пришлось использовать RS485-1 ПЛК как слейв. Как ни странно работало даже с Modsim))) c Мадио были проблемы при подключении, но они решаемы))))
А я уж было засомневалась в Овене. Прошу прощения у ПЛК и разработчиков ))))
Не пробовала считывать и записывать данные через конфигуратор ПЛК, но там, скорее всего нужно обновить версию прошивки ПЛК.
Огромное спасибо за помощь!!!!!! )))

gom
16.09.2019, 22:49
и вуаля: все работает. Выложили бы ваш пример. для мало опытных может быть полезно