Modbus Poll简介
Modbus poll是一款非常受欢迎的Modbus主站设备仿真器,支持Modbus RTU、ASCII、TCP/IP等协议模式,能够让Modbus通信设备人员测试和模拟使用通信协议,从而更好的对设备进行监控、测试和调试,也便于观察Modbus通讯过程中的各种报文数据,不仅节省大量的时间,还大大的提高了工作效率。
它支持多文档接口,可以同时监视多个从机设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。
Modbus Poll操作系统要求
硬件要求
处理器:推荐 1 GHz 或更快
内存:1 GB RAM
硬盘:5 MB 可用硬盘空间
分辨率:1024 x 768 及以上
系统:支持从 Windows 7 到 Windows 11 的所有 Windows 版本。
Modbus Poll 7 支持在 Windows XP 上运行。
终止用户许可协议
在使用 Modbus Poll 之前,您应该仔细阅读以下条款和条件。除非您有 Witte Software 签署的不同许可协议,否则您使用本软件即表示您接受本许可协议和保证。如果您不接受这些条款,您必须立即停止使用本软件。
版权。
Modbus Poll(“软件”)版权所有 2002-2022 归 Witte Software,保留所有权利。
评估和注册。
这不是免费软件。特此授权您在 30 天内免费使用本软件进行评估。
如果您在 30 天评估期后使用该软件,则需要支付注册费。
在 30 天评估期后未注册使用该软件违反了美国和国际版权法。
本软件的一份注册副本可以由个人在一台或多台计算机上使用该软件的个人使用,也可以安装在多人使用的单台计算机上,但不能同时使用。
有关订单和定价的信息,请访问https://www.modbustools.com/order.html
Modbus Poll 许可证是永久的。一旦您购买了特定版本的许可证,并且只要您遵守许可协议,您就可以永久使用该版本,无需额外费用。
分配。
如果您不包含您的许可密钥,您特此获得许可复制该软件;将原件的准确副本提供给任何人;并通过电子方式以未经修改的形式分发软件。明确禁止您对任何此类副本收费。
有限保修。
本软件按原样提供,WITTE 软件不提供与本软件有关的所有明示或默示保证,包括但不限于对适销性和特定用途适用性的任何默示保证。
损害赔偿限制。
WITTE 软件或参与本软件的创建、生产或交付的任何人均不对因使用或无法使用此类软件而引起的任何间接、后果性或附带损害负责,即使 WITTE 软件已被告知其可能性此类损害或索赔。在任何情况下,无论索赔的形式如何,WITTE SOFTWARE 对任何损害的责任均不超过为获得使用该软件的许可所支付的价格。使用该软件的人将承担该软件的质量和性能的所有风险。
Modbus Poll功能
连接
Modbus 从设备轮询读/写数据,使用:
- RS232 或 RS485 网络上的 Modbus RTU 或 ASCII。(USB/RS232/485转换器)
- Modbus TCP/IP
- 基于 TCP/IP 的 Modbus。(Modbus RTU/ASCII 封装在 TCP 数据包中)
- Modbus UDP/IP
- 基于 UDP/IP 的 Modbus。(Modbus RTU/ASCII 封装在 UDP 数据包中)
支持的 Modbus 功能
- 01:读取线圈
- 02:读取离散输入
- 03:读取保持寄存器
- 04:读取输入寄存器
- 05:写单线圈
- 06:写单个寄存器
- 15:写多个线圈
- 16:写多个寄存器
- 17:报告服务器ID
- 22:屏蔽写寄存器
- 23:读/写寄存器
- 43/14:读取设备标识
数据记录
- 将数据记录到文本文件
- 将数据直接记录到 Excel 中
显示格式
- 每个单元格都可以单独格式化。
- 有符号 16 位寄存器
- 无符号 16 位寄存器
- 十六进制
- 二进制
- 具有任何字/字节顺序的 32 位有符号整数
- 具有任何字/字节顺序的 32 位无符号整数
- 具有任何字/字节顺序的 64 位有符号整数
- 具有任何字/字节顺序的 64 位无符号整数
- 具有任何字/字节顺序的 32 位浮点数
- 具有任何字/字节顺序的 64 位双浮点数
其他功能
- 用于与 Excel VBA、Python 等接口的 OLE/自动化。
- 监控数据流量
- 打印和打印预览
- 字体选择
- 有条件的颜色
- 缩放
- 实时图表
概述
Modbus Poll 支持多窗口界面,可以同时监控多个Modbus从站和数据区。对于每个窗口,只需指定Modbus从站的ID、功能码、地址、长度和轮询时间,即可从任何窗口读取和写入寄存器和线圈。。
使用说明
按 F1可以获取与当前选定项目相关的帮助文档。
SHIFT + F1调用特殊的“帮助模式”,其中光标变为帮助光标(箭头+问号)。然后,用户可以选择用户界面中的可见对象,例如菜单项、工具栏按钮或窗口。这将打开有关描述所选项目的主题的帮助。
命名单元格
您可以在此处键入任何文本以指定值单元格。您还可以从 Excel 单元格中复制/粘贴文本。
值单元格
显示 Modbus 寄存器的数据值。如果您双击一个值单元格,一个对话框允许您将一个新值写入从设备。在值单元格中键入数字也会显示对话框。可以选择用于写入值的 Modbus 功能。
复选框“Close dialog on Response ok”用于在成功发送值时自动关闭对话框。当要更改大量值时,这很方便。这样可以快速选择一个新单元格,然后再次键入一个新值。
更改字体
要更改字体,您有 2 个选项
- 选择要更改的单元格,然后单击鼠标右键。
- 选择要更改的单元格,然后选择菜单 → 显示 → 字体。
有条件的颜色
条件颜色可帮助您直观地显示特定范围内的值。3种颜色选择
- 默认颜色:如果没有条件颜色评估为真,则使用此颜色。
- 规则 1:如果表达式计算结果为真,则使用此颜色选择。
- 规则 2:如果表达式计算结果为真,则使用此颜色选择。规则 2 优先于规则 1。
7种比较运算符
- 未使用
- 等于
- 比…更棒
- 少于
- 大于或等于
- 小于或等于
- 和
当数据类型为浮点型或 32 位长型时,不能使用“与”运算符。如果选择“and”,则条件值以十六进制数字形式输入。如果单元格和条件值中的任何位为 1,则计算结果为真。
颜色示例
如果单元格值介于 398 和 402 之间,则为绿色
缩放
缩放可帮助您将原始值缩放为人类可读的值。缩放仅适用于有符号和无符号 16/32 位整数。
(X1,Y1) 和 (X2,Y2)
通过 (X1,Y1) 和 (X2,Y2) 两点的线
小号l o p e = m =是2 -是1X2 – X1小号l○pe=米=是2-是1X2-X1线方程
是=米⋅ ( X- X1 ) + Y1是=米⋅(X-X1)+是1精确
小数点后的位数。使能够
必须启用以缩放来自 Modbus 服务器/从站的值。如果选择的不是 16/32 位整数显示格式,则会自动禁用缩放。
实时图表
该图表可以实时绘制 12 个系列,每个系列最多 100000 个点。
打开一个新窗口
要打开另一个窗口,您有 3 个选项:
连接对话框
要打开连接对话框,您有 2 个选项:
- 按 F3
- 从连接菜单中选择连接
联系
有 5 种不同的连接类型:
- 串行:
通过串行线路的 Modbus。RS232 或 RS485。可以使用 USB 串行转换器。 - Modbus TCP/IP:
如果要与 MODBUS TCP/IP 网络通信,请选择 TCP/IP。在这种情况下,从站 ID 与 MODBUS TCP/IP 中使用的单元 ID 相同。
端口号默认为 502。
如果连接失败,请尝试是否可以在命令提示符下 ping 设备。如果 ping 命令失败,则 Modbus Poll 也会失败。 - Modbus UDP/IP:
如果要与 MODBUS UDP/IP 网络通信,请选择 UDP/IP。这与 Modbus TCP/IP 相同,但使用了无连接的 UDP 协议。 - TCP/IP 上的Modbus RTU/ASCII:
这是通过 TCP/IP 网络而不是串行线路发送的 RTU 或 ASCII 消息。 - Modbus RTU/ASCII over UDP/IP:
这是通过 UDP/IP 网络而不是串行线路发送的 RTU 或 ASCII 消息。
连接类型 3-5 不是 www.modbus.org指定的标准 Modbus,但为方便起见添加了它们。 |
根据您的选择,其他一些设置将变灰。
串行设置
使用这些参数设置串行端口设置。它们仅在连接类型为“串行端口”时可用。模式
使用此选项可选择RTU或ASCII模式。默认 RTU。响应超时
指定 Modbus Poll 在放弃之前应等待从设备响应的时间长度。默认值为 1000 毫秒。轮询之间的最小延迟
无论扫描速率如何,此设置都可确保在传输下一个请求之前的最小延迟。此设置的分辨率约为 15ms。在某些计算机上可以获得更好的分辨率,但不是全部。
如果将此值设置为低于 20 毫秒,则无法保证响应和新请求之间的 3.5 个字符的时间间隔。这是因为 Windows 调度程序每 10 到 20 毫秒切换一次任务。如果您在串行 RS485 网络中轮询多个从站,则不应将该值设置为低于 20 毫秒。这是为了确保 3.5 个字符的时间间隔。在 TCP/IP 网络中,少于 20 毫秒是可以的。仅与一台从设备的串行连接小于 20 毫秒是可以的。 |
远程服务器
远程服务器设置仅在使用以太网连接时可用。IP地址
服务器 IP 地址。默认为 localhost 127.0.0.1港口
服务器端口号。默认 502连接超时
用于建立连接的最长时间。默认 1000
高级设置
RTS 切换
RTS Toggle 指定如果字节可用于传输,RTS 线将处于高电平。发送完所有缓冲字节后,RTS 线将为低电平。
如果您有一个没有自动方向开关的 232/485 转换器,您可以使用它来切换方向。
如果可能,应避免使用 RTS 控制的 RS232/RS485 转换器。对于 Windows 和 Linux 等非实时操作系统,很难确定关闭发射机的确切时间。如果过早关闭,字符可能仍位于 FIFO 或 UART 的发送寄存器中,这些字符将丢失。因此从站将无法识别该消息。另一方面,如果关闭得太晚,则从站的消息被破坏,主站将无法识别该消息。 |
DSR
DSR 指定是否监视 DSR(数据集就绪)信号以进行输出流控制。如果此成员为 TRUE 且 DSR 已关闭,则输出将暂停,直到再次发送 DSR。中旅
CTS 指定是否监视 CTS(清除发送)信号以进行输出流控制。如果启用此复选框并关闭 CTS,则输出将暂停,直到再次发送 CTS。DTR
DTR 指定在打开端口时是否启用或禁用 DTR。移除回声
如果您的设备或 RS232/RS485 转换器回显刚刚发送的字符。
读/写定义
使用此命令定义活动窗口要监视的数据。
要打开读/写定义对话框,您有 3 个选项:
从站 ID
范围 1 到 255。(MODBUS 协议规范说 247)。值 0 也被接受以直接与 MODBUS/TCP 或 MODBUS/UDP 设备通信。
功能码
您可以选择 8 个功能代码中的 1 个。
5.2.1。读取函数
读取函数返回的数据显示在网格窗口上。
- 01:读取线圈(0x)
- 02:读取离散输入 (1x)
- 03:读取保持寄存器(4x)
- 04:读取输入寄存器(3x)
5.2.2. 编写函数
写入函数写入显示在网格窗口上的数据。
- 05:写入单个线圈(写入线圈状态)
- 06:写入单个寄存器(写入保持寄存器)
- 15:写入多个线圈(Writes to Coils)
- 16:写入多个寄存器(Writes to Holding registers)
地址
Modbus 协议中的地址令人困惑!一些协议规范使用协议/消息地址,而另一些则使用设备寻址。
5.3.1。协议/消息地址
一些协议规范使用从 0 到 65535 计数的协议/消息地址以及功能代码。这也是新的 Modbus 规范使用的内容。这是通过网络发送的消息中的地址。
Modbus Poll 使用从 0 到 65535 计数的协议/消息地址。
5.3.2. 设备地址
一些协议规范使用设备地址/寄存器。寄存器从 1 开始计数。第一个数字描述要使用的功能。这意味着设备地址 40101 由地址 100 标识。“4”表示保持寄存器,4x 寄存器从 1 开始计数。更令人困惑的是:4x 表示功能代码 03,3x 表示功能代码 04!
5.3.3. 5 位与 6 位寻址
地址格式 4x 从 40001 计数到 49999。下一个地址不是50000。在过去,9999 个地址就足够了。在某些情况下,9999 是不够的。然后添加一个零。40101 变成 400101 等等。这称为 6 位寻址或扩展寻址。
这不是 Modbus Poll 的问题。410001 变为 10000。“4”被丢弃,其余的 10001 减 1,因为我们从 0 而不是 1 计数。
5.3.4. 地址示例
这些示例显示了如果规范使用设备地址,如何设置 Modbus 轮询。
读取保持寄存器
您希望每 1000 毫秒从从 ID 2 的设备地址 40011 读取 20 个寄存器。从“4”我们知道这是功能03“读取保持寄存器”。
- 从站 ID = 2
- 功能 =“03 读取保持寄存器 (4x)”
- 地址 = 10(11 减 1)
- 数量 = 20
- 扫描率 = 1000
读取离散输入
您想每 500 毫秒从从站 ID 5 的地址 110201 读取 1000 个线圈。从“1”我们知道这是功能02“读取离散输入”
- 从站 ID = 5
- 功能 =“02 读取离散输入 (1x)”
- 地址 = 10200 (10201 – 1)
- 数量 = 1000
- 扫描率 = 500
扫描率
扫描速率可以设置为 0 到 3600000ms。请注意,将扫描速率设置为低于事务时间是没有意义的。如果使用 9600 波特的串行连接并请求 125 个寄存器,则事务时间大约为 8 + 2 + 250 + 2 = 262ms + 请求和响应之间的间隙(>3.5 个字符时间)。在这种情况下,将扫描速率设置为例如 100 毫秒是没有意义的,因为事务时间至少为 262 毫秒 + 从站中的延迟(间隙)+ 轮询之间的最小时间。(在连接对话框 F3 中设置)。
读/写禁用
“Read/Write Disabled”复选框可用于临时启用或禁用此窗口的通信。然后显示文本(禁用)以及 Tx 和错误计数器。
5.5.1。出错时禁用
出现错误时禁用读/写。
隐藏名称列
隐藏所有名称列。如果不使用它们,这样可以方便地腾出更多空间。
单元格中的地址
如果启用,地址也会显示在值单元格中,例如:2000 = 00000
PLC 地址(基数 1)
此选项将地址显示为设备地址。
安然/丹尼尔模式
Enron 或 Enron/Daniels Modbus 是带有一些“供应商扩展”的标准 Modbus。这些扩展的确切影响取决于上下文,但最常见的 Modbus 命令按预期工作。有一些自定义的供应商定义的功能可用 – 但很少有用户期望或使用它们。最大的影响与 32 位数据值的读取/写入方式有关。
Enron-Modbus 定义了两个特殊的 4x 保持寄存器范围:
- 4×5001 到 4×5999 假定为 32 位长整数(每个寄存器 4 字节)。
- 4×7001 到 4×7999 假定为 32 位浮点数(每个寄存器 4 字节)。
在 Modbus 中处理 32 位值并不是 Enron-MB 独有的。然而,Enron-MB 采取了有争议的步骤,即每个寄存器返回 4 个字节,而不是 Modbus 规范中术语“保持寄存器”所暗示的 2 个字节。这意味着在 Enron-Modbus 中对寄存器 4×5001 和 4×5002 的轮询返回 8 个字节或两个 32 位整数,而标准 Modbus 将仅返回 4 个字节或一个被视为两个 16 位整数的 32 位整数。此外,在 Enron-MB 中轮询寄存器 4×5010 返回第十个 32 位长整数,而标准 Modbus 将考虑此范围内第五个 32 位长整数的 1/2。
行
指定您喜欢的网格中的行数。
实时图表
使用此命令可在图表中实时绘制多达 12 个数据系列。
实时图表是高速的,并且能够在接收到新数据时尽快绘制新线。
所有图表设置都存储在工作区中。保存/打开工作区 |
要打开实时图表对话框,您有 2 个选项:
- 按 Alt + R
- 从显示菜单中选择“实时图表”
X 轴显示自图表启动以来的秒数。
当点到达图表的末尾时,有 3 个选项:
- 结束时停止:图表停止。
- 结束时重新开始:图表重新开始。
- 继续:它一直持续到达到最大点数或按下停止。
设置
默认情况下,所有 12 个系列都链接到左侧 Y 轴。如果要将系列链接到右 Y 轴,请选中“右 Y 轴”复选框。指定
- 颜色
- 右 Y 轴
- 标题
- 抵消
显示
- 文件名
- 地址
偏移对于在同一 Y 轴上对齐数据点很有用。例如,可以偏移 0 或 1 的数据点,这样它们就不会被绘制在彼此之上。
缩放功能
如果您想查看更多详细信息,放大图表会很有用。缩放由鼠标左键控制。要缩放图表的特定部分,只需左键单击图表(这将是缩放矩形的左上角)并拖动到右下角。将出现一个矩形。松开鼠标按钮后,轴将自动调整到您选择的区域。
如果您左键单击图表(例如开始缩放),但如果您移动到左上角,则使用缩放和平移功能所做的所有修改都将被取消(图表将处于原来的状态)在使用平移和缩放进行操作之前)。
平移功能
要平移控件,请右键单击控件上的某处并移动鼠标。鼠标下方的点将跟随鼠标的移动。
将数据链接到图表系列
除非您将 Modbus 数据单元链接到 12 个系列之一,否则该图表不知道要使用哪些数据。为此,请选择一个值单元格,然后从菜单→显示中选择“链接到图表”。
复制系列
将系列数据保存到磁盘或复制到剪贴板。将数据直接粘贴到 Excel 中以进行进一步处理。
尽管使用了非逗号字段分隔符,但该文件仍具有 .csv 扩展名。
分隔符:选择在文本文件中分隔值的字符。使用 Excel 选项卡。此外,还给出了一些附加信息。
- 点数
- 最大点值
- 最小点值
- 平均分值
显示格式
标记要格式化的单元格。从显示菜单中选择 28 种显示格式之一。
原生 Modbus 寄存器
16 位 Modbus 寄存器可以以 4 种不同的模式显示。
- 签
- 未签名
- 十六进制
- 二进制
32 位有符号整数
这结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 有符号整数 Big-endian
- 有符号整数 Little-endian
- 有符号整数大端字节交换
- 有符号整数小端字节交换例子字节顺序:AB CD (Big-endian)
十进制数 123456789 或十六进制07 5B CD 15
它们在 Modbus 消息中通过线路的顺序:07 5B CD 15
32 位无符号整数
这结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 无符号整数 Big-endian
- 无符号整数小端序
- 无符号整数大端字节交换
- 无符号整数小端字节交换例子字节顺序:AB CD (Big-endian)
十进制数 123456789 或十六进制07 5B CD 15
它们在 Modbus 消息中通过线路的顺序:07 5B CD 15
64 位有符号整数
这结合了 4 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 有符号整数 Big-endian
- 有符号整数 Little-endian
- 有符号整数大端字节交换
- 有符号整数小端字节交换例子字节顺序:AB CD EF GH(大端)
十进制数 -1,234,567,890,123,456,789 或十六进制EE DD EF 0B 82 16 7E EB
在 Modbus 消息中通过线路的顺序:EE DD EF 0B 82 16 7E EB
64 位无符号整数
这结合了 4 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 无符号整数 Big-endian
- 无符号整数小端序
- 无符号整数大端字节交换
- 无符号整数小端字节交换例子字节顺序:AB CD EF GH(大端)
十进制数 1,234,567,890,123,456,789 或十六进制11 22 10 F4 7D E9 81 15
它们在 Modbus 消息中通过线路的顺序:11 22 10 F4 7D E9 81 15
32 位浮动
这结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 浮点大端
- 浮点小端序
- 浮点大端字节交换
- 浮点小端字节交换例子字节顺序:AB CD (Big-endian)
浮点数 123456.00 或十六进制47 F1 20 00
它们在 Modbus 消息中通过线路的顺序:47 F1 20 00
64 位双精度
这结合了 4 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 双大端
- 双小端序
- 双大端字节交换
- 双小端字节交换例子字节顺序:AB CD EF GH (Big-endian)
浮点数 123456789.00 或十六进制41 9D 6F 34 54 00 00 00
它们在 Modbus 消息中通过线路的顺序:41 9D 6F 34 54 00 00 00
保存/打开工作区
如果您打开许多相关的 Modbus 窗口,将所有打开和排列的 Modbus 窗口的当前布局的快照保存在一个工作区中会很方便。
工作区 (*mbw) 是一个文件,其中包含所有打开窗口的显示信息和文件名。不是实际内容。为此,请转到文件→保存工作区。
当您打开工作区文件时,Modbus Poll 会打开所有 Modbus 窗口并将它们显示在您保存的布局中。
导出为csv
将名称和值导出到逗号、分号或制表符分隔值文件。从文件对话框中选择
- 逗号分隔值文件 (*.csv)
“温度”、“19.7” - 分号分隔值文件 (*.csv)
“Temperature”;”19.7″ - 制表符分隔值文件 (*.txt)
温度 19.7
根据您的系统,逗号或句点用于分隔小数。
测试中心
此测试对话框的目的是帮助 MODBUS 从设备开发人员使用他们自己组成的任何字符串来测试设备。
列表框显示发送的数据以及接收的数据。
您可以在下拉列表框中有多个测试字符串。输入字符串后,按“添加到列表”按钮,然后将字符串添加到列表中。
按下“发送”按钮时发送选定的字符串。打开列表
从文件中休息测试字符串。保存列表
将测试字符串存储到文件中。清除
清除测试列表。添加到列表
将当前测试字符串添加到列表中。添加检查
在输入字符串的末尾添加 CRC 或 LRC。
使用考试中心时,您可能希望禁用来自其他窗口的通信。选中“读/写定义”对话框中的“读/写禁用”复选框。设置→读/写定义。
ASCII 示例
组合框中的字符串:
3A 30 31 30 33 30 30 30 30 30 30 30 41
如果添加了 LRC,则传输的字符串
3A 30 31 30 33 30 30 30 30 30 30 30 41 46 32 0D 0A
还添加了一个 CR LF 对。
TCP/IP 示例
读取 10 个保持寄存器。
00 00 00 00 00 06 01 03 00 00 00 0A
前 6 个字节是 TCP/IP 标头。
测试中心字符串文件
使用记事本或类似的文本编辑器,您可以准备要在测试中使用的字符串。
文件中的第一行必须是字符串“TestCenter”。这就是 Modbus Poll 知道文件格式正确的方式。按“打开列表”打开准备好的文本文件。
10.3.1. 字符串列表的内容
测试中心 3A 30 31 30 33 30 30 30 30 30 30 30 41 3A 30 32 30 33 30 30 30 30 30 30 30 41 3A 30 33 30 33 30 30 30 30 30 30 30 41
复制
使用 Copy 按钮将选定的 Tx/Rx 字符串复制到剪贴板。
SHIFT 和 CTRL 键可以与鼠标一起使用来选择和取消选择字符串、选择字符串组以及选择不相邻的字符串。
在执行其他命令时保持此窗口打开。 |
Modbus 数据记录
您可以将数据记录到文本文件或直接记录到 Microsoft Excel。
文本文件
从设置菜单中选择日志或使用快捷键:Alt+L
每个 Modbus 窗口都记录到其单独的文本文件中。
当您想停止数据记录时,请在设置菜单上选择注销命令。
11.1.1. 日志率
每次读
为所有 Modbus 请求编写日志行。记录频率作为扫描速率。选择
以秒为单位指定日志速率。与扫描速率无关。
如果扫描速率是例如 10000 毫秒,那么设置 1 秒的日志速率是没有意义的,因为只有在新数据准备好时才会记录数据。 |
11.1.2. 分隔符
作为分隔符,您可以使用以下选项之一:固定宽度
表示值按列组织。逗号
用逗号分隔的值。标签
由制表符分隔的值。
11.1.3. 仅记录数据更改
指定仅当自上次日志以来有任何数据更改时才写入新日志行。
11.1.4. 记录错误
指定记录超时等错误。
11.1.5。记录日期
指定将当前日期添加到日志时间。
11.1.6。记录毫秒
指定将毫秒添加到日志时间。
11.1.7。日志地址
指定将 Modbus 地址添加到日志中。
11.1.8。按下确定时开始记录
指定在按下 ok 按钮时开始记录。否则,日志设置仅在保存 *mbp 文件时存储。
11.1.9。打开 *mbp 时启动日志
指定在打开 *.mbp 文件时自动启动日志记录。
11.1.10。立即刷新归档
这确保了日志行不会在文件系统中兑现,而是立即物理写入。
11.1.11。附加
指定将日志附加到所选文件。否则会创建一个新文件。
11.1.12。午夜的新日志文件
关闭当前日志文件并在午夜开始一个新文件。时间戳会添加到您的文件名中。
具有固定宽度的文本文件示例:
22:28:13 <40001> 17395 0 0 0 0 0 0 0 0 22:28:14 <40001> 17396 1 0 0 0 0 0 0 0 22:28:15 <40001> 17394 1 0 0 2 55 0 0 0 22:28:16 <40001> 13350 1 0 0 4 0 0 0 0
您可以在 Excel 电子表格中导入数据。
微软Excel
此功能需要安装 Microsoft Excel。Excel 2003 日志限制为 65535 个日志,因为这是 Excel 工作表中的最大行数。Excel 2007 或更高版本限制为 1,048,576 行。每个 Modbus 窗口都记录到其单独的 Excel 表中。
从设置菜单中选择 Excel 日志或使用快捷键:Alt+X
记录时不要触摸 Excel 表,因为这会中断记录。
11.2.1. 日志率
- 每次读取:为所有 Modbus 请求写入日志行。记录频率作为扫描速率。
- 选择:以秒为单位指定日志速率。日志与扫描速率无关。
备注:如果扫描速率为例如 10000 毫秒,则设置 1 秒的记录速率是没有意义的,因为只有在新数据准备好时才会记录数据。 - 停止后:指定日志行数。请注意,Excel 2003 限制为 65,536 行,Excel 2007 限制为 1,048,576 行。
11.2.2. 标头信息
- 插入标题:信息插入到 Excel 工作表的最顶部 3 行。
- 在第一行命名单元格:在第 3 行插入名称。
- 轮询定义:在第 2 行插入 ID、Function 等。
- 名称:在第 1 行插入一个日志名称。
带有标题信息的 Excel 日志。
通信流量
选择菜单 Display→Communication 以显示串行线路或以太网电缆上的流量。使用停止按钮暂时停止更新以进行检查。
使用复制按钮将选定的行复制到剪贴板。
此窗口仅显示 Modbus Poll 发送和接收的数据。您不能将其用作数据嗅探器。 |
在执行其他命令时保持此窗口打开。 |
OLE/自动化
自动化(以前称为 OLE 自动化)使一个应用程序可以操作在另一个应用程序中实现的对象。
自动化客户端是可以操作属于另一个应用程序的公开对象的应用程序。这也称为自动化控制器。
自动化服务器是将可编程对象公开给其他应用程序的应用程序。Modbus Poll是一个自动化服务器。
这意味着您可以使用任何支持 VBA(Visual Basic for Applications)的程序,例如 Visual Basic、Excel 等,根据您的特定要求来解释和显示 modbus 数据。
Excel 示例
当您想要编写宏时,您应该显示开发人员选项卡或在开发人员模式下运行。
13.1.1. Excel 2007
- 单击 Microsoft office 按钮,然后单击 Excel 选项。
- 单击流行,然后选中功能区复选框中的显示开发人员选项卡。
请注意,功能区是 Microsoft fluent 用户界面的一部分。
13.1.2. Excel 2010, 2016
- 单击文件选项卡。
- 单击选项。Excel 选项窗口将打开。
- 在左侧窗格中单击自定义功能区。
- 在右侧窗格的主选项卡下,选中开发人员复选框。
- 单击确定。开发人员选项卡现在应显示在功能区(最右侧的选项卡)中。
13.1.3. Excel 示例代码
此示例打开两个窗口。一个读数寄存器和另一个读数线圈。
Modbus Poll 是隐藏的,但您可以通过取消注释“ShowWindow”行来显示它。这将显示其中一个窗口。
Modbus Poll 安装中还包含一个示例。
开始 → 所有程序 → Modbus 轮询 → Excel 示例Excel VBA 示例
Public doc1 As Object
Public doc2 As Object
Public app As Object
Dim res As Integer
Dim n As Integer
Private Sub StartModbusPoll_Click()
Set app = CreateObject("Mbpoll.Application")
Set doc1 = CreateObject("Mbpoll.Document")
Set doc2 = CreateObject("Mbpoll.Document")
' Read 10 Holding Registers every 1000ms
res = doc1.ReadHoldingRegisters(1, 0, 10, 1000)
' Read 10 Coil Status every 1000ms
res = doc2.ReadCoils(1, 0, 10, 1000)
' doc1.ShowWindow()
app.Connection = 1 ' Modbus TCP/IP
app.IPAddress = "127.0.0.1" ' local host
app.ServerPort = 502
app.ConnectTimeout = 1000
res = app.OpenConnection()
End Sub
Private Sub Read_Click()
Cells(5, 7) = doc1.ReadResult() 'Show results for the requests
Cells(6, 7) = doc2.ReadResult()
For n = 0 To 9
Cells(5 + n, 2) = doc1.SRegisters(n)
Next n
For n = 0 To 9
Cells(18 + n, 2) = doc2.Coils(n)
Next n
End Sub
Python 示例
这个 Python 示例打开一个窗口并设置所有可能的数据格式。Python 示例
import win32com.client as win32
SIGNED = 0
UNSIGNED = 1
HEX = 2
BINARY = 3
FLOAT_LE_BS = 4
FLOAT_BE = 5
DOUBLE_LE_BS = 6
DOUBLE_BE = 7
S32_LE_BS = 8
S32_BE = 9
FLOAT_LE = 10
FLOAT_BE_BS = 11
DOUBLE_LE = 12
DOUBLE_BE_BS = 13
S32_LE = 14
S32_BE_BS = 15
U32_BE = 17
U32_LE_BS = 18
U32_BE_BS = 19
U32_LE = 20
S64_BE = 21
S64_LE_BS = 22
S64_BE_BS = 23
S64_LE = 24
U64_BE = 25
U64_LE_BS = 26
U64_BE_BS = 27
U64_LE = 28
#Endianness
BE = 0
LE = 3
BE_BS = 2
LE_BS = 1
App = win32.Dispatch('Mbpoll.Application')
App.Connection = 1
App.IPAddress = "127.0.0.1"
App.ServerPort = 502
App.OpenConnection
#Create a Modbus display window called Win1
Win1 = win32.Dispatch("Mbpoll.Document")
# Read 100 holding registers from slave ID 1, address 0 (40001) every 1000ms
Win1.ReadHoldingRegisters(1, 0, 100, 1000)
# Show the Modbus window
Win1.ShowWindow()
# Show 20 rows
Win1.Rows(1)
# Disable refresh for speed
Win1.EnableRefresh = False
# Set all different formats
# This sets how the value is displayed
Win1.SetFormat(0, SIGNED)
Win1.SetFormat(1, UNSIGNED)
Win1.SetFormat(2, HEX)
Win1.SetFormat(3, BINARY)
Win1.SetFormat(4, S32_BE)
Win1.SetFormat(6, S32_LE)
Win1.SetFormat(8, S32_BE_BS)
Win1.SetFormat(10, S32_LE_BS)
Win1.SetFormat(12, U32_BE)
Win1.SetFormat(14, U32_LE)
Win1.SetFormat(16, U32_BE_BS)
Win1.SetFormat(18, U32_LE_BS)
Win1.SetFormat(20, S64_BE)
Win1.SetFormat(24, S64_LE)
Win1.SetFormat(28, S64_BE_BS)
Win1.SetFormat(32, S64_LE_BS)
Win1.SetFormat(40, U64_BE)
Win1.SetFormat(44, U64_LE)
Win1.SetFormat(48, U64_BE_BS)
Win1.SetFormat(52, U64_LE_BS)
Win1.SetFormat(60, FLOAT_BE)
Win1.SetFormat(62, FLOAT_LE)
Win1.SetFormat(64, FLOAT_BE_BS)
Win1.SetFormat(66, FLOAT_LE_BS)
Win1.SetFormat(80, DOUBLE_BE)
Win1.SetFormat(84, DOUBLE_LE)
Win1.SetFormat(88, DOUBLE_BE_BS)
Win1.SetFormat(92, DOUBLE_LE_BS)
# Set all Names to used format
Win1.SetName(0, "SIGNED")
Win1.SetName(1, "UNSIGNED")
Win1.SetName(2, "HEX")
Win1.SetName(3, "BINARY")
Win1.SetName(4, "S32_BE")
Win1.SetName(6, "S32_LE")
Win1.SetName(8, "S32_BE_BS")
Win1.SetName(10, "S32_LE_BS")
Win1.SetName(12, "U32_BE")
Win1.SetName(14, "U32_LE")
Win1.SetName(16, "U32_BE_BS")
Win1.SetName(18, "U32_LE_BS")
Win1.SetName(20, "S64_BE")
Win1.SetName(24, "S64_LE")
Win1.SetName(28, "S64_BE_BS")
Win1.SetName(32, "S64_LE_BS")
Win1.SetName(40, "U64_BE")
Win1.SetName(44, "U64_LE")
Win1.SetName(48, "U64_BE_BS")
Win1.SetName(52, "U64_LE_BS")
Win1.SetName(60, "FLOAT_BE")
Win1.SetName(62, "FLOAT_LE")
Win1.SetName(64, "FLOAT_BE_BS")
Win1.SetName(66, "FLOAT_LE_BS")
Win1.SetName(80, "DOUBLE_BE")
Win1.SetName(84, "DOUBLE_LE")
Win1.SetName(88, "DOUBLE_BE_BS")
Win1.SetName(92, "DOUBLE_LE_BS")
# Refresh
Win1.EnableRefresh = True
Win1.ResizeAllColumns ()
Win1.ResizeWindow()
print (Win1.GetName(1))
_ = input("Press ENTER to quit:")
连接功能/属性
以下属性和功能与您在连接对话框 (F3) 中的设置相同。
13.3.1. 联系
连接选择所需的连接。可以选择串行端口或以太网连接之一。
属性连接为整数有效值
0 = 串行端口
1 = Modbus TCP/IP
2 = Modbus UDP/IP
3 = Modbus ASCII/RTU over TCP/IP
4 = Modbus ASCII/RTU over UDP/IP
例子
Connection = 0
13.3.2. 波特率
仅适用于 Connection = 0
属性BaudRate as Long有效值
300
600
1200
2400
4800
9600(默认)
14400
19200
38400
56000
57600
115200
128000
153600
230400
256000
460800
921600例子
BaudRate = 9600
13.3.3. 数据位
仅适用于 Connection = 0
属性DataBits为整数有效值
7
8(默认)
例子
DataBits = 8
13.3.4. 平价
仅适用于 Connection = 0
属性奇偶校验为整数有效值
0 = 无
1 = 奇数
2 = 偶数(默认)
例子
Parity = 2
13.3.5. 停止位
仅适用于 Connection = 0
属性StopBits为整数有效值
1(默认)
2
例子
StopBits = 1
13.3.6。串行端口
仅适用于 Connection = 0
将SerialPort属性设为整数有效值
1…255
默认值 = 1例子
SerialPort = 1
13.3.7. 模式
仅适用于 Connection = 0
属性模式为整数有效值
0 = RTU 模式
1 = ASCII 模式
例子
Mode = 1
13.3.8. 移除回声
仅适用于 Connection = 0
如果您的设备或 RS232/RS485 转换器回显刚刚发送的字符。
属性RemoveEcho为整数有效值
0(默认)
1(去除回声)
例子
RemoveEcho = 1
13.3.9。响应超时
ResponseTimeout 指定 Modbus Poll 在放弃之前应等待从设备响应的时间长度(以 ms 为单位)。
属性ResponseTimeout为整数有效值
50…100000
默认值 = 1000例子
ResponseTimeout = 1000
13.3.10。轮询之间的延迟
属性DelayBetweenPolls为整数有效值
0…1000
默认值 = 20例子
DelayBetweenPolls = 20
13.3.11。服务器端口
仅适用于 Connection = 1…4
属性ServerPort as Long有效值
0…65535
默认值 = 502例子
ServerPort = 502
13.3.12。连接超时
ConnectTimeout 指定 Modbus Poll 等待 TCP/IP 连接成功的时间长度。
仅适用于 Connection = 1…4
属性ConnectTimeout为整数有效值
100…30000 毫秒
默认值 = 1000 毫秒例子
ConnectTimeout = 1000
13.3.13。IP版本
仅适用于 Connection = 1…4
属性IPVersion为整数有效值
4 = IP 版本 4(默认)
6 = IP 版本 6
例子
IPVersion = 4
13.3.14。开放连接
打开使用 Connection 属性选择的连接。
函数OpenConnection () 作为整数参数
这个函数没有参数。返回值
错误3-5:请检查您是否有最新的串口驱动程序。
错误 | 描述 |
---|---|
0 | 成功 |
1 | 串口不可用 |
3 | 串行端口。无法从端口驱动程序获取当前设置。 |
4 | 串行端口。串行端口驱动程序不接受端口设置。 |
5 | 串行端口。串行端口驱动程序不接受超时设置。 |
12 | TCP/UDP 连接失败。WSA 启动 |
13 | TCP/UDP 连接失败。连接错误 |
14 | TCP/UDP 连接失败。暂停 |
15 | TCP/UDP 连接失败。IOCTL |
17 | TCP/UDP 连接失败。套接字错误 |
21 | TCP/UDP 连接失败。地址信息 |
255 | 连接已打开 |
Excel 示例如何打开 Modbus TCP/IP 连接
Public app As Object
Dim res As Integer
' Create an object to Modbus Poll
Set app = CreateObject("Mbpoll.Application")
app.Connection = 1 ' Select Modbus TCP/IP
app.IPVersion = 4
app.IPAddress = "192.168.1.27"
app.ServerPort = 502
app.ConnectTimeout = 1000
app.ResponseTimeout = 1000
res = app.OpenConnection()
Python 示例如何设置串行连接
import win32com.client as win32
App = win32.Dispatch('Mbpoll.Application')
App.Connection = 0 # Serial connection
App.SerialPort = 3 # Com port 3
App.BaudRate = 9600 # 9600 baud
App.Parity = 0 # None parity
App.Mode = 0 # RTU mode
App.ResponseTimeout = 1000 # Wait 1000ms until give up
App.DelayBetweenPolls = 20 # Ensure minimum 20 ms gap until next request
App.OpenConnection
#Create a Modbus display window called Win1
Win1 = win32.Dispatch("Mbpoll.Document")
# Read 10 holding registers from slave ID 1, address 0 (40001) every 1000ms
Win1.ReadHoldingRegisters(1, 0, 10, 1000)
# Show the Modbus window
Win1.ShowWindow()
# Show 10 rows
Win1.Rows(0)
# Disable refresh for speed
Win1.EnableRefresh = False
# Set the name of the registers
Win1.SetName(0, "Register 0")
# Set the value to write
Win1.EnableRefresh = True
Win1.ResizeAllColumns ()
Win1.ResizeWindow()
_ = input("Press ENTER to quit:")
关闭连接
函数CloseConnection () 作为整数参数
这个函数没有参数。返回值
成功则为零。如果失败,则为非零值。
ShowCommunicationTraffic
显示通信流量窗口。
函数ShowCommunicationTraffic ()参数
这个函数没有参数。返回值
没有
关闭通讯交通
关闭通信流量窗口(如果显示)。
函数CloseCommunicationTraffic ()参数
这个函数没有参数。返回值
没有
读取函数
以下功能与您在读/写定义对话框 (F8) 中的设置相同。读取函数与 Modbus Poll 文档相关联。(数据窗口)例子
' First a Modbus Poll document is needed.
Public doc As Object
Set doc = CreateObject("Mbpoll.Document")
res = doc.ReadCoils(1, 0, 100, 1000) ' Read 100 coils every 1000ms
您必须先创建读取,然后才能使用属性获取数据。 |
读取线圈
Modbus功能码01
函数ReadCoils (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 2000
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
读取离散输入
Modbus功能码02
函数ReadDiscreteInputs (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 2000
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
13.4.3. ReadHoldingRegisters
Modbus功能码03
函数ReadHoldingRegisters (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 125
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
13.4.4. 读取输入寄存器
Modbus功能码04
函数ReadInputRegisters (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 125
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
自动化写入函数
写入函数写入存储在由属性填充的数组中的值。下面的 Write 函数不创建数据窗口。要创建数据窗口,请使用 Win 函数,例如WriteMultipleRegistersWin。
13.5.1. 写单线圈
Modbus 功能代码 05。
写入存储在写入数组中的第一个线圈。
函数WriteSingleCoil (SlaveID As Integer, Address As Long) As Integer参数
SlaveID:从机地址 0 到 255
地址:数据地址(Base 0)返回值
如果写入数组已准备好并且数据已发送,则为真。如果数组为空或参数错误,则为 False。
控制应用程序负责通过读回写入的值来验证写入操作。
13.5.2. 写单个寄存器
Modbus 功能代码 06。
写入存储在写入数组中的第一个寄存器。
函数WriteSingleRegister (SlaveID As Integer, Address As Long) As Integer参数
SlaveID:从机地址 0 到 255
地址:数据地址(Base 0)返回值
如果写入数组已准备好并且数据已发送,则为真。如果数组为空或参数错误,则为 False。
控制应用程序负责通过读回写入的值来验证写入操作。
13.5.3. 写多个线圈
Modbus 功能码 15.
写入存储在写入数组中的线圈。
函数WriteMultipleCoils (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer返回值
如果写入数组已准备好并且数据已发送,则为真。如果数组为空或参数错误,则为 False。
控制应用程序负责通过读回写入的值来验证写入操作。参数
SlaveID:从机地址 0 到 255
Address:数据地址(Base 0)
Quantity数据的数量。1 至 1968
13.5.4. 写多个寄存器
Modbus 功能代码 16.
写入存储在写入数组中的寄存器。
函数WriteMultipleRegisters (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer参数
SlaveID:从机地址 0 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 123返回值
如果写入数组已准备好并且数据已发送,则为真。如果数组为空或参数错误,则为 False。
控制应用程序负责通过读回写入的值来验证写入操作。
13.5.5. Python 示例
Python 示例如何创建一个从地址 0 (40001) 读取 10 个寄存器然后写入 5 个寄存器的窗口。Python 示例
import sys
import time
import win32com.client as win32
App = win32.Dispatch('Mbpoll.Application')
App.Connection = 1 # TCP/IP connection
App.IPAddress = "127.0.0.1"
App.ResponseTimeout = 1000 # Wait 1000ms until give up
App.DelayBetweenPolls = 20 # Ensure minimum 20 ms gap until next request
App.ConnectTimeout = 500 # Wait 500ms until give up
App.ServerPort = 502
result = App.OpenConnection
if result != 0:
print("Connection failed. Error: ", result)
sys.exit()
#Create a Modbus display window called Win1
Win1 = win32.Dispatch("Mbpoll.Document")
# Read 10 holding registers from slave ID 1, address 0 (40001) every 1000ms
Win1.ReadHoldingRegisters(1, 0, 10, 1000)
# Show the Modbus window
Win1.ShowWindow()
# Show 10 rows
Win1.Rows(0)
# Resize the window to fit to the grid
Win1.ResizeWindow()
time.sleep(1.0) # Wait until read is done
if Win1.ReadResult == 0: # Check read result
print("Modbus register 0 (40001) = ", Win1.SRegisters(0))
else:
print("Read failed error: = ", Win1.ReadResult)
print ("Tx count = %d, Rx count = %d" % (Win1.GetTxCount, Win1.GetRxCount))
# Prepare the internal array in Modbus Poll with data to write
Win1.SRegisters(0, 1) # Note that parameter 1 is not a
Win1.SRegisters(1, 10) # Modbus address but an index to the array
Win1.SRegisters(2, 100)
Win1.SRegisters(3, 1000)
Win1.SRegisters(4, 10000)
# Write the registers. This function do not create a window in Modbus Poll
# Use the function <<WriteMultipleRegistersWin>> to create a data window
Win1.WriteMultipleRegisters (1, 0, 5)
_ = input("Wait for write Press ENTER:")
if Win1.WriteResult == 0: # Check write result
print("Modbus write success")
else:
print("Write failed error: = ", WriteResult)
_ = input("Press ENTER to quit:")
各种功能
各种功能与 Modbus Poll 文档相关联。(数据窗口)
13.6.1. 展示窗口
默认 Modbus 文档窗口是隐藏的。ShowWindow 函数使 Modbus Poll 可见并显示带有数据内容的文档。
函数显示窗口()参数
这个函数没有参数。返回值
没有
13.6.2. 获取TxCount
检索请求数。
函数GetTxCount () 只要参数
这个函数没有参数。返回值
请求的数量。
13.6.3. 获取接收计数
检索响应数。
函数GetRxCount () 只要参数
这个函数没有参数。返回值
响应的数量。
13.6.4. 获取名称
检索值的名称。
函数GetName(索引为整数)为字符串参数
索引:索引 0 对应第一个 Modbus 地址。返回值
名字。
13.6.5. 集合名称
更改值的名称。函数SetName(索引为整数,名称为字符串)参数
索引:索引 0 对应第一个 Modbus 地址。
名称:值单元格的名称。返回值
没有
13.6.6。全部格式化
使用所选格式格式化所有值单元格。
函数FormatAll(格式化为整数)参数
格式:值单元格的格式。返回值
没有
13.6.7. 获取格式
检索 Modbus 值的显示格式。
函数GetFormat(索引为整数)为整数参数
索引:索引 0 对应第一个 Modbus 地址。
返回值
ID | 格式 |
---|---|
0 | 签 |
1 | 未签名 |
2 | 十六进制 |
3 | 二进制 |
4 | 浮点小端字节交换 |
5 | 浮点大端 |
6 | 双小端字节交换 |
7 | 双大端序 |
8 | 32 位有符号小端字节交换 |
9 | 32 位有符号大端序 |
10 | 浮点小端序 |
11 | 浮点大端字节交换 |
12 | 双小端序 |
13 | 双大端字节交换 |
14 | 32 位有符号小端序 |
15 | 32 位有符号大端字节交换 |
17 | 32 位无符号大端序 |
18 | 32 位无符号小端字节交换 |
19 | 32 位无符号大端字节交换 |
20 | 32 位无符号小端序 |
21 | 64 位有符号大端序 |
22 | 64 位有符号小端字节交换 |
23 | 64 位有符号大端字节交换 |
24 | 64 位有符号小端序 |
25 | 64 位无符号大端 |
26 | 64 位无符号小端字节交换 |
27 | 64 位无符号大端字节交换 |
28 | 64 位无符号小端序 |
此设置仅用于显示。在使用 Get/Set 值函数时,您仍然需要使用 byteOrder 来获得正确的字节顺序。 |
13.6.8. 设置格式
更改 Modbus 值的显示格式。请参阅上面的格式值。
函数SetFormat(索引为整数,格式为整数)参数
索引:索引 0 对应第一个 Modbus 地址。
格式:值单元格的格式。返回值
没有
13.6.9。调整窗口大小
调整打开的窗口大小以适合网格。
函数调整窗口()参数
这个函数没有参数。返回值
没有
13.6.10。调整所有列大小
调整所有列的大小以适合单元格内的值。
函数ResizeAllColumns ()参数
这个函数没有参数。返回值
没有
13.6.11。行
指定网格中的行数。
函数行(NumberRows)参数
NumberRows:网格中的行数。
ID | 描述 |
---|---|
0 | 10 行(默认) |
1 | 20行 |
2 | 50 行 |
3 | 100 行 |
4 | 适合数量 |
返回值
没有
13.6.12。读取结果
使用此属性检查与 Read 建立的通信是否运行成功。
属性ReadResult As Integer参数
这个函数没有参数。返回值
错误 | 描述 |
---|---|
0 | 成功 |
1 | 超时错误 |
2 | CRC 错误 |
3 | RESPONSE ERROR(响应不是预期的从属 ID、功能或地址) |
4 | 写错误 |
5 | 读取错误 |
6 | 端口未打开错误 |
10 | 数据未初始化 |
11 | 收到的字节不足 |
16 | 字节数错误 |
19 | 交易 ID 错误 |
81小时 | 非法功能 |
82小时 | 非法数据地址 |
83小时 | 非法数据值 |
84小时 | 服务器设备故障 |
85小时 | 承认 |
86小时 | 服务器设备忙 |
87小时 | NAK-否定确认 |
8Ah | 网关路径不可用 |
8Bh | 网关目标设备无法响应 |
13.6.13。写结果
使用此函数检查写入是否成功。
该值是 DATA_UNINITIALIZED,直到从站的结果可用。有关可能值的列表,请参阅ReadResult 。
属性WriteResult As Integer返回值
以整数形式返回写入结果。
自动化数据属性
以下属性用于在 Modbus Poll 的内部写入/读取数组中设置或获取值。使用的索引不是 Modbus 地址。无论使用什么地址,索引总是从 0 开始计数。数据属性与 Modbus Poll 文档相关联。(数据窗口)
每个数据属性有 2 个版本:
- 没有后缀的一种,例如SRegisters,用于从内部写入/读取数组中设置或获取值。
- 以 Win 作为后缀的一种,例如SRegistersWin,用于直接从数据窗口设置或获取值。这在数据窗口用于写入函数时使用,例如WriteMultipleRegistersWin。
示例 1:
' doc is assumed created first. See Excel example.
' Writes 1 to index 0 in the data array used for the Write function later
doc.SRegisters(0) = 1
doc.SRegisters(1) = 10
doc.SRegisters(2) = 1234
' Write 3 registers stored in Modbus Poll internal array
' to Modbus address 100 (40101)
' A window is not created
res = doc.WriteMultipleRegisters(1, 100, 3)
' The above example do not create a data window but just make a single Modbus write.
带有浮点值的示例 2:
写入 3 个浮点值。
' doc is assumed created first. See Excel example.
doc.Floats(0) = 1.3
doc.Floats(2) = 10.5
doc.Floats(4) = 1234.12
' Write the 6 register stored in Modbus Poll
res = doc. WriteMultipleRegisters(1, 0, 6)
' 6 Registers are written as a floating point value is 32 bit wide.
示例 3:
创建一个写入 3 个寄存器的窗口。
' doc is assumed created first. See Excel example.
' A window is created that writes the content every 1000ms
res = doc.WriteMultipleRegistersWin(1, 100, 3, 1000)
' Writes 1 to the first cell in the data window
doc.SRegistersWin(0) = 1
doc.SRegistersWin(1) = 10
doc.SRegistersWin(2) = 1234
' Now the 3 registers are written to slave id 1 address 100 every 1000ms
13.7.1. 线圈,线圈赢
属性线圈(索引为整数)为整数描述
在写入数组结构中设置一个线圈或从读取数组返回一个线圈。句法
线圈(索引)[=newvalue]
13.7.2. SRegisters, SRegistersWin
属性SRegisters (Index As Integer) As Integer描述
在写入数组结构中设置一个寄存器或从读取数组返回一个寄存器。句法
SRegisters(索引)[=新值]
13.7.3. URegisters, URegistersWin
属性URegisters(索引为整数)只要描述
在写入数组结构中设置一个寄存器或从读取数组返回一个寄存器。句法
URegisters(索引)[=新值]
13.7.4. Ints_32, Ints_32Win
属性Ints_32(索引为整数)为 Double描述
在写入数组结构中设置一个 32 位整数或从读取数组返回一个整数。句法
Ints_32(索引)[=新值]
13.7.5。UInts_32, UInts_32Win
属性UInts_32 (Index As Integer) As Double描述
在写入数组结构中设置一个 32 位无符号整数或从读取数组返回一个无符号整数。句法
UInts_32(索引)[=新值]
13.7.6。Ints_64, Ints_64Win
属性Ints_64(索引为整数)为 Double描述
在写入数组结构中设置一个 64 位整数或从读取数组返回一个整数。句法
Ints_64(索引)[=新值]
13.7.7. UInts_64, UInts_64Win
属性UInts_64 (Index As Integer) As Double描述
在写入数组结构中设置一个 64 位无符号整数或从读取数组返回一个无符号整数。句法
UInts_64(索引)[=新值]
13.7.8。花车,花车赢
属性浮点数(索引为整数)为单个描述
在写入数组结构中设置一个浮点数或从读取数组返回一个浮点数。句法
浮点数(索引)[=newvalue]
13.7.9。双打,双打赢
属性双精度数(索引为整数)双精度数描述
在写入数组结构中设置双精度或从读取数组返回双精度。句法
双打(索引)[=newvalue]
13.7.10。字节序
属性ByteOrder As Integer描述
设置 Ints_32、UInts_32、Ints_64、UInts_64、Floats 和 Doubles 属性使用的字节顺序。
Win 版本不使用此属性ByteOrder。
ID | 字节序 |
---|---|
0 | 大端(默认) |
1 | 小端字节交换 |
2 | 大端字节交换 |
3 | 小端序 |
Ints_32 示例:
字节顺序:大端
十进制数 123456789 或十六进制 07 5B CD 15
它们在 Modbus 消息中通过线路的顺序:07 5B CD 15句法
字节顺序[=新值]
编写函数(创建数据窗口)
以下功能与您在读/写定义对话框 (F8) 中设置的功能相同。
这些函数创建一个数据窗口,数据窗口中的数据内容根据扫描速率写入。
13.8.1. 写单线圈赢
Modbus 功能代码 05。
函数WriteSingleCoilWin (SlaveID As Integer, Address As Long, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
地址:数据地址(Base 0)
ScanRate: 0 到 3600000ms返回值
如果成功则为真。如果不成功则为假
13.8.2. 写单寄存器赢
Modbus 功能代码 06。
函数WriteSingleRegisterWin (SlaveID As Integer, Address As Long, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
地址:数据地址(Base 0)
ScanRate: 0 到 3600000ms返回值
如果成功则为真。如果不成功则为假Python 示例如何打开一个窗口并每 1000 毫秒写入一个寄存器
import win32com.client as win32
SIGNED = 0
App = win32.Dispatch('Mbpoll.Application')
App.Connection = 1
App.IPAddress = "127.0.0.1"
App.ServerPort = 502
App.OpenConnection
#Create a Modbus display window called Win1
Win1 = win32.Dispatch("Mbpoll.Document")
# Write 1 holding registers to slave ID 1, address 0 (40001) every 1000 ms
Win1.WriteSingleRegisterWin(1, 0, 1000)
# Show the Modbus window
Win1.ShowWindow()
# Fit rows to quantity
Win1.Rows(4)
# Disable refresh for speed
Win1.EnableRefresh = False
# This sets how the value is displayed
Win1.SetFormat(0, SIGNED)
# Set the Name of the register
Win1.SetName(0, "Setting")
# Set the value to write
Win1.SRegistersWin(0, 100)
Win1.EnableRefresh = True
Win1.ResizeAllColumns ()
Win1.ResizeWindow()
_ = input("Press ENTER to quit:")
13.8.3. WriteMultipleCoilsWin
Modbus 功能代码 15。
函数WriteMultipleCoilsWin (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 1968
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
13.8.4. WriteMultipleRegistersWin
Modbus 功能代码 16。
函数WriteMultipleRegistersWin (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机地址 1 到 255
Address:数据地址(Base 0)
Quantity:数据个数。1 到 123
扫描速率: 0 到 3600000 毫秒返回值
如果成功则为真。如果不成功则为假
异常和错误信息
Modbus 异常和错误消息以红色文本显示在每个窗口的第 2 行。
Modbus 异常代码
Modbus 异常是从设备返回的错误。
代码 | 姓名 | 意义 |
---|---|---|
01 | 非法功能 | 查询中收到的功能代码不是服务器(或从机)允许的操作。这可能是因为该功能码仅适用于较新的设备,并没有在所选单元中实现。它还可能表明服务器(或从属)处于错误状态来处理这种类型的请求,例如因为它没有配置并且被要求返回寄存器值。 |
02 | 非法数据地址 | 查询中收到的数据地址不是服务器允许的地址。更具体地说,参考号和传输长度的组合是无效的。对于一个有 100 个寄存器的控制器,PDU 寻址第一个寄存器为 0,最后一个寄存器为 99。如果提交的请求起始寄存器地址为 96,寄存器数量为 4,则该请求将成功运行(至少在地址方面)在寄存器 96、97、98、99 上。如果提交的请求的起始寄存器地址为 96,寄存器数量为 5,则此请求将失败,异常代码 0x02“非法数据地址”因为它试图对寄存器 96、97、98、99 和 100 进行操作,并且没有地址为 100 的寄存器。 |
03 | 非法数据值 | 查询数据字段中包含的值不是服务器(或从属)允许的值。这表明复杂请求的其余部分的结构存在错误,例如隐含长度不正确。这并不意味着提交存储在寄存器中的数据项具有超出应用程序预期的值,因为 MODBUS 协议不知道任何特定寄存器的任何特定值的重要性。 |
04 | 服务器设备故障 | 服务器(或从属服务器)尝试执行请求的操作时发生不可恢复的错误。 |
05 | 承认 | 专门与编程命令结合使用。 服务器(或从属服务器)已接受请求并正在处理它,但这样做需要很长时间。返回此响应以防止在客户端(或主控)中发生超时错误。客户端(或主控)接下来可以发出轮询程序完成消息以确定处理是否完成。 |
06 | 服务器设备忙 | 专门与编程命令结合使用。 服务器(或从机)正在处理一个长时间的程序命令。当服务器(或从属)空闲时,客户端(或主控)应稍后重新传输消息。 |
0A | 网关路径不可用 | 与网关结合使用时,表示网关无法分配从输入端口到输出端口的内部通信路径以处理请求。通常意味着网关配置错误或过载。 |
0B | 网关目标设备响应失败 | 与网关结合使用时,表示未从目标设备获得响应。通常意味着该设备不存在于网络上。 |
Modbus 轮询错误消息
错误信息 | 意义 |
---|---|
超时错误 | 未在预期时间内收到响应。检查以下内容:串行连接串行设置,如波特率、奇偶校验、数据位、停止位等。Modbus 模式,RTU 或 ASCII从站 ID响应超时TCP/IP 连接响应超时检查Host和Port与从机是否一致 |
响应错误 | 反应不是预期的。不同的从站 ID。 |
CRC 错误 | 接收到的响应的 CRC 值不正确。 |
写入错误 | 这是串行驱动程序报告的错误。如果使用 USB/RS232/485 转换器并且拔下 USB 电缆,则可能会发生这种情况。有4种类型:中断条件输入输出错误串行连接错误输出缓冲区溢出使用 TCP/IP 连接的写入错误通常是由于连接丢失引起的。 |
读取错误 | 这是串行驱动程序报告的错误。有6种:构图错误字符缓冲区溢出奇偶校验错误输入缓冲区溢出输入输出错误中断条件使用 TCP/IP 连接读取错误通常是由于连接丢失造成的。 |
收到的字节数不足 | 响应不是预期的长度。 |
字节数错误 | 响应中的字节数不正确。与预期相比。 |
交易 ID 错误 | 它用于事务配对,MODBUS 服务器在响应中复制请求的事务标识符。 |
Comments(22)
11111
感谢分享
学习
xz
介绍的很详细,非常好用
xiazia
感谢
下载
谢谢
666
感谢
收下
谢谢楼主
最新版吗?给力!
感谢楼主
感谢楼主
感谢楼主
感谢楼主
感谢感谢
感谢楼主
介绍的很详细,非常好用
ceshi