下位机有下位机的语言

时间:2022-05-15 09:02:42

一、   网关的成果:承上启下

比来有点忙,更新慢了。感谢感动园友们给以的撑持,此刻github上已经有。方针是最好的开源组态,看来又近一步^^

之前有提到网关是物联网的关键环节,它的感化就是承上启下

下位机有下位机的语言,上位机有上位机的思路。网关就是一个翻译,把下位机的语言转成通用语,再报告上位机该怎么做。

这个翻译的过程,应该保证:

实时性。如果太慢,上下位机明显不同拍,就会出问题。

精确性。信号不能频繁丢掉、丢步、跳步;不能有太大误差;也不会带入太多滋扰和噪音。

不变性。如产生故障,如通讯断开,要能自动重连;要足够强壮,不会动辄瓦解;产生不测瓦解,要能自动重启;要有容错机制和错误日志;等等。

要实现这些指标,还是很有挑战的。

二、   通讯底本:OPC规范

网关看上去是个很玄奥的对象,网上找来很多相关资料,发明都集中到一个点:OPC规范。

OPC就如一盏明灯,,照亮了前进的标的目的。OPC规范是大家手笔,集中了业界专家的智慧,站在巨人的肩膀上,可以少走很多弯路。

OPC规范界说了数据的收罗、归档、报警以及完整的接口示范。

OPC数据收罗规范,包罗了这样一些重要观点:

数据读写方法包孕下位机批量推送数据、上位机单独读写数据。

可以异步读写,也可以同步读写。

数据包孕元数据(数据的属性,如数据类型、长度、名称等)和过程数据(ID、数值、时间戳、质量戳)。

包罗驱动(Driver)-组(Group)-变量(Item)的三级架构。可以对变量按需分组,有的组只读,有的组需要1秒刷新一次,有的只要5分钟就可以,要加以区别以提高效率。

要能判断驱动措施是否断线、要供给断线或*的事件提供用措施措置惩罚惩罚。

  

下位机有下位机的语言

总之,信息量很丰富,启发很大,我的网关措施很洪流平上都参考了OPC规范。

但是OPC有它固有的缺陷:依赖微软的COM组件技术,不能跨平台,同时COM是一种过时的技术,在差别主机上通讯的配置十分繁琐且不安适。

因此,我改革实现了本身的类OPC处事器。根基通讯过程是:批量轮询下位机-与上个周期的数据比对-提取变革的数据-批量推送给上位机

三、   与下位机通讯:批量轮询

下位机的特点-为什么要给与轮询

下位机通讯的特点:

下位机很多给与主-从模式。即主机发送的信息可以传送到各个从机或指定的从机,而各个从机的信息只能发送给主机。主机给与盘问方法接收发送数据,从机给与中断方法接收发送数据。这种模式天然适合轮询。

下位机大都只有一个通信口,有些还是串口,天然不适合推送模式。

下位机很多是单片机,订阅-颁布模式往往逻辑较为庞大,措施编写难度大,对芯片及存储要求也一定提高。因此给与这种模式的下位机目前极少。

轮询就是网关作为主机,按期请求下位机的数据。如果实现批量请求,减少往返,轮询的效率并不低。几千个变量轮询周期500毫秒(西门子),无压力。

轮询是以组(Group)为单位的。Group都担任自IGroup 接口:  

public interface IGroup : IDisposable { bool IsActive { get; set; } short ID { get; } int UpdateRate { get; set; } float DeadBand { get; set; } string Name { get; set; } IDriver Parent { get; } IDataServer Server { get; } IEnumerable<ITag> Items { get; } bool AddItems(IList<TagMetaData> items); bool AddTags(IEnumerable<ITag> tags); bool RemoveItems(params ITag[] items); bool SetActiveState(bool active, params short[] items); ITag FindItemByAddress(DeviceAddress addr); HistoryData[] BatchRead(DataSource source, bool isSync, params ITag[] itemArray); int BatchWrite(SortedDictionary<ITag, object> items, bool isSync = true); ItemData<int> ReadInt32(DeviceAddress address, DataSource source = DataSource.Cache); ItemData<short> ReadInt16(DeviceAddress address, DataSource source = DataSource.Cache); ItemData<byte> ReadByte(DeviceAddress address, DataSource source = DataSource.Cache); ItemData<float> ReadFloat(DeviceAddress address, DataSource source = DataSource.Cache); ItemData<bool> ReadBool(DeviceAddress address, DataSource source = DataSource.Cache); ItemData<string> ReadString(DeviceAddress address, DataSource source = DataSource.Cache); int WriteInt32(DeviceAddress address, int value); int WriteInt16(DeviceAddress address, short value); int WriteFloat(DeviceAddress address, float value); int WriteString(DeviceAddress address, string value); int WriteBit(DeviceAddress address, bool value); int WriteBits(DeviceAddress address, byte value); event DataChangeEventHandler DataChange; }

此中,UpdateRate就是轮询周期。DeadBand是死区。死区代表敏感度,设的小敏感度高,但也带来更多的噪声。