【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板

简介: 从2002年就开始接触Modbus协议,以后陆续在PLC、DOS、Windows、.Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友可以看一看《我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)》。

2002年就开始接触Modbus协议,以后陆续在PLCDOSWindows.Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友可以看一看《我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp》。该协议公开,精简,并且可靠,目前大部分智能仪表,智能模块和一些PLC都采用了该协议,前一段时间有位网友询问相关Modbus的问题,所以这里就以Modbus的实现来来作为.Net MF开发板的串口示例。

本示例包含两部分,一部分运行到开发板上,作为Modbus RTU Slave服务存在;另一部分典型的.Net Framework代码,实现了Modbus RTU Client端功能,可以借助开发板上的Slave服务控制开发板上的LED灯和获取按钮状态。

Slave类的实现如下(具体实现请参见示例源码):

namespace YFSoft.Modbus

{

    public class Slave

    {

        //数据区读写事件

        public event ReadDataEventHandler ReadData;

        public event WriteDataEventHandler WriteData;

        //启动Modbus服务

        public void Start(string portName, int baudRate, Parity parity);

        //停止Modbus服务

        public void Stop();

}

}

调用相对简单,代码如下:

public static void Main()

        {

            Graphics.Clear(Color.Black);

            Graphics.Print("Modbus Rtu Test/r/n");

           

            RtuSlave.ReadData += new ReadDataEventHandler(RtuSlave_ReadData);

            RtuSlave.WriteData += new WriteDataEventHandler(RtuSlave_WriteData);

            RtuSlave.Start("COM2", 19200, System.IO.Ports.Parity.None);

            int index = 0;

            while (true)

            {

                //leds[0].Write(!leds[0].Read());

                Graphics.FillRectangle(0, 305, 240, 15, Color.White);

                Graphics.DrawString(5, 306, (index++).ToString(), Color.Blue);

                Thread.Sleep(1000);

            }

            //RtuSlave.Stop();

  }

比较重要的是下面的代码,它们具体实现读写LED的状态及按钮状态,需要注意的是红牛的开发板和EM-STM3210ELED有些不同,一个是输出电平为低时点亮,一个是输出电平为高时点亮,相关代码如下:

        static void RtuSlave_WriteData(int addr, int size, ref byte[] data)

        {

            //LED

            if (addr == 0)

            {

                for (int i = 0; i < leds.Length; i++)

                {

#if Redox

                    leds[i].Write(!((data[1] & 0x1<<i) > 0));

#else

                    leds[i].Write((data[1] & 0x1 << i) > 0);

#endif

                }

            }

        }

 

        static void RtuSlave_ReadData(int addr, int size, ref byte[] data)

        {

            if (addr < 2)

            {

                //LED

                byte bytTemp = 0;

                for (int i = 0; i < leds.Length; i++)

                {

#if Redox

                    bytTemp |= (byte)((leds[i].Read() ? 0 : 1) << i);

#else

                    bytTemp |= (byte)((leds[i].Read() ? 1 : 0) << i);

#endif

                }

                data[1] = bytTemp;

                //Button

                bytTemp = 0;

                for (int i = 0; i < buttons.Length; i++)

                {

                    bytTemp |= (byte)((buttons[i].Read() ? 1 : 0) << i);

                }

                data[3] = bytTemp;

            }

  }

PC机上的.Net Framework代码实现了一个Modbus Rtu Client类,相关接口如下:

namespace YFSoft.Modbus

{

    public class Client

    {

        public bool Open(string portName, int baudRate, Parity parity);

        public int Read(byte Addr, UInt16 DataAddr, UInt16[] DataValue, UInt16 DataNum);

        public int Write(byte Addr, UInt16 DataAddr, UInt16[] DataValue, UInt16 DataNum);

    }

}

由于.Net Framework代码不是介绍的重点,感兴趣的朋友直接看相关源码(其实该套源码几乎不需要修改,就可以直接成为.Net Micro Framewor的代码,这也正是.Net Micro Framework的魅力之所在)。

下位机机运行后的效果图如下:

 

 

注意:红牛代码和EM-STM3210E不同,后者需要注释掉 #define Redox 代码

上位机代码解压后,直接运行即可,程序的相关参数已经配好,如果启动时,开发板已经正常运行,并且和PC进行了串口连接,则会显示如下画面。按开发板上的按钮,这是按钮状态会有变化,用鼠标单击LED区的鼠标,你会发现开发板上的LED灯会做同步改变。

 

这应该是关于Modbus示例代码中的重量级示例,因为ClientSlave的源码都涉及到了,并且相关代码不仅仅是示例,也来源于我以前所做的工程项目,所以非常有价值。

下一篇文章将介绍和所做的,就是我们就要把Modbus Client端移植到开发板上运行了,对红牛开发板来说,我们通过COM3485接口直接控制PLC,不过对EM-STM3210E开发板来说,没有这么爽,它不光没有485接口,并且COM3口也没有引出了,所以要想访问PLC,一般需要中间接一个232485设备,不管怎样,我们的开发板不仅上可以给PC通信,下也可以和PLC通信了。

-----------------------------------------------------------------------------------------

【低价开发板】http://item.taobao.com/item.htm?id=7117999726 

源码下载:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/Modbus.rar

文章参考: .Net Micro Framework 快速入门

中文讨论组:http://space.cnblogs.com/group/MFSoft/

相关文章
|
3月前
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
|
4月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
228 0
|
4月前
|
消息中间件 Linux iOS开发
.NET 高性能异步套接字库,支持多协议、跨平台、高并发
【11月更文挑战第3天】本文介绍了高性能异步套接字库在网络编程中的重要性,特别是在处理大量并发连接的应用中。重点讨论了 .NET 中的 Socket.IO 和 SuperSocket 两个库,它们分别在多协议支持、跨平台特性和高并发处理方面表现出色。Socket.IO 基于 WebSocket 协议,支持多种通信协议和跨平台运行,适用于实时通信应用。SuperSocket 则通过事件驱动的异步编程模型,实现了高效的高并发处理,适用于需要自定义协议的场景。这些库各有特点,可根据具体需求选择合适的库。
|
5月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
303 3
|
5月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
349 0
|
5月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
80 1
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
这篇文章是关于计算机组成原理的王道考研学习笔记,主要介绍了半导体存储器RAM和ROM的相关知识。
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
|
7月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
150 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【文献学习】Phase-Aware Speech Enhancement with Deep Complex U-Net
文章介绍了Deep Complex U-Net模型,用于复数值的语音增强,提出了新的极坐标掩码方法和wSDR损失函数,并通过多种评估指标验证了其性能。
94 1
|
8月前
|
存储 开发框架 前端开发
基于Lumisoft.NET组件,使用IMAP协议收取邮件
基于Lumisoft.NET组件,使用IMAP协议收取邮件

热门文章

最新文章