当前位置: 首页 > 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.gsyq.cn/news/1543869.html

相关文章:

  • 不曾欢岁月见
  • 从Store到Agent:鸿蒙游戏逻辑与渲染分层架构设计
  • 2026发热膜厂家实力深度解析:高温 pi发热膜、石墨烯发热片厂家横向对比,解读350度PI发热膜、PI高温发热膜选型要 - 栗子测评
  • 2026年深圳防水补漏推荐:从“踩坑”到“避雷”,一份基于实地调研的靠谱选择指南 - 资讯速览
  • 线程的状态
  • Jmeter 从零到一:新手避坑安装与环境配置全指南
  • 破解U盘文件复制行业合规痛点:CAS合规交付方法论如何实现稳定交付? - 资讯纵览
  • 2026武汉名表回收选哪家?这家一站式变现,省心无忧 - 奢侈品回收测评
  • APK Installer:Windows电脑安装Android应用的终极解决方案
  • 2026年拆装难易度ai毛绒玩具怎么选:五家优选品牌深度解析 - 科技焦点
  • 从论文想法到投稿策略:一个全自动学术出版智能助手(智能选择期刊助手)
  • 红外热像仪推荐:基于底层物理逻辑与行业标准的选型决策指南
  • 2026自动点焊机品牌综合解析:高性价比国产代表性品牌选购参考 - 资讯纵览
  • 从零封装el-select-tree组件:实现可复用的树形下拉选择器
  • MTK8088单板机串口下载运行测试程序
  • 电源接口EMC设计实战:从浪涌防护到滤波优化
  • 2026年三亚回收飞天茅台靠谱商家推荐:全维度实力解析! - 资讯速览
  • 多层PCB超表面单元设计与频率响应优化
  • 06梦断代码阅读笔记
  • 2026年 切管机/激光切管机/坡口切管机/三卡盘重型切管机厂家推荐榜:高精度与智能切割实力深度解析 - 品牌发掘
  • python_let`s try it
  • G-Helper终极指南:3分钟找回华硕笔记本丢失的GameVisual色彩配置文件
  • Duix-Avatar开源ai数字人,离线视频生成 懒人整合包
  • OpenCore Legacy Patcher终极指南:3步让你的老Mac焕发新生
  • 2026年苏州滤芯厂家盘点:PTFE/PVDF滤芯优质品牌推荐 - 资讯速览
  • 【四】3D Object Model之特征洞察——get_object_model_3d_params()算子详解
  • SQL注入全面总结
  • 2026年6月沭阳渔网厂家推荐:从原材料工艺分辨优质渔网厂 - 资讯速览
  • 2026 年 6 月上海宝珀名表回收避坑指南|本地正规机构实测测评 - 开心测评
  • 2026年真空炉厂家推荐排行榜:广东高温/热处理/立式/连续/管式/微波/石墨/井式真空炉源头品牌精选 - 品牌发掘