实例介绍
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Timers; using System.IO.Ports; namespace Modbus_Poll_CS { public partial class Form1 : Form { modbus mb = new modbus(); SerialPort sp = new SerialPort(); System.Timers.Timer timer = new System.Timers.Timer(); string dataType; bool isPolling = false; int pollCount; #region GUI Delegate Declarations public delegate void GUIDelegate(string paramString); public delegate void GUIClear(); public delegate void GUIStatus(string paramString); #endregion public Form1() { InitializeComponent(); LoadListboxes(); timer.Elapsed = new ElapsedEventHandler(timer_Elapsed); } #region Delegate Functions public void DoGUIClear() { if (this.InvokeRequired) { GUIClear delegateMethod = new GUIClear(this.DoGUIClear); this.Invoke(delegateMethod); } else this.lstRegisterValues.Items.Clear(); } public void DoGUIStatus(string paramString) { if (this.InvokeRequired) { GUIStatus delegateMethod = new GUIStatus(this.DoGUIStatus); this.Invoke(delegateMethod, new object[] { paramString }); } else this.lblStatus.Text = paramString; } public void DoGUIUpdate(string paramString) { if (this.InvokeRequired) { GUIDelegate delegateMethod = new GUIDelegate(this.DoGUIUpdate); this.Invoke(delegateMethod, new object[] { paramString }); } else this.lstRegisterValues.Items.Add(paramString); } #endregion #region Timer Elapsed Event Handler void timer_Elapsed(object sender, ElapsedEventArgs e) { PollFunction(); } #endregion #region Load Listboxes private void LoadListboxes() { //Three to load - ports, baudrates, datetype. Also set default textbox values: //1) Available Ports: string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { lstPorts.Items.Add(port); } lstPorts.SelectedIndex = 0; //2) Baudrates: string[] baudrates = { "230400", "115200", "57600", "38400", "19200", "9600" }; foreach (string baudrate in baudrates) { lstBaudrate.Items.Add(baudrate); } lstBaudrate.SelectedIndex = 1; //3) Datatype: string[] dataTypes = { "Decimal", "Hexadecimal", "Float", "Reverse" }; foreach (string dataType in dataTypes) { lstDataType.Items.Add(dataType); } lstDataType.SelectedIndex = 0; //Textbox defaults: txtRegisterQty.Text = "20"; txtSampleRate.Text = "1000"; txtSlaveID.Text = "1"; txtStartAddr.Text = "0"; } #endregion #region Start and Stop Procedures private void StartPoll() { pollCount = 0; //Open COM port using provided settings: if (mb.Open(lstPorts.SelectedItem.ToString(), Convert.ToInt32(lstBaudrate.SelectedItem.ToString()), 8, Parity.None, StopBits.One)) { //Disable double starts: btnStart.Enabled = false; dataType = lstDataType.SelectedItem.ToString(); //Set polling flag: isPolling = true; //Start timer using provided values: timer.AutoReset = true; if (txtSampleRate.Text != "") timer.Interval = Convert.ToDouble(txtSampleRate.Text); else timer.Interval = 1000; timer.Start(); } lblStatus.Text = mb.modbusStatus; } private void StopPoll() { //Stop timer and close COM port: isPolling = false; timer.Stop(); mb.Close(); btnStart.Enabled = true; lblStatus.Text = mb.modbusStatus; } private void btnStart_Click(object sender, EventArgs e) { StartPoll(); } private void btnStop_Click(object sender, EventArgs e) { StopPoll(); } #endregion #region Poll Function private void PollFunction() { //Update GUI: DoGUIClear(); pollCount ; DoGUIStatus("Poll count: " pollCount.ToString()); //Create array to accept read values: short[] values = new short[Convert.ToInt32(txtRegisterQty.Text)]; ushort pollStart; ushort pollLength; if (txtStartAddr.Text != "") pollStart = Convert.ToUInt16(txtStartAddr.Text); else pollStart = 0; if (txtRegisterQty.Text != "") pollLength = Convert.ToUInt16(txtRegisterQty.Text); else pollLength = 20; //Read registers and display data in desired format: try { while (!mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values)) ; } catch(Exception err) { DoGUIStatus("Error in modbus read: " err.Message); } string itemString; switch (dataType) { case "Decimal": for (int i = 0; i < pollLength; i ) { itemString = "[" Convert.ToString(pollStart i 40001) "] , MB[" Convert.ToString(pollStart i) "] = " values[i].ToString(); DoGUIUpdate(itemString); } break; case "Hexadecimal": for (int i = 0; i < pollLength; i ) { itemString = "[" Convert.ToString(pollStart i 40001) "] , MB[" Convert.ToString(pollStart i) "] = " values[i].ToString("X"); DoGUIUpdate(itemString); } break; case "Float": for (int i = 0; i < (pollLength / 2); i ) { int intValue = (int)values[2 * i]; intValue <<= 16; intValue = (int)values[2 * i 1]; itemString = "[" Convert.ToString(pollStart 2 * i 40001) "] , MB[" Convert.ToString(pollStart 2 * i) "] = " (BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0)).ToString(); DoGUIUpdate(itemString); } break; case "Reverse": for (int i = 0; i < (pollLength / 2); i ) { int intValue = (int)values[2 * i 1]; intValue <<= 16; intValue = (int)values[2 * i]; itemString = "[" Convert.ToString(pollStart 2 * i 40001) "] , MB[" Convert.ToString(pollStart 2 * i) "] = " (BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0)).ToString(); DoGUIUpdate(itemString); } break; } } #endregion #region Write Function private void WriteFunction() { //StopPoll(); if (txtWriteRegister.Text != "" && txtWriteValue.Text != "" && txtSlaveID.Text != "") { byte address = Convert.ToByte(txtSlaveID.Text); ushort start = Convert.ToUInt16(txtWriteRegister.Text); short[] value = new short[1]; value[0] = Convert.ToInt16(txtWriteValue.Text); try { while (!mb.SendFc16(address, start, (ushort)1, value)) ; } catch (Exception err) { DoGUIStatus("Error in write function: " err.Message); } DoGUIStatus(mb.modbusStatus); } else DoGUIStatus("Enter all fields before attempting a write"); //StartPoll(); } private void btnWrite_Click(object sender, EventArgs e) { WriteFunction(); } #endregion #region Data Type Event Handler private void lstDataType_SelectedIndexChanged(object sender, EventArgs e) { //restart the data poll if datatype is changed during the process: if (isPolling) { StopPoll(); dataType = lstDataType.SelectedItem.ToString(); StartPoll(); } } #endregion } }
标签: Modbus TCP/IP C#
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论