天天看點

【物聯網中間件平台-02】YFIOs技術白皮書(V1.1)1 前言2 YFIOs簡介3 YFIOs應用開發4相關資源

YFIOs技術白皮書

版本

V1.1.0

說明

增加 技術特色和優勢 章節

作者

葉帆

日期

曆史

V1.0.0  葉帆 2012-12-20

文檔清單

<a href="http://www.sky-walker.com.cn/MFRelease/YF_document_list.pdf">http://www.sky-walker.com.cn/MFRelease/YF_document_list.pdf</a>

在工控領域,組态軟體司空見慣,國外的iFix、InTouch、WinCC,國内的組态王、力控、MSCG等等。組态軟體的出現徹底解決了軟體重複開發的問題,實作子產品級複用,好處不僅僅是提高了開發效率,降低了開發周期,更大的優勢的是成熟子產品的複用,大大提高了系統穩定性和可靠性。

所謂組态(Configuration),就是子產品化任意組合(類似積木玩具)。組态軟體的主要特點有:

(1)、延展性。所謂延展性,就是系統的延續和易于擴充性,用組态軟體開發的系統,當現場或使用者需求發生改變時(包括硬體裝置或系統結構的改變),使用者無需做很多修改,就可以很友善地完成系統的更新和改造;

(2)、易用性。組态軟體對底層功能都進行了子產品級封裝,對于使用者,隻需掌握簡單的程式設計語言(内嵌的腳本語言,類Basic或類C語言),甚至不需要程式設計技術,就能很好地,通過組态配置的方式完成一個複雜系統的開發和內建;

(3)、通用性。不同使用者根據系統的不同,利用組态軟體提供的I/O驅動(如PLC、儀表、闆卡、智能子產品、變頻器等等驅動)、資料庫和圖元,就能完成一個具有動畫、實時資料處理、曆史資料和圖表并存,且具有多媒體功能和網絡功能的系統工程,不受領域或行業限制。

但是無論是基于PC平台的組态軟體還是基于ARM系統的嵌入式組态軟體,其組态粒度都顯過大,大部分通過序列槽、網口、CAN等通道把個系統子產品連接配接在一起,在一定程度上增加了系統建構的成本和代價。

而以.NET Micro Framework為依托建構的輕量級嵌入式組态軟體(YFIOs)就很好的解決了上述問題,除支援正常的序列槽、網口、CAN外,還支援USB、Wifi、ZigBee、SPI、I2C等通道,SPI、I2C片級總線的支援加上強大的托管代碼(C#,VB.net)開發能力,使嵌入式硬體系統真正的組态化、子產品化成為可能,這項技術的推出,無疑為快速打造形态各異,功能不同的産品提供了最有力的支撐。

為了适應這種新形勢的發展,加速和降低各種傳感器、智能子產品的入網代價,以微軟成熟的.NET Micro Framework系統為基礎,打造出物聯網時代的輕量級嵌入式組态系統 —— YFIOs。

和傳統組态或其他物聯網、嵌入式等方案相比,有如下優勢:

(2)、支援遠端更新,遠端調試。

(3)、由于.NET Micro Framework的跨平台特性,是以基于該架構的YFIOs也可以跨平台應用。

(5)、驅動和政策可以在MicrosoftVisual Studio 2010開發環境中線上調試;

(6)、政策可以和驅動關聯,不僅可以直接調用驅動,還可以和驅動進行關聯,事件觸發的方式執行政策;

(7)、政策不僅可以調用驅動,彼此之間還可以互相調用;

(8)、驅動和政策可以加密,也可以綁定指定硬體運作,不僅可以保護使用者的知識産權,還可以在此基礎上為第三方客戶提供增值服務。

(9)、運作時小巧輕便,不含YFHMI庫的運作時僅19.2K,含MiniGUI、中文字庫、四套圖元庫的運作時,也僅355K。

Microsoft .NET Micro Framework 将 .NET 的可靠性和效率與 VisualStudio的高生産率結合起來,以針對價格較低、資源受限的小型裝置開發應用程式,可幫助人們使用熟悉的Visual Studio工具來建構托管的嵌入式應用程式。2009年5月,.NET MicroFramework采用Apache 2.0license,比Linux等開源軟體更為徹底的方式實作了源代碼完全開放。

.NET Micro Framework技術可以應用到:Sideshow、遠端控制、智能家電、教育類機器、醫療電子、零售終端以及汽車電子等行業應用場景;此外由于.NET Micro Framework內建了各種接口,如序列槽、網口、Wifi、Zigbee、I2C、SPI、SDIO、USB等通信接口,加上其應用開發簡便,是以在物聯網時代,将大有作為。

.NET Micro Framework對存儲器和處理器的要求更低。開發人員可以在低功耗、低成本的ARM7、ARM9、Blackfin和Cortex-M3處理器上使用該架構(不需要MMU支援),所開發出來的軟體僅需要幾百Kbytes的RAM或Flash/ROM存儲空間。而WindowsEmbedded CE的托管代碼環境需要約10~12Mbytes的存儲空間,基于.NET的應用程式設計裝置隻需要較少的存儲空間,降低了産品成本。

作為.NET家族的一員,.NET MicroFramework是微軟專門針對超輕量級平台設計的軟體架構。與.NET Framework和.NET CompactFramework不同的地方是,.NETMicro Framework具有自啟動的特性,并且在HAL層,微軟将作業系統的必要特性引入,如:啟動管理、中斷處理、線程排程、記憶體管理等。.NET Micro Framework可以單獨使用,不需要依托其它作業系統,是以占用空間很小。

YFIOs由三大部分構成,一是YFIOs運作時,包含YFIODB、YFIOBC、驅動引擎和政策引擎四部分;二是應用子產品,包含驅動、政策和IO資料三部分;三是YFIOsIDE環境(YFIOsManager),該工具和Microsoft Visual Studio開發工具一起共同完成驅動、政策的開發、配置及部署工作。

系統架構圖和YFIOs和.NET Micro Framework關系圖(如下圖所示):

YFIODB是一個在記憶體實作的資料庫,主要存放IO資料,供驅動程式、政策程式直接通路,進而起到跨子產品交換資料的目的。其IO資料一般可分兩類,一種是内部IO資料,該類IO資料不綁定任何裝置驅動,主要作為中間變量或臨時變量來使用;另一種是裝置IO資料,該類IO資料和實際的驅動程式進行綁定,該IO資料的值映射驅動所對應的裝置參變量的值。

2.4.1 YFIODB庫結構

序号

變量名稱

長度

1

Name

32

變量的名稱

2

Type

資料類型B布爾型I整型F浮點型S 字元串

3

Value

變量的值

4

Comment

26

注釋

5

RWMode

讀寫類型 0 隻讀 1 隻寫 2 讀寫(自動讀) 3 讀寫(手動讀) 4-隻讀(手動)

6

RWFlag

R 自動讀 W 自動寫  r 手動讀 n讀不操作 N 寫不操作

7

LO

16

下限

8

HO

上限

9

DateTime

資料更新時YYYY(2B)MM(1B)DD(1B)HH(1B)mm(1B)SS(1B)

統計

136

1000個點需要  約132.8 K Byte 的記憶體

YFIODB通路接口被操作類接口(IOPerate)進一步封裝,而操作類接口是驅動和政策标準函數接口的第一個參數,是以任何一個驅動和政策程式都可以操作YFIODB。

相關操作接口定義如下:

    //讀資料

    stringIORead(string name);

    intIOReadInt(string name);

    floatIOReadFloat(string name);

    //讀資料(擴充方式 變量名.字段名)

    stringIOReadEx(string name);

    //寫資料(内部寫)

    intIOWrite(string name, stringdata);

    intIOWrite(string name, intdata);

    intIOWrite(string name, floatdata);

    //寫資料(擴充方式 變量名.字段名)

    intIOWriteEx(string name, stringdata);

    //外部寫(直接寫變量)

    intExtern_IOWrite(string name, string data);

    //變量讀寫模式

    stringIOReadMode(string name);

需要說明的是,該接口提供的對YFIODB的寫操作,并不是直接對YFIODB資料庫某表某字段,進行寫操作,而是根據一定的邏輯算法,對各表項綜合操作(注意:擴充方式寫操作,是直接對表中具體的項直接進行操作的)。驅動函數要采用内部寫模式,執行後,會自動複位“W”标志位,而對政策函數來說,屬于使用者層面操作,是以要寫YFIODB的時候,要采用外部寫函數,執行後,函數會自動置位“W”标志位。

寫YFIODB分内外的意義在于:政策函數僅僅是把變量的值寫入資料庫,而驅動才會真正的把該變量的值寫入到實際的裝置中去。而通過複位和置位“W”标志可以獲知是否要寫入到實際裝置,或是否寫入完成。

和YFIODB不同,YFIOBC是用來供驅動程式和政策程式存儲和交換大塊資料而用的,如攝像頭的圖像資料。該結構設計的如同檔案系統,可建立、删除和讀寫,其内容大小僅受裝置記憶體的限制。

 2.5.2 通路接口

和操作YFIODB接口一樣,操作YFIOBC的接口也封裝到操作類接口(IOPerate)中,是以驅動和政策程式都可以操作YFIOBC。

操作接口定義如下:

    //删除記憶體資料條目

    intIOBC_Del(string name);

    //size=0 打開,size&gt;0 建立

    intIOBC_Create(string name, uint size);

    //擷取指定條目所配置設定的記憶體大小

    intIOBC_GetLength(int hander);

    //讀寫偏移設定

    intIOBC_Seek(int hander, intoffset);

    //讀記憶體資料

    intIOBC_Read(int hander, byte[]buffer, int offset, intcount);

    //寫記憶體資料

    intIOBC_Write(int hander, byte[]buffer, int offset, intcount);

    //關閉

    intIOBC_Close(int hander);

該接口仿照檔案操作方式進行操作,其作用類似Windows平台上的共享記憶體操作,讀寫都在記憶體中完成。

一個驅動程式可對應一種裝置,也可以對應一類裝置,關鍵在于裝置支援的協定是私有的,還是公開的,一般公開的協定,如Modbus,不同廠家的通信裝置都有不同程度的支援(比如支援3号或16号指令),凡支援該協定的裝置,都可以通過同一個裝置驅動進行通路,唯一不同的就是裝置位址、資料類型、起始位址和資料長度等參變量,我們可以根據實際需要,相應配置即可。

     public interface IDriver

    {

        DriverInfoGetDriverInfo();

        intOnLoad(Device dv, IOperateop, object arg);

        intOnRun(Device dv, IOperateop, object arg);

        intOnUnload(Device dv, IOperateop, object arg);

}

驅動程式必須要實作這四個函數接口,其中GetDriverInfo僅供上位機配置程式調用。

(1)、GetDriverInfo – 傳回驅動相關資訊(請參見2.5.3)。

(2)、OnLoad – 驅動被加載時,将自動調用OnLoad方法。使用者可以在該函數内,完成一些初始化操作。

(3)、OnRun – 根據配置不同,該函數按指定的時間間隔連續被系統調用(如果時間間隔配置為0,則系統不會自動調用OnRun方法)。同一個接口配置的驅動,将共享一個線程,系統将依次調用該方法。

(4)、OnUnload – 驅動被解除安裝時,系統将調用OnUnload。(目前YFIOs系統不支援驅動解除安裝)。

    public enum DeviceConnMode

        SerialPort = 0,

        Ethernet,

        CAN,

        USB,

        SPI,

        I2C,

        SDIO,

        Zigbee,

        AD,

        DA,

        I,

        Q,

        PWM,

        Other,

    }

{

    //32byte,驅動名稱(要保證唯一)

        public string Name;                        

        //16byte,版本資訊

public string Ver;

//64byte,說明

public stringExplain;                    

        //16byte,開發者

public stringDeveloper; 

//16byte,日期                

        public string Date;                               

//自動化标志

        //0 bit 0 - 系統為你初始化通信接口 1 - 由驅動程式本身完成通信接口初始化

        //1 bit 0 - 無操作                  1 - 由驅動程式本身完成IO變量添加

        //2~31 bit 備用    

        public int AutoFlag;  

//通信方式                    

        public DeviceConnMode ConnMode;

        //64byte,裝置制造商

        public stringManufacturer;                

//32byte,裝置類型

        public string DeviceType;                  

        //裝置參數

//硬體端口名稱  空為無效項

        public string PortAddrExplain;            

//硬體端口預設值項選擇(如果有的話)用"|" 分隔開,預設項為第一個

        public string PortAddrValue;

//端口參數名稱  空為無效項              

        public string PortConfigExplain;           

  //端口參數預設值項選擇(如果有的話)用"|" 分隔開,預設項為第一個

        public string PortConfigValue;   

//裝置位址名稱  空為無效項       

        public string DeviceAddrExplain;

//裝置位址預設值項選擇(如果有的話)用"|" 分隔開,預設項為第一個          

        public string DeviceAddrValue;     

//裝置參數名稱  空為無效項      

        public string DeviceConfigExplain;

//裝置參數預設值項選擇(如果有的話)用"|" 分隔開,預設項為第一個

        public string DeviceConfigValue;          

        //項參數

//8*32 byte,連接配接項名稱

        public string[] ItemExplain;              

//8*4 byte 預設值項選擇(如果有的話)用"|" 分隔開,預設項為第一個

        public string[] ItemValue;                 

         //擴充配置資訊的長度如果為0,則表示沒有(上位機管理程式使用)

如果驅動程式提供的标準配置項,不足以配置驅動,則可以自行定制驅動配置頁,自行生成配置資料,驅動自行解析。

DriverInfo資訊類中的最後一項ConfigSize,就是定義該配置資訊的大小。驅動的執行個體類中會含有一個Config位元組數組,存放上位機管理程式配置的資訊。

(【接口說明】選項就是選擇該驅動後,自動出現的頁面,不過該頁面并沒有配置任何資料,僅僅起到提示說明的作用)

    public interface IConfig

        //建議面闆大小319*203

        Panel[]GetPanel(byte[] InitConfig,ConfigParameter parameter);

        byte[]GetConfig();

    public class ConfigParameter

        public string[] IODataNames;

        public string[] DeviceNames;

        public string[] StrategyNames;

        public object Sender;

上位機管理程式會向驅動配置面闆提供目前所有IO記憶體變量名稱,驅動名稱和政策名稱等等資訊。

驅動程式除了按設定的掃描時間周期執行外,還可以把掃描時間設定為0,表示不會自動運作。設定為該模式的驅動,一般被政策程式直接調用而得以執行。

另外驅動還可以設定為Disabled,這樣該驅動任何方式的調用将被禁止,如該驅動不存在一樣。

可以把YFIOs運作時想象成一個支援多任務的作業系統,這樣每個政策的OnRun接口,都可以當成一個程序的Main函數,唯一不同的是,這個Main函數被調用的機制多種多樣(參見政策執行模式)。

政策就是一段代碼,一段标準的.NETMicro Framework程式,可以根據項目的需求充分通路.NET Micro Framework已有的開發資源(如各類庫函數),編寫任意功能的代碼子產品。

    public interface IStrategy

        StrategyInfoGetStrategyInfo();

        intOnLoad(IOperate op, objectarg);

        intOnRun(IOperate op, StrategyModemode, object arg);

        intOnUnload(IOperate op, object arg);

政策程式必須要實作這四個函數接口,其中GetStrategyInfo僅供上位機配置程式調用。

(1)、GetDriverInfo – 傳回政策相關資訊(請參見2.5.3)。

(2)、OnLoad – 政策被加載時,将自動調用OnLoad方法。使用者可以在該函數内,完成一些初始化操作。

(3)、OnRun – 根據配置不同,該函數以事件、循環等等方式被系統自動調用。

(4)、OnUnload – 政策被解除安裝時,系統将調用OnUnload。(目前YFIOs系統不支援政策解除安裝)。

    public enum StrategyRunMode

        None = 0,      //無動作  

        Loop,          //循環執行

        System_Loop,   //系統循環執行

        //事件驅動

        Event_System_Launch_After,

        Event_System_Error_Process,

        Event_Driver_Run_Before,

        Event_Driver_Run_After,

和最初的定義的執行模式不同,新版政策執行子產品簡化了許多。

(1)            None – 政策定義為該模式,意味着需要其它政策來調用才能被執行。系統本身隻負責加載政策和調用政策的初始化接口,

(2)     Loop – 系統自動為政策建立一個線程,然後按指定的間隔,連續調用政策的OnRun的接口。

(3)     System_Loop – 系統不會另外為政策建立線程,而是在主線程裡(也就是Main函數中的while循環裡)不斷調用政策的OnRun接口,如果多個政策配置了該模式,則這些政策的OnRun接口将依次執行。建議包含界面的政策配置成這種執行模式,并且僅且隻有一個這樣的政策配置成這種模式。

(5)            Event_System_Launch_After – 政策将在YFIOs執行Launch函數之後執行。

(6)            Event_System_Error_Process – 當系統出現異常和錯誤的時候,将會自動調用配置為該模式的政策。

(7)            Event_Driver_Run_Before – 該政策執行模式需要指定關聯觸發的驅動,在系統調用驅動OnRun接口之前,會自動執行配置該模式的政策。注意,當政策調用DriverRun接口來執行驅動的OnRun函數時,該事件也會被觸發。

(8)            Event_Driver_Run_After – 和Event_Driver_Run_Before執行模式類似,隻是在調用驅動的OnRun接口之後,觸發該事件。

注意:政策并不僅支援一種政策執行模式,同一個政策可以配置多個執行模式,隻要符合條件,該政策将會被調用。

     政策除了按政策執行模式執行外,政策之間還可以互相調用,并且還可以直接調用指定名稱的驅動程式的接口函數。

    政策在配置的時候,也可以設定為Disabled,這樣該政策的所有接口将無法通路,和該政策不存在一樣。

    和驅動程式的擴充配置接口相同,請參見2.5.4項的介紹。

     public class ApplicationHead

        public string Flag = "YFIOs";         //标志 YFIOs 8 byte

        public uint Ver;                      //版本

        public uint ApplicationHeadSize;      //ApplicationHead大小

        public uint ChannelHeadSize;          //ChannelHead大小

        public uint DeviceHeadSize;           //DeviceHead大小

        public uint StrategyHeadSize;         //StrategyHeadSize大小

        public uint StrategyModeSize;         //StrategyModeSize大小

        public uint IOItemSize;               //IOItem大小

        public uint IODataSize;               //IOData大小 

        public string Name="";                //應用名稱  32 byte

        //伺服器URL,128byte 既可以是IP+端口模式 192.168.0.1:80 ,也可以是标準url格式

        public string Server = "http://192.168.1.100";          

        public int MaxDBCount = 256;          //IO資料最大條目數

        public int MaxBCCount = 8;            //IO資料塊最大個數

        public uint IODataCount;              //IO資料個數

        public uint ChannelCount;             //信道個數

        public uint StrategyCount;            //政策個數

        //總調試模式開關,驅動中的debugmode為單個控制     

        public uint DebugMode = 0xEC;       

        public uint ConfigSize;               //擴充配置資訊

   public class ChannelHead

{    

//禁止執行 0 - 允許執行 1 - 禁止執行

        public int Disabled; 

        //通道模式 0 - 分别打開端口 1 - 統一打開端口               

        public int ChannelMode = 0;

//通信方式

        public DeviceConnMode ConnMode;     

//端口位址 序列槽:1.序列槽:1...n 網絡:端口号 ...

        public int PortAddr;      

//32byte,端口參數  如序列槽:波特率,資料位,校驗方式,停止位如9600,N,8,1

        public string PortConfig; 

 //裝置個數

        public uint DeviceCount;

  }

     public class DeviceHead

    {       

        public int Disabled;                  //0- 執行 1 - 禁止執行不調用相關函數

        public string Name;                   //32byte,裝置名稱 

        public int AutoFlag;                  //自動化标志     

        public DeviceConnMode ConnMode;       //通信方式

        public int PortAddr;                   //端口位址 1.序列槽:1...n 網絡:端口号 ...

        public string PortConfig;             //32byte,端口參數

        public int DeviceAddr;                //裝置位址

        public string DeviceConfig;           //32byte,裝置參數

        public int Scantime;                  //掃描周期(ms) 如果為0,則禁止掃描

        public int Overtime;                  //逾時時間(ms)

        public int ErrorScantime;             //故障掃描周期(s

        public int ErrorMaxScantime;          //最長故障掃描周期(s)

        public int AcceptBufferLength;        //接收緩沖區大小

        public int SendBufferLength;          //發送緩沖區大小

        public int ReadDataBufferLength;      //一次從端口讀取的字元數

        public int DebugMode;                 //debug模式,控制驅動是否顯示一些調試資訊

        public uint IOItemCount;              //裝置連接配接項個數

        public uint PeSize;                   //pe檔案的大小

        public uint PeAddr;                   //pe檔案存放的位址(相對位址)     

  public class StrategyHead

        public int Disabled;                   //禁止執行,不調用相關函數

        public string Name;                    //32byte,政策名稱

        public uintModeCount;                 //政策運作模式個數

        public uint ConfigSize;                //擴充配置資訊

        public uint PeSize;                    //pe檔案的大小

        public uint PeAddr;                    //pe檔案存放的位址(相對位址)     

   public class IOItem

   {

      public string Name;                   //32byte,記憶體變量名稱(對數組,僅指數組名)

      public int[] Param = new int[8];      //中間傳遞變量,由驅動程式自己設定,自己解釋

   }

    public class IOData

        public string Name = "";        //32  資料名稱

        public string Type = "";        //2   資料類型 B布爾型 I整型 F浮點型 S 字元串

        public string Value = "";        //32 變量的值

        public string Comment = "";      //26 注釋

//2  讀寫模式 0 隻讀 1 隻寫 2 讀寫(自動讀) 3 讀

        public string RWMode = "";       寫(手動讀) 4-隻讀(手動)

//2  R自動讀 W 自動寫 r 手動讀 n讀不操作 N 寫不操作

        public string RWFlag = "";      

        public string LO = "";           //16  下限

        public string HO = "";           //16  上限

        public string DateTime = "";     //8  資料更新時間

<a href="http://v.youku.com/v_show/id_XNDg2MjMxODI4.html"></a>

<a href="http://v.youku.com/v_show/id_XNDg2MjM4MTQw.html"></a>

1、.NET Micro Framework官方網址

<a href="http://www.microsoft.com/netmf/default.mspx">http://www.microsoft.com/netmf/default.mspx</a>

2、.NET Micro Framework官方部落格

<a href="http://blogs.msdn.com/netmfteam/">http://blogs.msdn.com/netmfteam/</a>

3、中文部落格

<a href="http://blog.csdn.net/yefanqiu">http://blog.csdn.net/yefanqiu</a>

<a href="http://www.cnblogs.com/yefanqiu">http://www.cnblogs.com/yefanqiu</a>

4、葉帆科技

<a href="http://www.sky-walker.com.cn/">http://www.sky-walker.com.cn/</a>

5、物聯網中間件技術開發論壇

<a href="http://weibo.com/1804832611?s=6uyXnP"></a>

從2012-12-21起YFIOs和YFHMI将開展為期半年的免費試用活動,符合申請條件的使用者,将依次擷取YFIOs和YFHMI的試用機會。