#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 вместе с кучей очисток, и это был результат.