前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >电气工程师要了解的上位机知识,C#简单几行代码就能实现Modbus通信,源代码分享

电气工程师要了解的上位机知识,C#简单几行代码就能实现Modbus通信,源代码分享

作者头像
自动化大师
发布2024-08-14 20:26:23
1480
发布2024-08-14 20:26:23
举报
文章被收录于专栏:自动化大师
MODBUS通信案例- 使用nModbus库

之前一直想用C#写一个MODBUS通信的案例,本来想用SerialPort直接写的,然后发现可以用 nModbus类库,使用nModbus库来编写Modbus通信的C#案例是一个很好的选择,因为它大大简化了Modbus通信的实现过程。

不说了,上图上代码 。

nmodbus的中文说明书需要可以点击下方链接下载。

nmodbus中文说明书.zip

01、部署nModbus库

首先,通过NuGet部署nModbus库到你的C#项目中。

02、winform设计

接下来,进行winform设计(本文仅展示了一个BOOL值的读取,需要其他的功能可以参考说明文档)

03、示例代码

接下来你可以按照以下步骤编写代码:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Modbus.Device;


namespace modbus
{
    public partial class Form1 : Form
    {
        public Form1()
{
            InitializeComponent();
            timer1.Enabled = false;
        }
        //实例化一个串口
        public SerialPort serialPort1 = new SerialPort("COM3");
        IModbusSerialMaster master;
        byte slaveID = 1;
            ushort startAddress = 0;
            ushort numOfPoints = 10;

        private void Form1_Load(object sender, EventArgs e)
{
           

        }

        private void OpenBtn_Click(object sender, EventArgs e)
{
            if (serialPort1.IsOpen == true)
            {
                OpenBtn.Text = "打开串口";
                serialPort1.Close();
                timer1.Enabled = false;
              }

            else {
                timer1.Enabled = true;
                OpenBtn.Text = "关闭串口";
                serialPort1.Open();
               
                //myThread.Start();
            }
            serialPort1.BaudRate = 9600;//配置
            serialPort1.DataBits = 8;//数据位
            serialPort1.Parity = Parity.None;//校验位
            serialPort1.StopBits = StopBits.One;//停止位
            //创建 Rtu 传输模式、通过串口 port 通信的主站
            master = ModbusSerialMaster.CreateRtu(serialPort1);
            master.Transport.ReadTimeout = 1000;//读取串口数据超时为 1000ms master.Transport.WriteTimeout = 1000;//写入串口数据超时
            master.Transport.Retries = 3;//重试次数
        }
       

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
            serialPort1.Close();
            timer1.Enabled = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
{
            bool[] all = master.ReadCoils(slaveID, startAddress, numOfPoints);
            textBox1.Text = all[0].ToString();
            if (all[0] == true)
            {
                button1.BackColor = Color.Red;
            }
            else { button1.BackColor = Color.Green; }

        }

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自动化大师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档