2011-05-20 13 views
3

我正在嘗試用Modbus協議ping一個Socomec儀表,經過研究,我發現了一個C#庫NModbus。我從來沒有使用庫或C#之前(通常是Java),但我必須潛入其中。如何用Modbus進行ping測量

我爲C#安裝了Visual Studio Express,並安裝了.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 
     } 
    } 
} 

回答

5

你爲什麼不使用一些Java MODBUS library當你已經熟悉Java?我沒有使用Socomec儀表,但一般情況下,對於MODBUS設備,您需要知道您感興趣的協議和地址。然後嘗試使用您知道工作正常的一些工具從設備讀取標籤,如MODPOLL。然後,當您按預期獲得可用值時,您可以使用任何您喜歡的語言對輪詢連接進行編程。否則,你會冒很大的時間想知道發生了什麼。 一個提示...從您的代碼中我看到您充當MODBUS ASCII串行主機。雖然存在這樣的設備,但我使用的RS232/RS485設備中有95%是MODBUS RTU。如果你不知道區別,請閱讀規範。

+0

我最初使用Jamod,但後來被告知我需要使用C varient,因此我的代碼可以作爲Windows服務/ Linux守護進程運行。你能告訴我,是否有可能使用類似mono的方式運行c#作爲linux守護進程?還是最好使用C++之類的語言?或者,我已經找到了這個:http://homepage.mac.com/ruske/ruske/C157541049/E1772200146/index。它允許Java作爲這樣的服務運行。你可能不知道,但如果你這樣做,這是否實用? – marked 2011-05-24 09:40:38

+0

關於原始問題...我昨天設法連接到了儀表,你死了,我需要使用RTU和有效地址。現在的問題是,我不知道哪些地址是有效的,它們是什麼。該文檔列出了數百個寄存器,但它們都沒有使用我的代碼或MODPOLL工作,我猜其他值和獲取數據(MODPOLL中的相同數據),但我需要的那些不工作:/你以前遇到過這樣的問題嗎?我想知道這些文檔是否過時,並通過電子郵件發送socomec問。對不起,很長的回覆,謝謝你的回答!和MODPOLL,很棒的工具! – marked 2011-05-24 09:51:32

+0

對於使用C#或Java的Linux服務,我不知道任何事情,對不起。順便說一句,當你接受某人的回答時,你應該用積極的回報來獎勵它。這就是這個網站的工作方式。 ;-) – avra 2011-05-25 00:14:16

1

您可以將Java應用程序作爲Windows服務運行。我的公司的Java應用程序中使用了Tomcat Java服務啓動器。你已經創建了一個將被調用來停止服務的方法,但這只是一種方法。

這是我用來安裝我的應用程序作爲服務行 -

「%〜dp0windows \ tomcat6中」 //即//%1 --DisplayName%1 --description 「gmServer%1」^ --JavaHome「%JAVA_HOME%」 - 類路徑「%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。我的公司做了一個jamod的叉子,以及一堆清理工作,這就是結果。