回到python的Optommp入门

关于Optommp数据软件包

Optommp是一种基于二进制的协议,需要在处理每个软件包中精确。结果,您应该在开始之前知道所需的软件包的格式,这从交易代码开始。

交易代码是通过您是阅读还是写入内存位置来确定,以及是否要使用4字节“ Quadlets”或N字节“块”。
使用这些属性选择以下七个软件包类型之一(请注意,没有代码3):

包装类型 代码 二进制 包装尺寸
写Quadlet请求 0 0000 16个字节
写块请求 1 0001 24个字节
写Quadlet或块响应 2 0010 12个字节
阅读Quadlet请求 4 0100 12个字节
读取块请求 5 0101 16个字节
读取四边形响应 6 0110 16个字节
读取块响应 7 0111 24个字节

检查读取块请求

确定事务代码后,请按照“自定义应用程序编程概述”部分所述的该软件包类型的特定语法OPTOMMP协议指南(表格1465)。这是该指南的片段,显示了逐个点故障之一,特别是读取块请求包结构:


灰色的区域代表未使用的位:destination_id,,,,source_id, 和Extended_tcode是完全未使用的字节,可以将所有八位设置为零。但是,重试代码RT占用两个未使用的位,与交易标签共享其余的字节TL,供请求者跟踪应用程序之间的交易。同样优先pri占用四个未使用的交易代码TCODE字节,该字节确定上述包装类型。为了处理这些未使用的区域,只需将未使用的字节设置为零,并将交易代码和交易标签都设置为弥补未使用的位。

  • 交易标签应由两个(Python操作)进行Bitshift<< 2
    这样一个标签1 = 0000 0001变成4 = 0000 0100

  • 交易代码应该用四个(Python操作)bitshift<< 4
    这样的代码5 = 0000 0101变成80 = 0101 0000

最佳

目的地偏移

软件包的教学内容包裹在目标偏移量中(如果提出书面请求,则在数据块中)。此偏移是您要访问某些地址的特定地址位置;例如,系统正常运行时间(MS)0xf030 010c。您可以使用PAC管理器查看所有固定地址,其中大多数是系统值,例如正常运行时间或固件详细信息。但是,物理数字和模拟点的地址尚未固定。他们的地址取决于您正在阅读的I/O模块。
您可以使用此公式来计算已安装的I/O模块上物理点的地址:

抵消=start_address+((module_no*mod_length+((channel_no*ch_length

… 在哪里start_address和每个长度是常数,基于访问区域的类型。例如,史诗般的数字通道读取区域开始0xF01E 0000,具有模块长度0x1000和通道长度0x40。例如,读取频道数字点的地址5模块1在史诗般的底盘上是:

抵消=0xF01E0000+((1*0x00001000+((5*0x00000040

…给出0xF01E1140。您将需要在开始地址和长度的启动地址和长度参考资料在本教程末尾链接。

现在已经找到或构建了此内存地址,必须将其存储在读取块请求的四个字节8-11中,作为单独的字节:F0,,,,1e,,,,11, 和40。接下来,让我们看一下这个过程。

最佳

字节阵列

Python是一种高级语言,不是为内存级操作而设计的,因此它确实缺少一些比特和字节级的操纵工具和类型,这些工具和类型在使用OPTOMMP时会很有帮助。为了解决这个问题,我们将使用标准字符阵列,字符串切片和一些来回类型的转换来管理软件包的确切字节。

  1. Python将上述“偏移”变量如小数数字,因此第一步是将该数字的十六进制表示:

    十六进制(偏移)#== 0xF01E1140

  2. 接下来,我们需要能够引用该数字的每个字节。我们可以通过将这种十六进制表示形式转换为字符串并在0x之后切片来做到这一点:

    str(十六进制))[2:4]#==“ f0”

  3. 最后,使用base 16(十六进制)编码:从一串字符字符串中转换为python的实际数字,以将其存储在要发送的数组软件包中:

    int(str(hex(offset))[2:4],16)#== 240(f0的十进制值)

  4. 重复此四个字节的此转换板转换过程,然后将它们放在数组中:

    [... int(str(offset))[2:4],16),int(str(hex(offset))[4:6],16),...,...,int(str(hex(hex)偏移))[8:10])...]

…之后,该数组的8-11将保持:[…240、30、17、64…],或在十六进制中:[…F0,1e,11,40…],这正是我们应该为此特定偏移发送的内容。

使用此方法,可以通过参数值动态确定偏移,然后系统地分解为要打包并发送到控制器的字节。即使是内存起点的常数以及模块和通道长度,也可以通过运行时参数来确定,而不是通过硬编码的十六进制值确定。

最佳

数据包

现在,所有这些零件都集中在上面图所示的较大数据包中,我将将这些件存储在标准数组中,该阵列将完全需要16个条目,因为读取块请求软件包是16个字节。为了帮助查看在哪里,我们可以构建一个粗糙的软件包映射(专门针对此读取块请求),以查看与每个条目关联的属性。

在检查数组之前,请注意一些一般特征:

  • 没有任何条目大于1111 1111 = 0xff = 255(一个字节的最大值)。
  • 目的地偏移的前两个字节都是0xff,这是最后四个字节各种 - 它们是偏移。
  • 数组的大小应与请求软件包的大小匹配,例如写块请求为20个字节,并且读取Quadlet请求为12个字节,因此它们的数组应分别具有20个和12个条目。
  • 如果要发送写请求,则应在任何未使用的空间中使用零填充整个块。例如,附加+ [0] * 12如果只写四个(一个字节)。
#[destination_id移动交易详细信息source_id目标[[0,,,,0,,,,((T_LABEL<<2),((T_CODE<<4),0,,,,0,,,,255,,,,255,,,,#目标偏移字节字节,使用int(str(hex(偏移))[a:b],16)如上int((str((..)[24]),,int((str((..)[46]),,int((str((..)[68]),,int((str((..)[810]),,#数据长度扩展t_code =属性0,,,,16,,,,0,,,,0这是给予的=大批价值

这是一个没有属性表示法的简化示例:

mybytes=[[0,,,,0,,,,((T_LABEL<<2),((T_CODE<<4),0,,,,0,,,,255,,,,255,,,,#字节0-7抵消[[24],,抵消[[46],,抵消[[68],,抵消[[810],,0,,,,16,,,,0,,,,0];#字节8-15

最佳

下一步

继续发送和解码optommp数据

或回到python的Optommp入门

或查看预制的Python软件包为了凹槽史诗。

参考