本示例包含兩部分,一部分運作到開發闆上,作為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的魅力之所在)。
下位機機運作後的效果圖如下:
注意:紅牛代碼和EM-STM3210E不同,後者需要注釋掉 #define Redox 代碼。
上位機代碼解壓後,直接運作即可,程式的相關參數已經配好,如果啟動時,開發闆已經正常運作,并且和PC進行了序列槽連接配接,則會顯示如下畫面。按開發闆上的按鈕,這是按鈕狀态會有變化,用滑鼠單擊LED區的滑鼠,你會發現開發闆上的LED燈會做同步改變。
這應該是關于Modbus示例代碼中的重量級示例,因為Client和Slave的源碼都涉及到了,并且相關代碼不僅僅是示例,也來源于我以前所做的工程項目,是以非常有價值。
下一篇文章将介紹和所做的,就是我們就要把Modbus Client端移植到開發闆上運作了,對紅牛開發闆來說,我們通過COM3的485接口直接控制PLC,不過對EM-STM3210E開發闆來說,沒有這麼爽,它不光沒有485接口,并且COM3口也沒有引出了,是以要想通路PLC,一般需要中間接一個232轉485裝置,不管怎樣,我們的開發闆不僅上可以給PC通信,下也可以和PLC通信了。
-----------------------------------------------------------------------------------------