PDA

Просмотр полной версии : помогите разобраться с universal devise ModBus



GAD
21.07.2009, 10:51
Передо мной стоит задача передать по протоколу Modbus с помощью universal device один раз булевское значение ... вроде бы есть там такой параметр как Working Mode ставлю ему значение by command ... в саму команду записую FF ... помогите разобраться в перечне команд ... потому как вроде бы эта не работает как надо (((
и еще ворос ... если в одном ModBus (Master) я использую несколько universal device ... они не будут конфликтовать?

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

Kirill
21.07.2009, 12:19
Передо мной стоит задача передать по протоколу Modbus с помощью universal device один раз булевское значение ... вроде бы есть там такой параметр как Working Mode ставлю ему значение by command ... в саму команду записую FF ... помогите разобраться в перечне команд ... потому как вроде бы эта не работает как надо (((
и еще ворос ... если в одном ModBus (Master) я использую несколько universal device ... они не будут конфликтовать?

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

Не видя вашего проекта можно сказать только, что команда FF работает как-надо. Если все корректно сделать. Покажите, пожалуйста, проект, тогда можно что-то советовать.
Вы можете использовать несколько Universal modbus device, и даже обращаться с их помощью к разным данным одного и того же слэйва. Здесь никаких перпятствий нет.

GAD
21.07.2009, 13:17
В принципе вот сам проект ... адреса указаны правильно ... есть ли все-таки возможность мониторинга общения ?

Kirill
21.07.2009, 13:42
В принципе вот сам проект ... адреса указаны правильно ... есть ли все-таки возможность мониторинга общения ?

Вы можете через преобразователь интерфейсов подключить линию rs485 к компьютеру. На нем запуститьhyper terminal (и программоку port monitor). И с помощью этого софта посмотреть, что творится в сети.

GAD
21.07.2009, 14:10
Посмотрел сеть .... ничего не передается (((( ... не пойму в чем проблема ((( исходник прилагаю ... у меня такая конфигурация системы ПЛК-100 + СП270 + PSA-04 -- контроллер темзадатчика ... с ним собственно говоря и проблемы ((( он если к нему что-нить приходит отвечает ...

Партизан
22.07.2009, 13:16
Проверьте еще раз адреса регистров.
1) Адреса регистров 40609, 40613 - это не очень похоже на правду
2) Может стоит заменить 8 bit output module на 2 byte? и использовать команду Preset single register?
Это всего лишь мои предположения...

GAD
22.07.2009, 14:18
Я бы был щаслив если так .. но регистры записаны правильно ... неделю до этого долбал производителя контроллера темзодатчика ((( с заменой 8 бит на 2 байта тоже врядли получиться ((( так как неизвесно какие я еще регистры по пути захвачу (( + функция неизвестно реализована ли вообще функция Preset single register ... функция 0х0F точно рабочая ...

Проблема все равно не решается этим ... просто не идет обмен вообще ... проверил с помощью терминала ... если ставишь параметр Working Mode со значением by command не передает ничего ... если ставишь by poll time наблюдается нормальный обмен между контроллерами ... не пойму где набочинил в проге ...

GAD
22.07.2009, 15:57
Обмен пошел ... конечно хорошо когда читают документацию но могли бы и в таргете прописать в коментах universal modbus device не только 0xff to start ... а хотя бы смотри документацию ... кто ж может подумать что старт имеется введу старт опроса переменной ... а последующая отсылка 0xff есть сама передача ...:rolleyes:

ЗЫ : Спасибо всем кто отозвался )

xapymam6ypoji
12.02.2018, 12:05
Приветствую.
Не совсем понял, как пользоваться режимом работы modbus мастера Work mode - by command.
Для записи или считывания регистров слейва мне достаточно записать 0xFF в регистр %QB8.2.0? Как будет это работать, если я каждый цикл ПЛК буду писать это значение?
Спасибо.
35536

Зинько Владислав
19.02.2018, 09:39
Приветствую.
Не совсем понял, как пользоваться режимом работы modbus мастера Work mode - by command.
Для записи или считывания регистров слейва мне достаточно записать 0xFF в регистр %QB8.2.0? Как будет это работать, если я каждый цикл ПЛК буду писать это значение?
Спасибо.
35536

Добрый день.
Для работы UMD по команде необходимо, чтобы значение команды изменялось с 0x00 на 0xFF.
Если все время записывать FF в поле команды, то чтение/запись произойдет только один раз.
Иными словами, чтение/запись происходит по переднему фронту команды.

xapymam6ypoji
01.03.2018, 12:00
Почему то не работает
35887
команда Read Holding Register, контроллер ПЛК110

xapymam6ypoji
01.03.2018, 12:58
Делаю так:
IF q_MbReadCmd=16#00 THEN
q_MbReadCmd:=16#FF;
ELSE
q_MbReadCmd:=16#00;
END_IF;

Делал и в ручном режиме - в Last Addr и Last Err стоит "0"

Мастеренко Иван
01.03.2018, 16:16
Делаю так:
IF q_MbReadCmd=16#00 THEN
q_MbReadCmd:=16#FF;
ELSE
q_MbReadCmd:=16#00;
END_IF;

Делал и в ручном режиме - в Last Addr и Last Err стоит "0"

Всё верно за исключением добавленного подэлемента.
Нужно добавить Register input module State.

xapymam6ypoji
02.03.2018, 11:24
Спасибо. Работает. Единственный момент - в A69_RdCmd нужно записывать 0xFF два раза, как следует из руководства пользователя Овен ПЛК 110 М02. Т.е. для постоянного опроса работает следующая конструкция:
IF A69_RdCmd =16#00 THEN
A69_RdCmd :=16#FF;
ELSE
A69_RdCmd :=16#00;
END_IF;
35896

31nick
28.07.2018, 00:44
Подскажите пожалуйста будет работать следующая конструкция? В UMD WORK MODE стоит BY POLL TIME. В нем добавлен REAL OUTPUT MODULE STATE. Мне нужно, что бы модуль опрашивался постоянно, а вот значение одного регистра записывалось только по нажатию кнопки. В коде нажатия кнопки будет прописано:
IF prob<>etalon_ud8 THEN
tarir1:=etalon_ud8;
command1:=50700;
IF write1=16#00 THEN
write1 :=16#FF;
ELSE
write1 :=16#00;
END_IF;
END_IF;
38176

Мастеренко Иван
30.07.2018, 17:02
Подскажите пожалуйста будет работать следующая конструкция? В UMD WORK MODE стоит BY POLL TIME. В нем добавлен REAL OUTPUT MODULE STATE. Мне нужно, что бы модуль опрашивался постоянно, а вот значение одного регистра записывалось только по нажатию кнопки. В коде нажатия кнопки будет прописано:
IF prob<>etalon_ud8 THEN
tarir1:=etalon_ud8;
command1:=50700;
IF write1=16#00 THEN
write1 :=16#FF;
ELSE
write1 :=16#00;
END_IF;
END_IF;
38176

Нет, такая конструкция работать не будет.
Добавьте 2 UMD:
1 - режим By Poll Time - регистры на чтения,
2 - режим By value Change - регистры на запись.

By value Change - однократно генерирует запрос устройству, когда новое значение не равно предыдущему.

Пример
38188

31nick
30.07.2018, 23:29
Нет, такая конструкция работать не будет.
Добавьте 2 UMD:
1 - режим By Poll Time - регистры на чтения,
2 - режим By value Change - регистры на запись.

By value Change - однократно генерирует запрос устройству, когда новое значение не равно предыдущему.

Пример
38188

Спасибо за ответ. Вариант как предлагаете Вы, реализовал вчера. Но на форуме наткнулся на подобную тему http://www.owen.ru/forum/showthread.php?t=2060 из нее понял, что нужно писать FF и FE не в цикле, а единично только при необходимости старта (FF) и остановки (FE) обмена. И все заработало, как я изначально хотел. 38192
Пример кода:
IF tar1_ud8=1 THEN
IF T_tarir.Q=0 AND T_tarir.ET=T#0S THEN
tarir1:=etalon1_ud8;
cmd_tarir1:=255;
command1:=50700;
T_tarir(IN:=1,PT:=T#5S);
END_IF;
IF T_tarir.Q=0 AND T_tarir.ET=T#5S THEN
cmd_tarir1:=254;
command1:=43948;
END_IF;
IF err_modul1=1 THEN
command1:=0;
T_tarir.IN:=0;
tar1_ud8:=0;
END_IF;
END_IF;