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

简介: SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    开发准备 把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录。开发包文件包括如下图:   SuperIO.dll是软件平台的核心模块, 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函数是把当前对象序列化成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

相关文章
|
19天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
46 11
|
18天前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
131 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
2天前
|
运维 监控 Cloud Native
构建深度可观测、可集成的网络智能运维平台
本文介绍了构建深度可观测、可集成的网络智能运维平台(简称NIS),旨在解决云上网络运维面临的复杂挑战。内容涵盖云网络运维的三大难题、打造云原生AIOps工具集的解决思路、可观测性对业务稳定的重要性,以及产品发布的亮点,包括流量分析NPM、网络架构巡检和自动化运维OpenAPI,助力客户实现自助运维与优化。
|
1天前
|
存储 监控 安全
网络设备日志记录
网络设备日志记录是追踪设备事件(如错误、警告、信息活动)的过程,帮助IT管理员进行故障排除和违规后分析。日志详细记录用户活动,涵盖登录、帐户创建及数据访问等。为优化日志记录,需启用日志功能、管理记录内容、区分常规与异常活动,并使用专用工具进行事件关联和分析。集中式日志记录解决方案可收集并统一管理来自多种设备和应用的日志,提供简化搜索、安全存储、主动监控和更好的事件可见性,增强网络安全。常用工具如EventLog Analyzer能灵活收集、存储和分析日志,确保高效管理。
|
18天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
44 11
|
26天前
|
5G 数据安全/隐私保护
如果已经链接了5Gwifi网络设备是否还能搜索到其他5Gwifi网络
当设备已经连接到一个5G Wi-Fi网络时,它仍然有能力搜索和发现其他可用的5G Wi-Fi网络。这里所说的“5G Wi-Fi”通常指的是运行在5GHz频段的Wi-Fi网络,而不是与移动通信中的5G网络(即第五代移动通信技术)混淆。
|
16天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
37 4
|
18天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
58 17
|
29天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
30天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
49 10

热门文章

最新文章