网口模拟量采集卡可达到10毫秒访问频率,最近项目需要更换了串口的采集卡(100ms访问频率)。

实际上也是标准的Socket通信。

1,程序界面如下:

开发界面:

C# TcpClient访问ModbusTCP模拟量采集卡

运行效果:

C# TcpClient访问ModbusTCP模拟量采集卡

2,添加引用

using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

3,变量定义

//是否连接成功
 private bool m_IsConnectOK = false;
 //发送字串
 private string m_CmdSend;
 //TcpClient连接对象
 private TcpClient m_Client;
 private NetworkStream m_NetStream;
 //数据缓冲
 private byte[] m_SendBuffer = new byte[16];
 private byte[] m_RecvBuffer = new byte[16];
 //定时器:发送
 private System.Threading.Timer m_ThreadSendTimer;
 //启动发送
 private bool m_EnableSend = false;
 //定时器:接收
 private System.Threading.Timer m_ThreadRecvTimer;
 //启动接收
private bool m_EnableRecv = false;

4,窗体加载事件中添加代码

private void FormMain_Load(object sender, EventArgs e)
        {
            m_ThreadSendTimer = new System.Threading.Timer(new TimerCallback(ThreadSend_TimerCallBack), null, 500, 10);
            m_ThreadRecvTimer = new System.Threading.Timer(new TimerCallback(ThreadRecv_TimerCallBack), null, 500, 6);
        }

5,请求连接:

private void buttonTcpCltConn_Click(object sender, EventArgs e)
        {
            
            string serverIP = this.textBoxIPAddress.Text.Trim();
            string serverPort = this.textBoxPort.Text.Trim();

            try
            {
                m_Client = new TcpClient();
                m_Client.Connect(serverIP, int.Parse(serverPort));

                m_IsConnectOK = true;
                m_EnableRecv = false;
                SetMsgShow(serverIP + ":" + serverPort + " TcpClient连接成功.", true);
            }
            catch (Exception ex)
            {
                m_IsConnectOK = false;
                SetMsgShow(serverIP + ":" + serverPort + " TcpClient连接失败:" + ex.Message, true);
            }
        }

6,开始采集

private void buttonTcpCltSend_Click(object sender, EventArgs e)
        {
            try
            {
                this.richTextBoxSend.Clear();
                this.richTextBoxRecv.Clear();

                m_CmdSend = this.textBoxCmd.Text.Trim();
                m_SendBuffer = HexStrTobyte(m_CmdSend);
                //private byte[] m_SendByte = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03 };
                //发送频率更改
                int period = int.Parse(this.textBoxSendInterval.Text.Trim());
                m_ThreadSendTimer.Change(0, period);

                m_EnableSend = true;
                SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":启动定时发送", true);
            }
            catch (Exception ex)
            {
                SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":" + ex.Message, true);
            }
        }

7,发送数据

 private void ThreadSend_TimerCallBack(object state)
        {
            if (m_EnableSend) {
                if (!string.IsNullOrEmpty(m_CmdSend) && m_IsConnectOK)
                {
                    m_NetStream = m_Client.GetStream();
                    m_NetStream.Write(m_SendBuffer, 0, m_SendBuffer.Length);
                    m_NetStream.Flush();

                    m_EnableRecv = true;
                    SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " - " + byteToHexStr(m_SendBuffer), true);
                }
            }
        }

8,接收数据

private void ThreadRecv_TimerCallBack(object state)
        {
            while (m_EnableRecv)
            {
                try
                {
                    m_NetStream = m_Client.GetStream();
                    int recvLen = m_NetStream.Read(m_RecvBuffer, 0, m_RecvBuffer.Length);
                    string recvStr = ByteToHex(recvByte);
                    SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " -- " + recvStr, false);
                }
                catch (Exception ex)
                {
                    SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":" + ex.Message, false);
                }
                
                //带返回值:r.Result;.
                m_EnableRecv = false;
            }
        }

提供完整源代码:https://download.csdn.net/download/mossiy/12094772

开发环境:Vs2017;模拟量输入转以太网modbus tcp数据IO网口采集模块。

相关文章:

  • 2021-11-07
  • 2021-11-03
  • 2022-02-13
  • 2021-10-06
  • 2022-02-22
  • 2021-12-11
猜你喜欢
  • 2022-01-02
  • 2021-08-22
  • 2021-05-25
  • 2021-12-03
  • 2022-01-28
  • 2021-08-13
相关资源
相似解决方案