从2002年就开始接触Modbus协议,以后陆续在PLC、DOS、Windows、.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-STM3210E的LED有些不同,一个是输出电平为低时点亮,一个是输出电平为高时点亮,相关代码如下:

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示例代码中的重量级示例,因为Client和Slave的源码都涉及到了,并且相关代码不仅仅是示例,也来源于我以前所做的工程项目,所以非常有价值。

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

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







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/343819,如需转载请自行联系原作者

【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板的更多相关文章

  1. Modbus协议和应用开发介绍

    因业务需要了解Modbus协议的使用,因此对Modbus的协议,以及相应的C#处理应用进行了解,针对协议的几种方式(RTU.ASCII.TCPIP)进行了封装,以及对Modbus的各种功能码的特点进行 ...

  2. 各种非标232,485协议,自定义协议转modbus协议模块定制开发,各种流量计协议转modbus,

    工业现场经常会碰到通过485或者232采集各类仪表数据,但是很多早期的仪表和设备不支持标准modbus协议,而是采用自定义的协议,这些协议数据由plc或者dcs系统来实现采集,不仅费时麻烦,而且不方便 ...

  3. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  4. IMX6开发板学习烧写Linux-QT系统步骤做个笔记

    平台:迅为-i.MX6开发板  烧写系统:Linux-QT   <ignore_js_op>   Qt系统的烧写,是使用 MfgTool2 工具,只需要简单的配置下.   打开 “Mfgt ...

  5. Nvidia Jetson TX2开发板学习历程(1)- 详细开箱、上电过程

    考试周已经结束了,开发板也已经到了.希望借着这个假期能够好好的利用这块开发板学习Linux系统以及Tensorflow的相关知识. 我打算将学习历程通过博客的方式写出来,作为自己的笔记,也可以供以后拿 ...

  6. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  7. STM32学习笔记(三) STM32的GPIO的深入学习

    STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...

  8. [Intel Edison开发板] 06、Edison开发在linux中烧写、配置、搭建开发环境

    1.前言 linux上烧写.配置.搭建Edison环境,千万不要用默认的setup tool for ubuntu!!! (即使,你用的就是ubuntu) 因为,其默认的工具会从一个坏链接下载配置文件 ...

  9. web前端学习路线(含20个真实web开发项目集合)

    目前web前端工程师日均岗位缺口已经超过50000,随着互联网+的深入发展,html5作为前端展示技术,市场人才需求量将呈直线上涨. Web前端工程师的岗位职责是利用HTML.CSS.Java.DOM ...

随机推荐

  1. RedHat7.4配置yum网络源

    本次RedHat版本为:Red Hat Enterprise Linux Server release 7.4 (Maipo). 将RedHat7.4的yum源替换为免费的CentOS对应版本yum源 ...

  2. 【php】面向对象(二)

    一. 封装: a) 描述:使用成员修饰符修饰成员属性和成员方法,能够最大限度的隐藏对象内部的细节,保证对象的安全 b) PPP修饰符:public(公共的),protected(受保护的),priva ...

  3. 微信小程序页面跳转的三种方式总结

    原文链接 https://blog.csdn.net/zgmu/article/details/72123329 首先我们了解到,小程序规定页面路径只能有五层,所以我们尽量避免多层级的页面跳转 页面跳 ...

  4. keras与卷积神经网络(CNN)实现识别minist手写数字

    在本篇博文当中,笔者采用了卷积神经网络来对手写数字进行识别,采用的神经网络的结构是:输入图片——卷积层——池化层——卷积层——池化层——卷积层——池化层——Flatten层——全连接层(64个神经元) ...

  5. Fastdfs文件系统扩容

    1.简介     FastDFS文件服务器在设计时,为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式.存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是 ...

  6. CH5701 开车旅行(倍增dp+set)

    传送门 解题思路: 一道比较有趣的题,解题工作主要分为两块: ①找出k(k=0表示小A先走,k=1表示小B先走,下面同理)从点i出发下一个到达的点to[k][i]; 一开始偷懒用了vector(偷懒一 ...

  7. Python pip高级用法

    1.pip 高级用法为了便于用户安装和管理第三方库和软件,越来越多的编程语言拥有自己的包管理工 具,如 nodejs 的 npm, ruby 的 gem. Python 也不例外,现在 Python ...

  8. Delphi Unicode转中文

    function UniCode2GB(S : String):String;Var I: Integer;beginI := Length(S);while I >=4 do begintry ...

  9. STL迭代器的使用

    STL的迭代器听起来怪吓人的,其实并不是什么高深的东西,说白了就是定义了一个指向STL的指针.. 对于没个STIL都可以定义 set,,vector ,,map,,,string 定义: set< ...

  10. 最短路径变形 POJ 2253

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...