SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf

1.1    开发准备

把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录。开发包文件包括如下图:

SuperIO.dll是软件平台的核心模块, SuperIO目录是软件平台的参数配制、数据存储的目录。

1.2    项目配制

1)目标框架选择Framework4.0

2)生成的目标平台采用x86

所有事例程序的目标平台采用x86。主要考虑到32位操作系统与64操作系统的兼容性。

1.3    假定通讯协议

1.3.1    发送读实时数据命令协议

计算机发送0x61指令为读实时数据命令,共发送6个字节,校验和为从“从机地址”开始的累加和,不包括“数据报头”、“校验和”和“协议结束”。

发送指令数据帧如下:

1.3.2    解析实时数据协议

下位机接收到读实时数据命令后,并校验成功,返回实时数据,校验和为从“从机地址”开始的累加和,不包括“数据报头”、“校验和”和“协议结束”。

接收数据帧如下:

1.3.3    发送和接收数据事例

发送(十六进制):0x55 0xaa 0x00 0x61 0x61 0x0d

接收(十六进制):0x55 0xaa 0x00 0x61 0x43 0x7a 0x00 0x00 0x43 0xb4 0x15 0x0d

流量数据为:250.00

信号数据为:360.00

1.4    新建设备模块

如下图:

增加对SuperIO.dll的引用,如下图:

项目的配制请参见:1.2项目配制。

1.5    构建协议驱动

新建两个类:MySendProtocol 和MyReceiveProtocol,MySendProtocol继承SCL.Device.DeviceSendProtocol基类,MyReceiveProtocol类继承SCL.Device.DeviceReceiveProtocol。

MySendProtocol 和MyReceiveProtocol两个类都重写(override)“Function61”函数,MySendProtocol类中的Function61函数完成打包发送命令操作,MyReceiveProtocol类中的Function61函数完成解析数据操作,FunctionXX在两个类中都会成对出现,主要是为了好记。

在MySendProtocol实例中可以调用DriverFunction函数,传入相应的命令,例如:0x61。会自动调用“Function61”函数,作为调用相应命令函数的驱动接口。GetSendCmdBytes函数接口是在DriverFunction函数基础上封装的,同样也可以使用,但是要把“isbox“设置成false,否则会对发送的数据做特殊的处理。

在MyReceiveProtocol实例中可以调用DriverFunction函数,传入相应的命令,例如:0x61。会自动调用“Function61”函数,作为调用相应命令函数的驱动接口。GetAnalysisData函数是在DriverFunction函数基础上封装的,同样可以使用,只是多调用了一层GetCommand函数接口。

具体代码请参见:DeviceDemo项目。

1.6    构建参数和实时数据实例类

新建两个类:MyDeviceParameter和MyDeviceRTDataMyDeviceParameter继承SCL.Device.DeviceParameter类,用于保存备参数,可以在此类中增加新的设备参数。

MyDeviceRTData继承SCL.Device.DeviceRealTimeData类,用于保存设备的实时数据,可以根据通讯协议自定义设备的实时数据。

这两个类继承基类后会自动继承SaveSerialize和GetSerialize两个泛型函数,SaveSerialize函数是把当前对象序列化成XML,GetSerialize是把序列化的XML反向生成对象实例。

SCL.Device.DeviceParameter类和SCL.Device.DeviceRealTimeData类是继承自SerializeOperation类,他们的接口是IserializeOperation,SerializeOperation只是一个简单的序列化XML操作类库。

如果开发者想完全自定义一个数据持久文件,那么可以继承IserializeOperation接口,重写相应的接口函数,自定义存储数据的方式。

1.7    构建设备驱动

“构建协议驱动”和“构建参数和实时数据实例类”两节都是为构建运行设备做的前期准备,将作为运行设备的属性。

新建一个设备类:MyDevice,它继承自SCL.Device.RunSCLDevice1。

开发者注意到还有一个SCL.Device.RunSCLDevice类,它是比较早的运行设备类,考虑的平台的兼容性,现在还在继承使用,但是新开发的设备模型不建议使用SCL.Device.RunSCLDevice类。

它们都是继承自IRunSCLDevice接口。

1.7.1    常用接口

1)         public override
SCL.ProtocolDriver.ISendProtocol SendProtocol

把写好的发送协议类实例化之后,在此返回。例如:MySendProtocol类。

2)         public override
SCL.ProtocolDriver.IReceiveProtocol ReceiveProtocol

把写好的接收协议类实例化之后,在此返回。例如:MyReceiveProtocol类。

3)         public override
SCL.Device.IDeviceParameter DeviceParameter

把写好的设备参数类实例化之后,在此返回。例如:MyDeviceParameter类。

4)         public override
SCL.Device.IDeviceRealTimeData DeviceRealTimeData

把写好的实时数据类实例化之后,在此返回。例如:MyDeviceRTData类。

5)         public override void
InitDevice(int devid)

初始化设备,可以在这里对发送协议、接收协议、设备参数和实时数据等信息进行初始化。

6)         public override byte[]
GetRealTimeCommand()

这个类是返回读实时数据命令,当CommandCache命令缓冲区中有可发送命令的时候,优先读、发送取命令缓冲区中的命令数据;如果CommandCache命令缓冲区没有数据的时候,软件平台会自动调用GetRealTimeCommand函数接口,返回读实时数据命令,进行发送。

7)         public override void
DealData(byte[] data)

当通讯正常时,软件平台会把接收到的数据自动传入到这个函数,可以调用ReceiveProtocol属性进行解析数据以及处理、分析、保存。通讯正常与否和接收协议类中CheckData函数接口有关。

8)         public override void
UnRegDevice()

当软件平台没有注册的时候,软件平台会调用这个函数。

9)         public override void UnknownIO()

当通讯链路为null的时候,软件平台会调用这个函数。例如:串口未打开、网络没有连接等。

10)     public override void
CommunicateChanged(SCL.Device.IOState ioState)

当通讯状态发送改变的时候,软件平台会调用这个函数。通讯状态包括:通讯正常、通讯中断和通讯干扰。

11)     public override void
CommunicateError()

当通讯干扰的时候,软件平台会调用这个函数。通讯正常与否和接收协议类中CheckData函数接口有关。

12)     public override void
CommunicateInterrupt()

当通讯中断的时候,软件平台会调用这个函数。通讯正常与否和接收协议类中CheckData函数接口有关。

13)     public override void
CommunicateNone()

当未知通讯状态的时候,软件平台会调用这个函数。一般情况下不会出现此类情况。

14)     public override void SaveData()

对处理的数据进行保存。

15)     public override void Alert()

判断数据是否异常,如果出现异常数据,在进行报警处理。

16)     public override void ShowData()

显示数据处理,用于更新设备运行器,以及自定义UI和导出数据。

17)     public override void
DeviceTimer()

每个设备会分配一个定时器,默认1秒钟调用一次这个函数。可以通讯IsStartTimer属性启动、停止定时器,通过TimerInterval属性设置定时器执行间隔。

18)     public override
SCL.Device.DeviceType DeviceType

返回设备类型,设备类型包括:普通设备、虚拟设备以及其他。

19)     public override
s y s t e m.Windows.Forms.Control DeviceGraphics

返回设备图形化界面。

20)     public override void
ShowContextMenu()

显示上下文菜单函数。

21)     public override string
ModelNumber

返回设备模块编号,也就是设备的型号,这个编号尽量要求不能重复。

24)public void ShowMonitorIODialog();

显示通道监视器窗口

25)public void
ShowMonitorIOData(byte[] data, string desc);

向运行监视器中显示数据信息

1.7.2    属性说明

下面是设备具有的属性,请参考。

1)         UserLevel

用户级别属性,包括:未知用户、普通用户、低级用户和高级用户等四个级别。

2)         IsStartTimer

获得或设置是否开启当前设备的时钟,默认不开启。

3)         TimerInterval

获得或设置当前设备时钟的间隔时间,默认为1秒。

4)         IsRegLicense

获得或设备当前设备是否被注册,默认不注册。

5)         RunDevicePriority

获得或设置当前设备运行级别,分为:普通和优先。如果为优先级别,则先调用该进行发送和接收数据。

6)         CommunicationType

获得或设置当前设备的通讯类型。包括:串口和网络两种。

7)         CommandCache

获得或设置当前设备命令缓冲,如果有要发送的数据,则优先调用命令缓冲的数据进行发送。

8)         IsRunDevice

获得或设置是否运行当前设备,如果设置false,当前设置不参加运行(发送和接收数据)。

9)         DeviceParameter.IsSaveOriginBytes

标识是否保存原始发送和接收的字节数据,如果保存,默认保存路径在D盘。

10)      object Tag

临时标记属性。

11)      object SyncLock

同步锁对象

1.7.3    事件说明

以下设备事件都是在原有事件的基础上进行封装的函数,开发者可以直

接调用以下触发事件的函数,软件平台在启动的时候已经默认加载了这些事件。

1)         void OnReceiveDataHandler(byte[]
revdata);

触发接收数据事件

2)         void OnSendDataHandler(byte[]
senddata);

触发发送数据事件,当网络通讯的时候,应用Self模式的时候,可以通过这个事件自主发送数据。

3)         void OnDeviceRuningLogHandler(string
statetext);

把设备运行日志输出到运行监视器

4)         void OnUpdateContainerHandler();

触发更新运行监视器事件

5)         void OnCOMParameterExchangeHandler(int
oldcom, int oldbaud, int newcom, int newbaud);

串口改变事件。

6)         void OnDeviceObjectChangeHandler(object
obj);

对象数据改变事件,用于驱动显示、导出、服务等模块。

7)         void OnDeleteDeviceHandler();

删除设备事件

1.7.4    高级应用

1)         void RunIODevice
(SCL.CommunicateController.IDeviceIO io)

可以重写这个函数,在这里改变设备运行的流程,根据CommunicationType属性指定的通讯类型,可以把io参数转换为网络通讯接口ISocket或串口通讯接口ICOM,之后可以有针对性的对发送操作和接收操作进行二次开发。一般不建议重写这个函数。

2)         void Send(SCL.CommunicateController.IDeviceIO
io, byte[] sendbytes)

可以重写这个函数,根据CommunicationType属性指定的通讯类型,可以把io参数转换为网络通讯接口ISocket或串口通讯接口ICOM,进行发送数据操作。在不重写RunDevice函数的情况下,在合适的应用场景可以重写这个函数。

3)         byte[] Receive(SCL.CommunicateController.IDeviceIO
io)

可以重写这个函数,根据CommunicationType属性指定的通讯类型,可以把io参数转换为网络通讯接口ISocket或串口通讯接口ICOM,进行接收数据操作。在不重写RunDevice函数的情况下,在合适的应用场景可以重写这个函数。

4)         void SaveBytes(byte[] data,
string desc)

可以重写这个函数,对发送的数据和接收的数据进行自定义保存。默认保存在"d:软件平台 原始数据"目录下。

5)         void SocketConnect(string ip,
int port)

可以重写这个函数,当网络通讯的时候,有客户端连接到软件平台会调用这个函数接口。

6)         void SocketDisconnect(string
ip, int port)

可以重写这个函数,当网络通讯的时候,有客户端与软件平台断开会调用这个函数接口。

1.8    设备调试

1.8.1    界面方式调度

界面方式测试主要是构建一个主程序,模拟真实的应用程序对设备进行

测试。推荐使用这种测试方法。

1)  引用组件

主要引用DeviceDemo程序集。如下图:

测试设备

界面方式测试是有窗体界面的,必须继承“SCL.UI .MainForm”类,并用代码把软件平台设置成调试模式“SuperIO.Device.DebugDevice.IsDebug = true;”,如图:

在Form_Load中初始化实例,并且加载调试设备模块,主要是创建设备实例、初始化参数、进行设备调试,如:this.DebugDevice((IRunDevice)_myDevice)语句。如下图:

3)IO监测器,显示发送和接收的原始十六进制数据,便于调试。如下图:

4)用VirtualSerialPortDriver在本机虚拟出来两个串口,两个串口实现了虚拟连接,例如:COM1和COM2;打开串口助手软件和平台软件(SuperIO平台),分别设置COM1和COM2,按照“1.3假定通讯协议”发送和接收数据。相关软件在“辅助工具”目录里有。如下图:

具体测试代码,请参见:FormTest项目。

1.8.2    控制台方式调试

控制台测试,没有UI显示界面,部分功能可能测试不全。需要通过

SCL.Device.IdebugDevice
debug= SCL.Device.DebugDevice.GetDebugInstance()获得调试实例。其他代码与“界面方式测试”一样。如下图:

1.9    挂载设备模块

在“工业串口和网络软件通讯平台_SuperIO”目录下找到【ConfigTool.exe】应用程序,选择【设备配置】选卡,单击【挂载设备】按钮,把刚才开发的设备驱动模块挂载到平台下。如下图:

1.10    在平台下运行设备

把设备驱动挂载好之后,运行“工业串口和网络软件通讯平台_SuperIO”目录下的【SuperIO_Run.exe】应用程序,选择【用户管理】->【用户登陆】菜单,选择【工程师】或【管理员】用户,输入默认的密码:123。

登陆到软件平台后,选择【设备管理】->【增加设备】菜单,选择刚才挂载的设备驱动模块。如下图:

开发的好的设备驱动模块同时支持COM(串品)和TCP(网络)两种通讯方式,TCP(网络)通讯时支持Client和Server两种工作模式。

作者QQ:504547114

交流QQ群:54256083

官方网址:http://www.bmpj.net

源文章地址:http://www.bmpj.net/index.php?m=article&f=view&id=4

【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动的更多相关文章

  1. 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...

  2. 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己 ...

  3. 【工业串口和网络软件通讯平台(SuperIO)教程】五.二次开发图形显示界面

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    图形显示接口的作用 用于显示采集终端设备的数据,可以把不同类型设备的数据以多种形式集成显示在不 ...

  4. 【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    通讯机制说明 通讯的总体机制采用呼叫应答方式,就是上位机软件主动发送请求数据命令,下位机终端接 ...

  5. 【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制

    1.1    应用场景 通讯平台的交互对象包括两方面:第一.与硬件产品交互.第二.与软件产品交互.基本这两方面考虑,通讯平台一般会应用在两个场景: 1)通讯平台应用在PC机上 主要应用在自动站的工控机 ...

  6. 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分

    1.1    架构结构图 1.1.1    层次示意图 1.1.2    模型对象示意图 1.2    IO管理器 IO管理器是对串口和网络通讯链路的管理.调度.针对串口和网络通讯链路的特点,在IO管 ...

  7. 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    统一的IO接口 开发一套设备驱动同时具备串口和网络通讯能力,通讯接口在逻辑上是统一的,在此基础 ...

  8. 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程

    1.1    二次开发流程图 1.2    引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3    开发设备驱动模块 1.3.1    开发发送协议驱动 继承SuperIO.Devi ...

  9. 【发布】工业串口和网络软件通讯平台(SuperIO v2.2.4)

    SuperIO 下载:本站下载 百度网盘 更新说明: 1.修复无法把数据输出给IAppService的问题,以及无法触发删除操作事件. 2.侦听端口,可以设置. 3.设备接口,增加Object属性,方 ...

随机推荐

  1. .NET 基础 一步步 一幕幕 [前言]

    .NET 基础 一步步 一幕幕 [前言部分] 本人小白一枚,虽然说从去年就开通博客了,到现在也没有写多少东东,虽然工作了,也没有更好得总结.故此重新祭出博客园法宝,修炼技术,争取早日走上大神之位. 故 ...

  2. Xcode升级 Alcatraz 无法使用

    Alcatraz 主要是可以管理xcode 插件 随着 Xcode 的更新 Alcatraz 有可能无法使用 以下是解决办法: 1,关闭Xcode 2,如果已经安装过 Alcatraz,先卸载掉,然后 ...

  3. Java集合类的总结

    Java语言的java.until包中提供了一些集合类,这些集合类又被称为容器.说到集合就会想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本数据类型,集合从 ...

  4. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  5. KnockoutJS 3.X API 第六章 组件(3) 组件绑定

    组件绑定将指定的组件注入到元素中,并且可选地将参数传递给它. 本节目录 一个例子 API 组件生命周期 备注1:仅限模板组件 备注2:使用没有容器元素的组件 备注3:将标记传递给组件 处置和内存管理 ...

  6. iOS中通讯录的开发

    通讯录开发主要是获取用户手机中的联系人,进而可以在应用中添加好友 一 .如何访问通讯录 (1)在iOS9之前,有两个框架可以访问用户的通讯录 AddressBookUI.framework: 提供了联 ...

  7. WaitType:SOS_SCHEDULER_YIELD

    今天遇到一个query,处于SOS_SCHEDULER_YIELD 状态,physical IO 不增加,CPU的使用一直在增长.当一个sql query长时间处于SOS_SCHEDULER_YIEL ...

  8. LINQ系列:LINQ to XML操作

    LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...

  9. 关于HTML5 Audio线程问题

    移动端果然很坑! 在移动端IOS平台上用new Audio每次调用这个API都会创建一个新的线程,而且还不能销毁...直到拖死应用 后来改进了换了AudioContext,线程问题解决了 https: ...

  10. ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑

    上次搭建好了项目框架,但还是觉得不太对劲,后来才想起来没有对开发目标进行定位,这个小demo虽然不用做需求分析,但是要实现什么效果还得明确.后来想了一下就做个最简单的网站,目标定为小公司进行展示用的网 ...