Unity Modbus Tcp 通讯协议

unity Modbus Tcp/IP 通讯协议

提示:unity通过Modbus Tcp协议进行工控软件的交互
前段时间自己有个需求需要unity通过Modbus协议去读取数据,然后在网上找了很多博客实现方法很多,但是Modbus依赖的DLL文件再CSDN很多前辈都在收费搞得很是头大,进过几番周折才搞到Nmodbus4.dll这个程序集,为乐方便后来者直接给你们免费挂上,坚决杜绝那种有点东西就乱收费的现象。




废话不多说,直接上连接

一、NModbus4.DLL下载链接

链接:https://pan.baidu.com/s/1sRUmpzfzYlbHERdE8VW-Lg?pwd=zll8
提取码:zll8

二、讲dll导入Unity中

1.引入库 放置Assets下创建Plugins文件夹下

在这里插入图片描述

2.脚本中引用 Modbus.Device;

在这里插入图片描述


实现代码如下:

代码如下(示例):

using Modbus.Device;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Modbus Tcp/IP
/// </summary>
public class Concent_ : MonoBehaviour
{
    public ModbusMaster modbusIpMaster;
    public TcpClient tcpClient;
    IPAddress Address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 
    public int Port = 502;
    public bool Conen = false;
    public bool Reda_White;
    private ushort[] Udata = new ushort[] {0x03};
    private ushort star = 1;
    Thread mythread;
    public bool isconect = false;


    public Button Connect_Bt;
    public Button Read_Bt;
    public InputField Ip_;
    public InputField Port_;
    public Text Sta_;
    public Text Data_;
    // Start is called before the first frame update
    void Start()
    {
        Connect_Bt.onClick.AddListener(() =>
        {
            if (Ip_.textComponent.text=="")
            {
                Debug.Log(Ip_.textComponent.text + "     " + Port_.textComponent.text);
            }
            OpenConnect_(Ip_.textComponent.text, int.Parse(Port_.textComponent.text));
        });
        Read_Bt.onClick.AddListener(()=> {
            Data_.text = null;
            ushort[] AoData = modbusIpMaster.ReadHoldingRegisters(0x00, 0, 0x14);
            //string str = AoData.ToString();
            //Debug.Log(AoData.Length);
            foreach (var item in AoData)
            {
                //Debug.Log();
                Data_.text += "数据:" + item;
            }
        });
    }


    public void OpenConnect_(string ip,int port)
    {
        
        if (Connect(ip, port))
        {
            Debug.Log("连接成功");
            Sta_.text = "连接成功";
            Sta_.color = Color.green;
            Read_Bt.interactable = true;
        }
        else
        {
            Debug.Log("连接失败");
            Sta_.text = "连接失败";
            Sta_.color = Color.red;
        }
    }
    public bool Connect(string ip,int port)
    {
        try
        {
            tcpClient = new TcpClient(ip, port);

            tcpClient.SendTimeout = 1;
            modbusIpMaster = ModbusIpMaster.CreateIp(tcpClient);

            mythread = new Thread(WriteMessageFromClient);

            mythread.Start();
            Conen = true;
            return true;
        }
        catch(Exception ex)
        {
            tcpClient.Close();
            Debug.LogError(ex.Message);
            return false;
        }
    }
    public void WriteMessageFromClient()
    {
        while (Conen)
        {
            try
            {
                if (Reda_White)
                {
                    Write_jiChunQi(star,Udata);
                    Debug.Log("发送成功");
                }
                if (kuse)
                {
                    //READ HOLDING REGISTER
                    ushort[] msg = modbusIpMaster.ReadHoldingRegisters(0x01, 1, 0x01);
                }
            }
            catch
            {
                break;
            }
        }
        tcpClient.Close();
    }
    public void Write_jiChunQi(ushort star, ushort[] data)
    {
        modbusIpMaster.WriteMultipleRegisters(1, star, data);
    }
    private byte GetHex(string msg)
    {
        byte hex = Convert.ToByte(msg);
        return hex;
    }
    public int GetDexx(string msg)
    {
        int res = Convert.ToInt32(msg, 16);
        return res;
    }
    private void OnApplicationQuit()
    {
        tcpClient.Close();
    }
    public bool kuse = false;
    // Update is called once per frame
    void Update()
    {
        //if (Input.GetMouseButtonDown(0))
        //{
        //    modbusIpMaster.WriteMultipleRegisters(0x01, star, Udata);
        //    Debug.Log("发送成功");
        //}
        //if (Input.GetKeyDown(KeyCode.Space))
        //{
        //    ushort[] msg = modbusIpMaster.ReadInputRegisters(0x01, 1, 0x06);
        //    foreach (var item in msg)
        //    {
        //        Debug.Log(item);
        //    }
        //}
        //if (Input.GetKeyDown(KeyCode.W))
        //{
        //    ushort[] AoData = modbusIpMaster.ReadHoldingRegisters(0x00, 0, 0x14);
        //    //string str = AoData.ToString();
        //    //Debug.Log(AoData.Length);
        //    foreach (var item in AoData)
        //    {
        //        Debug.Log("读取到的数据:"+item);
        //    }
        //}
    }
}


后期调试工具Modbus Slave 以及Modbus Poll下载链接:

链接:https://pan.baidu.com/s/1RwLHzXKKxpgPAHm5O0So6Q?pwd=16t1 
提取码:16t1

   

以上就是今天要讲的内容,希望能帮到大家,同时呢也不要吝啬手中的赞哦!

  • 19
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
回答: Unity Tcp协议和Http协议有一些差别。首先,Tcp协议是一种面向连接的协议,而Http协议是一种无连接的协议。这意味着在使用Tcp协议时,需要先建立一个连接,然后才能进行数据传输,而Http协议则不需要建立连接,每次请求都是独立的。其次,Tcp协议提供可靠的字节流服务,确保数据的可靠传输,而Http协议则不提供可靠性,可能会丢失数据。此外,Tcp协议使用重传策略来防止丢包,而Http协议没有这个机制。最后,在连接和关闭方面,Tcp协议使用三次握手建立连接和四次挥手关闭连接,而Http协议没有这个过程。所以,虽然Tcp和Http都是网络协议,但它们在连接方式、可靠性和关闭机制等方面有一些差别。 #### 引用[.reference_title] - *1* *2* [Unity-TCP篇-初识TCP](https://blog.csdn.net/qq_30868065/article/details/124187430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Unity Modbus Tcp 通讯协议](https://blog.csdn.net/cq786/article/details/124769619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值