如何使用Modbus ping仪表

mar*_*ked 3 modbus

我正在尝试使用Modbus协议ping一个Socomec仪表,经过研究,我发现了NModbus,一个C#库.我以前从未使用过库或C#(通常是Java),但我必须直接进入.

我为自己设置了Visual Studio Express for 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

avr*_*vra 5

当您熟悉Java时,为什么不使用某些Java MODBUS库?我没有使用过Socomec仪表,但一般来说,对于MODBUS设备,您需要知道您感兴趣的协议和地址.然后尝试使用一些您知道运行良好的工具(如MODPOLL)从设备读取标签.然后,当您按预期获得可用值时,您可以使用您喜欢的任何语言编写轮询连接.否则,你可能会浪费很多时间来想知道发生了什么.一个提示......从您的代码中我看到您充当了MODBUS ASCII串行主机.虽然存在这样的设备,但我使用的RS232/RS485设备中有95%是MODBUS RTU.如果您不知道差异,请阅读规范.