Автор |
Сообщение |
Сообщение создано: 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
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 надо будет где-то сбрасывать.
|