zoukankan      html  css  js  c++  java
  • 【STM32 .Net MF开发板学习08】远程PLC读写控制

        在工控项目中,PLC一般必不可少,现场控制一般以它为核心,而PC系统一般只是起到远程监控、图表和数据存储的作用。除了PLC之间,PCPLC之间通信外,一般一些智能显示模块(如型号各异的触摸屏 HMI系统)也和PLC通信,我们就要把把承载.NET MF的系统打造成一个最简单的HMI系统,远程操控PLC

        一般国外每一个PLC厂家,其通信协议一般都是不同的,如西门子PLCPPI/MPI、欧姆龙 PLCHostLinkAB PLCDF1、施奈德 PLCModbus等等,由于Modbus协议简单、并且公开,所以国内一些PLC和智能模块大都是支持Modbus协议的,西门子200系列的PLC只要加载一个官方Modbus库,也是可以非常方便的支持Modbus协议。

       在上一篇文章《PC通过Modbus协议远程操控开发板》,我们把Modbus Rtu client运行在PC端,这次我们把这部分程序移植到.Net Micro Framework系统上,让.Net Micro Framework开发板直接访问PLC

        有所不同的是,红牛开发的COM3直接支持RS485通信,这样我们和PLC直接用两个线相连就可以通信了,此外RS485是半双工通信,所以需要自己手动进行收发切换,除此之外和RS232通信代码基本一致。

         不同之处的代码如下:

         //发送数据

         if (RS485)

         {

            RTS.Write(true);

         }

         serial.Write(bytSendData, 0, intSendNum);

         if (RS485)

         {

            while (serial.BytesToWrite > 0) ;

            RTS.Write(false);

         }    

        具体的测试代码如下:

        public static void Main()  

        {

            Client mbclient = new Client();

            mbclient.RS485 = true;

            mbclient.RTS_Pin = (Cpu.Pin)GPIO_NAMES.PF11;

            mbclient.Open("COM3", 19200, System.IO.Ports.Parity.None);

            UInt16[] data=new UInt16[3];

            Graphics.Clear(Color.Black);

            Graphics.FillRectangle(0, 0, 239, 19, Color.White);

            Graphics.DrawString(60, 3, "Modbus Rtu Test", Color.Blue);

            byte QW0 = 0;

            while (true)

            {

                if (++QW0 > 128) QW0 = 0;

                mbclient.Write(1, 0, new UInt16[] { QW0 }, 1);   

                Thread.Sleep(300); 

     

                if(mbclient.Read(1,0,data,3) == 0)

                {

                    Graphics.SuspendLayout();

                    Graphics.FillRectangle(0, 40, 239, 100, Color.Black);

                    Graphics.DrawString(20, 43, "QW0 : " + data[0].ToString(), Color.Yellow);

                    Graphics.DrawString(20, 63, "IW0 : " + data[1].ToString(), Color.LightGreen);

                    Graphics.DrawString(20, 83, "VW2 : " +data[2].ToString(), Color.Orange);

                    Graphics.ResumeLayout();

                }            

                Thread.Sleep(300); 

            }

    }

    由于我们仅实现了Modbus协议的3,16号指令,所以要想操作PLC的I、Q,我们对V变量区进行了映射,具体的代码如下

       TITLE=Modbus测试

    Network 1

    // 端口初始化

    LD     SM0.1

    CALL   YFMB_INIT, 1, 1, 19200, 0, 0, 128, 32, 2000, &VB0, M0.0, MB1

     

    Network 2

    // 服务程序

    LD     SM0.0

    CALL   YFMB_SLAVE, M0.1, MB2             //Modbus Slave 服务程序

     

    Network 3

    LD     SM0.0

    TON    T32, 1000

     

    Network 4

    // 1s钟更新一次

    LD     T32

    R      T32, 1

    INCB   VB5

     

    Network 5

    // IO 映射到V变量区

    LD     SM0.0

    MOVB   VB0, QB1

    MOVB   VB1, QB0

     

    MOVB   IB0, VB3

    MOVB   IB1, VB2

       运行后的效果图如下:

      

     

       没有PLC朋友也不要气馁,这里提供一个Modbus RTU Slave的模拟器,可以运行在Windows平台上,如下图:  

       要设为串口模式(Modbus RS-232),串口参数如下:

    这时候红牛开发板就没有必要用COM3了(否则需要一个232485模块),直接用COM2PC相连即可(注意,相关的代码要做一下调整)。

    连接之后,你可以看到模拟器的数据在变化,当然你可以输入修改相关的数据,以观看开发板上LCD的变化。

    Modbus模拟器下载地址:http://www.sky-walker.com.cn/yefan/MFV40/mod_RSsim.exe

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

      

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

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

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

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

  • 相关阅读:
    Mongodb操作之查询(循序渐进对比SQL语句)
    Java之IO转换流
    Java之final、finalize、finally的区别
    Java之IO流基础流对象
    lib库实现loadrunner驱动mysql性能测试
    java之集合框架使用细节及常用方法
    java之JAVA异常
    sql注入工具sqlmap使用参数说明
    Java之String类的使用细节
    MySQL引擎介绍ISAM,MyISAM,HEAP,InnoDB
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/1773855.html
Copyright © 2011-2022 走看看