第 3 课: KONNEKTING 的结构
1.CONNECTING KNX
在第 1 课的基本硬件连接第 2课的 KNX 收发器芯片BCU之后,第 3 课现在是关于 KONNEKTING 设备项目的结构。
一句话KONNEKTING是一种DIY KNX系统的软件,通过KNX系统库可以构建实现相应供能knx硬件。
首先,KONNEKTING 旨在设计一种 KNX“设备”——与其他 KNX 设备一样——可以通过 KNX 总线进行编程/调整。
KONNEKTING 试图尽可能接近 KNX ETS软件的流程和模式。
如果您想在 KNX 世界中安装新的 KNX 设备,您必须从设备制造商处以(自 ETS4 以来).knxprod 文件的形式获取产品数据库。您将设备本身连接到总线,在您的计算机上启动 ETS 软件并使用产品数据库文件添加设备。然后在 ETS 中设置设备的物理地址,根据自己的需要设置设备的参数,并将通信对象与组地址连接起来。然后按下设备上的编程按钮,开始在 ETS 中编程。完成的。
它与 KONNEKTING 的工作方式类似。但是,这里的“产品数据库”并不是一个.knxprod文件,而是一个以“.kdevice.xml”结尾的文件。您将 KONNEKTING 设备连接到总线,启动编程软件“ KONNEKTING Suite ”,使用 .kdevice.xml 文件添加新设备,根据自己的需要设置参数,将通讯对象与组地址连接。然后按下设备上的编程按钮,开始在套件中编程。完成的。
你注意到什么了吗?这与 ETS 中的工作方式完全相同。只有产品数据库有不同的结尾,套件使用它与 ETS 略有不同。
因此,一台 KONNEKTING 设备需要一个产品数据库。这对于 KONNEKTING用户来说已经足够了。但是如果要开发KONNEKTING 设备,则必须处理产品数据库 .kdevice.xml 的格式。
2. 身份证的事
与 ETS 一样,KONNEKTING 也有“设备制造商”。您不能将制造商 A 的产品数据库应用于制造商 B 的设备。为了确保这一点,设备以及产品数据库都知道它来自/为哪个制造商。简而言之:ID 必须存储在某处。KONNEKTING 也是如此。
每个设备都分配给一个制造商。并且每个设备也有一个“设备ID”和一个“修订版”。这是必要的,因此制造商 A 的产品数据库 X 不能在制造商 A 的设备 Y 上使用。如果设备 X 出现在一个新的改进版本中(例如,需要更改硬件),那么这里还必须确保设备 X 版本 1 不能与设备 X 版本 2 的产品数据库一起使用。
设备唯一身份标志:
- 制造商编号 ManufacturerId=“57005”
- 设备编号 DeviceId=“3”
- 修订序号 Revision=“0”
ID 是一个 16 位的值
并且这个3 元组 在设备和产品数据库中必须是已知的。
原则上,每个开发人员都可以考虑自己的 ID。但是,如果设备随后以开源/开放硬件 的方式在网络上“共享”,则很快就会出现 ID 冲突。
3 .kdevice.xml 格式
到目前为止,我们知道 KONNEKTING 的行为与 KNX/ETS 类似,并且需要类似的信息才能正确识别。
ETS 产品数据库格式 .knxprod 或多或少是一个伪装的 ZIP 文件,其中包含大量描述设备的相当复杂的XML文件。
不过也有基于.knxprod文件的制作方法等待时机成熟可以学习一下。
在 KONNEKTING,这更容易一些。产品数据库 .kdevice.xml 直接是一个“可读”的 XML 文件。理想情况下,他在为他的设备开发固件或草图之前执行此操作。
可以在此处找到包含示例元素的详细 .kdevice.xml 文档。
但让我们从一个简单的例子开始。我们想开发一种测量温度并定期将其发送到总线的设备。我们需要什么?
指定发送间隔的参数。未来的用户应该能够设置他希望多久查看一次总线上的温度值。
用户可以提供组地址并用于发送温度值的通信对象。
第 1 点非常简单。您必须考虑为此需要什么类型的数据。我们以数据类型“uint32”为例。所以“无符号整数32位”。或者简单地说:一个整数,长度为 32 位的正数值。也就是允许取值 0 到 4294967295 的数字类型。这应该足以存储两个温度读数之间等待的秒数。如果这对您来说太多了,只需使用 uint16 或 uint8。
注意:数据类型也是后来在 Arduino 代码中使用的类型。
如果您不知道如何处理 uint32、uint16、…,最好在这里阅读:Arduino - UnsignedInt
第 2 点稍微复杂一些。毕竟这是一个通讯对象(简称KO)。也许您已经从 ETS 知道您可以为 KO 设置“标志”。就像是
K-Flag (通讯)
L-Flag (读取)
S-Flag (写入)
Ü-Flag(发送)
A-Flag(更新)
根据这些标志的设置方式,KO 的行为会有所不同。总而言之,入门只有两个重要的星座:
传感器配置-> K+L+Ü
执行器配置 -> K+S+A
因此,当值更改时(传感器配置),KO 将数据发送到总线,或者 KO 等待来自总线的电报,以便设备可以对其执行某些操作,例如切换输出(参与者配置文件)。对于我们这里的示例,传感器配置文件是相关的。
最后但并非最不重要的一点是,您必须考虑 KO 具有哪种数据类型或 DPT。KNX 电报可以传输各种各样的信息。DPT1 例如用于切换过程,DPT9 用于温度之类的东西,…
在这里,您可以最好地了解 KNX 世界中用于 DPT 的类似/可比设备。相关信息可在设备的相应手册和产品数据库中找到。
以下 XML 示例(Beta4 Format!):
KONNEKTING_SimpleSensor.kconfig.xml文件
<KonnektingDevice xmlns="http://konnekting.de/xml/KonnektingDevice/v0">
<Device ManufacturerId="57005" DeviceId="3" Revision="0">
<ManufacturerName>KONNEKTING</ManufacturerName>
<DeviceName>SimpleSensor</DeviceName>
<Parameters>
<ParameterGroup Name="Temperatur" Id="0">
<Parameter Id="0" IdName="tempPollingTime">
<Description>Cycle [s]</Description>
<Value Type="uint32" Default="0000001E" Options="" Min="00000000" Max="000FFFFF"/>
</Parameter>
</ParameterGroup>
</Parameters>
<CommObjects>
<CommObject Id="0" IdName="tempValue">
<Name>Temperature</Name>
<Function>Value</Function>
<DataPointType>9.001</DataPointType>
<Flags>52</Flags>
</CommObject>
</CommObjects>
</Device>
<Configuration ManufacturerId="57005" DeviceId="3" Revision="0">
<IndividualAddress Address="1.1.3" Description="KONNEKTING SimpleSensor"/>
<CommObjectConfigurations>
<CommObjectConfiguration Id="0" GroupAddress="1/1/12" Description="WEMDU" active="true"/>
</CommObjectConfigurations>
<ParameterConfigurations>
<ParameterConfiguration Id="0" Value="00000005"/>
</ParameterConfigurations>
</Configuration>
</KonnektingDevice>
带有元素“Device”的行(元素在 XML 中称为由 <> 包围的部分)包含制造商 ID、设备 ID 和设备修订版的属性。属性在元素内使用AttributeName="AttributeValue"定义。
参数总是分配给一个组。这有助于处理许多参数。我们这里只有一个参数。我们将关联的组称为“温度”。出于“内部”目的,许多元素还具有“Id”属性。有关详细信息,请参阅详细文档。
然后参数在参数组内跟随。“描述”是参数的描述,因为它稍后会在KONNEKTING Suite中列出。
“价值”元素有点棘手。
在这里你必须指定参数类型(在我们的例子中是“uint32”)。为了套件为用户提供一个合理的默认值,你应该用“Default=”指定标准应该是什么。规范以十六进制进行符号!
同样,可以在套件中输入的最小值 (“Min=”) 和最大值 (“Max=”)。例如,如果您不想完全耗尽 uint32 数据类型的长度(最长为 4294967295),这将非常有用。然后套件不允许任何超出最小/最大范围的值。在此示例中,属性“Options=”不是必需的,并且保持为空(您当然可以在文档中找到有关此的更多详细信息…)。
KO 列在 CommObjects 元素中。每个 KO 都位于其自己的“CommObject”元素中。子元素“名称”和“功能”是准自由文本元素。在这里,您可以以文本形式指定 KO 的名称和功能。“DataPointType”表示KO的DPT。在示例“9.001”中,我们的温度值。最后但同样重要的是,“标志”元素。这在细节上有点棘手。但由于我们这里主要只有两个“配置文件”,因此您可以为传感器 KO 输入 52 或为执行器 KO 输入 42。您猜对了,可以在文档中找到有关如何获取这些数字的详细信息。
XML 就是这样。还有一些其他元素可用于限制 KO 和参数的可见性,具体取决于其他参数。但这与这么小的初学者示例无关,可以省略。
4. 还有什么?
套件中包含的工具可用于从 .kdevice.xml 生成头文件,该文件接管 Arduino 草图中用于参数和 KO 的必要代码部分。但这将在下一课中出现,即为设备编写 Arduino 草图。
5. XML标准解释
<?xml version="1.0" encoding="UTF-8" Standalone="yes"?>
<KonnektingDevice xmlns="http://konnekting.de/xml/KonnektingDevice/v0"
xmlns:xsi="http:// www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://konnekting.de/xml/KonnektingDevice/v0 http://konnekting.de/xml/KonnektingDevice/KonnektingDeviceV0.xsd">
<!--
在这里,您必须提供您的 ID 和设备版本。
这必须与您的 Arduino Sketch 中的定义相匹配。
否则编程失败。
ID 需要以无符号整数值的形式提供。
Revision = 通常为“1” (uint8)
您可以使用
0 表示开发阶段,
1 表示第一个版本,并且
每次更改都使用 2...255,这会破坏兼容性。
-->
<Device ManufacturerId="12345" DeviceId="123" Revision="123">
<!--
提供制造商名称和设备名称是可选的。
但如果没有,您的设备将不会在 KONNEKTING SUite 中显示供应商/名称
-->
<ManufacturerName>You Manufacturer Name您的制造商名称</ManufacturerName>
<DeviceName>Your Device Name您的设备名称</DeviceName>
<!--
如果您的设备需要用户应该能够配置的任何参数,
您必须将它们放在这里。
-->
<Parameters>
<!--
参数被分组。不允许有没有组的参数。
每个组都需要一个 ID 和可读名称。第一组必须有 Id="0"。
ID 必须以可读整数的形式提供,并且不能有 ID 间隔。
该名称显示在 KONNEKTING 套件中。
您可以拥有任意数量的组。好的,实际上限制是 256。
但这应该足够了。
-->
<ParameterGroup Name="A Parameter Group" Id="0">
<!--
每个参数都需要一个ID。第一个参数必须有 Id="0"。
ID 必须以可读整数形式提供。
您可以按任何顺序在组中分配参数。
重要的是:
- 如果您有参数,则必须有一个 Id="0" 的参数,
- 没有 Id-gaps
如果您有一个过时的参数:
- 将名称更改为“未使用”或“已弃用”或其他,
- 默认为 00,
- 最小值为 00 和
- 最大值为 00
这只会在你的草图中浪费你的 EEPROM 内存的一个字节。
IdName 是可选的,可以与 KONNEKTING 代码创建器一起使用以自动创建 Arduino 代码。确保 IdName 属性只有字母字符,没有空格、特殊字符等。
-->
<Parameter Id="0" IdName="aParameter">
<!-- 如果参数当然需要名称,您可以定义这里 -->
<Description>A Parameter 一个参数</Description>
<!--
除了名称之外,您必须至少提供:
- 类型:
数字参数的变量类型
uint8:无符号 8 位整数:0..255
int8:有符号 8 位整数:-128..127
uint16:无符号 16 位整数:0..65535
int16:有符号 16 位整数:-32768..32767
uint32:无符号 32 位整数:0..4294967295
int32:有符号 32 位整数:-2147483648..2147483647
还有是原始数据的一种类型,称为“原始”。这很有用
如果您有 IR 十六进制代码或 1-wire 序列号等参数。
套件将让您以 HEX 形式输入数据。
raw1:1 字节原始数据
raw2:2 字节原始数据
。
raw11:11 字节原始数据
string11:最大值。11 字节 ISO-8859-1 编码字符串/文本。未使用的尾随字符填充为 0x00
此属性是强制性的,并且 - 除了 DEFAULT - 没有其他可能的属性!
- 默认
默认值的十六进制表示,
根据给定的类型,包括。前导/尾随零,fi
一个 16 位类型需要四个十六进制字符: 00FF
一个 32 位类型需要八个十六进制字符: 000000FF
一个 11 字节字符串: 666F6F2062617200000000 ("foo bar")
这个属性是强制性的。
可选:
- 选项
如果要为参数显示一组选项,
可以使用“选项”属性。为此的价值
属性是一组“管道”分隔的值键对:
Options="value=key_1|value=key_2|value=key_n"
“键”是用户将在
KONNEKTING Suite 的下拉框中看到的内容,也称为“ value" 是内部将被选为
参数的值(如果选择)。
示例:您要为用户预设“启动延迟值”:
10ms、30ms、60ms、120ms、无延迟
那么选项可能如下所示:
Options="
您的 arduino 草图需要知道如何解释这些值,并且
02hex 值实际上意味着 60 毫秒,而 FFhex 意味着没有延迟。
- 最小值/最大值
只能在未设置选项属性且具有数字类型时使用。这将限制
用户在 Min 和 Max 之间输入的值。根据类型,提供的
值需要再次为十六进制,并带有前导零。
-->
<Value Type="uint8" Default="01" Options="" Min="00" Max="0A"/>
</Parameter>
<Parameter Id="1" IdName="anotherParameter">
<Description>Another Parameter另一个参数</Description>
<Value Type="int16" Default="0001" Options=""/>
</Parameter>
<Parameter Id="2 " IdName="yetAnotherParameter">
<Description>Yet Another Parameter又一个参数</Description>
<Value Type="uint8" Default="00" Options="00=10ms|01=30ms|02=60ms|04=120ms|FF=无延迟"/>
</Parameter>
<Parameter Id="3" IdName="activate1">
<Description>Activate 'Another Parameter'激活“另一个参数”</Description>
<Value Type="uint8" Default="01" Options="00=disabled|01=enabled"/>
</Parameter>
<Parameter Id="4" IdName="activate2">
<Description>Activate 'Another Parameter Group'激活“另一个参数组”</Description>
<Value Type="uint8" Default="01" Options="00=disabled|01 =enabled"/>
</Parameter>
<Parameter Id="5" IdName="activate3">
<Description>Activate 'My Second Com Object'</Description>
<Value Type="uint8" Default="01" Options="00=disabled|01=enabled"/>
</Parameter>
</ParameterGroup>
<ParameterGroup Id="1" Name="另一个参数组">
<ParameterId="6">
<Description>Another parameter in another parametergrou另一个参数组中的另一个参数</Description>
<Value Type="uint8" Default="02" Options="00=Aus|01=An|02=letzter Wert|04=Helligkeitswert"/>
</Parameter>
</ParameterGroup>
</Parameters>
<CommObjects>
<!--
一台普通的KNX设备应该至少有一个通讯对象。
与参数一样,ID 必须从 0 开始,并且不能有 ID 间隙。
comm 对象的最大数量为 256。Id 必须以可读整数的形式提供。
-->
<
<!-- 您应该提供一个合理的名称 -->
<Name>My First Com Object</Name>
<!-- 以及该 comm 对象的功能描述-->
<Function>Test-Function #1< /Function>
<!--
此处您必须提供此 CommObject
格式的数据点类型:
x.yyy
其中 x = 主类型编号,不带前导零
,yyy = 子类型编号,前导零最多可填充 3 个字符值 [0..999]。
-->
<DataPointType>1.001</DataPointType>
<!--
ComObj 通信标志。
“标志”是单个字节(整数值),
通过设置/取消设置该字节的单个位来指示 ComObj 的设置通信标志。
标志是:
C Communication
R Read
W Write
T Transmit
U Update
I Init
(有关标志的更多详细信息,请阅读:http://www.knx.org/fileadmin/template/documents/downloads_support_menu/KNX_tutor_seminar_page/Advanced_documentation/02_Flags_E1008a.pdf )
B7 B6 B5 B4 B3 B2 B1 B0(位号)
128 64 32 16 8 4 2 1(整数值)
xx xx CRWTUI(标志)
位 B6 和 B7 未使用。
常见标志组合:
*“传感器配置文件”-> C+R+T -> 32+16+4 = 52(整数值)
*“逻辑输入配置文件”-> C+W+U -> 32+8+2 = 42 (整数值)
-->
<Flags>52</Flags>
</CommObject>
<CommObject Id="1">
<Name>My Second Com Object 我的第二个 Com 对象</Name>
<Function>Test-Function #2</Function>
<DatPointType>1.001</DataPointType>
<Flags>42</Flags>
</CommObject>
</CommObjects>
<!--
如果要根据参数值隐藏CommObjects、Parametergroups或Parameters,
可以在这里定义依赖关系。
ParameterDependency:
一个参数的可见性取决于另一个参数的值
* ParamId 引用受影响的Parameter
ParameterGroupDependency:
CommObjectDependency:CommObject
的可见性取决于参数的值
* CommObjId 引用受影响的 CommObject
所有三种依赖类型都具有三个公共属性:
* 测试:
eq = 等于
ne = 不等于
gt = 大于
lt = 小于
ge = 大于或等于
le = 小于或等于
* TestParamId:为设置可见性而测试
其值的参数 * TestValue:测试参数的值
有一个限制:用作依赖项
的参数(=由 TestParamId 引用)需要参数类型“uint8”。不支持其他类型。
-->
<Dependencies>
<ParameterDependency ParamId="1" Test="eq" TestParamId="3" TestValue="01"/>
<ParameterGroupDependency ParamGroupId="1" Test="eq" TestParamId="4" TestValue=" 01"/>
<CommObjectDependency CommObjId="1" Test="eq" TestParamId="5" TestValue="01"/>
</Dependencies>
</Device>
</KonnektingDevice>