Просто о NModbus(RTU)

от автора

Данная статья рассчитана на новичков.

Теория

NModbus — коммуникационный протокол, основанный на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP. Данный протокол достаточно популярен при разработке разной периферии для умного дома, а так же интернета вещей.

Команды

Руководство, с перечнем всех команд можно найти в официальном мануале, там так же есть примеры кода для TCP/IP соединений.

Итак, для того, чтобы управлять чем-либо, нам необходимо знать, что и куда отправлять. Значит нам нужна карта регистра.

Уточню, что ячейки регистра бывают:
1. Только для чтения
2. Для чтения и записи

Самая простая карта, выглядит примерно таким образом:

Скриншот

Так же, там присутствуют разные пояснения, о том например, какое максимальное/минимальное значение может быть передано по адресу и тд.

Практика

Я пользуюсь бесплатным симулятором — Modbus Tools и COM портами от MOXA с RS-485 интерфейсом.

COM порт

После того, как вы создали проект, необходимо интегрировать в него NModbus. Я рекомендую использовать VisualStudio, поскольку сделать это в нем достаточно просто с помощью NuGet, как показано ниже:

Шаг 1-й

Шаг 2-й

В 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *