Как выполнить пинг счетчика с помощью Modbus

#modbus

#modbus

Вопрос:

Я пытаюсь выполнить пинг счетчика Socomec, используя протокол Modbus, проведя исследование, я нашел NModbus, библиотеку C #. Я никогда раньше не использовал библиотеки или C # (обычно Java), но я должен сразу погрузиться.

Я настроил Visual Studio Express для C # и установил .Net. Затем я скопировал содержимое файла NModbus в папку моего проекта и добавил ссылки на две основные библиотеки DLL. Он не работал с .Net 4, но я перенастроил его на 3.5 (и удалил Microsoft.Ссылка на Csharp) и все, казалось, скомпилировалось.

Я использую этот пример, приведенный ниже, чтобы попытаться подключиться к ведомому устройству. Однако, когда я запускаю это и устанавливаю для переменной startAdress желаемое значение (найдено в документации Socomec), все, что я получаю, это пустое окно консоли.

Короче говоря, использую ли я правильный метод / параметры, неверны ли мои настройки / код? Как мне подключиться к этому счетчику?

Мой код:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using Modbus.Data;
using Modbus.Device;
using Modbus.Utility;


namespace NModbus
{
    class SerialMaster
    {
        static void Main(string[] args)
        {
            ModbusSerialAsciiMasterReadRegisters();
        }

        public static void ModbusSerialAsciiMasterReadRegisters()
        {
            using (SerialPort port = new SerialPort("COM1"))
            {
                // configure serial port
                port.BaudRate = 9600;
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                port.Open();

                // create modbus master
                IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);

                byte slaveId = 1;
                ushort startAddress = 50536;
                ushort numRegisters = 5;

                // read five registers       
                ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);

                for (int i = 0; i < numRegisters; i  )
                    Console.WriteLine("Register {0}={1}", startAddress   i, registers[i]);
                    Console.ReadLine();
            }

            // output:
            // Register 1=0
            // Register 2=0
            // Register 3=0
            // Register 4=0
            // Register 5=0
        }
    }
}
  

Ответ №1:

Почему бы вам не использовать какую-нибудь библиотеку Java MODBUS, если вы уже знакомы с Java? Я не работал со счетчиками Socomec, но в целом для устройств MODBUS вам необходимо знать протокол и адреса, которые вас интересуют. Затем попробуйте прочитать теги с устройства с помощью какого-нибудь инструмента, который, как вы знаете, хорошо работает, например, MODPOLL. Затем, когда вы получите ожидаемые значения, вы переходите к программированию соединения для опроса на любом языке, который вам нравится. В противном случае вы рискуете потерять много времени, задаваясь вопросом, что происходит. Один совет… Из вашего кода я вижу, что вы действуете как MODBUS ASCII serial master. Хотя такие устройства существуют, 95% устройств RS232 / RS485, с которыми я работал, были MODBUS RTU. Прочитайте спецификацию, если вы не знаете разницы.

Комментарии:

1. Изначально я использовал Jamod, но затем мне сказали, что мне нужно использовать вариант C, чтобы мой код мог запускаться как демон службы Windows / Linux. Не могли бы вы сказать мне, возможно ли запустить c # как демон Linux, используя что-то вроде mono? Или лучше всего использовать язык, подобный C ? В качестве альтернативы я нашел это: homepage.mac.com/ruske/ruske/C157541049/E1772200146/index.html Это позволяет запускать java в качестве таких сервисов. Возможно, вы этого не знаете, но если знаете, практично ли это?

2. Что касается первоначального вопроса… Вчера мне удалось подключиться к счетчику, вы были в курсе, мне нужно было использовать RTU и действительные адреса. Проблема сейчас в том, что я не знаю, какие адреса действительны, для чего они нужны. В документации перечислены сотни регистров, но ни один из них не работает с использованием моего кода или MODPOLL, я предполагаю, что другие значения и получаю данные (те же данные в MODPOLL), но те, которые мне нужны, не работают: / Вы когда-нибудь сталкивались с такой проблемой раньше? Мне было интересно, устарели ли документы, и я отправил запрос socomec по электронной почте. Извините, длинные ответы, спасибо за ваши ответы! и MODPOLL, отличный инструмент!

3. Я ничего не знаю об использовании C # или Java для служб Linux, извините. Кстати, когда вы принимаете чей-то ответ, вы должны вознаградить его повышением. Именно так работает этот сайт. 😉

4. Очень важно иметь точный список адресов всех регистров, к которым вам нужен доступ в устройстве MODBUS. Если вы доверяете своему списку адресов, то не сдавайтесь, если восстановленные данные выглядят неправильно. Возможно, ваша интерпретация неверна. Иногда может случиться так, что используется другой порядковый номер (большой / маленький против little / big), или вы считываете значение без знака, когда устройство выдает значение со знаком, или вы предполагаете, что float упакован в регистр, когда это действительно целое число, или несколько регистров объединяются, чтобы получить Int64 или DOUBLE, или STRING или… Вы получаете картину.

5. Это потребует некоторого анализа, когда я дойду до этого момента. Я знаю, что MODBUS использует big-endian (по крайней мере, так сказано в спецификации), и мне, вероятно, придется читать в двух регистрах для одного значения. Моя проблема в том, что я не знаю, как использовать 6-значную адресацию, которой, похоже, являются мои адреса. Мне нужно получить доступ к адресу 50526, но при попытке сделать это я получаю исключение. Библиотека, которую я использую, использует адреса ushort, поэтому я не могу использовать ‘450526’, если это формат. Есть идеи? Возможно, в духе организации я должен задать новый вопрос: P

Ответ №2:

Вы можете запускать Java-приложения как службу Windows. Существует Tomcat Java service starter, который я использую с Java-приложением моей компании. Вы должны создать метод, который будет вызываться для остановки службы, но это всего лишь метод.

Вот строка, которую я использую для установки моего приложения как сервиса —

«%~ dp0windowstomcat6» //IS //%1 —Имя_дисПлея %1 —Описание «gmServer для %1» ^ —JavaHome «%JAVA_HOME%» —Classpath «%PR_CLASSPATH%» —LogPrefix gmserver ^ —jvm StartMode —jvm StopMode —Jvm auto —Начальный путь «% ~ dp0». ^ —Путь к журналу «% ~ dp0.» —Отладка на уровне журнала —StdOutput %1.out —Ошибка StdError %1.err ^ —StartClass greenMonitor.gmServer —StartParams -I#%I #-u #3600 ^ —StopMethod WindowsService —StopParams stop —StopTimeout 10

Символы каретки («^») являются символами продолжения строки в .Файлы BAT. Вы должны быть в состоянии найти значения параметров командной строки Tomcat в документации Tomcat.

А для получения библиотеки Modbus на базе Java с множеством удобных программ, которые вы можете использовать для проверки соединения, ознакомьтесь с j2mod на Sourceforge. Моя компания выполнила форк jamod вместе с кучей очисток, и это был результат.