您好,欢迎来到平阳县妙观科技有限公司官方网站!主营温湿度记录仪温湿度变送器新款蓝牙版TH20BL火热畅销中!电联18601064199.

温湿度变送器 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);


        }

    }

    

}