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

简介:

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通信了。

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

 

 

 







本文转自yefanqiu51CTO博客,原文链接: http://blog.51cto.com/yfsoft/343819 ,如需转载请自行联系原作者
相关文章
|
Windows
在Corex-M3开发板上移植.Net Micro Framework系列文章
.NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio&reg; 的高生产率结合起来,以针对价格较低、资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Visual Studio 工具来构建托管的嵌入式应用程序。
650 0
|
芯片
免费发放firmwave,打造史上最低价.Net MF开发板
很久以前就曾多方位思考限制.Net Micro Framework发展的原因是什么?在物联网和Cortex-M3大行其道的今天,应该有更大的发展空间才对,为什么现在还是关注者甚少?我想主要原因有三,一、源码代码是否开源;二、是否有低价开发板;三、TinyCLR是否够小。
786 0
|
开发工具
【STM32 .Net MF开发板学习-01】Hello world
我们抛弃掉所谓的模拟器,我们在真机上体验一下运行最简单的“Hello world”程序的效果。
743 0
【STM32 .Net MF开发板学习-02】GPIO测试
示例很简单,主要是按钮和LED灯的测试,红牛和EM-STM3210E的按钮和LED有所不同,所以有针对性的对二者pin都做了定义(这些信息,你可以直接看开发板相对应的原理图,很容易就可以获得相关Pin脚的定义)。
509 0
【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
.Net Micro Framework官方图形库是WPF,由于目前ST Cortex-M3开发板RAM太小,最大才512K(常见是128K或256k),并且Cortex-M3的CPU主频也不太高,运行WPF图形框架显得过于重了,所以我这边推出了轻量级图形库TinyGUI
607 0
|
内存技术
【STM32 .Net MF开发板学习-04】TinyGUI位图显示
由于Cortex-M3开发板的RAM比较小,比如EM-STM3210E仅128K,所以显示位图是个比较棘手的事,如320*240 16位的位图大小就为150K,由于官方的WPF以一个BMP位图为本底进行绘图,所以RAM内存需求至少大于150K。
639 0
【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板
本示例包含两部分,一部分运行到开发板上,作为Modbus RTU Slave服务存在;另一部分典型的.Net Framework代码,实现了Modbus RTU Client端功能,可以借助开发板上的Slave服务控制开发板上的LED灯和获取按钮状态。
764 0
【STM32 .Net MF开发板学习-06】蜂鸣器和LED数码管显示
无论是蜂鸣器还是LED数码管显示,其实这二者对代码编写来说没有太大区别,都是GPIO的一个典型应用。红牛开发板有一个蜂鸣器,而EM-STM3210E有一个四位LED数码管,代码都相对简单,不值的为二者单独写一篇博文,所以二者合一以一篇文章来说明,不过两个示例代码是独立的。
671 0
|
内存技术
【STM32 .Net MF开发板学习-07】全屏位图无闪烁显示
16位320*240的位图大小为150K字节,而对于EM-STM3210E开发板来说,RAM仅有128K,远不够显示一幅完整位图,红牛的开发板即使有256K的RAM,但是刨去堆、栈及TinyCLR本身所用,剩下的也不多了,所以要显示全屏位图,必须分块显示。
536 0
【STM32 .Net MF开发板学习-08】远程PLC读写控制
在工控项目中,PLC一般必不可少,现场控制一般以它为核心,而PC系统一般只是起到远程监控、图表和数据存储的作用。
728 0