驱动开发指南
1. 驱动概述
和Windows或Linux等操作系统一样,要想让接入的硬件设备正常工作,必须有对应的设备驱动程序。
1.1 驱动类型
YFIOs®的驱动程序正常情况下,一个驱动程序对应一种设备。不过如果硬件有一定的兼容性,一个驱动程序也可以对应一类设备。
1.2 驱动特点
和传统的组态驱动不同,YFIOs®绝大多数驱动都不是通用驱动。
1.2.1 通用驱动 vs YFIOs驱动
通用驱动(如Modbus):
- 大多数厂家的智能设备都不同程度地支持
- 凡支持该协议的设备,都可以通过同一个设备驱动进行访问
- 唯一不同的就是设备地址、数据类型、起始地址和数据长度等参变量
YFIOs驱动:
- 支持IO变量自动添加
- 通信协议本身反而不那么重要
- 重要的是智能设备本身的"属性",比如温度、湿度、大气压等指标属性
1.2 面向对象设计
YFIOs®很早就采用面向对象的思想构建设备驱动,所以天然地和当前主流的物联网平台相匹配,从设备到云端都可以采用一致的物模型去构建物联网项目。
2. 驱动运行模式
2.1 周期执行模式
驱动程序按设定的扫描时间周期执行。
2.2 手动调用模式
把扫描时间设置为0,表示不会自动运行。设置为该模式的驱动,一般被策略程序直接调用而得以执行。
2.3 禁用模式
驱动还可以设置为Disabled,这样该驱动任何方式的调用将被禁止,如该驱动不存在一样。
3. 开发环境搭建
3.1 两种开发方式
有两种方法开发设备驱动:
方式1:YFIOs开发环境
针对Modbus或者CJ/188协议的智能设备,只需要简单的配置就可以自动生成对应的驱动。
方式2:Visual Studio开发
在Microsoft Visual Studio开发环境里进行开发。
3.2 YFIOs IDE环境
只要下载了YFIOs® Manager,打开运行后:
- 在菜单【工具】->【YFIOs开发环境】中就可以打开YFIOsIDE程序
- 或者在YFIOs Manager所在的目录下进入"Tools\F-YFIOsIDE"目录
- 可以看到"YFIOsIDE.exe",双击打开即可
3.3 Visual Studio环境
3.3.1 安装前提
需要先安装:
- Visual Studio 2010
- 安装时需要选择"Visual C# 2010"
- .NET Micro Framework SDK
3.3.2 安装YFIOs开发模板
下载地址:http://cloud.yfiot.com/file/YFIOs/YFIOsVS2010.rar
安装步骤:
-
下载YFIOsVS2010.rar后,解压到合适的目录
- 文件目录最好不要有中文,不要有空格
- 后续安装后不能移动
-
以管理员身份运行install_vs2010_template.exe
- 或在有超级用户权限的DOS命令窗口执行该命令
- 以便于查看调试信息
3.3.3 创建项目
安装完毕后,打开Microsoft Visual C# 2010学习版:
- 【文件】菜单下单击"新建项目"
- 弹出对话框
从上图可以看出YFIOs模板下,有两个模板:
- YFIOs Driver:驱动开发的模板
- YFIOs Strategy:策略开发的模板
4 Modbus驱动开发向导
4.1 开发流程
YFIOs IDE开发环境提供了Modbus驱动开发向导和CJ/188驱动开发向导。
我们以叶帆科技的YF3610-TH21温湿度传感器为例,进行驱动开发及网关接入。
第一步:获取设备说明书
对任何智能设备,第一步需要获取该设备的说明书,了解:
- 模块供电电压范围
- 电源和通信接线说明
第二步:获取通信协议
获得通信协议,了解:
- 通信参数
- 需要读取的数据的寄存器地址
第三步:设备接线
让YF3300和YF3610-TH21连接在一起。
第四步:使用向导开发驱动
运行YFIOsIDE程序:
- 在菜单【文件】下,单击"Modbus驱动开发向导"菜单项
- 在弹出的对话框中,根据通信协议的说明,填写和添加相关的选项
4.2 配置说明
基本信息
驱动名称、版本、作者、说明、制造商和设备类型根据实际进行填写即可。
注意:
- 填写什么没有硬性规定
- 只是驱动名称不要和已有的重复即可
IO变量配置
添加IO变量(物模型中的属性)这一步比较关键。
标识符最好和云端物模型保持一致,这样上传云端的时候,无需进行变量映射,就可以上传到物联网云平台了。
数据区域
数据区域选择保持寄存器(40000)。
一般情况下:
- 数据地址40001对应的数据地址为0
- 数据地址40002对应的数据地址为1
- 依次类推
数据类型
Modbus保持寄存器最小的数据单位就是字,也就是两字节:
- 无符号:一般选择UInt16
- 有符号:选择Int16
其它具体的类型就根据实际来进行选择了。
字节顺序
虽然Modbus协议规定是大端传输,高字节在前,但是很多智能设备虽然采用了Modbus协议,在IO数据这块并不一定严格遵守这个约定。
所以字节顺序可以依次验证一下,直到获取的数据和期望值一样,就可以了。
运算表达式
温度和湿度是含有一位小数的,这个需要驱动进行特别处理。
因为Int16的变量范围为-32768到32765,含一位小数,范围是-3276.8到3276.5,也满足温度(-40~1000°C)和湿度(0-100%)的需要。
所以运算表达式需要填写$Value/10.0:
$Value为获取的原始值- 除以10就是我们需要的最终值
4.3 编译和部署
编译驱动
如上,我们依次添加了温度T和湿度H选项,添加完毕后:
- 单击"编译"按钮
- 选定好输出目录
- 编译完毕后会输出两个文件:
- "YFTH21.dll"
- "YFTH21.pe"
安装驱动
把这两个文件拷贝到(或者一开始就输出到)YFIOsManager程序所在目录的"Driver"子目录下。
也可以在"Driver"目录下新建目录,然后拷入其中。
验证驱动
拷贝完毕后,重新启动YFIOsManager程序,可以在驱动列表中看到我们新添加的驱动YFTH21。
5 使用自定义驱动
5.1 添加用户设备
- 单击"用户设备"选项
- 然后双击"新建…"项
- 在弹出的用户设备对话框中,单击"..."按钮
- 添加一个基于YFTH21驱动的用户设备
5.2 配置设备参数
设置串口号
单击对话框框左下角的"设备接口表"按钮,设置串口号。
我们采用的网关是"YF3300",接入的是RS485接口,所以是COM2,双击该选项则会自动设置串口号为"COM2"。
设备名称和地址
- 设备名称:设置为"TH21",名称可以任意,只要和其它用户设备名称不重复即可
- 设备地址:设置为"253",这是叶帆科技智能设备默认的通用地址
如果RS485总线只有一个设备,可以直接设置为这个地址,否则就要设置该设备实际的地址。
串口参数采用默认值即可。
5.3 自动生成IO变量
单击"确定"按钮,则用户驱动完成创建。同时在数据配置中,自动生成IO数据变量。
- T和H就是我们在Modbus驱动开发向导中添加的
- Csr是驱动自动添加的,表示网关和YF3610-TH21温湿度传感器之间的通信成功率
- Commstate也是驱动自动添加的,表示智能设备的通信状态,比如0就是正常,非0就是异常
5.4 部署和监控
部署项目
- 单击菜单【调试】下的"部署"选项
- 或者直接单击工具条上的部署按钮
- 部署驱动及相关配置到YF3300网关
数据监控
部署成功重启后,单击"数据监控",就可以看到温度T和湿度H都有对应的值了。
6 调试技巧
6.1 启用调试模式
如果通信失败,我们也可以输出对应的调试信息进行调试。
步骤1:配置信息输出
- 双击"项目属性"
- 在弹出的对话框面板中,单击进入"信息输出控制"
- 勾选所有的选项
步骤2:启用DEBUG模式
- 单击"用户设备"
- 双击我们添加的用户驱动"TH21"
- 在弹出的对话框中,单击进入"其它"面板
- 勾选"DEBUG模块"
- 单击"确定"按钮关闭对话框
步骤3:重新部署
重新单击"部署"按钮向YF3300网关下载相关配置。
步骤4:查看调试信息
部署完毕重启后,在信息输出区,可以看到网关发出的命令帧及YF3610-TH21温湿度设备的响应帧了。
7. Visual Studio驱动开发
7.1 开发场景
如果基于Modbus或CJ/T188驱动开发向导无法满足驱动开发的需要,则就需要采用Visual Studio进行开发了。
7.2 创建项目
在VS2010中的YFIOs开发模板中,选择YFIOs Driver选项,项目名为"YFIOsDriver",打开后发现,已经有相关的模板代码了。
7.3 核心接口
所有的驱动类需要继承一个接口类:IDriver。
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);
}
驱动程序必须要实现这四个函数接口。
7.4 接口说明
GetDriverInfo
返回驱动相关信息(请参见DriverInfo驱动配置信息类)。
说明:仅供YFIOs Manager程序调用。
OnLoad
驱动被加载时,将自动调用OnLoad方法。用户可以在该函数内,完成一些初始化操作。
OnRun
根据配置不同,该函数按指定的时间间隔连续被系统调用。
说明:
- 如果时间间隔配置为0,则系统不会自动调用OnRun方法
- 同一个接口配置的驱动,将共享一个线程
- 系统将依次调用该方法
OnUnload
驱动被卸载时,系统将调用OnUnload。
注意:目前YFIOs系统不支持驱动卸载,所以该函数可以为空。
7.5 DriverInfo驱动配置信息类
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;
}
7.6 配置说明
该驱动配置信息类的配置信息主要供YFIOs Manager调用,YFIOs Manager根据这个配置:
- 自动生成驱动配置参数选项
- 生成相关配置信息
- 用户配置后,相关配置参数连同驱动程序一起被部署到网关设备里
8.最佳实践
驱动开发建议
- 优先使用向导:对于Modbus和CJ/T188协议设备,优先使用驱动开发向导
- 规范命名:驱动名称、变量名称要有意义,便于维护
- 充分测试:在不同环境下测试驱动稳定性
- 完善文档:为驱动编写详细的使用说明
调试技巧
- 使用DEBUG模式:查看通信数据帧
- 查看日志:分析运行日志定位问题
- 数据监控:实时监控变量值变化
- 逐步调试:先确保通信正常,再处理数据解析
性能优化
- 合理设置扫描周期:根据设备特性设置合适的扫描时间
- 优化数据解析:避免过于复杂的数据处理逻辑
- 错误处理:添加完善的错误处理机制
- 资源管理:合理使用内存和CPU资源