Теория
NModbus — коммуникационный протокол, основанный на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP. Данный протокол достаточно популярен при разработке разной периферии для умного дома, а так же интернета вещей.
Итак, для того, чтобы управлять чем-либо, нам необходимо знать, что и куда отправлять. Значит нам нужна карта регистра.
Уточню, что ячейки регистра бывают:
1. Только для чтения
2. Для чтения и записи
Самая простая карта, выглядит примерно таким образом:
Так же, там присутствуют разные пояснения, о том например, какое максимальное/минимальное значение может быть передано по адресу и тд.
Практика
Я пользуюсь бесплатным симулятором — Modbus Tools и COM портами от MOXA с RS-485 интерфейсом.
После того, как вы создали проект, необходимо интегрировать в него NModbus. Я рекомендую использовать VisualStudio, поскольку сделать это в нем достаточно просто с помощью NuGet, как показано ниже:
В ModbusTools нам необходимо задать параметры соединения(для Вас они могут отличатся, для моих COM-портов подходят эти):
Открываются параметры на F3, либо по вкладке «Connection».
Для Master и Slave настройки должны совпадать, за исключением пункта с COM портами.
После настройки можно нажать «OK» и устройства подключатся друг к другу. Либо этого не произойдет и появится надпись о том, что соединение прервано N секунд, либо отсутствует вовсе. В таком случае, проверьте настройки и соединение, убедитесь в том, что драйвера для COM портов установлены верно и работают корректно.
using Modbus.Device; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Modbus { class Program { static void Main(string[] args) { SerialPort serialPort = new SerialPort(); //Create a new SerialPort object. serialPort.PortName = "COM1"; serialPort.BaudRate = 9600; serialPort.DataBits = 8; serialPort.Parity = Parity.None; serialPort.StopBits = StopBits.One; serialPort.Open(); ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort); byte slaveID = 1; ushort startAddress = 0; ushort numOfPoints = 1; ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints); Console.WriteLine(holding_register); Console.ReadKey(); } } }
ссылка на оригинал статьи https://habr.com/ru/post/486346/
Добавить комментарий