用 ADAM-6052 学习 ModBus TCP 协议 (6) – 写寄存器

目录 Content
[hide]

ADAM-6052 的输出端子可以配置成脉冲输出功能,并且提供了寄存器可以读取和配置占空参数数值。占空参数设置完成后,脉冲频率可以用万用表的频率档测量出来比对。

一、寄存器地址

按照此系列第一篇文章里提供的 Modbus 地址表:

Pulse output low level width 地址为 17,长度为 16,即每个输入设置占用 2个长度。Pulse output high level width 地址为 33,长度为 16,即每个输入设置占用2个长度。

二、读寄存器

设置 DO2 为 pulse 输出,low signal width 占用 1ms, High signal width 占用 1ms,所以周期为 2ms,频率为 500Hz。

 

使用功能码 16#03 Read Holding Registers

请求读取地址17开始,长度为 32的寄存器数值。

1. 请求报文

25 A0 00 00 00 06 05 03 00 10 00 20

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 25
  • byte 1 :  事务标识符,本例为 A0
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于 256 个字节
  • byte 5 :  后面的字节数,低字节。本例为 06,即 05 03 00 10 00 20 共 6 个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 05
  • byte 7 :  功能码,本例为 03,即 Read Holding Registers
  • byte 8 :  读取地址,高字节。本例为 00
  • byte 9 :  读取地址,低字节。本例为 10,即地址16。(17-1,原因是是从0开始)
  • byte 10: 读取数量,高字节。本例为 00
  • byte 11: 读取数量,低字节。本例为 20,即32个寄存器

2. 返回报文

25 A0 00 00 00 43 05 03 40 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 25
  • byte 1 :  事务标识符,本例为 A0
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于256个字节
  • byte 5 :  后面的字节数,低字节。本例为 43,即 67个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 05
  • byte 7 :  功能码,本例为 03,即 Read Holding Registers
  • byte 8 :  数据数量,本例为 40,即 64 个字节
  • byte 9 :  读取数值,本例为 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

特别的:
00 0A 00 00 表示数值 10
00 0A 00 00 表示数值 10

三、写入单个寄存器

使用功能码 16#06 Preset Single Registers

1. 请求报文

00 77 00 00 00 06 05 06 00 14 00 0A

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 00
  • byte 1 :  事务标识符,本例为 77
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于 256 个字节
  • byte 5 :  后面的字节数,低字节。本例为 06,即 05 06 00 14 00 0A 共 6 个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 05
  • byte 7 :  功能码,本例为 06,即 Preset Single Registers
  • byte 8 :  写入地址,高字节。本例为 00
  • byte 9 :  写入地址,低字节。本例为 14,即地址20。(21-1,原因是是从0开始)
  • byte 10: 写入数据,高字节。本例为 00
  • byte 11: 写入数据,低字节。本例为 0A,即数值10

2. 返回报文

00 77 00 00 00 06 05 06 00 14 00 0A

如果没有异常,返回报文和请求报文相同。

 

四、写入多个寄存器

使用功能码 16#10 Preset Multiple Registers

请求写入地址为 17开始,5个寄存器的数值,共5*2 个字节,将第5个寄存器数值设为 5。

1. 请求报文

7C 28 00 00 00 11 05 10 00 10 00 05 0A  00 00 00 00 00 00 00 00 00 05

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 7C
  • byte 1 :  事务标识符,本例为 28
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于 256 个字节
  • byte 5 :  后面的字节数,低字节。本例为 11,即共 17 个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 05
  • byte 7 :  功能码,本例为 10,即 Preset Multiple Registers
  • byte 8 :  写入地址,高字节。本例为 00
  • byte 9 :  写入地址,低字节。本例为 10,即地址17。(17-1,原因是是从0开始)
  • byte 10: 寄存器数量,高字节。本例为 00
  • byte 11: 寄存器数量,低字节。本例为 05,即写入5个寄存器。
  • byte 12: 字节个数。本例为 0A,即10个字节。(寄存器数量*2)
  • byte 13: 字节。00 00 00 00 00 00 00 00 00 05

特别的

00 05 为第5个寄存器写入的数值。

2. 返回报文

7C 28 00 00 00 06 05 10 00 10 00 05

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 7C
  • byte 1 :  事务标识符,本例为 28
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于 256 个字节
  • byte 5 :  后面的字节数,低字节。本例为 06,即共6 个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 05
  • byte 7 :  功能码,本例为 10,即 Preset Multiple Registers
  • byte 8 :  写入地址,高字节。本例为 00
  • byte 9 :  写入地址,低字节。本例为 10,即地址17。(17-1,原因是是从0开始)
  • byte 10: 寄存器数量,高字节。本例为 00
  • byte 11: 寄存器数量,低字节。本例为 05,即写入5个寄存器。

扩展阅读

Leave a Reply

Your email address will not be published. Required fields are marked *