在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#与PLC进行ModbusRTU通信

C#与PLC进行ModbusRTU通信

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:1.92M
  • 下载次数:305
  • 浏览次数:3934
  • 发布时间:2019-11-21
  • 实例类别:C#语言基础
  • 发 布 人:597855668
  • 文件格式:.rar
  • 所需积分:2
 相关标签: ModbusRtu Modbus RTU PLC 通信

实例介绍

【实例简介】已经验证可以和支持ModbusRTU 的PLC通信

【实例截图】

from clipboard

【核心代码】

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
    }
}

实例下载地址

网友评论

第 1 楼 ftq62017 发表于: 2019-11-27 13:40 35
差评,该代码不是完全开源的

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警