我正在嘗試用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
}
}
}
我最初使用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
關於原始問題...我昨天設法連接到了儀表,你死了,我需要使用RTU和有效地址。現在的問題是,我不知道哪些地址是有效的,它們是什麼。該文檔列出了數百個寄存器,但它們都沒有使用我的代碼或MODPOLL工作,我猜其他值和獲取數據(MODPOLL中的相同數據),但我需要的那些不工作:/你以前遇到過這樣的問題嗎?我想知道這些文檔是否過時,並通過電子郵件發送socomec問。對不起,很長的回覆,謝謝你的回答!和MODPOLL,很棒的工具! – marked 2011-05-24 09:51:32
對於使用C#或Java的Linux服務,我不知道任何事情,對不起。順便說一句,當你接受某人的回答時,你應該用積極的回報來獎勵它。這就是這個網站的工作方式。 ;-) – avra 2011-05-25 00:14:16