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>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的試用機會。