工业树莓派访问过程映像数据的三种方式

RevolutionPi是一款基于树莓派计算模块进行工业级设计和封装的工业树莓派。RevPi的操作系统在Raspbian基础上进行了优化,给linux内核添加了RT实时补丁,以使得linux满足硬实时的需求。用户可以通过python等高级语言编写程序,并且可以通过存储器中的过程映像便捷的写入或者读取所有当前过程值。本文将介绍从过程映像中访问数据的三种方法:直接从文件中读取、ioctl以及revpimodio2模块。(以下示例均采用python代码)

1 设备配置

为了演示如何从过程映像中读取过程值,本文采用RevPi内置的虚拟Modbus TCP Master读取电脑模拟的Modbus TCP Slave的一个保持寄存器的值,并将其放入变量Input_Word_1中。其中变量Input_Word_1的值被放入过程映像中,下面将采用三种方法读取它的值。在此之前,首先使用piTest命令,查看Input_Word_1的当前值。


图0.1 Modbus TCP Slave寄存器配置


图0.2 Input_Word_1的值
0. 直接从文件中读取
直接从文件中读取数据,简单来说就是通过变量的参数offset和length,在过程映像文件中查找变量所在位置并读取,然后对读取到的数据进行解包即可。


图1.1 从文件中直接读取数据程序示例


图1.2 数据读取程序运行结果
当然,也可以直接对文件进行修改,为变量赋值。可以在RevPi的Modbus TCP Master中配置另一个任务,将Output_Word_1的值写入电脑模拟的Modbus TCP Slave寄存器中。下图展示了,如何通过python程序为Output_Word_1赋值。


图1.3 通过修改文件为变量赋值程序示例


图1.4 写入数据程序运行结果
通过这种方式读取和写入数据,过程不是很复杂,但问题在于需要提前知道变量的offset和length,这对于编程开发人员来说很不友好。我们希望的是直接通过变量名,而不需要知道变量的存储位置及长度,就可以对变量进行操作,下面一个方法将弥补这个缺点。

2 ioctl

在计算机中,ioctl(input/output control)是一个专用于设备输入输出操作的系统调用,该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。RevPi的系统中已经预定义好了一些ioctl功能,我们可以通过调用这些功能,获取变量的offset、length等信息,并读取数据。


图2.1 ioctl功能定义


图2.2 ioctl读取数据示例程序


图2.3 ioctl读取数据程序运行结果


图2.4 ioctl为变量赋值程序示例


图2.5 ioctl为变量赋值程序运行结果
实际上ioctl功能15和16主要用于长度为1bit的变量的读写,如果将其用于2byte的变量的读写,程序比较繁杂,且可能会带来其它问题。示例程序采用ioctl功能15和16读写变量数据仅仅是为了展示其功能,在实际使用时,通过ioctl功能17得到变量的offset之后,用f.seek()和f.read()以及f.write()实际上更方便。


图2.6 ioctl访问2byte数据示例程序


图2.7 ioctl访问2byte数据示例程序运行结果
虽然采用第二种方法,我们不再需要提前记住变量的offset,但这种程序比较繁杂,只是为了读取或者修改一个变量就需要很多代码。在实际开发中,这也会给开发人员带来很多困扰,那有没有一种更简单地方式让我们能够轻松便捷的控制变量呢?很幸运,确实有这样的方法,就是下面要介绍的第三种方法revpimodio2模块。

3 revpimodio2 模块

如前所述,如果要使用Python3编写程序,则可以使用FileHandler打开过程映像并读取/写入模块中的数据。但是,变量名称在那里不可用,必须在文件中搜索IO的各个位…计算…读取…写入…。这给开发人员带来很大的困扰,但这正是python3-revpimodio2发挥作用的地方!通过这个模块,可以为所有Python开发人员节省很多工作。与过程映像的所有通信均在模块内部执行。不仅如此,python3-revpimodio2还为开发者提供了一些其它功能,了解详细信息可以访问:https://revpimodio.org/en/homepage/。在这里,本文仅仅展示如何借助revpimodio2模块读取或写入变量。


图3.1 revpimodio2示例程序

图3.2 revpimodio2示例程序运行结果
可以看到,通过使用revpimodio2模块,我们可以很简单地读取和写入变量的值,所有与过程映像相关的操作都自动完成。需要注意的是对于Core模块,revpimodio2默认的io数据同步频率是25Hz,所以在向io变量写入数值之后,至少保证40ms内不退出程序运行,否则可能会导致写入失败,当然此循环时间可以自行更改。

4 总结

本文总结了三种访问过程映像的方法,对于大多数开发者来说,第三种方法已经足够了,而且操作相对其它两种方法来说十分便捷。本文介绍前两种方法的目的是让你能够更加深刻地理解RevPi中的过程映像的数据访问机制。当然,第三种方法也并非毫无缺点,相对来说调用revpimodio2模块进行数据访问的效率比起其它两种办法来说较低,开发者可根据自身项目的要求选择合适的方法。另外,关于revpimodio2的其它功能,本文在此不再深入介绍,作者将在另一篇文章中进行详细介绍,有兴趣的也可以访问revpimodio2官网深入了解。

这是一篇发布于 4年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


坐沙发

发表评论

你的邮件地址不会公开


*