Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Lm2 и Modbus
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Автоматизация систем > Экспертный клуб EVIKA: вопросы и ответы > Логический контроллер Logic Machine 2
Alferov
Я так понимаю, сюда можно писать?

Есть LM2... есть ОПС на базе Болидовского Ориона. Есть у Болида такой приборчик - С2000ПП. Приборчик этот занимается преобразованием сообщений в протоколе орион в регистры modbus.
Подключил порт rs485 на LM к с2000пп.
Пытаюсь прочитать 16-битный регистр.
Код
if not mb then
  require('luamodbus')
  mb = luamodbus.rtu()
  mb:open('/dev/ttyS2', 19200, 'E', 8, 1, 'H')
  mb:connect()
end
mb:setslave(4)
r1, err = mb:readregisters(46152)
if r1 then
  alert(r1)
else
  alert(err)
end
mb:close()

В ответ на первый запрос получаю значение (корректное), а вот на все последующие запросы - ответ один:
Код
err = "Method called on invalid context"


Вопрос - что делаю не так?
Arrow
Добрый день Александр,
я правильно понимаю что вы запускаете данный скрипт в цикле, и первый проход нормально отрабатывает, а после нет?
Вы в блоке
if not mb then
require('luamodbus')
mb = luamodbus.rtu()
mb:open('/dev/ttyS2', 19200, 'E', 8, 1, 'H')
mb:connect()
end
вы не только открываете порт, но и выделяете память под переменную mb. После прохождения цикла первый раз, вы закрываете соединение
mb:close(). При повторном вызове скрипта, mb уже не равна nil и не заходит в блок открытия соединения, а само соединение уже закрыто.
Для исправления ситуации либо уберите вызов mb:close() и вызывайте его только когда действительно вы заканчиваете работать с этим устройством (например в другом скрипте), либо после mb:close() присвойте mb = nil
пример работы с modbus устройствами вы можете посмотреть у нас на сайте http://lm.evika.ru/?page_id=389
Alferov
Да... в цикле. Убрал закрытие соединения, заработало, спасибо.
Следующий вопрос, если можно...

Нужно вытянуть 14 регистров одним запросом.
Код
r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14 = mb:readregistrers(46264, 14)

Правильно делаю?
Arrow
да правильно,
если нужно будет объединить в массив эти переменные, можете использовать конструкцию
t = {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14}
и обращение к этим данным будут через t[1],t[2],....
для проверки полученных значений можно использовать функцию log(), например log(r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14), и результат вы увидите в закладке log веб-интерфейса LM2.
если получится что вы ошиблись с кол-вом переменных, то лишние переменные будут иметь значение nil
shustrik814
Добрый день!


Есть LM2 и модули INSYTE (диммер, реле, ШИМ-регулятор и модуль входов). Модули работают по Modbus RTU.
1. Реле - имеет два физических входа и один выход

Не могу прочитать адрес устройства, состояние входов\выхода(для последующей визуализации) - -подскажите как?

Я, пока, не особо разбираюсь в скриптах, helpsmilie.gif

Реле переключается по скрипту:

-- объявляем переменную с групповым адресом 2/1/15
value_dimmer = grp.getvalue('2/1/15')

-- создаем объект Modbus RTU
require('luamodbus')
mb = luamodbus.rtu()

-- открываем Modbus соединение с параметрами 38400 baud rate, even parity, 8 data bits, 1 stop bit, half duplex
mb:open('/dev/ttyS2', 38400, 'E', 8, 1, 'H')
mb:connect()

-- устанавливаем ведомый модуль с адресом 15
mb:setslave(15)

-- записываем в регистр модуля значение переменной
mb:writeregisters(1, value_dimmer)

-- закрываем Modbus соединение
mb:close()

во вкладке "объекты" меняю состояние переменной, реле переключается....нужно еще анализировать состояние входов и состояние выхода.... попытки использовать команды coil = mb:readcoils(??), value = mb:readdiscreteinputs(??) не увенчались успехом...

Arrow
Добрый день, у нас на сайте есть пример работы с modbus http://lm.evika.ru/?page_id=389
Если это не поможет, пожалуйста пришлите или скрипты или бекап системы удобным Вам способом (список на http://evika.ru/kontakty/) мы попробуем воспроизвести и найти ошибку.
shustrik814
Разобрался с модулями.... Если кому нужно интегрировать LM2 и INSYTE, пишите...
4ertjaga_88
можете поделиться тем, как вы настраивали с2000 пп)))хочу его использовать в качестве slave,чтоб опрашивать его системой визуализации,но пока не получается...если надо могу скинуть мои настройки...
aek
Цитата(4ertjaga_88 @ 19.10.2015, 14:14) *
можете поделиться тем, как вы настраивали с2000 пп)))хочу его использовать в качестве slave,чтоб опрашивать его системой визуализации,но пока не получается...если надо могу скинуть мои настройки...

добрый день, в чем у вас сложность? не получается считать нужные параметры, или устройство вообще не отвечает?
4ertjaga_88
устройство не отвечает,сдаётся мне я не правильно настраиваю его в uprog,так как в pprog в трансляции событий я группы присвоил и клаве и с2000 пп.
Устройство с2000пп используется в качестве слева,сделал скрины...собственно вопросы по всем пунктам: 1)верно ли выстроена таблица зон,если адреса 2,3,4- это сигналы 20П?
2)что за таблица идентификаторов,прочтя мануал, так и не дошло;сюда надо пароль ,который в пульте с2000 нужно вводить?
3)вкладка ключи верно ли настроена?

aek
Уважаемый 4ertjaga_88, мне стоило в первом посте пояснить. с устройствам Болида работал только с одним (С2000-T).
я инженер компании EVIKA. из Вашего поста я понял что стоит проблема интеграции вашего устройства в контроллер LogicMachine. если возникнут в этом сложности - мы поможем, но по настройке устройства болид подсказать не сможем. думаю стоит обратиться в техническую поддержку компании Болид.
4ertjaga_88
Да,спасибо,уже обратился,правда ответы оттуда поступают раз в день,а то и в два)))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.