如何使用Modbus ping仪表

时间:2011-05-20 13:58:02

标签: modbus

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

我为自己设置了Visual Studio Express for C#并安装了.Net。我已经将NModbus文件的内容复制到我的项目文件夹中,并添加了对两个主要DLL的引用。它不适用于.Net 4,但我重新定位到3.5(并删除了Microsoft.Csharp引用),似乎编译好了。

我正在使用下面的this sample来尝试连接到从设备。当我运行它,并将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
        }
    }
}

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您可以将Java应用程序作为Windows服务运行。我在公司的Java应用程序中使用了Tomcat Java服务启动程序。您已创建一个将被调用以停止服务的方法,但这只是一种方法。

以下是我用来将我的应用程序安装为服务的行 -

“%~dp0windows \ tomcat6”// IS //%1 - 显示名称%1 - 描述“gmServer for%1”^  --JavaHome“%JAVA_HOME%” - Classpath“%PR_CLASSPATH%” - LogPrefix gmserver ^  --StartMode jvm --StopMode jvm --Jvm auto --StartPath“%~dp0。” ^  --LogPath“%~dp0。” --LogLevel debug --StdOutput%1.out --StdError%1.err ^  --StartClass greenMonitor.gmServer --StartParams -I#%I#-u#3600 ^  --StopMethod windowsService --StopParams stop --StopTimeout 10

插入符(“^”)是.BAT文件中的行连续符。您应该能够使用Tomcat文档找到Tomcat命令行选项的含义。

对于基于Java的Modbus库,可以使用许多方便的程序来测试连接,在Sourceforge上查看j2mod。我的公司做了一个塞子,还有一堆清理,结果就是这样。