Unity Modbus Tcp 通讯协议
Posted Art@sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上就是今天要讲的内容,希望能帮到大家,同时呢也不要吝啬手中的赞哦!
以上是关于Unity Modbus Tcp 通讯协议的主要内容,如果未能解决你的问题,请参考以下文章