А я вот узнал, что NModbus не умеет делать несколько слейвов на одном TCP-канале. Печаль-беда.
А я вот узнал, что NModbus не умеет делать несколько слейвов на одном TCP-канале. Печаль-беда.
Что именно вы подразумеваете? Как такие свойства по-вашему должны выглядеть и работать?
Есть подозрение, что вы что-то не так делаете. Tell, don't ask. По принципу инкапсуляции, вас не должно беспокоить состояние мастера и уж тем более свойства его транспорта. Вы просто должны быть готовы к тому, что мастер выдаст исключение. Отлавливать исключения проще, чем поддерживать чужое состояние (stateful vs stateless).
Здравствуйте!
Я еще не успел написать что-то, что не стыдно выложить на форум
Вы присваиваете имя входу ПЛК (например in1).
Создаете в MODBUS (slave) регистр (например reg0).
В коде ПЛК присваиваете в нужный бит регистра значение своего входа:
reg0.2:=in1; (где .2 номер бита регистра).
Важно помнить, что сигнал может быть коротким и Ваша программа может не успеть его считать - я делал дополнительный регистр в котором контролировал сигнал.
В коде программы считываете значение регистра:
bool[] coilstatus = master.ReadCoils(1 , Bit , 1) [0]
Где Bit – адрес бита (в нашем случае будет 2).
Насчет проблем с первыми 35 запросами не стыкался. Используйте Nmodbus как описано вначале данной темы и проблем быть не должно.
Последний раз редактировалось Kish; 24.05.2019 в 14:29.
Странно, мне казалось достаточно изменить адрес слейва в параметрах и в запросе в коде просто указывать нужный слейв (При обращении к слейву первый параметр в команде вроде-как отвечает за адрес слейва).
Но я на практике не проверял (сейчас нет под рукой ПЛК).
Кстати, а подключатся из кода к эмулятору ПЛК запущенному в Codesys нет возможности?
Последний раз редактировалось greenwod; 30.05.2016 в 19:18.
Если данные передаются по инициативе стороны модема и белый айпишник тут, а не там, то о каком мастере на принимающей стороне может идти речь? Делайте наоборот слейв тогда.