УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Вопрос по работе протокола MODBUS


Автор Сообщение
Сообщение создано: 02. 02. 2016 [12:18]
ANDMAN
Андрей Баковкин
Создатель темы
Зарегистрирован(а) с: 22.10.2015
Сообщения: 17
Приходится работать с таким "замечательным" контроллером как ОВЕН. :bang:

Он по modbus tcp умеет работать только с 4 и 6 функцией, что не совсем логично, но проблема не в этом:

Я хочу передать команды управления краном в контроллер, делаю такой перечень атрибутов:

R_b0:0:w:YA1_open_mnemo :1YA Открыть кран с мнемосхемы
R_b1:0:w:YA1_close_mnemo:1YA Закрыть кран с мнемосхемы

Но телеграмм в порту с 6й функцией не вижу.
Оскада позволяет записывать таким образом регистры?

PS: понимаю что регистры можно записывать только целиком, для чего нужно знать состояние остальных 15и бит в этом регистре, вроде не совсем корректно, но а почему бы нет?

[Сообщение редактировалось 1 раз(а), в последний раз 02.02.2016 в 12:22.]
Сообщение создано: 02. 02. 2016 [12:54]
fido_max
Maxim Kochetkov
Contributor
Зарегистрирован(а) с: 28.10.2010
Сообщения: 129
"ANDMAN" wrote:


Но телеграмм в порту с 6й функцией не вижу.
Оскада позволяет записывать таким образом регистры?

PS: понимаю что регистры можно записывать только целиком, для чего нужно знать состояние остальных 15и бит в этом регистре, вроде не совсем корректно, но а почему бы нет?


Чтобы что-то записалось в ModBus регистры в устройство, сначала надо записать в соответствующий атрибут, привязанный к регистру. Чтобы корректно изменить один бит в регистре нужно знать значение регистра, чтобы не испортить остальные биты. У вас регистр обозначен только для записи, следовательно он не читается и значение его не известно, следовательно изменить его корректно нельзя. Поэтому посылка и не формируется.

попробуйте:

R_b0:0:rw:YA1_open_mnemo :1YA Открыть кран с мнемосхемы
R_b1:0:rw:YA1_close_mnemo:1YA Закрыть кран с мнемосхемы

А вообще лучше для разных команд отводить отдельные регистры.
Сообщение создано: 02. 02. 2016 [12:57]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"ANDMAN" wrote:

Он по modbus tcp умеет работать только с 4 и 6 функцией, что не совсем логично, но проблема не в этом:

Нормальные функции, если стандартные.

"ANDMAN" wrote:

R_b0:0:w:YA1_open_mnemo :1YA Открыть кран с мнемосхемы
R_b1:0:w:YA1_close_mnemo:1YA Закрыть кран с мнемосхемы

Но телеграмм в порту с 6й функцией не вижу.

А я вижу:
Запрос -> 6D 41 00 00 00 06 01 06 00 03 00 0A
Ответ -> 6D 41 00 00 00 06 01 06 00 03 00 0A

"ANDMAN" wrote:

Оскада позволяет записывать таким образом регистры?

Да, позволяет, раз в документации суффикс расширения "_b" присутствует.

Learn, learn and learn better than work, work and work.
Сообщение создано: 02. 02. 2016 [13:08]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"fido_max" wrote:

Чтобы что-то записалось в ModBus регистры в устройство, сначала надо записать в соответствующий атрибут, привязанный к регистру. Чтобы корректно изменить один бит в регистре нужно знать значение регистра, чтобы не испортить остальные биты. У вас регистр обозначен только для записи, следовательно он не читается и значение его не известно, следовательно изменить его корректно нельзя. Поэтому посылка и не формируется.

Да, для записи бита регистра его нужно явно или неявно причитать. Явно — установить "rw", неявно — если попадёт в смежную область читаемых фрагментов регистров (и включено объединение фрагментов).

Learn, learn and learn better than work, work and work.
Сообщение создано: 02. 02. 2016 [13:25]
ANDMAN
Андрей Баковкин
Создатель темы
Зарегистрирован(а) с: 22.10.2015
Сообщения: 17
"roman" wrote:

"ANDMAN" wrote:

Он по modbus tcp умеет работать только с 4 и 6 функцией, что не совсем логично, но проблема не в этом:

Нормальные функции, если стандартные.




Дело в том что, регистры для 4й функции и 6й, это разные регистры в контроллере ОВЕН, из за чего нельзя одновременно прочитать и записать в один и тот же регистр, приходится костыли придумывать, так как нет 3й функции, чтобы прочитать то, что записал 6й.
Сообщение создано: 02. 02. 2016 [13:32]
ANDMAN
Андрей Баковкин
Создатель темы
Зарегистрирован(а) с: 22.10.2015
Сообщения: 17
По сути, мне нужно записывать команды непосредственно по нажатию кнопки на мнемосхеме, явно прочитать и формировать фрагменты регистров в моём случае не позволяет контроллер, из за вышеопиисанных нюансов, а неявно, количество команд у меня не кратно 16и.
Вот думаю как лучше извернуться попроще.

[Сообщение редактировалось 2 раз(а), в последний раз 02.02.2016 в 13:35.]
Сообщение создано: 02. 02. 2016 [13:53]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"ANDMAN" wrote:

По сути, мне нужно записывать команды непосредственно по нажатию кнопки на мнемосхеме, явно прочитать и формировать фрагменты регистров в моём случае не позволяет контроллер, из за вышеопиисанных нюансов, а неявно, количество команд у меня не кратно 16и.
Вот думаю как лучше извернуться попроще.

Шаблон параметра написать, где читать RI и записвать R по нужному алгоритму.

Learn, learn and learn better than work, work and work.
Сообщение создано: 02. 02. 2016 [14:15]
fido_max
Maxim Kochetkov
Contributor
Зарегистрирован(а) с: 28.10.2010
Сообщения: 129
"ANDMAN" wrote:

По сути, мне нужно записывать команды непосредственно по нажатию кнопки на мнемосхеме, явно прочитать и формировать фрагменты регистров в моём случае не позволяет контроллер, из за вышеопиисанных нюансов, а неявно, количество команд у меня не кратно 16и.
Вот думаю как лучше извернуться попроще.


Написать МодБас шаблон, в котором как атрибуты будут экспортироваться команды (открыть, закрыть, включить, выключить и т.д.), в шаблоне они анализируются и в регистр пишется код команды: 01 - открыть, 02 - закрыть, 04 - включить, 08 - выключить и т.д. после анализа атрибут сбрасывается в false

JAVASCRIPT
if (doOpen) {
  cmd = 1;
  doOpen = false;
}
if (doClose) {
  cmd = 2;
  doClose = false;
}
if (doOn) {
  cmd = 4;
  doOn = false;
}
if (doOff){
  cmd = 8;
  doOff = false;
}

cmd привязываем к регистру ModBus, а do - логические атрибуты для команд.
Единственная проблема тут - не пройдет одна и та же команда два раза подряд, т.к. cmd уже будет содержать значение, а для фактической записи должно быть изменение значения. cmd надо будет где-то сбрасывать.



10074