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

Modbus通信、tcp、udp

页面:

image

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Modbus.Device;
namespace WinUpperCourse
{public partial class WinNModbus4Test : Form{public WinNModbus4Test(){InitializeComponent();}//声明串口SerialPort serialPort = null;TcpClient tcpClient = null;UdpClient udpClient = null;//创建主站对象IModbusSerialMaster modbusSerialMaster = null; //串口IModbusMaster modbusMaster = null;//网口private void WinNModbus4Test_Load(object sender, EventArgs e){//初始化控件值this.cmInfoType.Items.AddRange(new[] { "串口", "TCP", "UDP" });this.cmInfoType.SelectedIndex=0;//初始化串口string[] portItem = SerialPort.GetPortNames();this.cmPort.Items.AddRange(portItem);this.cmPort.SelectedIndex = 0;this.cmBaudRate.Items.Add("9600");this.cmBaudRate.SelectedIndex = 0;Parity[] parityItem = new[] { Parity.None, Parity.Odd, Parity.Even };cmParity.Items.AddRange(parityItem.Cast<object>().ToArray());this.cmParity.SelectedIndex = 0;this.cmDataBits.Items.AddRange(new string[] { "8", "9" });this.cmDataBits.SelectedIndex = 0;StopBits[] stopBitsItem = new[] { StopBits.One, StopBits.None };this.cmStopBits.Items.AddRange(stopBitsItem.Cast<object>().ToArray());this.cmStopBits.SelectedIndex = 0;this.txtIP.Text="127.0.0.1";this.txtPort.Text="302";this.btnStatue.Text="未连接";this.rdRTU.Checked=true;}/// <summary>/// 通信方式选择改变事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmInfoType_SelectedIndexChanged(object sender, EventArgs e){if (this.cmInfoType.Text=="串口"){this.txtIP.Enabled = false;this.txtPort.Enabled = false;this.cmPort.Enabled = true;this.cmPort.Enabled=true;this.cmBaudRate.Enabled = true;this.cmParity.Enabled = true;this.cmDataBits.Enabled = true;this.cmStopBits.Enabled = true;this.cmParity.Enabled = true;}else{this.cmPort.Enabled = false;this.cmPort.Enabled=false;this.cmBaudRate.Enabled = false;this.cmParity.Enabled = false;this.cmDataBits.Enabled = false;this.cmStopBits.Enabled = false;this.cmParity.Enabled = false;this.txtIP.Enabled = true;this.txtPort.Enabled = true;}}/// <summary>/// 打开连接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOpen_Click(object sender, EventArgs e){//如果是串口if (this.cmInfoType.Text=="串口"){// 1. 转换波特率、数据位int baudRate = int.Parse(cmBaudRate.Text);int dataBits = int.Parse(cmDataBits.Text);// 2. 校验位文本转 Parity 枚举  校验位// Enum.TryParse(cmParity.Text, true, out Parity parity);Parity parity = Enum.Parse<Parity>(cmParity.Text);// 3. 停止位文本转 StopBits 枚举 停止位Enum.TryParse(cmStopBits.Text, true, out StopBits stopBits);// 4. 实例化串口serialPort = new SerialPort(cmPort.Text,baudRate,parity,dataBits,stopBits);//打开
                serialPort.Open();if (serialPort!=null&&serialPort.IsOpen){this.Invoke(new Action(() => { this.btnStatue.Text = "串口已连接"; }));//判断是 RTU还是ASCIIif (rdRTU.Checked==true){//创建RTU主站modbusSerialMaster=ModbusSerialMaster.CreateRtu(serialPort);}else{modbusSerialMaster=ModbusSerialMaster.CreateAscii(serialPort);}}}else{//tcpif (this.cmInfoType.Text=="TCP"){tcpClient=new TcpClient(this.txtIP.Text, int.Parse(this.txtPort.Text));this.Invoke(new Action(() => { this.btnStatue.Text = "tcp已连接"; }));modbusMaster=ModbusIpMaster.CreateIp(tcpClient);}else //upd
                {udpClient=new UdpClient(this.txtIP.Text, int.Parse(this.txtPort.Text));this.Invoke(new Action(() => { this.btnStatue.Text = "upd已连接"; }));modbusMaster=ModbusIpMaster.CreateIp(udpClient);}}}/// <summary>/// 断开连接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnClose_Click(object sender, EventArgs e){if (this.cmInfoType.Text=="串口"){serialPort.Close();this.Invoke(new Action(() => { this.btnStatue.Text = "串口连接断开"; }));}else if (this.cmInfoType.Text=="TCP"){tcpClient.Close();this.Invoke(new Action(() =>{this.btnStatue.Text="TCP连接断开";}));}else{udpClient.Close();this.Invoke(new Action(() =>{this.btnStatue.Text="UDP连接断开";}));}}/// <summary>/// 读取数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRead_Click(object sender, EventArgs e){OperationAction(1);}/// <summary>/// 写入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnWrite_Click(object sender, EventArgs e){OperationAction(2);}/// <summary>/// 读写操作/// </summary>/// <param name="type">1:读,2:写</param>public void OperationAction(int type){//从站地址byte slaveId = byte.Parse(this.txtSlaveId.Text);//开始地址ushort startAddres = ushort.Parse(this.txtStartAdders.Text);//写入开始地址ushort writeStartAdder = 0;if(type==2){writeStartAdder= ushort.Parse(this.txtWriteStartAdder.Text);}//读取数量ushort count = ushort.Parse(this.txtReadQty.Text);//功能码byte funtionCode = byte.Parse(this.txtFuntionCode.Text);bool[] bValue = null;ushort[] uValue = null;switch (funtionCode){//写操作 只能是功能码1和3 读写都可以,     2和4是只读case 1://读线一个或多个圈状态if (type==1){if (this.cmInfoType.Text=="串口"){bValue = modbusSerialMaster.ReadCoils(slaveId, startAddres, count);}else  //tcp  udp
                        {bValue = modbusMaster.ReadCoils(slaveId, startAddres, count);}this.lbData.Items.Add(string.Join(",", bValue));}else{//写入线圈//  bValue=  this.txtValue.Text.Split(',').Select(str => str=="1" ? true : false).ToArray();bValue=   this.txtValue.Text.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(str => str.Trim() == "1" ? true : false).ToArray();if (this.cmInfoType.Text=="串口"){//写入多线圈if (bValue.Length>1){modbusSerialMaster.WriteMultipleCoils(slaveId, writeStartAdder, bValue);}else{modbusSerialMaster.WriteSingleCoil(slaveId, writeStartAdder, bValue[0]);}}else  //tcp  udp
                        {//写入多线圈if (bValue.Length>1){modbusMaster.WriteMultipleCoils(slaveId, writeStartAdder, bValue);}else{modbusMaster.WriteSingleCoil(slaveId, writeStartAdder, bValue[0]);}}}break;case 2: //读一个或多个输入线圈if (this.cmInfoType.Text=="串口"){bValue = modbusSerialMaster.ReadInputs(slaveId, startAddres, count);}else  //tcp  udp
                    {bValue = modbusMaster.ReadInputs(slaveId, startAddres, count);}this.lbData.Items.Add(string.Join(",", bValue));break;case 3: //读一个或多个保持寄存器if(type==1){if (this.cmInfoType.Text=="串口"){uValue = modbusSerialMaster.ReadHoldingRegisters(slaveId, startAddres, count);}else  //tcp  udp
                        {uValue = modbusMaster.ReadHoldingRegisters(slaveId, startAddres, count);}this.lbData.Items.Add(string.Join(",", uValue));}else{ushort[] sValue = this.txtValue.Text.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(str => ushort.Parse(str.Trim())).ToArray();if (this.cmInfoType.Text=="串口"){//写入多线圈if (sValue.Length>1){modbusSerialMaster.WriteMultipleRegisters(slaveId, writeStartAdder, sValue);}else{modbusSerialMaster.WriteSingleRegister(slaveId, writeStartAdder, sValue[0]);}}else  //tcp  udp
                        {//写入多线圈if (sValue.Length>1){modbusMaster.WriteMultipleRegisters(slaveId, writeStartAdder, sValue);}else{modbusMaster.WriteSingleRegister(slaveId, writeStartAdder, sValue[0]);}}}break;case 4: //读一个或多个输入寄存器if (this.cmInfoType.Text=="串口"){uValue = modbusSerialMaster.ReadInputRegisters(slaveId, startAddres, count);}else  //tcp  udp
                    {uValue = modbusMaster.ReadInputRegisters(slaveId, startAddres, count);}this.lbData.Items.Add(string.Join(",", uValue));break;}}}
}

 

http://www.jsqmd.com/news/1031977/

相关文章:

  • AI与大模型新闻日报 | 2026-06-17
  • 美国商标购买平台有哪些?2026 官方备案正规靠谱平台实测:资质、标源、过户全维度评测 - 资讯速览
  • 本地跑模型,现在是真可以了
  • AntV Infographic:让AI成为你的信息图设计师
  • 2026自动点焊机选型指南:代表性品牌推荐与选购解析 - 资讯纵览
  • 不曾欢岁月见
  • 全球 AI 大模型批判精神的本质缺失与自我批判机制重构—— 兼论波普尔证伪主义的伪批判本质及其行业危害
  • Python多版本兼容测试自动化:tox配置与CI集成实战
  • 从Store到Agent:鸿蒙游戏逻辑与渲染分层架构设计
  • Gemini 3.1 Pro五大变现场景:结构化输出+多文档比对实战指南
  • 2026发热膜厂家实力深度解析:高温 pi发热膜、石墨烯发热片厂家横向对比,解读350度PI发热膜、PI高温发热膜选型要 - 栗子测评
  • 2026年深圳防水补漏推荐:从“踩坑”到“避雷”,一份基于实地调研的靠谱选择指南 - 资讯速览
  • 2026 早八通勤实测|好用的素颜霜推荐 7 款权威横评 敏肌黄皮抗暗沉首选 - 资讯速览
  • 小程序搭建平台实测调研:2026主流SaaS与开发框架优缺点全梳理 - 资讯纵览
  • 2026年常州冲压件加工厂家TOP10榜单:精密冲压、深拉伸与模具定制实力厂家深度推荐 - 品牌发掘
  • 线程的状态
  • Jmeter 从零到一:新手避坑安装与环境配置全指南
  • 2026清远高考复读学校排名十强榜:哪所复读学校综合实力第一? - IT老炮老刘
  • Easy EDA #实战解析# | 从Type-C到Lightning,一文读懂主流充电接口的PCB封装与引脚奥秘
  • 买商标去哪个网站好?2026 商标交易平台最新实测排名推荐 - 资讯速览
  • Windows轻量部署Oracle Instant Client:从零配置到Navicat成功连接云端Oracle
  • ZigBee Green Power API实战:免维护物联网设备通信开发指南
  • 破解U盘文件复制行业合规痛点:CAS合规交付方法论如何实现稳定交付? - 资讯纵览
  • 2026数分自学项目面试老挂:5个致命盲区及破解方案 - 资讯速览
  • APK Installer:Windows电脑安装Android应用的终极解决方案
  • 挽回前女友机构排行:上海正规服务品牌客观盘点 - 互联网科技品牌测评
  • 五墩社区龙虾店排行榜|住在五墩吃小龙虾,本地人私藏第一名私房酒楼 - 资讯速览
  • 2026武汉名表回收选哪家?这家一站式变现,省心无忧 - 奢侈品回收测评
  • 如何3步快速实现设计到动画的无缝转换:AEUX完整工具指南
  • 2026年拆装难易度ai毛绒玩具怎么选:五家优选品牌深度解析 - 科技焦点