serversuperio分享终端控制传感器或设备形成回路控制的示例分析

发布时间:2021-09-17 10:39:34 作者:小新
来源:亿速云 阅读:118

这篇文章主要为大家展示了“serversuperio分享终端控制传感器或设备形成回路控制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“serversuperio分享终端控制传感器或设备形成回路控制的示例分析”这篇文章吧。

21.1     概述

ServerSuperIO以前所做的工作逐步为形成回路控制或级联控制打下基础,例如:服务连接器和设备驱动连接器的开发与应用。总之,是通过多种形式下发命令控制设备(驱动)或传感器,云端控制站点或监测点的传感器、App或者其他终端控制传感器、根据传感器的采集数据控制另一个传感器等。

下面介绍云端、App或者其他终端如何控制传感器设备(传感器控制传感器类似,请参见:12.服务接口的开发,以及与云端双向交互)。根据通讯协议,结构化方案、不需要太多代码即可完成相应的功能。效果如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

21.2     结构示意图

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

控制端发起控制命令,用ServerSuperIO服务接口开发一个简单的代理服务,通过服务连接器IServiceConnector接口与设备驱动进行交互,设备驱动接收到控制命令后下发给设备或传感器,等待控制返回的确认消息,再原路返回给控制端。

21.3     通讯协议

有人问为什么不使用MQTT协议,那如何兼容不同设备和传感器的协议?以于中国现实情况,显然还不能达到统一标准的水平,在经济不好的情况下,企业也不可能投资替换掉原来的硬件设备。也不符合ServerSuperIO设计的原则,就是要搞协议无关性,任何标准或非标准的协议都可以集成进来。如果想过一条河,把桥修好、把索道搭好、把船摆好…具体怎么过河由你自己决定。

有人问ServerSuperIO都集成了什么协议?上面已经给出了答案,另外我想说的是没有任何一个框架可以包治百病。从相反的角度来考虑,如果像组态一样把任何协议都加进来,企业又想拿出来多少的价值来对等交换呢,所以协议驱动还是交给大家来自己写吧。

我们演示的协议如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

21.4     控制端

控制端包括很多种:云端向下级发送控制命令、App或Pc机软件连接服务发送控制命令等等。发送控制命令如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

21.5     代理服务(SSIO服务接口)

代理服务是通过ServerSuperIO的IService接口实现,在继承类中使用ServerSuperIO框架本身的单例模式开发代理服务,代码如下:

public override void StartService()
        {
            string devId = "ControlDeviceService";
            Driver dev = new Driver();
            dev.ReceiveRequestInfos += Dev_ReceiveRequestInfos;
            dev.DeviceParameter.DeviceName = "控制设备驱动器";
            dev.DeviceParameter.DeviceAddr = 0;
            dev.DeviceParameter.DeviceID = devId;
            dev.DeviceParameter.DeviceCode = "";
            dev.DeviceDynamic.DeviceID = devId;
            dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev.DeviceParameter.NET.RemotePort = 9600;
            dev.DeviceParameter.NET.ControllerGroup = "LocalGroup";
            dev.CommunicateType = CommunicateType.NET;
            dev.Initialize(devId);

            IServer server = new ServerManager().CreateServer(new ServerConfig()
            {
                ServerName = "控制设备服务",
                ListenPort=6670,
                ComReadTimeout = 1000,
                ComWriteTimeout = 1000,
                NetReceiveTimeout = 1000,
                NetSendTimeout = 1000,
                ControlMode = ControlMode.Singleton,
                SocketMode = SocketMode.Tcp,
                StartReceiveDataFliter = false,
                ClearSocketSession = false,
                StartCheckPackageLength = false,
                CheckSameSocketSession = false,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.SocketConnected += server_SocketConnected;
            server.SocketClosed += server_SocketClosed;
            server.Start();

            server.AddDevice(dev);
        }

dev.ReceiveRequestInfos事件是控制驱动继承ServerSuperIO框架中RunDevice驱动类扩展的事件接口,ServerSuperIO单例模式接收到数据信息,如果符合协议标准会把数据信息反馈给驱动程序的Communicate接口,ReceiveRequestInfos事件把数据信息传递给代理服务订阅该事件的Dev_ReceiveRequestInfos函数。代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

代理服务中的Dev_ReceiveRequestInfos函数,通过服务连接器接口IServiceConnector,根据DeviceCode(addr)把信息传递给相应的设备驱动。代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

代理服务通过ServiceConnectorCallback和ServiceConnectorCallbackError函数接口接收设备驱动反馈的结果信息,如果中间出现异常会调用ServiceConnectorCallbackError,如果正常会调用ServiceConnectorCallback函数,ServiceConnectorCallback函数接口根据记录的命令与IO通道的对应关系,再把结果发送给控制端。ServiceConnectorCallback代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

在这里边有一个注意的地方,就是设备驱动在规定的时间内没有反馈控制命令的确认信息,也就是传感器没有反馈相应的信息。这种情况要增加一个定时检测服务,如果超时没有反馈信息,发送给控制端相应的消息。代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

21.6     设备驱动

这个设备驱动与传感器相对应,之间相互过行数据交互。设备驱动的RunServiceConnector接口负责接收代理服务Dev_ReceiveRequestInfos(OnServiceConnector)函数传递过来的命令信息。代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

有两点说明:1.接收到命令数据后可以通过OnSendData函数立即下发数据信息,以设置的IP查找相应的IO通道,适用于自控模式。2. 接收到命令数据后放到this.Protocol.SendCache协议缓存中,等待下发命令,适用于轮询、并发模式。

针对于返回的结果对象ServiceConnectorCallbackResult的isAsyn参数,如果为true,说明通过AsyncServiceConnectorCallback callback返回结果信息,也就是说要等待传感器返回确认信息,并且设备驱动接收后再反馈到代理服务;如果为false,说明会立即反馈到代理服务,适用于传递数据信息而不管与传感器是否交互成功。

可以在这个函数中把callback参数进行临时保存,等待传感器返回确认信息后在Communicate函数中触发异步回调到代理服务。代码如下图:

serversuperio分享终端控制传感器或设备形成回路控制的示例分析

以上是“serversuperio分享终端控制传感器或设备形成回路控制的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. 网络准入控制设备
  2. Nginx中信号控制的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

serversuperio

上一篇:ZooKeeper集群的安装、配置和高可用测试

下一篇:微软怎样能和本地应用一样处理URL协议

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》