跳到主要内容

modpoll 命令

介绍

modpoll 是一个基于 libmodbus 库的 Modbus 主站仿真工具,支持基于串行链路的 Modbus RTU、Modbus ASCII 和基于以太网的 Modbus TCP 协议。

如果您的系统没有 modpoll 命令,可以通过如下命令下载获得。

wget https://www.modbusdriver.com/downloads/modpoll.tgz

语法

modpoll [OPTIONS] SERIALPORT|HOST [WRITEVALUES...]

选项

  • -m ascii :Modbus ASCII 协议。
  • -m rtu :Modbus RTU 协议(如果 SERIALPORT 参数包含 / 则默认为该模式)。
  • -m tcp :MODBUS TCP 协议(如果 SERIALPORT 参数不包含 / 则默认为该模式)。
  • -m udp :MODBUS UDP 协议。
  • -m enc :基于 TCP 的封装 Modbus RTU(Encapsulated Modbus RTU over TCP)。
  • -a # :从站地址(串行链路取值范围 1-247,TCP 取值范围 0-255,默认值为 1)。
  • -r # :起始地址(取值范围 1-65536,默认为 100)。
  • -c # :要读取的值的数量(1-125,默认值为 1),写入可选(使用 -c 1 强制 FC5 或 FC6)。
  • -t 0 :离散输出(线圈)数据类型。
  • -t 1 :离散输入数据类型。
  • -t 3 :16 位输入寄存器数据类型。
  • -t 3:hex :16 位输入寄存器数据类型(以十六进制显示)。
  • -t 3:int :输入寄存器表中的 32 位整数数据类型。
  • -t 3:mod :输入寄存器表中的 32 位模块 10000 数据类型。
  • -t 3:float :输入寄存器表中的 32 位浮点数据类型。
  • -t 4 :16 位输出(保持)寄存器数据类型(默认)。
  • -t 4:hex :16 位输出(保持)寄存器数据类型(以十六进制显示)。
  • -t 4:int :输出(保持)寄存器表中的 32 位整数数据类型。
  • -t 4:mod :输出(保持)寄存器表中的 32 位模块 10000 类型。
  • -t 4:float :输出(保持)寄存器表中的 32 位浮点数据类型。
  • -i :从站设备以大端字节序操作 32 位整数。
  • -f :从站设备以大端字节序操作 32 位浮点数。
  • -e :使用 Daniel/Enron 单寄存器 32 位模式(暗示 -i 和 -f)。
  • -0 :第一个引用(起始地址)是 0(PDU 寻址)而不是 1。
  • -1 :只轮询一次,否则以设定的轮询间隔循环执行。
  • -l # :以毫秒为单位的轮询时间(默认为 1000)。
  • -o # :以秒为单位的超时(0.01 - 10.0,默认为 1.0 秒)。
  • -h :显示帮助信息。

以下选项仅适用 MODBUS/TCP, UDP 和 RTU over TCP:

  • -p # :IP 协议端口号(默认为 502)

以下选项仅适用 Modbus ASCII 和 Modbus RTU:

  • -b # :波特率(例如 9600, 19200, ...),默认为 19200。
  • -d # :数据位(ASCII 协议为 7 或 8,RTU 协议为 8)。
  • -s # :停止位(1 或 2,默认为 1)。
  • -p none :无校验。
  • -p even :偶校验(默认)。
  • -p odd :奇校验。
  • -4 # :RS-485 模式,传输时开启 RTS,之后还有 # 毫秒。

参数

  • SERIALPORT :串口设备,在 Windows 下如 COM1、COM2 等,在 Linux 下如 /dev/ttyS0、/dev/ttyS1 等。
  • HOST :主机名或 IP 地址。
  • WRITEVALUES :对于 Modbus 写入命令,需要在此依次填入数据域的数据,以空格分隔。

示例

通过 Modbus RTU 从 ID 为 3 的从站设备中读取 500 地址开始的连续 10 个保持寄存器的值。(串口 COM1,波特率 9600,无奇偶校验)

modpoll -b 9600 -p none -m rtu -a 3 -r 500 -c 10 COM1

通过 Modbus TCP 从 10.0.0.100 设备读取 100 地址开始的连续 5 个浮点数值。

modpoll -t4:float -r 100 -c 5 -1 10.0.0.100

通过 Modbus TCP 往 10.0.0.100 设备 1201 地址写保持寄存器,值为 1234。(使用 FC 16 功能码)

modpoll -r 1201 10.0.0.100 1234

通过 Modbus TCP 往 10.0.0.100 设备 1201 地址写保持寄存器,值为 1234。(使用 FC 6 功能码)

modpoll -r 1201 -c 1 10.0.0.100 1234

通过 Modbus RTU 执行一次「写单个线圈」命令,开启 1 号继电器。

modpoll -m rtu -1 -a 1 -r 1 -c 1 -b 9600 -p none -t 0 /dev/ttyUSB1 1

通过 Modbus RTU 执行一次「写单个线圈」命令,关闭 1 号继电器。

modpoll -m rtu -1 -a 1 -r 1 -c 1 -b 9600 -p none -t 0 /dev/ttyUSB1 0

通过 Modbus RTU 循环执行「读线圈状态」命令,读取 1 号继电器状态。

modpoll -m rtu -a 1 -r 1 -c 1 -b 9600 -p none -t 0 /dev/ttyUSB1