天天看點

【STM32 .Net MF開發闆學習-05】PC通過Modbus協定遠端操控開發闆

本示例包含兩部分,一部分運作到開發闆上,作為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;

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

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

                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類,相關接口如下:

    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的魅力之所在)。

下位機機運作後的效果圖如下:

【STM32 .Net MF開發闆學習-05】PC通過Modbus協定遠端操控開發闆

注意:紅牛代碼和EM-STM3210E不同,後者需要注釋掉 #define Redox 代碼。

上位機代碼解壓後,直接運作即可,程式的相關參數已經配好,如果啟動時,開發闆已經正常運作,并且和PC進行了序列槽連接配接,則會顯示如下畫面。按開發闆上的按鈕,這是按鈕狀态會有變化,用滑鼠單擊LED區的滑鼠,你會發現開發闆上的LED燈會做同步改變。

【STM32 .Net MF開發闆學習-05】PC通過Modbus協定遠端操控開發闆

這應該是關于Modbus示例代碼中的重量級示例,因為Client和Slave的源碼都涉及到了,并且相關代碼不僅僅是示例,也來源于我以前所做的工程項目,是以非常有價值。

下一篇文章将介紹和所做的,就是我們就要把Modbus Client端移植到開發闆上運作了,對紅牛開發闆來說,我們通過COM3的485接口直接控制PLC,不過對EM-STM3210E開發闆來說,沒有這麼爽,它不光沒有485接口,并且COM3口也沒有引出了,是以要想通路PLC,一般需要中間接一個232轉485裝置,不管怎樣,我們的開發闆不僅上可以給PC通信,下也可以和PLC通信了。

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

繼續閱讀