当前位置: 首页 > news >正文

hex文件修改_树莓派工控机RevPi(十一)自定义设备(RAP文件)

摘要:REVOLUTION PI  Family是基于树莓派的工业级工控机家族,型号和功能齐全,家族产品还包括现场总线各协议网关比如Profinet/EtherCAT/CANopen等,还包括DIO,AIO等模块。

与传统的树莓派相比是真正意义上适用于工业场合的模块,工作温度范围达到-40 ~55 °C,静电保护达到4 kV / 8 kV,且浪涌/爆裂测试以及EMI测试都达到了EN61131-2和IEC 61000-6-2标准的要求。  支持Node-RED,Python,或纯C等多种编程语言;支持通用的工业物联网(IIoT)协议,如MQTT和OPC UA;含两个以太网接口,其中一个可以通过Modbus TCP协议连接工业现场网络,另一个可以连接上级的IT系统或是云端服务器。

自定义设备(RAP文件)

要将自己的设备集成到PiCtory中时,你需要创建一个设备描述文件来告诉PiCtory你的设备具有哪些属性。该文件称为RAP文件(RevolutionPiAdapter Profile)。

要创建自己的RAP文件,需要以下工具:

   用于创建RAP文件的文本编辑器(例如Notepad ++)。

   用于验证RAP文件的JSONLint。JSONLint是一个免费的在线工具。http://pro.jsonlint.com

建议复制现有的RAP文件,并将其用作模板。在本示例中,我们将以RevPiTimer为模板进行操作。在操作之前先备份系统映像文件,以便出现错误时可以恢复备份。

下面开始正式操作。

先学习“FileZilla”软件。它用来在PC上处理RevPi模块内的文件。

打开软件之后点击此处开始添加一个新的连接。

ce7d47533d45feadfa33ad7df301eeb7.png

然后点击“新站点”,给新建的站点命名。

94bfd085cc3fa3c63fcd15c0eb4ffabb.png

在协议选项栏中选择“SFTP”,然后在右侧页面的“主机”栏中输入RevPiCore的IP地址。登录类型选择“正常”。在“用户”和”密码”栏输入登录RevPi Core的用户和密码信息。

f2c6852ed9d8ff54013a416c93cc876e.png

之后点击“连接”就可建立一个新的连接。连接建立成功后,在窗口的右侧显示的就是RevPi模块里的文件。在窗口左侧显示的是PC上的文件。

   进入RevPi Core上的“/ var / www / pictory/resources / data / rap”目录。这里存放的是PiCtory目录中的所有RAP文件。

双击RAP文件VirtTimer_20170208_1_0.rap将其复制到你的PC上。

8353df71ab13c6eec98be0130e3295b1.png

   为复制的RAP文件重命名为VirtTimer2_20170208_1_0.rap。

文件名的结构:

[名称] _ [时间戳] _ [主版本号] _ [次版本号].rap

例如:VirtTimer_20170208_1_0.rap

   在文本编辑器中打开你的RAP文件。如果使用的是Notepad ++,则可以将源语言切换为JSON。菜单 - >语言 - > JSON。

下面具体介绍一下RAP文件的语法。

RAP文件的语法是JSON格式。

下面列出了所有可用的属性:

ID

标题

描述/实例

类型

必要/可选

A

id

模块/设备的内部ID

String

必要

B

version

模块/设备版本

String

必要

C

comment

内部注释,例如用于解释

String-Array

可选

D

screencomment

设备类型的预置注释,显示在应用程序里的设备信息表的注释列中;可以由用户为每个设备更改

String

必要

E

size

扩展模块的宽度;可用于确定DIN导轨上是否有足够的空间

String

可选

F

devicetype

设备的定位类型;确定设备可插入的位置(请输入大写字母)
 BASE Core单元;必须先定位
 LEFT 模块只能位于Core单元的左侧
 RIGHT 模块只能位于Core单元的右侧
 LEFT_EDGE 模块只能位于最左侧
 RIGHT_EDGE 模块只能位于最右侧
 LEFT_RIGHT 模块可以位于BASE单元的左侧或右侧
 RIGHT_LEFT 模块可以位于BASE单元的左侧或右侧
 VIRTUAL 虚拟设备 - 自动放入虚拟设备区域。

String

必要

G

producttype

KUNBUS产品系列的单元号

Num

必要

H

input / output / memory

在操作期间修改的设备的实际操作数据(“属性”);数据声明由以下描述的值(H.1到H.12)组成。input,output和memory数组都必须存在于文件中,但允许为空([])。

Object-Array

必要

H.1

name

值的名称
 提醒:读取文件时,名称中的空格将被下划线替换!尽可能避免使用空格。

String

必要

H.2

type

DIN61131数据类型;例如BOOL,BYTE,WORD;用大写字母

String

必要

H.3

range

值输入的有效范围;基于不同的类型,可以生成合理性检查或预定义的下拉列表。每个“range”条目包含依照下例格式的两个子条目:
 "range":{
 "type":"tooltip_loop",
 "values":[0,1,1]
 }
 可用的type/values组合参见H.3.1至H.3.3

Object

必要

H.3.1

Range类型01:
 loop

根据“values”数组中定义的循环值创建一个下拉列表,例如"values":[0,10,1.5]创建一个下拉列表,其值为0到10,步长为1.5(0,1.5,3,4.5,6...等)

-

-

H.3.2

Range类型02:
 tooltip_loop

创建一个普通的文本输入字段,当鼠标置于此处时在提示框中显示有效值范围;在输入值之后检查值范围,如果输入错误,则生成错误消息。

-

-

H.3.3

Range类型03:
 list

用“values”数组中定义的常量生成下拉列表:
 "values":[
 "M01|1",
 "M02|2",
 "M03|3"
 ]
 “|”符号前面的条目在下拉框中显示为可读文本,“|”符号后面的条目将作为实际工作值导出。

-

-

H.4

default

属性的默认值;注意:请确保它在“range/values”定义的值范围内!当使用“list”range类型时,该值必须在'|'分隔符之后有定义!

String

必要

H.5

unit

描述属性值单位的文本字符串;出现在编辑列表的“Unit”列中;如果其为空,则将数据类型显示为单位。

String

可选

H.6

tags

属性的任意描述性文本标签;但是,至少必须指定属性区域(“input / output /  memory”)和属性的“type”(bool,byte,word等),用逗号分隔。
 注意:属性的范围和类型也可以在标记中存储,以便更轻松,更有效地处理RAP文件。但它们不应与属性区域/类型的内容相对立。

String

必要

H.7

edit

属性的编辑模式;确定用户可以输入或更改哪个部分;有效值是0-4之间的值
 0 既不能编辑属性的名称也不能编辑属性的值
 1 可以编辑属性的值
 2 可以编辑属性的名称
 3 可以编辑属性的名称和值
 4 值列不显示在编辑列表中(用于不应向用户显示的常量或不可更改的值)

String

必要

H.8

order

排序顺序,即在编辑列表中的相对位置;这里可以输入任何有间断的数值,然后执行升序排序,例如:10,20,25,99等。注意:不要使用两次相同值,否则排序将导致不可预测的结果。

Num

必要

H.9

offset

属性的内存偏移量;设备的第一个属性从‘0’开始;为了确保正确连续地分配偏移量,请根据值类型(“type”条目,例如BYTE)输入距离下一个属性的适当偏移距离,例如:
 "name":"Input01",
 "type":"WORD",
 "offset":0,
 :
 "name":"Input02",
 "type":"BYTE",
 "offset":2
 作为WORD型值,Input01占用字节0和1;因此,Input02的偏移量从字节2开始。

Num

必要

H.10

multi

从1到n的整数值;从该属性生成所需数量的多个属性(主要是为了省略许多相似或相关值的冗余数据录入);按顺序的编号将附加到属性的名称中,例如:
 "name":"Input01",
 "multi":3
 ...创建属性Input01_1到Input01_3。
 注意:
 如果未设置“multi”值,则默认值为1。
 如果没有为BOOL值定义“multi”值,则在内部读取RAP文件时,“multi”值会自动固定为“8”,以便将它们设置为字节限制。RAP文件中的“multi”值会覆盖此默认设置 - 需要确认仅定义“8”的倍数的值。

Num

可选

H.11

active

true或false;定义在读取RAP文件时是否考虑属性值。这使你可以完全停用属性值。

Bool

可选

H.12

export

true或false;确定编辑列表的“Export”列中该属性是否默认进行导出。

Bool

可选

I

colorEdit

#000000和#ffffff之间的十六进制颜色代码;为可编辑输入字段设置单独的背景颜色;如果此值不存在,则使用config.json文件中的默认值。("colors":{colorEdit...)

Hex-color

可选

J

colorReadOnly

#000000和#ffffff之间的十六进制颜色代码;为不可编辑(只读)输入字段设置单独的背景颜色;如果此值不存在,则使用config.json文件中的默认值。("colors":{colorReadOnly...)

Hex-color

可选

K

colorTextEdit

#000000和#ffffff之间的十六进制颜色代码;为可编辑输入字段设置单独的文本颜色;如果此值不存在,则使用config.json文件中的默认值。("colors":{colorTextEdit...)

Hex-color

可选

L

colorTextReadOnly

#000000和#ffffff之间的十六进制颜色代码;为不可编辑(只读)输入字段设置单独的文本颜色;如果此值不存在,则使用config.json文件中的默认值。("colors":{colorTextReadOnly...)

Hex-color

可选

M

Variant-specific

要创建变体层次结构,输入/输出条目后需要以下附加条目:
 "variants":[
 {
 "id":"Variante 001",
 "isDefault":true,
 "data":[
 :
 :
 变体“id”将显示在“PiCtory”的未来版本中,用于变体选择。在这里,你应输入具有唯一性的描述性文本。
 “isDefault”指定将RAP文件导入PiCtory后的默认变体。请注意定义的规则,并在设置'isDefault'时考虑它们。PiCtory目前仅在用户手动更改变体时才应用规则,并且无法解决与'isDefault'条目的矛盾!
 在“data”数组中,再次输入“normal”输入/输出属性,因为它们将在没有变体的情况下完成。
 注意:通过使用变体,输入/输出条目的类型从数组变为对象(矩形括号到大括号),例如:
 "input":[...
 变为
 "input":{...

Array

可选

N

lang

为了实现值显示的国际化,工作值的名称(标签)用作指向相应国家名称的指针。如果标签条目以前缀“lang_”开头,则将其解释为指针。如果没有此前缀,则值将按规定存储在显示中。
 例如:
 work unit:"lang_input":"8″
 国际化区域
 "lang":{
 {
 "de": {
 "input":"Eingang",
 "output":"Ausgang"
 },
 "en":{
 "input":"Input",
 "output":"Output"
 }
 }
 }
 如果设置了德语,则在值编辑器中进行渲染:
 Eingang:8

Object

可选

O

rules

包含输入和输出条目的RAP文件变体,可用于通过指定“rules”在输入和输出变体之间创建逻辑链接。一旦选择了变体,这会使“PiCtory”自动“同步”链接的变体。 例如:
 "rules":{
 "IO":[
 {
 "sync":[0,0]
 },
 {
 "sync":[1,1]
 }
 ]
 }
 在此示例中,链接了第0个输入和第0个输出变量,以及第1个输入和第1个输出变量。如果用户将输入更改为变量1,则“PiCtory”会自动将输出更改为变量1。如果输出重置为0,则输入自动跳回0。

Object

可选

P

include

要集成由外部配置工具创建的数据定义,还可以在运行时从外部文件中读取输入,输出和内存块的内容(PiCtory读取RAP文件时)。必须按如下方式对相应的块进行编码:
 "input":
 {
 "include":"[path to Include file]"
 }
 注意以下几点:
 包含文件的路径必须以物理和权限相关的方式定义,以便通过Ajax调用(Web服务器的用户上下文)访问它。
 包含文件的内容必须是JSON格式;它完全替换“input”对象块,这意味着它不只是被添加到“include”条目所在的对象块中。这意味着普通(非变体)内容的包含文件必须包含数组的方括号,例如:
 [
 {
 "name":"RevPiLED",
 "type":"BYTE",
 "offset":1,
 :
 :
 如果是变体定义,它必须如下所示:
 {
 "variants":[
 {
 "id":"001",
 "isDefault":true,
 :
 :

接着需要对RAP文件做一些调整。

为了避免你的RAP文件因为与现有文件重叠而出现错误,需要更改以下属性:

   id

一个尚未在PiCtory中分配的唯一的名称,本例修改为“VirtTimer2”。

   producttype

例如:32769

将product type更改为大于或等于32769的数字。此区域适用于非生产商提供的自编写的RAP文件。该数字不能是已经在PiCtory中分配的数字。因此,如果你编写了多个RAP文件,可以考虑为每个RAP文件中的producttype数字递增1。

2e61c28716dc4f3cabd0c953826b9818.png

修改完成后打开JSONLint网站。

   将文件内容从文本编辑器复制到浏览器窗口,然后单击相应按钮开始验证。

下面介绍如何将设备添加到设备目录。

PiCtory具有包含所有已知设备的树状结构。要包含一个新设备,你需要扩展以下文件:/var/www/pictory/resources/data/catalog.json。在这个文件里可以看到设备的分布子目录。

因此复制这个文件到你的电脑并用文本编辑器打开它。

cbcc17d6d68522bdedbdd05121d8ee92.png

复制一个虚拟设备行,例如下面这个虚拟设备:

{"key":"VirtTimer_20170208_1_0", "title": "RevPiTimer", "tooltip":"Weekly Timer", "icon": "##GSD_ICON_PATHNAME##" }

更改此行,使其与你的RAP文件匹配:

   key:没有文件扩展名的RAP文件的文件名。

   title:在已配置设备的列表中显示的名称。

   tooltip:当使用鼠标指向设备时显示的信息。

   icon:不用改变。

{"key":"VirtTimer2_20170208_1_0", "title": "RevPiTimer2","tooltip": "Weekly Timer", "icon":"##GSD_ICON_PATHNAME##" }

注意:在上一行设备描述的最后需要加上一个逗号。

6c11596f3dafe4b7bdd48bfb7d1a8a46.png

保存文件并使用JSONLint对其进行验证。

你可以为虚拟设备添加一个漂亮的图标,该图标将显示在PiCtory中。本示例使用以下文件作为模板:

/var/www/pictory/resources/images/devices/VirtTimer.png

c55baa082ff4638d3870631785dcf1eb.png

将此文件复制到你的PC并使用画图工具打开。在图片上添加一个数字2,来和已经存在的VirtTimer区别。

ad8464e681b2b60dae1c071db45760ee.png

然后将其保存在与RAP文件的“id”属性相对应的文件名下:VirtTimer2.png。

接着介绍如何导入新的RAP文件。

注意:在导入文件之前,请备份文件或系统,以便在出现错误时能够恢复可执行系统。

如果文件在语法上是正确的,就可以将它们复制回RevPi。在本示例中,这三个文件是:

   /var/www/pictory/resources/images/devices/VirtTimer2.png

   /var/www/pictory/resources/data/catalog.json

   /var/www/pictory/resources/data/rap/VirtTimer2_20170208_1_0.rap

最后测试你的设备是否成功创建了。

打开PiCtory并检查设备列表。现在应该能看到你新建的虚拟设备了。

2d3889e970724aef01dd64b10a26ae99.png

相关文章:

  • pop3通过时间或者条件取邮件_10 分钟实现 Spring Boot 发送邮件功能
  • 目标检测算法对比_目标检测算法Fast RCNN详解
  • 格式化字符串漏洞_二进制各种漏洞原理实战分析总结
  • python文件的建立方法_python 读写、创建 文件的方法(必看)
  • jdbc代码_JDBC详细整理(二)
  • python查看系统信息_python获取linux系统信息
  • 旋转数组中的最小元素 java_漫画:“旋转数组”中的二分查找
  • python面试自我介绍_2020马上到来,面试时如何自我介绍,备着呗
  • python导入鸢尾花数据集_决策树分类鸢尾花数据集python实现
  • 正向代理获取原始ip_Nginx的学习,反向代理和负载均衡
  • python打开excel执行vba代码_xlwings:操作Excel,通过宏调用Pyhton(VBA调Python)-Go语言中文社区...
  • 编写python程序的步骤_python socket通信程序编写步骤
  • postgresql 查询序列_PostgreSQL的Tuple内幕探索
  • 前端 post 提交时 数据量大 性能 ie很慢_前端面试题整理
  • python中各操作符的优先级_讲解Python中运算符使用时的优先级
  • 《剑指offer》分解让复杂问题更简单
  • 【技术性】Search知识
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • java2019面试题北京
  • js如何打印object对象
  • Logstash 参考指南(目录)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Next.js之基础概念(二)
  • Vim 折腾记
  • windows下如何用phpstorm同步测试服务器
  • 编写符合Python风格的对象
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 检测对象或数组
  • 今年的LC3大会没了?
  • 浏览器缓存机制分析
  • 每天10道Java面试题,跟我走,offer有!
  • 通信类
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • kubernetes资源对象--ingress
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #define用法
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (SpringBoot)第七章:SpringBoot日志文件
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二十四)Flask之flask-session组件
  • (三)模仿学习-Action数据的模仿
  • (十八)SpringBoot之发送QQ邮件
  • (新)网络工程师考点串讲与真题详解
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .htaccess 强制https 单独排除某个目录
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET Remoting学习笔记(三)信道
  • :O)修改linux硬件时间
  • @JsonSerialize注解的使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042