在工控领域,组态软件司空见惯,国外的iFix、InTouch、WinCC,国内的组态王、力控、MSCG等等。组态软件的出现完全解决了软件重复开发的问题,实现模块级复用,好处不只仅是提升了开发效率,下降了开发周期,更大的优点的是成熟模块的复用,大大提升了系统稳定性和可靠性。html
所谓组态(Configuration),就是模块化任意组合(相似积木玩具)。组态软件的主要特色有:ios
(1)、延展性。所谓延展性,就是系统的延续和易于扩展性,用组态软件开发的系统,当现场或用户需求发生改变时(包括硬件设备或系统结构的改变),用户无需作不少修改,就能够很方便地完成系统的升级和改造;算法
(2)、易用性。组态软件对底层功能都进行了模块级封装,对于用户,只需掌握简单的编程语言(内嵌的脚本语言,类Basic或类C语言),甚至不须要编程技术,就能很好地,经过组态配置的方式完成一个复杂系统的开发和集成;数据库
(3)、通用性。不一样用户根据系统的不一样,利用组态软件提供的I/O驱动(如PLC、仪表、板卡、智能模块、变频器等等驱动)、数据库和图元,就能完成一个具备动画、实时数据处理、历史数据和图表并存,且具备多媒体功能和网络功能的系统工程,不受领域或行业限制。编程
可是不管是基于PC平台的组态软件仍是基于ARM系统的嵌入式组态软件,其组态粒度都显过大,大部分经过串口、网口、CAN等通道把个系统模块链接在一块儿,在必定程度上增长了系统构建的成本和代价。windows
而以.NET Micro Framework为依托构建的轻量级嵌入式组态软件(YFIOs)就很好的解决了上述问题,除支持常规的串口、网口、CAN外,还支持USB、Wifi、ZigBee、SPI、I2C等通道,SPI、I2C片级总线的支持加上强大的托管代码(C#,VB.net)开发能力,使嵌入式硬件系统真正的组态化、模块化成为可能,这项技术的推出,无疑为快速打造形态万千,功能不一样的产品提供了最有力的支撑。数组
YFIOs就是YFSoft I/O Server的简称,在物联网、云计算时代,一切以数据为中心,不一样的传感器经过不一样的方式接入网络,经过云计算的方式为不一样的终端用户提供服务。网络
为了适应这种新形势的发展,加速和下降各类传感器、智能模块的入网代价,以微软成熟的.NET Micro Framework系统为基础,打造出物联网时代的轻量级嵌入式组态系统 —— YFIOs。架构
和传统组态或其余物联网、嵌入式等方案相比,有以下优点:app
(1)、组态式搭建系统,自动添加IO配置数据,驱动和策略开发接口对外开放;
(2)、支持远程升级,远程调试。
(3)、因为.NET Micro Framework的跨平台特性,因此基于该框架的YFIOs也能够跨平台应用。
(4)、采用Microsoft Visual Studio 2010模板进行驱动和策略进行C#开发,开发门槛较低,和windows平台的开发别无二致;
(5)、驱动和策略能够在Microsoft Visual Studio 2010开发环境中在线调试;
(6)、策略能够和驱动联动,不只能够直接调用驱动,还能够和驱动进行关联,事件触发的方式执行策略;
(7)、策略不只能够调用驱动,彼此之间还能够互相调用;
(8)、驱动和策略能够加密,也能够绑定指定硬件运行,不只能够保护用户的知识产权,还能够在此基础上为第三方客户提供增值服务。
(9)、运行时小巧轻便,不含YFHMI库的运行时仅19.2K,含MiniGUI、中文字库、四套图元库的运行时,也仅355K。
Microsoft .NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio的高生产率结合起来,以针对价格较低、资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Visual Studio工具来构建托管的嵌入式应用程序。2009年5月,.NET Micro Framework采用Apache 2.0 license,比Linux等开源软件更为完全的方式实现了源代码彻底开放。
.NET Micro Framework技术能够应用到:Sideshow、远程控制、智能家电、教育类机器、医疗电子、零售终端以及汽车电子等行业应用场景;此外因为.NET Micro Framework集成了各类接口,如串口、网口、Wifi、Zigbee、I2C、SPI、SDIO、USB等通讯接口,加上其应用开发简便,因此在物联网时代,将大有做为。
.NET Micro Framework对存储器和处理器的要求更低。开发人员能够在低功耗、低成本的ARM七、ARM九、Blackfin和Cortex-M3处理器上使用该框架(不须要MMU支持),所开发出来的软件仅须要几百Kbytes的RAM或Flash/ROM存储空间。而Windows Embedded CE的托管代码环境须要约10~12Mbytes的存储空间,基于.NET的应用编程设备只须要较少的存储空间,下降了产品成本。
做为.NET家族的一员,.NET Micro Framework是微软专门针对超轻量级平台设计的软件架构。与.NET Framework和.NET Compact Framework不一样的地方是,.NET Micro Framework具备自启动的特性,而且在HAL层,微软将操做系统的必要特性引入,如:启动管理、中断处理、线程调度、内存管理等。.NET Micro Framework能够单独使用,不须要依托其它操做系统,所以占用空间很小。
YFIOs由三大部分构成,一是YFIOs运行时,包含YFIODB、YFIOBC、驱动引擎和策略引擎四部分;二是应用模块,包含驱动、策略和IO数据三部分;三是YFIOs IDE环境(YFIOsManager),该工具和Microsoft Visual Studio开发工具一块儿共同完成驱动、策略的开发、配置及部署工做。
系统架构图和YFIOs和.NET Micro Framework 关系图(以下图所示):
YFIODB是一个在内存实现的数据库,主要存放IO数据,供驱动程序、策略程序直接访问,从而起到跨模块交换数据的目的。其IO数据通常可分两类,一种是内部IO数据,该类IO数据不绑定任何设备驱动,主要做为中间变量或临时变量来使用;另外一种是设备IO数据,该类IO数据和实际的驱动程序进行绑定,该IO数据的值映射驱动所对应的设备参变量的值。
序号 |
变量名称 |
长度 |
说明 |
1 |
Name |
32 |
变量的名称 |
2 |
Type |
2 |
数据类型 B布尔型 I整型 F浮点型 S 字符串 |
3 |
Value |
32 |
变量的值 |
4 |
Comment |
26 |
注释 |
5 |
RWMode |
2 |
读写类型 0 只读 1 只写 2 读写(自动读) 3 读写(手动读) 4-只读(手动) |
6 |
RWFlag |
2 |
R 自动读 W 自动写 r 手动读 n读不操做 N 写不操做 |
7 |
LO |
16 |
下限 |
8 |
HO |
16 |
上限 |
9 |
DateTime |
8 |
数据更新时YYYY(2B)MM(1B)DD(1B)HH(1B)mm(1B)SS(1B) |
统计 |
136 |
1000个点须要 约132.8 K Byte 的内存 |
YFIODB自己仅仅是一个数据库框架平台,并不包含以上的字段信息,也不包含任何数据。YFIOs启动后,会根据以上字段定义的信息,建立指定大小的内存数据库表,而且把预先定义好的内部IO变量和设备IO变量填充到内存数据库中去。
YFIODB访问接口被操做类接口(IOPerate)进一步封装,而操做类接口是驱动和策略标准函数接口的第一个参数,因此任何一个驱动和策略程序均可以操做YFIODB。
相关操做接口定义以下:
//读数据
string IORead(string name);
int IOReadInt(string name);
float IOReadFloat(string name);
//读数据(扩展方式 变量名.字段名)
string IOReadEx(string name);
//写数据(内部写)
int IOWrite(string name, string data);
int IOWrite(string name, int data);
int IOWrite(string name, float data);
//写数据(扩展方式 变量名.字段名)
int IOWriteEx(string name, string data);
//外部写(直接写变量)
int Extern_IOWrite(string name, string data);
//变量读写模式
string IOReadMode(string name);
须要说明的是,该接口提供的对YFIODB的写操做,并非直接对YFIODB数据库某表某字段,进行写操做,而是根据必定的逻辑算法,对各表项综合操做(注意:扩展方式写操做,是直接对表中具体的项直接进行操做的)。驱动函数要采用内部写模式,执行后,会自动复位“W”标志位,而对策略函数来讲,属于用户层面操做,因此要写YFIODB的时候,要采用外部写函数,执行后,函数会自动置位“W”标志位。
写YFIODB份内外的意义在于:策略函数仅仅是把变量的值写入数据库,而驱动才会真正的把该变量的值写入到实际的设备中去。而经过复位和置位“W”标志能够获知是否要写入到实际设备,或是否写入完成。
和YFIODB不一样,YFIOBC是用来供驱动程序和策略程序存储和交换大块数据而用的,如摄像头的图像数据。该结构设计的如同文件系统,可新建、删除和读写,其内容大小仅受设备内存的限制。
和操做YFIODB接口同样,操做YFIOBC的接口也封装到操做类接口(IOPerate)中,因此驱动和策略程序均可以操做YFIOBC。
操做接口定义以下:
//删除内存数据条目
int IOBC_Del(string name);
//size=0 打开,size>0 建立
int IOBC_Create(string name, uint size);
//获取指定条目所分配的内存大小
int IOBC_GetLength(int hander);
//读写偏移设置
int IOBC_Seek(int hander, int offset);
//读内存数据
int IOBC_Read(int hander, byte[] buffer, int offset, int count);
//写内存数据
int IOBC_Write(int hander, byte[] buffer, int offset, int count);
//关闭
int IOBC_Close(int hander);
该接口仿照文件操做方式进行操做,其做用相似Windows平台上的共享内存操做,读写都在内存中完成。
一个驱动程序可对应一种设备,也能够对应一类设备,关键在于设备支持的协议是私有的,仍是公开的,通常公开的协议,如Modbus,不一样厂家的通讯设备都有不一样程度的支持(好比支持3号或16号指令),凡支持该协议的设备,均可以经过同一个设备驱动进行访问,惟一不一样的就是设备地址、数据类型、起始地址和数据长度等参变量,咱们能够根据实际须要,相应配置便可。
public interface IDriver
{
DriverInfo GetDriverInfo();
int OnLoad(Device dv, IOperate op, object arg);
int OnRun(Device dv, IOperate op, object arg);
int OnUnload(Device dv, IOperate op, 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,
}
public class DriverInfo { //32byte,驱动名称(要保证惟一) public string Name; //16byte,版本信息 public string Ver; //64byte,说明 public string Explain; //16byte,开发者 public string Developer; //16byte,日期 public string Date; //自动化标志 //0 bit 0 - 系统为你初始化通讯接口 1 - 由驱动程序自己完成通讯接口初始化 //1 bit 0 - 无操做 1 - 由驱动程序自己完成IO变量添加 //2~31 bit 备用 public int AutoFlag; //通讯方式 public DeviceConnMode ConnMode; //64byte,设备制造商 public string Manufacturer; //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,则表示没有(上位机管理程序使用) public int ConfigSize; }
若是驱动程序提供的标准配置项,不足以配置驱动,则能够自行定制驱动配置页,自行生成配置数据,驱动自行解析。
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函数被调用的机制多种多样(参见策略执行模式)。
策略就是一段代码,一段标准的.NET Micro Framework程序,能够根据项目的需求充分访问.NET Micro Framework已有的开发资源(如各种库函数),编写任意功能的代码模块。
public interface IStrategy
{
StrategyInfo GetStrategyInfo();
int OnLoad(IOperate op, object arg);
int OnRun(IOperate op, StrategyMode mode, object arg);
int OnUnload(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_Before,
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接口将依次执行。建议包含界面的策略配置成这种执行模式,而且仅且只有一个这样的策略配置成这种模式。
(4) Event_System_Launch_Before – 配置为该模式,策略将在YFIOs执行Launch函数以前执行该策略。Launch函数执行的功能主要是初始化驱动、挂载驱动事件策略、建立线程执行驱动、初始化策略和建立线程执行策略。
(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项的介绍。
操做视频演示:http://v.youku.com/v_show/id_XNDkxMzgyNTgw.html
操做演示视频:http://v.youku.com/v_show/id_XNDg2MjMxODI4.html
设备运行视频:http://v.youku.com/v_show/id_XNDg2MjM4MTQw.html
一、.NET Micro Framework 官方网址
http://www.microsoft.com/netmf/default.mspx
二、.NET Micro Framework官方博客
http://blogs.msdn.com/netmfteam/
三、中文博客
http://www.cnblogs.com/yefanqiu
四、叶帆科技
五、物联网中间件技术开发论坛
从2012-12-21起YFIOs和YFHMI将开展为期半年的免费试用活动,符合申请条件的用户,将依次获取YFIOs和YFHMI的试用机会。
申请表下载:http://sky-walker.com.cn/MFRelease/document/yfios_yfhmi_application.doc