天天看點

【STM32 .Net MF開發闆學習-08】遠端PLC讀寫控制

   在工控項目中,PLC一般必不可少,現場控制一般以它為核心,而PC系統一般隻是起到遠端監控、圖表和資料存儲的作用。除了PLC之間,PC和PLC之間通信外,一般一些智能顯示子產品(如型号各異的觸摸屏 HMI系統)也和PLC通信,我們就要把把承載.NET MF的系統打造成一個最簡單的HMI系統,遠端操控PLC。

    一般國外每一個PLC廠家,其通信協定一般都是不同的,如西門子PLC的PPI/MPI、歐姆龍 PLC的HostLink、AB PLC的DF1、施奈德 PLC的Modbus等等,由于Modbus協定簡單、并且公開,是以國内一些PLC和智能子產品大都是支援Modbus協定的,西門子200系列的PLC隻要加載一個官方Modbus庫,也是可以非常友善的支援Modbus協定。

    有所不同的是,紅牛開發的COM3直接支援RS485通信,這樣我們和PLC直接用兩個線相連就可以通信了,此外RS485是半雙工通信,是以需要自己手動進行收發切換,除此之外和RS232通信代碼基本一緻。

     不同之處的代碼如下:

     //發送資料

     if (RS485)

     {

        RTS.Write(true);

     }

     serial.Write(bytSendData, 0, intSendNum);

        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();

            }            

        }

}

由于我們僅實作了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

TON    T32, 1000

Network 4

// 1s鐘更新一次

LD     T32

R      T32, 1

INCB   VB5

Network 5

// IO 映射到V變量區

MOVB   VB0, QB1

MOVB   VB1, QB0

MOVB   IB0, VB3

MOVB   IB1, VB2

   運作後的效果圖如下:

【STM32 .Net MF開發闆學習-08】遠端PLC讀寫控制

   沒有PLC朋友也不要氣餒,這裡提供一個Modbus RTU Slave的模拟器,可以運作在Windows平台上,如下圖:

【STM32 .Net MF開發闆學習-08】遠端PLC讀寫控制

  要設為序列槽模式(Modbus RS-232),序列槽參數如下:

【STM32 .Net MF開發闆學習-08】遠端PLC讀寫控制

這時候紅牛開發闆就沒有必要用COM3了(否則需要一個232轉485子產品),直接用COM2和PC相連即可(注意,相關的代碼要做一下調整)。

連接配接之後,你可以看到模拟器的資料在變化,當然你可以輸入修改相關的資料,以觀看開發闆上LCD的變化。

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

繼續閱讀