当前位置: 首页 > wzjs >正文

专业制作彩铃网站企业文化墙创意设计图

专业制作彩铃网站,企业文化墙创意设计图,建设银行纪检监察网站首页,广告投放行业一、前言 Modbus是一种串行通信协议,是工业领域全球最流行的协议之一。 1.1 环境 系统:Win11 工具:Visual Studio 2022 .Net 版本:.Net Framework4.6.0 依赖库:NModbus 3.0.81 1.2 协议类型 Modbus RTU:一…

一、前言

Modbus是一种串行通信协议,是工业领域全球最流行的协议之一。

1.1 环境

系统:Win11
工具:Visual Studio 2022
.Net 版本:.Net Framework4.6.0
依赖库:NModbus 3.0.81

1.2 协议类型

Modbus RTU:一种二进制协议,采用紧凑的数据帧格式,通信效率较高。通常用于串行通信链路,如RS - 485或RS - 232 ,在工业自动化领域应用广泛。

Modbus ASCII:采用ASCII码进行数据传输,数据帧可读性强,但传输效率相对较低,同样基于串行通信。

​Modbus TCP/IP:基于以太网和TCP/IP协议栈,将Modbus协议封装在TCP/IP协议中,适用于通过网络进行远程通信的场合,是目前工业以太网中常用的通信协议之一。

1.3 通信模式

​主从模式:在Modbus网络中,有一个主设备(通常是控制器或上位机)和多个从设备(如传感器、执行器等)。主设备发起通信请求,从设备根据请求进行响应,从设备不能主动向主设备发送数据。

1.4 程序功能

1、连接从站服务。
2、写入数值到指定寄存器
3、定时读取寄存器值
4、定时心跳检测通讯状态。

二、运行界面

在这里插入图片描述

三、代码

public partial class ModbusTCP : Form
{#region 字段// Modbus服务器的IP地址和端口private string ipAddress = "127.0.0.1";// 端口号private int port = 502;// 从站地址private byte slaveId = 1;// 读取保持寄存器的起始地址和数量ushort startAddress = 0;ushort numRegisters = 10;// 写入寄存器的地址和值ushort writeAddress = 0;ushort writeValue = 0;// 连接状态private bool isConnected = false;// 创建TcpClientprivate TcpClient tcpClient = null;// 创建modbusprivate ModbusFactory factory = null;// Modbus主站private IModbusMaster master = null;// 任务定时器Timer taskTimer = null;// 心跳定时器private Timer heartbeatTimer = null;#endregion#region 初始化加载public ModbusTCP(){InitializeComponent();CenterToParent();CenterToScreen();}private void MainForm_Load(object sender, EventArgs e){Initialize();}private void ModbusTCP_FormClosing(object sender, FormClosingEventArgs e){isConnected = false;taskTimer?.Stop();tcpClient?.Close();heartbeatTimer?.Stop();}#endregion/// <summary>/// 初始化/// </summary>public void Initialize(){InitializeControlsState();UpdataControlsState();dataGridView.Columns[0].Width = 100;dataGridView.Columns[1].Width = 100;dataGridView.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;dataGridView.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;dataGridView.RowHeadersVisible = false;//数据表格dataGridView.Rows.Add(new object[] { 0, 0 });dataGridView.Rows.Add(new object[] { 1, 0 });dataGridView.Rows.Add(new object[] { 2, 0 });dataGridView.Rows.Add(new object[] { 3, 0 });dataGridView.Rows.Add(new object[] { 4, 0 });dataGridView.Rows.Add(new object[] { 5, 0 });dataGridView.Rows.Add(new object[] { 6, 0 });dataGridView.Rows.Add(new object[] { 7, 0 });dataGridView.Rows.Add(new object[] { 8, 0 });dataGridView.Rows.Add(new object[] { 9, 0 });//定时读取值taskTimer = new Timer();taskTimer.Interval = 100;taskTimer.Tick += Timer_Tick;// 心跳任务heartbeatTimer = new Timer();heartbeatTimer.Interval = 1000;heartbeatTimer.Tick += HeartbeatTimer_Tick;}private void HeartbeatTimer_Tick(object sender, EventArgs e){try{// 发送心跳请求(这里假设发送一个简单的读取请求作为心跳)ushort[] dummyArray = master.ReadHoldingRegisters(slaveId, 0, 1);// 检查心跳响应是否有效(可以根据返回值来判断)if (dummyArray == null || dummyArray.Length != 1 || dummyArray[0] != 0){UpdataMessage("心跳失败,断开连接...");isConnected = false;taskTimer.Stop();tcpClient.Close();UpdataControlsState();}}catch (Exception ex){UpdataMessage("心跳失败...");isConnected = false;taskTimer.Stop();tcpClient.Close();UpdataControlsState();}}/// <summary>/// 初始化控件状态/// </summary>public void InitializeControlsState(){tbx_SlaveID.Text = slaveId.ToString();tbx_IPAddress.Text = ipAddress;tbx_TargetPort.Text = port.ToString();tbx_StartAddress.Text = startAddress.ToString();tbx_ReadLength.Enabled = false;tbx_ReadLength.Text = numRegisters.ToString();tbx_WriteAddress.Text = writeAddress.ToString();tbx_WriteValue.Text = writeValue.ToString();}private void UpdataControlsState(){if (isConnected){btn_Connect.Text = "断开";btn_WriteData.Enabled = true;tbx_IPAddress.Enabled = false;tbx_TargetPort.Enabled = false;tbx_SlaveID.Enabled = false;tbx_ReadLength.Enabled=false;}else{btn_Connect.Text = "连接";btn_WriteData.Enabled = false;tbx_IPAddress.Enabled = true;tbx_TargetPort.Enabled = true;tbx_SlaveID.Enabled = true;tbx_ReadLength.Enabled = false;}}/// <summary>/// 定时器方法/// </summary>private void Timer_Tick(object sender, EventArgs e){try{if (isConnected){// 读取保持寄存器ushort[] array = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);// 输出读取到的寄存器值for (int i = 0; i < array.Length; i++){dataGridView.Rows[i].Cells[0].Value = (startAddress + i);dataGridView.Rows[i].Cells[1].Value = array[i];}}}catch (Exception ex){UpdataMessage("");}}/// <summary>///  连接/// </summary>private void btn_Connect_Click(object sender, EventArgs e){try{if (!isConnected){tcpClient = new TcpClient(ipAddress, port);factory = new ModbusFactory();master = factory.CreateMaster(tcpClient);taskTimer.Start();heartbeatTimer?.Start();isConnected = true;UpdataControlsState();UpdataMessage("连接成功...");}else{isConnected = false;master = null;taskTimer.Stop();tcpClient.Close();UpdataControlsState();UpdataMessage("断开连接...");heartbeatTimer?.Stop();}}catch (Exception ex){isConnected = false;taskTimer?.Stop();heartbeatTimer?.Stop();tcpClient?.Close();UpdataControlsState();UpdataMessage("连接失败...");UpdataMessage($"{ex.Message}");}}/// <summary>///  写入数据/// </summary>private void btn_WriteData_Click(object sender, EventArgs e){master.WriteSingleRegister(slaveId, writeAddress, writeValue);UpdataMessage($"从站ID:{slaveId},写入数据:地址:{writeAddress} ,值:{writeValue}");}/// <summary>/// 更新操作消息/// </summary>private void UpdataMessage(string message){tbx_Output.BeginInvoke(new Action(() =>{tbx_Output.AppendText($"{DateTime.Now.ToString()}{message}\r\n");}));}#region 文本变更/// <summary>/// 起始地址/// </summary>private void tbx_StartAddress_TextChanged(object sender, EventArgs e){if (ushort.TryParse(tbx_StartAddress.Text, out ushort address)){startAddress = address;}}/// <summary>/// 读取长度/// </summary>private void tbx_ReadLength_TextChanged(object sender, EventArgs e){if (ushort.TryParse(tbx_ReadLength.Text, out ushort length)){numRegisters = length;}}/// <summary>/// 写入地址/// </summary>private void tbx_WriteAddress_TextChanged(object sender, EventArgs e){if (ushort.TryParse(tbx_WriteAddress.Text, out ushort address)){writeAddress = address;}}/// <summary>/// 写入值/// </summary>private void tbx_WriteValue_TextChanged(object sender, EventArgs e){if (ushort.TryParse(tbx_WriteValue.Text, out ushort address)){writeValue = address;}}/// <summary>/// 从站ID/// </summary>private void tbx_SlaveID_TextChanged(object sender, EventArgs e){if (byte.TryParse(tbx_SlaveID.Text, out byte address)){slaveId = address;}}#endregion
}

文章转载自:

http://fvdpOgmu.Lwtfx.cn
http://63qqXKqK.Lwtfx.cn
http://IY5l2eLq.Lwtfx.cn
http://NQcZPZJU.Lwtfx.cn
http://KErdchbc.Lwtfx.cn
http://SCj7XFPs.Lwtfx.cn
http://HTMrjqPq.Lwtfx.cn
http://5MesQiFE.Lwtfx.cn
http://FnmFIqhl.Lwtfx.cn
http://ownA5M0i.Lwtfx.cn
http://uaKBw0mO.Lwtfx.cn
http://6XMOPPW2.Lwtfx.cn
http://NNn5zAEy.Lwtfx.cn
http://YCnFKbqe.Lwtfx.cn
http://teJLFw95.Lwtfx.cn
http://4VmvUCPw.Lwtfx.cn
http://8oTwT7am.Lwtfx.cn
http://q5xn8oWq.Lwtfx.cn
http://kf2Q9zA6.Lwtfx.cn
http://jG11iLkU.Lwtfx.cn
http://izL16Sv0.Lwtfx.cn
http://85XxkSYZ.Lwtfx.cn
http://TGEaSivQ.Lwtfx.cn
http://Nw6YG3AP.Lwtfx.cn
http://OPoypAba.Lwtfx.cn
http://IcIfHOVZ.Lwtfx.cn
http://bGcN8k1N.Lwtfx.cn
http://0pQ0QDsA.Lwtfx.cn
http://JfIPOrSi.Lwtfx.cn
http://4Pp5FFqY.Lwtfx.cn
http://www.dtcms.com/wzjs/660587.html

相关文章:

  • 夜间正能量网站入口免费下载h5用什么网站来做
  • 集团公司做网站烟台做网站谁家好
  • 网站主题切换甜蜜定制app
  • 哪个网站做招聘海报比较好wordpress 获取所有菜单
  • 网站的商桥怎么做门户网站模板下载
  • 58同城类似的网站开发济南优化网络营销
  • 重庆制作网站培训机构西樵网站制作
  • 常州建设局建筑职称网站wordpress 更换数据库
  • 工业皮带怎么做免费的网站企业网站建设人员分析
  • 泉州住房与城乡建设网站网站安全防护措施
  • 代码需求网站网站是自己做还是让别人仿
  • 源码屋整站源码如何更好的建设和维护网站
  • 高密网站制作手机自己制作app软件
  • 网站建设都是用什么软件如何做网站本地服务器
  • 网站建站加盟单页网站的营销
  • 珠宝玉器监测网站建设方案让wordpress的页面有具体的地址
  • 西安seo网站公司找建设项目的网站
  • wordpress修改链接南宁seo怎么做优化团队
  • 绍兴手机网站建设东莞市智通人才市场最新招聘信息
  • 家政月嫂网站源码中国互联网排名前十的公司
  • 赤峰市做网站多少钱企业网站管理系统 免费
  • 网站建设需要关注什么做竞价托管的公司
  • 员工入职 在哪个网站做招工中关村在线官网入口
  • 顺义公司建站多少钱怎样找人做网站
  • 广西网站建设银行中国移动在线营销服务中心
  • 优质高等职业院校建设网站网页设计作业 定做
  • 网站制作的评价指标网上做二建题那个网站好
  • 如何将网站添加到域名SQL如何建网站
  • 网站建设效果wordpress国内服务器慢
  • 免费做网站的网址有哪些网站主机哪买