УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

Вопрос о ModBus


Автор Повідомлення
Повідомлення створено: 04. 10. 2011 [11:58]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83
"almaz" wrote:

В ModBUS регистры двухбайтные. Поэтому считывать-записывать байт надо в составе двухбайтного регистра.


Есть регистр в нем 2 байта с разными числами.
Считываю регистр
R:61472:r:sec:время
а как узнать, что в первом а что во втором?
Повідомлення створено: 04. 10. 2011 [12:03]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3747
"s-s-n" wrote:

Есть регистр в нем 2 байта с разными числами.
Считываю регистр
R:61472:r:sec:время
а как узнать, что в первом а что во втором?

Маской и сдвигом, естественно.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 04. 10. 2011 [12:28]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
low_byte = 255 & sec;
high_byte = 255 & (sec>>8);
Наверно и так можно high_byte = sec>>8;
Главное довести двухбайтный регистр ModBUS до ява-программы )))

Формирование двухбайтного регистра для записи по ModBUS:
sec = (high_byte<<8) & low_byte;
Для надёжности можно обрезать числа до байта:
sec = ((255 & high_byte)<<8) & (255 & low_byte);

[Повідомлення редагувалось 3 раз(ів), останній раз 04.10.2011 в 12:46.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 04. 10. 2011 [14:17]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83
"almaz" wrote:

low_byte = 255 & sec;
high_byte = 255 & (sec>>8);
Наверно и так можно high_byte = sec>>8;
Главное довести двухбайтный регистр ModBUS до ява-программы )))

Формирование двухбайтного регистра для записи по ModBUS:
sec = (high_byte<<8) & low_byte;
Для надёжности можно обрезать числа до байта:
sec = ((255 & high_byte)<<8) & (255 & low_byte);


Спасибо за пример, буду пробовать.
Повідомлення створено: 21. 10. 2011 [10:03]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83
"almaz" wrote:

low_byte = 255 & sec;
high_byte = 255 & (sec>>8);
Наверно и так можно high_byte = sec>>8;
Главное довести двухбайтный регистр ModBUS до ява-программы )))

Формирование двухбайтного регистра для записи по ModBUS:
sec = (high_byte<<8) & low_byte;
Для надёжности можно обрезать числа до байта:
sec = ((255 & high_byte)<<8) & (255 & low_byte);


Чтение пошло, а для записи по ModBUS исправил на
sec = ((255 & high_byte)<<8) | (255 & low_byte);

Есть функции объекта контроллера (SYS.DAQ["Modul"]["Controller"]):
Можно ли пример, как написать, чтобы узнать адрес транспорта или состояние контроллера ModBUS?
Пробовал и квадратных скобках и в круглых и через точку и с приставками "cntr_" , "mod_" и без них
Ни хочет мне ничего показывать.
Повідомлення створено: 21. 10. 2011 [10:17]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
"s-s-n" wrote:
sec = ((255 & high_byte)<<8) | (255 & low_byte);
Конечно надо ИЛИ. Просто написал не отлаживая на скорую руку.
"s-s-n" wrote:
Можно ли пример, как написать, чтобы узнать адрес транспорта или состояние контроллера ModBUS?
http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-10

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 21. 10. 2011 [10:17]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3747
"s-s-n" wrote:

Есть функции объекта контроллера (SYS.DAQ["Modul"]["Controller"]):
Можно ли пример, как написать, чтобы узнать адрес транспорта или состояние контроллера ModBUS?
Пробовал и квадратных скобках и в круглых и через точку и с приставками "cntr_" , "mod_" и без них
Ни хочет мне ничего показывать.

Форум читаем! http://oscada.org/ru/forum/posts//obnaruzhenie_obryva_svjazi//2

Learn, learn and learn better than work, work and work.
Повідомлення створено: 21. 10. 2011 [11:52]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83
"roman" wrote:

"s-s-n" wrote:

Есть функции объекта контроллера (SYS.DAQ["Modul"]["Controller"]):
Можно ли пример, как написать, чтобы узнать адрес транспорта или состояние контроллера ModBUS?
Пробовал и квадратных скобках и в круглых и через точку и с приставками "cntr_" , "mod_" и без них
Ни хочет мне ничего показывать.

Форум читаем! http://oscada.org/ru/forum/posts//obnaruzhenie_obryva_svjazi//2

Спасибо.
Люди по разному излагают свои мысли и потому трудно задать запрос для поиска по форуму.
Мне казалось что все попробовал, видать не все.
text = SYS.DAQ.ModBus.mymodbas.status(); и все хорошо
Повідомлення створено: 21. 10. 2011 [11:58]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83

Именно там я и нашел, что есть функции объекта контроллера (SYS.DAQ["Modul"]["Controller"]):
Но не смог сразу догадаться о правильном формате написания этих функций.
Повідомлення створено: 02. 12. 2011 [11:49]
s-s-n
s-s-n
Зареєстрован(а) с: 16.08.2011
Повідомлення: 83
Добрый день

Возникла проблема при записи данных по модбасу.
Настройки хранятся в одном байте, при записи в первый регистр, во втором 0-й байт обнуляется.
Но если записывать число которое там хранится, то и байт во втором не обнуляется.
Пример
R1 (100, 100)
R2 (100, 50)
если отправлю в первый (50, 100) во втором (0, 50)
если отправлю в первый (100, 100) второй не меняется

Подскажите пожалуйста возможную причину.



11240