实例介绍
【实例简介】已经验证可以和支持ModbusRTU 的PLC通信
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using HslCommunication; using HslCommunication.ModBus; using System.Threading; using System.Runtime.InteropServices; namespace ModbusRtuAndPLC { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private ModbusRtu busRtuClient = null; private void btnOpenPort_Click(object sender, EventArgs e) { int baudRate; if (!int.TryParse(txtRtuBaudrate.Text, out baudRate)) { MessageBox.Show("波特率输入错误!"); return; } int dataBits; if (!int.TryParse(txtRtuDataBit.Text, out dataBits)) { MessageBox.Show("数据位输入错误!"); return; } int stopBits; if (!int.TryParse(txtRtuStopBit.Text, out stopBits)) { MessageBox.Show("停止位输入错误!"); return; } byte station; if (!byte.TryParse(txtStastion.Text, out station)) { MessageBox.Show("站号输入不正确!"); return; } busRtuClient?.Close(); busRtuClient = new ModbusRtu(station); busRtuClient.AddressStartWithZero = checkBoxAddressStartWithZero.Checked; comboBox2_SelectedIndexChanged(null, new EventArgs()); busRtuClient.IsStringReverse = checkBoxStringReversal.Checked; try { busRtuClient.SerialPortInni(sp => { sp.PortName = cboRTUProtSelect.Text; sp.BaudRate = baudRate; sp.DataBits = dataBits; sp.StopBits = stopBits == 0 ? System.IO.Ports.StopBits.None : (stopBits == 1 ? System.IO.Ports.StopBits.One : System.IO.Ports.StopBits.Two); sp.Parity = cboRtuParity.SelectedIndex == 0 ? System.IO.Ports.Parity.None : (cboRtuParity.SelectedIndex == 1 ? System.IO.Ports.Parity.Odd : System.IO.Ports.Parity.Even); }); busRtuClient.Open(); btnClosePort.Enabled = true; btnOpenPort.Enabled = false; //panelRTU.Enabled = true; Thread threadInput = new Thread(IOMonitorIput); ////设置为后台线程 threadInput.IsBackground = true; System.Threading.Thread.Sleep(200); threadInput.Start(); Thread threadOutput = new Thread(IOMonitorOutput); ////设置为后台线程 threadOutput.IsBackground = true; System.Threading.Thread.Sleep(200); threadOutput.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnClosePort_Click(object sender, EventArgs e) { // 断开连接 busRtuClient.Close(); btnClosePort.Enabled = false; btnOpenPort.Enabled = true; //panelRTU.Enabled = false; } private void checkBoxStringReversal_CheckedChanged(object sender, EventArgs e) { } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { if (busRtuClient != null) { switch (comboBox2.SelectedIndex) { case 0: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.ABCD; break; case 1: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.BADC; break; case 2: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.CDAB; break; case 3: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.DCBA; break; default: break; } } } private void readResultRender<T>(OperateResult<T> result, string address, TextBox textBox) { if (result.IsSuccess) { textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") $"[{address}] {result.Content}{Environment.NewLine}"); } else { MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") $"[{address}] 读取失败{Environment.NewLine}原因:{result.ToMessageShowString()}"); } } private void btnRtu_read_short_Click(object sender, EventArgs e) { // 读取short变量 readResultRender(busRtuClient.ReadInt16(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData); } private void btnRtuReadInput_bool_Click(object sender, EventArgs e) { // 读取bool变量 //txtRtuRegisterAddress_Read.Text = "14"; readResultRender(busRtuClient.ReadCoil(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData); //txtRtuRegisterAddress_Read.Text = "15"; //readResultRender(busRtuClient.ReadCoil(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData); } List<TextBox> list = new List<TextBox>(); TextBox txtInShow = new TextBox(); //输入输出监控 public void IOMonitorIput() { // 读取输入 list.Add(txtInShow0); list.Add(txtInShow1); list.Add(txtInShow2); list.Add(txtInShow3); list.Add(txtInShow4); list.Add(txtInShow5); list.Add(txtInShow6); list.Add(txtInShow7); list.Add(txtInShow8); list.Add(txtInShow9); list.Add(txtInShow10); list.Add(txtInShow11); list.Add(txtInShow12); list.Add(txtInShow13); list.Add(txtInShow14); list.Add(txtInShow15); while (btnOpenPort.Enabled == false) { HslCommunication.OperateResult<bool[]> read = busRtuClient.ReadDiscrete("0", 16); bool[] readInput = read.Content; for (int i = 0; i < list.Count; i ) { list[i].BackColor = (readInput[i] == true ? Color.Lime : Color.Gray); } // 读取操作 //bool coil100 = busRtuClient.ReadCoil("100").Content; // 读取线圈100的通断 //short short100 = busRtuClient.ReadInt16("100").Content; // 读取寄存器100的short值 //ushort ushort100 = busRtuClient.ReadUInt16("100").Content; // 读取寄存器100的ushort值 //int int100 = busRtuClient.ReadInt32("100").Content; // 读取寄存器100-101的int值 //uint uint100 = busRtuClient.ReadUInt32("100").Content; // 读取寄存器100-101的uint值 //float float100 = busRtuClient.ReadFloat("100").Content; // 读取寄存器100-101的float值 //long long100 = busRtuClient.ReadInt64("100").Content; // 读取寄存器100-103的long值 //ulong ulong100 = busRtuClient.ReadUInt64("100").Content; // 读取寄存器100-103的ulong值 //double double100 = busRtuClient.ReadDouble("100").Content; // 读取寄存器100-103的double值 //string str100 = busRtuClient.ReadString("100", 5).Content;// 读取100到104共10个字符的字符串 // 写入操作 //busRtuClient.Write("100", true);// 写入线圈100为通 //busRtuClient.Write("100", (short)12345);// 写入寄存器100为12345 //busRtuClient.Write("100", (ushort)45678);// 写入寄存器100为45678 //busRtuClient.Write("100", 123456789);// 写入寄存器100-101为123456789 //busRtuClient.Write("100", (uint)123456778);// 写入寄存器100-101为123456778 //busRtuClient.Write("100", 123.456);// 写入寄存器100-101为123.456 //busRtuClient.Write("100", 12312312312414L);//写入寄存器100-103为一个大数据 //busRtuClient.Write("100", 12634534534543656UL);// 写入寄存器100-103为一个大数据 //busRtuClient.Write("100", 123.456d);// 写入寄存器100-103为一个双精度的数据 //busRtuClient.Write("100", "K123456789"); } } List<TextBox> listOutPut = new List<TextBox>(); TextBox txtOutShow = new TextBox(); public void IOMonitorOutput() { listOutPut.Add(txtOutShow0); listOutPut.Add(txtOutShow1); listOutPut.Add(txtOutShow2); listOutPut.Add(txtOutShow3); listOutPut.Add(txtOutShow4); listOutPut.Add(txtOutShow5); listOutPut.Add(txtOutShow6); listOutPut.Add(txtOutShow7); listOutPut.Add(txtOutShow8); listOutPut.Add(txtOutShow9); listOutPut.Add(txtOutShow10); listOutPut.Add(txtOutShow11); listOutPut.Add(txtOutShow12); listOutPut.Add(txtOutShow13); listOutPut.Add(txtOutShow14); listOutPut.Add(txtOutShow15); while (btnOpenPort.Enabled == false) { HslCommunication.OperateResult<bool[]> read = busRtuClient.ReadCoil("0", 16); bool[] readOutPut = read.Content; for (int i = 0; i < listOutPut.Count; i ) { //读取输出 listOutPut[i].BackColor = (readOutPut[i] == true ? Color.Lime : Color.Gray); } } } private void timerIOMoitor_Tick() { } private void Form1_Load(object sender, EventArgs e) { //取消夸线程间的检查 Control.CheckForIllegalCrossThreadCalls = false; //串口默认选COM4 cboRTUProtSelect.SelectedIndex = 3; //校验位默认选ODD cboRtuParity.SelectedIndex = 1; //pictureBoxIN0.Image = Image.FromFile("灰色.png"); } private void timerIOMoitor_Tick(object sender, EventArgs e) { } private void btnRtuInputRead_bool_Click(object sender, EventArgs e) { // 离散输入读取 readResultRender(busRtuClient.ReadDiscrete(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData); } private void label9_Click(object sender, EventArgs e) { } #region 单数据写入测试 private void btnWriteOutPut_Click(object sender, EventArgs e) { // bool写入 try { //writeResultRender(busRtuClient.WriteCoil(txtRtuRegisterAddress_Write.Text, bool.Parse(txtRtu_WriteData.Text)), txtRtuRegisterAddress_Write.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnShorWrite_Click(object sender, EventArgs e) { } private void btnUshorWrite_Click(object sender, EventArgs e) { } private void btnIntWrite_Click(object sender, EventArgs e) { } private void btnUintWrite_Click(object sender, EventArgs e) { } private void btnLongWrite_Click(object sender, EventArgs e) { } private void btnDoubleWrite_Click(object sender, EventArgs e) { } private void btnFloatWrite_Click(object sender, EventArgs e) { } private void btnStringWrite_Click(object sender, EventArgs e) { } #endregion #region Write Coil /// <summary> /// 写一个线圈信息,指定是否通断 /// </summary> /// <param name="address">起始地址</param> /// <param name="value">写入值</param> /// <returns>返回写入结果</returns> //public OperateResult WriteCoil(string address, bool value) //{ // // 解析指令 // // OperateResult<byte[]> command = BuildWriteOneCoilCommand(address, value); // //if (!command.IsSuccess) return command; // // 核心交互 // //return CheckModbusTcpResponse(command.Content); //} /// <summary> /// 批量写入线圈信息,指定是否通断 /// </summary> /// <param name="address">起始地址</param> /// <param name="values">写入值</param> /// <returns>返回写入结果</returns> //public OperateResult WriteCoil(string address, bool[] values) //{ // 解析指令 //OperateResult<byte[]> command = BuildWriteCoilCommand(address, values); //if (!command.IsSuccess) return command; // 核心交互 //return CheckModbusTcpResponse(command.Content); //} #endregion } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)