温湿度变送器 MODBUS TCP client C# demo
1.打开visual studio 2012以及以上版本,在NuGet中搜NMobus程序包并安装。
2.在自己新建的C#项目中添加引用NModbus4.dll
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Modbus;
using Modbus.Device;
namespace MXModbus
{
public class ModbusTcpClient
{
private string serverIP = string.Empty;
private int severPort = 0;
private TcpClient tcpClient = null;
private byte slaveID = 0;
private ModbusIpMaster ipMaster = null;
public ModbusTcpClient(string remoteServerIP, int remotePort)
{
serverIP = remoteServerIP;
severPort = remotePort;
tcpClient = new TcpClient();
IAsyncResult asyncResult = tcpClient.BeginConnect(serverIP, severPort, null, null);
asyncResult.AsyncWaitHandle.WaitOne(1000);
if (!asyncResult.IsCompleted)
{
Console.WriteLine("connect timeout in 1000ms");
return;
}
ipMaster = ModbusIpMaster.CreateIp(tcpClient);
//ipMaster.Transport.ReadTimeout = 500;//读取数据超时500ms
//ipMaster.Transport.WriteTimeout = 500;//写入数据超时500ms
//ipMaster.Transport.Retries = 3;//重试次数
//ipMaster.Transport.WaitToRetryMilliseconds = 1000;//重试间隔
}
public void ReadTempAndHum(int deviceID, out float temp, out float humidity)
{
slaveID = (byte)deviceID;
ushort tempStartAddress = 0;
ushort humStartAddress = 1;
ushort[] holding_register1 = ipMaster.ReadHoldingRegisters((byte)slaveID, tempStartAddress, 1);
ushort[] holding_register2 = ipMaster.ReadHoldingRegisters((byte)slaveID, humStartAddress, 1);
temp = processTemp(holding_register1[0]);
humidity = processHumidity(holding_register2[0]);
}
~ModbusTcpClient()
{
ipMaster.Dispose();
tcpClient.Close();
}
private float processTemp(ushort temp)
{
float temp1 = 0;
if (temp >= 0 && temp <= 32767)
{
temp1 = Convert.ToSingle(temp / 10.0);
}
//负数范围0X8000-0XFFFF
else if (temp >= 32768 && temp <= 65535)
{
temp1 = Convert.ToSingle((temp- 65535) / 10.0);
}
return temp1;
}
private float processHumidity(ushort hum)
{
return Convert.ToSingle(hum / 10.0);
}
}
}