3

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

我为 C# 设置了 Visual Studio Express 并安装了 .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
        }
    }
}
4

2 回答 2

5

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

于 2011-05-23T14:06:45.050 回答
1

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

这是我用来将我的应用程序安装为服务的行——

"%~dp0windows\tomcat6" //IS//%1 --DisplayName %1 --Description "gmServer for %1" ^ --JavaHome "%JAVA_HOME%" --Classpath "%PR_CLASSPATH%" --LogPrefix gmserver ^ --StartMode jvm --StopMode jvm --Jvm auto --StartPath "%~dp0." ^ --LogPath "%~dp0." --LogLevel 调试 --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。我的公司做了一个 jamod 的分支,以及一堆清理工作,结果就是这样。

于 2013-03-17T01:38:32.963 回答