Теория
Modbus — коммуникационный протокол, основанный на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP.
NModbus – большая библиотека на C#, включающая в себя реализацию всех режимов работы с протоколом. Модель реализации классов этой библиотеки позволяет работать с любым Modbus-устройством, но только с одним, поскольку классы библиотеки инкапсулируют в себе порт, не позволяя реализовать синхронизацию между несколькими Modbus-объектами. Данный протокол достаточно популярен при разработке разной периферии для умного дома, а так же интернета вещей.
Итак, для того, чтобы управлять чем-либо, нам необходимо знать, что и куда отправлять. Значит нам нужна карта регистра.
Уточню, что ячейки регистра бывают:
1. Только для чтения
2. Для чтения и записи
3. Только для записи(подтверждение записи допустимо выдавать кодом ошибки)
Самая простая карта, выглядит примерно таким образом:
Так же, там присутствуют разные пояснения, о том например, какое максимальное/минимальное значение может быть передано по адресу и тд.
Практика
Я пользуюсь пробной версией симулятора из 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();
}
}
}
Важно: если вы разрабатываете, что то сложнее, чем пример выше — необходимо следить за тем, чтобы пакеты не терялись. Возникает необходимость подсчета контрольных сумм, об этом можно почитать здесь.
neitri
Или я совсем не в теме, или автор меня запутал. Есть протокол modbus rtu который работает через последовательный порт, и есть modbus tcp который работает через ethernet.
А в конце статьи оказывается nmodbus это не протокол, а библиотека на C# которая реализует протокол modbus.
EGregor_IV
Да, это библиотека, которая поддерживает:
Автор скорее всего автор не силён в протоколе и их вариациях и решал просто поделится информацией, что есть такая библиотека.
Мне вот другое интересно.
Насколько сильно она будет грузить ПК при интенсивном обмене?
Есть ли возможность посылать широковещательные посылки?
Что делать с остальными командами? Их куда больше чем 4.
Как добавить свои команды?
Ну как-то так.
Если судить чисто по мануалу, то да, это такая примитивненькая библиотечка, но она настолько примитивная, что я бы её не рекомендовал даже новичкам.
neco
она умеет широковещалки
она умеет все стандартные катушки/регистры в том числе 3x/4x (input/holding)
она умеет вроде все стандартные команды официального модбаса, по крайне мере я её использую и ни разу не натыкался что она чего-то не поддерживает.
когда я её ставил, боялся что она не умеет чтени- записись нескольких регистров подряд, зря боялся умеет.
по загрузке не могу ответить у меня не сильно интенсивный обмен.