你的位置:首页 > ASP.net教程

[ASP.net教程]【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动


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函数是把当前对象序列化成

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

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

 

1.7    构建设备驱动

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

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

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

它们都是继承自IRunSCLDevice接口。

1.7.1    常用接口

1)         public overrideSCL.ProtocolDriver.ISendProtocol SendProtocol

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

 

2)         public overrideSCL.ProtocolDriver.IReceiveProtocol ReceiveProtocol

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

 

3)         public overrideSCL.Device.IDeviceParameter DeviceParameter

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

 

4)         public overrideSCL.Device.IDeviceRealTimeData DeviceRealTimeData

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

 

5)         public override voidInitDevice(int devid)

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

 

6)         public override byte[]GetRealTimeCommand()

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

 

7)         public override voidDealData(byte[] data)

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

 

8)         public override voidUnRegDevice()

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

 

9)         public override void UnknownIO()

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

 

10)     public override voidCommunicateChanged(SCL.Device.IOState ioState)

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

 

11)     public override voidCommunicateError()

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

 

12)     public override voidCommunicateInterrupt()

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

 

13)     public override voidCommunicateNone()

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

 

14)     public override void SaveData()

对处理的数据进行保存。

 

15)     public override void Alert()

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

 

16)     public override void ShowData()

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

 

17)     public override voidDeviceTimer()

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

 

18)     public overrideSCL.Device.DeviceType DeviceType

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

 

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

返回设备图形化界面。

 

20)     public override voidShowContextMenu()

显示上下文菜单函数。

 

21)     public override stringModelNumber

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

 

24)public void ShowMonitorIODialog();

显示通道监视器窗口

 

25)public voidShowMonitorIOData(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(stringstatetext);

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

 

4)         void OnUpdateContainerHandler();

触发更新运行监视器事件

 

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

串口改变事件。

 

6)         void OnDeviceObjectChangeHandler(objectobj);

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

 

7)         void OnDeleteDeviceHandler();

删除设备事件

1.7.4    高级应用

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

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

 

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

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

 

3)         byte[] Receive(SCL.CommunicateController.IDeviceIOio)

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

 

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

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

 

5)         void SocketConnect(string ip,int port)

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

 

6)         void SocketDisconnect(stringip, 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.IdebugDevicedebug= 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