- 1. 1.Modbus Poll
- 2. 1.1. Modbus 轮询的system要求
- 3. 1.2. 终止用户许可协议
- 4. 2. Modbus 轮询Function
- 5. 2.1. connect
- 6. 2.2. 支持的 Modbus Function
- 7. 2.3. data记录
- 8. 2.4. Display format
- 9. 2.5. 其他Function
- 10. 3. 概述
- 11. 3.1. 随时随地提供帮助
- 12. 3.2. 命名单元格
- 13. 3.3. 值单元格
- 14. 3.4. 更改字体
- 15. 3.5. 条件颜色
- 16. 3.6. 缩放
- 17. 3.7. 实时图表
- 18. 3.8. address扫描
- 19. 3.9. 打开一个新窗口
- 20. 4. connect对话框
- 21. 4.1. 联系
- 22. 4.2. 串口设置
- 23. 4.3. 远程服务器
- 24. 4.4. 高级设置
- 25. 5. 读/写定义
- 26. 5.1. 从机ID
- 27. 5.2. function code
- 28. 5.3. address
- 29. 5.4. 扫描率
- 30. 5.5. 读/写禁用
- 31. 5.6. 隐藏名称列
- 32. 5.7. 单元格中的address
- 33. 5.8. PLC address(基address 1)
- 34. 5.9. 安然/丹尼尔·莫德
- 35. 5.10. 行数
- 36. 6. 实时图表
- 37. 6.1. 设置
- 38. 6.2. 变焦Function
- 39. 6.3. 平移Function
- 40. 6.4. 将data链接到图表系列
- 41. 6.5. 出口系列
- 42. 7. address扫描
- 43. 7.1. exportaddress扫描
- 44. 8. Display format
- 45. 8.1. 本机 Modbus register
- 46. 8.2. 32 位有符号整数
- 47. 8.3. 32 位无符号整数
- 48. 8.4. 64 位有符号整数
- 49. 8.5。64 位无符号整数
- 50. 8.6。32位浮点
- 51. 8.7. 64位双
- 52. 9. 保存/打开工作区
- 53. 10.export为csv
- 54. 11. export到Modbus Slave
- 55. 12. 测试中心
- 56. 12.1。ASCII 示例
- 57. 12.2. TCP/IP 示例
- 58. 12.3。测试中心字符串文件
- 59. 12.4。Copy
- 60. 13.Modbusdata记录
- 61. 13.1. Text文件
- 62. 13.2. 微软Excel
- 63. 14.通讯流量
- 64. 15.OLE/自动化
- 65. 15.1. Excel 示例
- 66. 15.2. Python示例
- 67. 15.3。connectFunction/属性
- 68. 15.4。读取函数
- 69. 15.5。自动写入Function
- 70. 15.6。多种Function
- 71. 15.7。自动化data属性
- 72. 15.8。编写函数(创建data窗口)
- 73. 16. 异常和Error消息
- 74. 16.1. Modbus 异常代码
- 75. 16.2. Modbus 轮询Error消息
Witte Software® https://www.modbustools.com
2023-08-01
1.Modbus Poll
Modbus Poll 是一款易于使用的 Modbus 主站模拟器,专为多种用途而开发。其中:
- Modbus 从设备设计者可快速轻松地测试协议接口
- 需要现场测试Modbus设备或网络的自动化工程师
- 想要从设备读取和/或更改特定服务data的服务工程师
- 更改从设备中的 Modbus register
- 来自 Modbus 设备的日志data
- 故障排除和合规性测试
1.1. Modbus 轮询的system要求
硬件要求
处理器; 建议 1 GHz 或更快
1 GB RAM
5 MB 可用硬盘空间
1024 x 768 显示分辨率Operationsystem要求
支持从 Windows 7 到 Windows 11 的所有 Windows 版本。
Modbus Poll 版本 7 在 Windows XP 上运行。
1.1.1. 静默安装
静默安装不需要用户干预,并且没有用户界面。用户看不到任何对话框,也不会被问到任何问题。
使用命令行 /S switch。
1.2. 终止用户许可协议
在使用 Modbus Poll 之前,您应仔细阅读以下条款和条件。除非您有 Witte Software 签署的不同许可协议,否则您使用本软件即表示您接受本许可协议和保证。如果您不接受这些条款,您必须立即停止使用该软件。
版权。
Modbus Poll(“软件”)版权所有 2002-2023,归 Witte Software 所有,All rights reserved。
评估和Register。
这不是free软件。您特此被许可在 30 天内free使用本软件进行评估。
如果您在 30 天评估期后使用本软件,则需要支付Register费。
30 天评估期后未经Register使用本软件将违反美国和国际版权法。
本软件的一份Register副本可以由在一台或多台计算机上个人使用该软件的一个人使用,也可以安装在由多人使用的一台计算机上,但不能同时安装在这两种计算机上。
有关订单和定价的信息,请访问https://www.modbustools.com/order.html
Modbus Poll 许可证是永久的。一旦您购买了特定主要版本的许可证,并且只要遵守许可协议,您就可以永久使用该版本,无需额外费用。
分配。
如果您不包含您的许可证密钥,您将被授权Copy本软件;向任何人提供原件的精确副本;并通过电子方式分发未经修改的软件。特别禁止您对任何此类副本收费。
有限保修。
本软件按原样提供,WITTE SOFTWARE 不承担与本软件Related的所有明示或默示保证,包括但不限于适销性和特定用途适用性的任何默示保证。
损害赔偿限制。
对于因使用或无法使用该软件而造成的任何间接、后果性或附带损害,WITTE SOFTWARE 或参与该软件的创建、生产或交付的任何人均不承担责任,即使 WITTE SOFTWARE 已被告知这种可能性此类损害或索赔。在任何情况下,无论索赔形式如何,WITTE SOFTWARE 对任何损害的责任均不超过为使用本软件的许可所支付的价格。使用该软件的人承担与该软件的质量和性能Related的所有风险。
2. Modbus 轮询Function
2.1. connect
Modbus Poll 使用以下方式从设备读取/写入data:
- RS232 或 RS485 网络上的 Modbus RTU 或 ASCII。(USB/RS232/485转换器)
- Modbus TCP/IP
- TCP/IP 上的 Modbus。(Modbus RTU/ASCII封装在TCPdata包中)
- 协议UDP/IP
- 基于 UDP/IP 的 Modbus。(Modbus RTU/ASCII封装在UDPdata包中)
2.2. 支持的 Modbus Function
- 01 (0x01) 读取线圈
- 02 (0x02) Read discrete inputs
- 03 (0x03) Read and hold register
- 04 (0x04) Read input register
- 05 (0x05) 写单个线圈
- 06 (0x06) 写单个register
- 08 (0x08) 诊断(仅限串行线)
- 11 (0x0B) 获取通讯事件计数器(仅限串行线)
- 15 (0x0F) Write multiple coils
- 16 (0x10) Write multiple registers
- 17 (0x11) 报告服务器 ID(仅限串行线路)
- 22 (0x16) 掩码写register
- 23 (0x17) 读/写多个register
- 43 / 14 (0x2B / 0x0E) 读取设备标识
2.3. data记录
- 将data记录到Text文件
- 将data直接记录到 Excel 中
2.4. Display format
每个单元格都可以单独format化。
- 有符号 16 位register
- 无符号 16 位register
- hexadecimal
- binary
- 具有任意字/byte order的 32 位有符号整数
- 具有任意字/byte order的 32 位无符号整数
- 具有任意字/byte order的 64 位有符号整数
- 具有任意字/byte order的 64 位无符号整数
- 具有任意字/byte order的 32 位浮点数
- 具有任意字/byte order的 64 位双浮点
2.5. 其他Function
- 用于与 Excel VBA、Python 等connect的 OLE/自动化。
- data流量监控
- 打印和打印预览
- 字体选择
- 条件颜色
- 缩放
- 实时图表
- 保存/打开工作区
- address扫描
3. 概述
Modbus Poll 使用多Document接口。这意味着可以打开多个窗口。每一个同时具有来自不同从设备的不同data内容。

这张照片显示了两个打开的窗户。一次读取来自从机 id 1 的 10 个保持register,另一次读取来自从机 id 2 的 10 个保持register。
3.1. 随时随地提供帮助
按 F1即可获取与当前所选项目Related的主题的上下文Related帮助。
SHIFT + F1调用特殊的“帮助模式”,其中光标变成帮助光标(箭头+问号)。然后,用户可以选择用户界面中的可见对象,例如菜单项、Tools栏button或窗口。这将打开有关描述所选项目的主题的帮助。
3.2. 命名单元格
您可以在此处键入任何Text来指定值单元格。您还可以从 Excel 单元格Copy/粘贴Text。
3.3. 值单元格
显示 Modbus register的data值。如果双击值单元格,将出现一个对话框,您可以将新值写入从设备。在值单元格中键入数字也会显示该对话框。可以选择用于写入值的 Modbus Function。
“Response成功时Close对话框”复选框用于在成功send值时自动Close对话框。当要更改大量值时,这很方便。这样,可以快速选择新单元格,然后再次键入新值。

3.4. 更改字体
要更改字体,您有 2 个选项
- 选择要更改的单元格,然后右键单击。
- 选择要更改的单元格,然后菜单→显示→字体。

3.5. 条件颜色
条件颜色可帮助您直观地显示特定范围内的值。3 种颜色选择
- 默认颜色:如果没有任何条件颜色Computation result为 true,则使用此颜色。
- Rules 1:如果表达式的Computation result为 true,则使用此颜色选择。Rules 1 优先于Rules 2。
- Rules 2:如果表达式的Computation result为 true,则使用此颜色选择。
7 比较运算符
- 不曾用过
- 等于
- 比…更棒
- 少于
- 大于或等于
- 小于或等于
- 和
当data type为 float 或 32 位 long Type时,不能使用“and”运算符。如果选择“and”,则条件值将以hexadecimal数字形式输入。如果单元格和条件值中的任何位均为 1,则其Computation result为 true。
3.5.1. 颜色示例
如果单元格值介于 398 和 402 之间,则为绿色

3.6. 缩放
缩放可帮助您将原始值缩放为人类可读的值。缩放仅适用于有符号和无符号 16/32 位整数。

(X1,Y1) 和 (X2,Y2)
穿过两点 (X1,Y1) 和 (X2,Y2) 的直线
Slope=m=Y2−Y1X2−X1
直线方程
Y=m⋅(X−X1)+Y1
精确小数点后的位数。使能够
必须Enable才能缩放来自 Modbus 服务器/从站的值。如果选择 16/32 位整数Display format以外的format,则自动禁用缩放。
3.7. 实时图表
该图表可以实时绘制 12 个系列,每个系列最多 100000 个点。
3.8. address扫描
扫描address范围以获取设备中所有effectiveaddress的列表。
3.9. 打开一个新窗口
要打开另一个窗口,您有 3 个选项:
- 按 CTRL+N
- 在文件菜单中选择新建
- 按
Tools栏上的
4. connect对话框
要打开connect对话框,您有 2 个选项:
- 按F3
- 从connect菜单中选择connect

4.1. 联系
有 5 种不同的connectType:
- 串行:
通过串行线路的 Modbus。RS232 或 RS485。可以使用USB串行转换器。 - Modbus TCP/IP:
如果要与 MODBUS TCP/IP 网络通信,请选择 TCP/IP。在这种情况下,从站 ID 与 MODBUS TCP/IP 中使用的单元 ID 相同。
端口号默认为 502。
如果connect失败,请尝试在命令提示符下是否可以 ping 通您equipment。如果 ping 命令失败,则 Modbus 轮询也会失败。 - Modbus UDP/IP:
如果要与 MODBUS UDP/IP 网络通信,请选择 UDP/IP。这与 Modbus TCP/IP 相同,但使用无connect UDP 协议。 - TCP/IP 上的 Modbus RTU/ASCII:
这是通过 TCP/IP 网络而不是串行线路send的 RTU 或 ASCII 消息。 - Modbus RTU/ASCII over UDP/IP:
这是通过 UDP/IP 网络而不是串行线路send的 RTU 或 ASCII 消息。
| connectType 3-5 不是www.modbus.org指定的标准 Modbus ,但添加它们是为了方便。 |
根据您的选择,一些其他设置将呈灰色。
4.2. 串口设置
使用这些参数来设置串行端口设置。仅当connectType为“串行端口”时它们才可用。模式
使用此选项选择RTU或ASCII模式。默认 RTU。Response超时
指定 Modbus 轮询在放弃之前应等待从属设备Response的timeLength。默认值为 1000 毫秒。轮询之间的最小延迟
无论扫描速率如何,此设置都可确保传输下一个Request之前的最小延迟。该设置的分辨率约为15ms。在某些计算机上可以获得更好的分辨率,但并非All。
| 如果将此值设置为低于 20 毫秒,则无法保证Response与新Request之间的time间隔为 3.5 个字符。这是因为 Windows 调度程序每 10 – 20 毫秒Switch一次任务。如果您在串行 RS485 网络中轮询多个从站,则不应将该值设置为低于 20ms。这是为了确保 3.5 个字符的time间隙。在 TCP/IP 网络中,小于 20 毫秒就可以了。仅与一台从设备的串行connecttime小于 20ms 即可。 |
用户Baud rate
如果默认Baud rate均无用,请指定CustomizationBaud rate。
4.3. 远程服务器
远程服务器设置仅在使用以太网connect时可用。IPaddress
服务器 IP address。默认为本地主机 127.0.0.1港口
服务器端口号。默认502connect超时
用于建立connect的最长time。默认 1000
4.4. 高级设置
即时战略Switch
RTS Switch指定如果byte可用于传输,则 RTS 线将为高电平。send所有缓冲byte后,RTS 线将为低电平。
如果您的 232/485 转换器没有自动方向switch,则可以使用它来Switch方向。
| 如果可能,应避免使用 RTS 控制的 RS232/RS485 转换器。对于Windows、Linux等非实时Operationsystem,很难确定发射机Close的具体time。如果过早Close,字符可能仍位于 FIFO 或 UART 的sendregister中,并且这些字符将会丢失。因此从机将无法识别该消息。另一方面,如果Close得太晚,则从设备的消息会被损坏,并且主设备将无法识别该消息。 |
数字SR
DSR 指定是否监视 DSR(data集就绪)信号以进行输出流控制。如果该成员为 TRUE 并且 DSR Close,则输出将暂停,直到再次send DSR。CTS
CTS 指定是否监视 CTS(Clearsend)信号以进行输出流量控制。如果Enable此复选框并且Close CTS,则输出将暂停,直到再次send CTS。数字TR
DTR 指定每当端口打开时是否Enable或禁用 DTR。消除回声
如果您equipment或 RS232/RS485 转换器回显刚刚send的字符。
5. 读/写定义
使用此命令定义活动窗口要监视的data。
要打开读/写定义对话框,您有 3 个选项:
- 按 F8
- 从设置菜单中选择“读/写定义”
- 按
Tools栏上的

5.1. 从机ID
范围 1 到 255。(MODBUS 协议规范规定为 247)。值 0 也可以直接与 MODBUS/TCP 或 MODBUS/UDP 设备通信。
5.2. function code
您可以选择 8 个Function代码中的 1 个。
5.2.1. 读取Function
读取函数返回的data显示在网格窗口上。
- 01:读取线圈(0x)
- 02:Read discrete inputs (1x)
- 03:Read and hold register(4x)
- 04:Read input register(3x)
5.2.2. 编写函数
写入函数写入网格窗口上显示的data。
- 05:Write into a single coil(写入Coil status)
- 06:Write to a single register(写入保持register)
- 15:Write multiple coils(Writes to Coils)
- 16:Write multiple registers(Writes to Holding registers)
5.3. address
Modbus协议中的address很混乱!一些协议规范使用协议/消息address,而其他协议规范则使用设备寻址。
5.3.1. 协议/消息address
某些协议规范使用从 0 到 65535 计数的协议/消息address以及Function代码。这也是新的 Modbus 规范所使用的内容。这是通过线路send的消息中的address。
Modbus Poll 使用从 0 到 65535 计数的协议/消息address。
5.3.2. Device address
一些协议规范使用Device address/register。register从 1 开始计数。第一个数字描述要使用的Function。这意味着Device address 40101 由address 100 标识。“4”表示保持register和 4x register从 1 开始计数。更令人困惑的是:4x 表示Function代码 03,3x 表示Function代码 04!
5.3.3. 5 位与 6 位寻址
addressformat 4x 从 40001 计数到 49999。下一个address不是50000。在过去,9999 个address就足够了。有些情况下9999还不够。然后添加一个零。40101 变为 400101,依此类推。这称为 6 位寻址或扩展寻址。
这不是 Modbus 轮询的问题。410001 变成 10000。“4”被丢弃,剩下的 10001 减 1,因为我们从 0 而不是 1 开始计数。
5.3.4. address示例
这些示例展示了如果规范使用Device address,如何设置 Modbus 轮询。
Read and hold register
您希望每 1000ms 从从机 ID 2 读取Device address 40011 中的 20 个register。从“4”我们知道这是Function03“Read and hold register”。
- 从机 ID = 2
- Function =“03 Read and hold register (4x)”
- address = 10(11 减 1)
- quantity = 20
- 扫描率 = 1000
Read discrete inputs
您希望每 500ms 从从站 ID 5 读取address 110201 的 1000 个线圈。从“1”我们知道这是Function02“Read discrete inputs”
- 从机 ID = 5
- Function =“02 Read discrete inputs (1x)”
- address = 10200 (10201 – 1)
- quantity = 1000
- 扫描率 = 500
5.4. 扫描率
扫描速率可设置为 0 至 3600000ms。请注意,将扫描速率设置为低于事务time是没有意义的。如果使用 9600 Baud rate的串行connect并Request 125 个register,则事务time大约为 8 + 2 + 250 + 2 = 262ms + Request和Response之间的间隙(>3.5 个字符time)。在这种情况下,将扫描速率设置为 100ms 是没有意义的,因为事务time至少为 262ms + 从站延迟(间隙)+ 轮询之间的最短time。(在connect对话框 F3 中设置)。
5.5. 读/写禁用
“读/写禁用”复选框可用于临时Enable或禁用该窗口的通信。然后会显示Text(已禁用)以及 Tx 和Error count器。

如果“读/写”被禁用,您可以使用“读/写一次”button或按 F6 发出单个Request。

“读/写一次”button
5.5.1. 出错时禁用
发生Error时禁用读/写。
5.6. 隐藏名称列
隐藏所有名称列。如果不使用它们,这可以方便地腾出More空间。
5.7. 单元格中的address
如果Enable,address也会显示在值单元格中,例如:2000 = 00000

5.8. PLC address(基address 1)
此选项会将address显示为Device address。

5.9. 安然/丹尼尔·莫德
Enron 或 Enron/Daniels Modbus 是带有一些“供应商扩展”的标准 Modbus。这些扩展的确切影响取决于上下文,但最常见的 Modbus 命令按预期工作。有一些供应商定义的Customization函数可用 – 但很少有用户期望或使用它们。最大的影响与 32 位data值的读/写方式有关。
Enron-Modbus 定义了两个特殊的 4x 保持register范围:
- 假设 4×5001 到 4×5999 是 32 位长整数(每个register 4 个byte)。
- 假设 4×7001 到 4×7999 是 32 位浮点(每个register 4 个byte)。
在 Modbus 中处理 32 位值并不是 Enron-MB 所独有的。然而,Enron-MB 采取了有争议的步骤,即每个register返回 4 bytes,而不是 Modbus 规范中术语“保持register”所暗示的 2 bytes。这意味着 Enron-Modbus 中的register 4×5001 和 4×5002 轮询会返回 8 bytes或两个 32 位整数,而标准 Modbus 只会返回 4 bytes或一个 32 位整数(被视为两个 16 位整数)。此外,Enron-MB 中的轮询register 4×5010 返回第十个 32 位长整数,而标准 Modbus 会考虑此范围内第五个 32 位长整数的 1/2。
5.10. 行数
指定您喜欢的网格中的行数。
6. 实时图表
使用此命令可在图表中实时绘制最多 12 个data系列。
实时图表速度很快,能够在收到新data后尽快绘制新线。
| 所有图表设置都与工作区一起存储。保存/打开工作区 |
要打开实时图表对话框,您有 2 个选项:
- 按 Alt + R
- 从显示菜单中选择“实时图表”

X 轴显示自图表启动以来的秒数。
当点到达图表末尾时,有 3 个选项:
- End时停止:图表停止。
- End时重新启动:图表重新开始。
- 继续:继续,直到达到最大点数或按下停止button。
6.1. 设置
默认情况下,所有 12 个系列都链接到左侧 Y 轴。如果要将系列链接到右 Y 轴,请选中“右 Y 轴”复选框。指定
- 颜色
- 右 Y 轴
- 标题。如果标题为空,则使用阅读窗口中的名称进行初始化
- 抵消
展示
- 文件名
- address
偏移对于在同一 Y 轴上对齐data点很有用。例如,0 或 1 的data点可以偏移,这样它们就不会绘制在彼此之上。

6.2. 变焦Function
如果您想See more详细信息,放大图表会很有用。缩放由鼠标左键控制。要缩放图表的特定部分,只需左键单击图表(这将是缩放矩形的左上角)并拖动到右下角。将出现一个矩形。一旦释放鼠标button,轴就会自动调整到您选择的区域。
如果您左键单击图表(例如开始缩放),但如果您移动到左上角,则使用缩放和平移FunctionComplete的所有修改都将被Cancel(图表将处于原来的状态)在进行平移和缩放Operation之前)。
6.3. 平移Function
要平移控件,请右键单击控件上的某处并移动鼠标。鼠标下方的点将跟随鼠标的移动。
6.4. 将data链接到图表系列
除非将 Modbus data单元链接到 12 个系列之一,否则图表不知道要使用哪些data。为此,选择一个值单元格,然后从菜单→显示中选择“链接到图表”。

6.5. 出口系列
将系列data保存到磁盘或Copy到剪贴板。将data直接粘贴到 Excel 中以进行进一步处理。
尽管使用非逗号field分隔符,但该文件仍具有 .csv 扩展名。
分隔符:选择分隔Text文件中的值的字符。Copy/粘贴到 Excel 时使用制表符分隔符。此外还给出了一些附加信息。
- 点数
- 最大分值
- 最小分值
- 平均分值

7. address扫描
扫描address范围以获取设备中所有effectiveaddress的列表。address被逐一读取,读取结果以列表形式显示。
| 扫描所有 65535 个address需要一些time,具体取决于connectType、服务器设备等。 |
7.1. exportaddress扫描
保存address扫描data到磁盘或Copy到剪贴板。将data直接粘贴到 Excel 中以进行进一步处理。
尽管使用非逗号field分隔符,但该文件仍具有 .csv 扩展名。
分隔符:选择分隔Text文件中的值的字符。Copy/粘贴到 Excel 时使用制表符分隔符。
8. Display format
标记要format化的单元格。从显示菜单中选择 28 种Display format之一。
8.1. 本机 Modbus register
16 位 Modbus register可以以 4 种不同的模式显示。
- 签
- 未签名
- hexadecimal
- ASCII – hexadecimal
- binary
8.2. 32 位有符号整数
它结合了 2 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 有符号整数 大尾数
- 有符号整数 小尾数
- 有符号整数大端byte交换
- 有符号整数小端byte交换例子byte order:AB CD(大端)
decimal数 123456789 或hexadecimal数07 5B CD 15
Modbus 消息中通过线路传输的顺序:07 5B CD 15
8.3. 32 位无符号整数
它结合了 2 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 无符号整数 大尾数
- 无符号整数 小尾数
- 无符号整数 Big-endian byte交换
- 无符号整数小端byte交换例子byte order:AB CD(大端)
decimal数 123456789 或hexadecimal数07 5B CD 15
Modbus 消息中通过线路传输的顺序:07 5B CD 15
8.4. 64 位有符号整数
它结合了 4 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 有符号整数 大尾数
- 有符号整数 小尾数
- 有符号整数大端byte交换
- 有符号整数小端byte交换例子byte order:AB CD EF GH(大端)
decimal数 -1,234,567,890,123,456,789 或hexadecimal数EE DD EF 0B 82 16 7E EB
Modbus 消息中的线路顺序:EE DD EF 0B 82 16 7E EB
8.5。64 位无符号整数
它结合了 4 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 无符号整数 大尾数
- 无符号整数 小尾数
- 无符号整数 Big-endian byte交换
- 无符号整数小端byte交换例子byte order:AB CD EF GH(大端)
decimal数 1,234,567,890,123,456,789 或hexadecimal数11 22 10 F4
7D E9 81 15 Modbus 消息中的线路顺序:11 22 10 F4 7D E9 81 15
8.6。32位浮点
它结合了 2 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 浮点大尾数
- 浮点数小尾数
- 浮点大端byte交换
- 浮点小端byte交换例子byte order:AB CD(大端)
浮点数 123456.00 或hexadecimal47 F1 20 00
Modbus 消息中的线路顺序:47 F1 20 00
8.7. 64位双
它结合了 4 个 16 位 Modbus register。它可以以 4 种不同的字/byte order显示。
- 双大尾数
- 双小端
- 双大端byte交换
- 双小端byte交换例子byte order:AB CD EF GH(大端)
浮点数 123456789.00 或hexadecimal41 9D 6F 34 54 00 00 00
Modbus 消息中的线路顺序:41 9D 6F 34 54 00 00 00
9. 保存/打开工作区
如果您打开许多Related的 Modbus 窗口,可以方便地在一个工作区中保存所有打开和排列的 Modbus 窗口的当前布局的快照。
工作区 (*mbw) 是一个包含所有打开窗口的显示信息和文件名的文件。不是实际内容。为此,请转到“文件”→“保存工作区”。
connect和图表设置存储在工作区文件中。
当您打开工作区文件时,Modbus 轮询会打开所有 Modbus 窗口并以您保存的布局显示它们。
10.export为csv
将名称和值export到逗号、分号或制表符分隔值文件。从文件对话框中选择
- 逗号分隔值文件 (*.csv)
“Temperature”,”19.7″ - 分号分隔值文件 (*.csv)
“Temperature”;”19.7″ - 制表符分隔值文件 (*.txt)
temperature 19.7
根据您的system,使用逗号或句点来分隔小数。
11. export到Modbus Slave
将名称、值和formatexport到 Modbus 从站文件。*.mbs
需要 Modbus Slave 版本 7.4.0 或更高版本才能打开该文件。
12. 测试中心
此测试对话框的目的是帮助 MODBUS 从站设备开发人员使用自己组成的任何字符串来测试设备。
列表框显示send的data以及receive的data。
下拉列表框中可以有多个测试字符串。输入字符串后,按“添加到列表”button,该字符串就会添加到列表中。
当按下“send”button时,将send所选字符串。打开列表
从文件中恢复测试字符串。保存列表
将测试字符串存储到文件中。Clear
Clear测试列表。添加到列表
将当前测试字符串添加到列表中。添加支票
将 CRC 或 LRC 添加到输入字符串的末尾。
使用测试中心时,您可能希望禁用其他窗口的通信。选中“读/写定义”对话框中的“读/写禁用”复选框。设置→读/写定义。
12.1。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 对。
12.2. TCP/IP 示例
读取 10 个保持register。00 00 00 00 00 06 01 03 00 00 00 0A
前 6 个byte是 TCP/IP 标头。
12.3。测试中心字符串文件
使用记事本或类似的TextEdit器,您可以准备要在测试中使用的字符串。
文件中的第一行必须是字符串“TestCenter”。这就是 Modbus Poll 知道文件format正确的方式。按“打开列表”打开准备好的Text文件。
12.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
12.4。Copy
使用Copybutton将选定的 Tx/Rx 字符串Copy到剪贴板。
SHIFT 和 CTRL 键可与鼠标一起使用来选择和Cancel选择字符串、选择字符串组以及选择不相邻的字符串。
| 在执行其他命令时保持此窗口打开。 |
13.Modbusdata记录
您可以将data记录到Text文件或直接记录到 Microsoft Excel。
13.1. Text文件
从设置菜单中选择“日志”或使用快捷键:Alt+L
每个 Modbus 窗口都会记录到其单独的Text文件中。
当您想要停止data记录时,请在设置菜单上选择注销命令。

13.1.1. 记录率
每读
为所有 Modbus Request编写日志行。将频率记录为扫描速率。选择
指定日志速率(以秒为单位)。与扫描速率无关。
| 例如,如果扫描速率为 10000 毫秒,则设置 1 秒的记录速率是没有意义的,因为仅当新data准备就绪时才会记录data。 |
13.1.2. 分隔符
作为分隔符,您可以使用以下选项之一:固定宽度
意味着值按列组织。逗号
值以逗号分隔。Tags
值由制表符分隔。
13.1.3。仅当data发生更改时才记录
指定仅当自上次日志以来有任何data更改时才写入新的日志行。
13.1.4。记录Error
指定记录超时等Error。
13.1.5。记录日期
指定将当前日期添加到日志time中。
13.1.6。使用“T”作为分隔符
指定time和日期由 ISO 8601 中指定的字母“T”分隔。
13.1.7。记录毫秒
指定将毫秒添加到日志time中。
13.1.8。日志address
指定将 Modbus address添加到日志中。
13.1.9。按下“确定”后开始记录
指定按下确定button时开始记录。否则,日志设置仅在保存 *mbp 文件时存储。
13.1.10。*mbp 打开时启动日志
指定打开 *.mbp 文件时自动启动日志记录。
13.1.11。立即冲入档案
这确保日志行不会被缓存到文件system中,而是立即以物理方式写入。
13.1.12。附加
指定将日志附加到所选文件。否则会创建一个新文件。
13.1.13。午夜新日志文件
Close当前日志文件并在午夜启动新文件。time戳会添加到您的文件名中。
13.1.14。标头信息
- 插入标题:信息插入到日志文件的顶部。
- 顶行中的名称单元格:插入名称。
- 投票定义:插入 ID、Function等。
- 名称:插入日志的名称。
固定宽度的Text文件示例: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 电子表格中的data。
13.2. 微软Excel
此Function需要安装 Microsoft Excel。Excel 2003 日志限制为 65535 条日志,因为这是 Excel 工作表中的最大行数。Excel 2007 或更高版本仅限于 1,048,576 行。每个 Modbus 窗口都会记录到其单独的 Excel 工作表中。
从设置菜单中选择 Excel Log 或使用快捷键:Alt+X
记录时请勿触摸 Excel 工作表,因为这会中断记录。

13.2.1. 记录率
- 每次读取:为所有 Modbus Request写入日志行。将频率记录为扫描速率。
- 选择:指定日志速率(以秒为单位)。日志与扫描速率无关。
备注:如果扫描速率为 10000ms,则设置 1 秒的记录速率是没有意义的,因为仅当新data准备好时才会记录data。 - 停止time:指定日志行数。请注意,Excel 2003 限制为 65,536 行,Excel 2007 限制为 1,048,576 行。
13.2.2. 标头信息
- 插入标题:信息插入到 Excel 工作表的最上面 3 行。
- 顶行中的单元格名称:在第 3 行中插入名称。
- 投票定义:在第 2 行插入 ID、Function等。
- 名称:在第 1 行插入日志名称。

带有标题信息的 Excel 日志。
14.通讯流量
选择菜单“显示”→“通讯”以显示串行线路或以太网电缆上的流量。使用停止button暂时停止更新以进行检查。
使用Copybutton将所选行Copy到剪贴板。
| 该窗口仅显示通过 Modbus Poll send和receive的data。您不能将其用作data嗅探器。 |
| 在执行其他命令时保持此窗口打开。 |
15.OLE/自动化
自动化(以前称为 OLE 自动化)使一个应用程序可以Operation另一应用程序中实现的对象。
自动化客户端是一个可以Operation属于另一个应用程序的公开对象的应用程序。这也称为自动化控制器。
自动化服务器是向其他应用程序公开可编程对象的应用程序。Modbus Poll是一个自动化服务器。
这意味着您可以使用任何支持VBA(Visual Basic for Applications)的程序(例如Visual Basic、Excel等)根据您的具体要求解释和显示modbusdata。
15.1. Excel 示例
当您想要编写宏时,您应该显示“开发人员”选项卡或在开发人员模式下运行。
15.1.1. Excel 2007

- 单击 Microsoft Office button,然后单击 Excel 选项。
- 单击“流行”,然后选中“在Function区中显示开发人员选项卡”复选框。
请注意,Function区是 Microsoft Fluent 用户界面的一部分。
15.1.2. Excel 2010、2016
- 单击文件选项卡。
- 单击选项。Excel 选项窗口将打开。
- 在左侧窗格中单击“CustomizationFunction区”。
- 在右侧窗格的“主选项卡”下,选中“开发人员”复选框。
- 单击“确定”。“开发人员”选项卡现在应该显示在Function区中(最右侧的选项卡)。
15.1.3。Excel 示例代码
此示例打开两个窗口。一个读取register,另一个读取线圈。
Modbus 轮询是隐藏的,但您可以通过Cancel注释“ShowWindow”行来显示它。这将显示其中一个窗口。
Modbus 轮询安装中还包含一个示例。
开始 → 所有程序 → 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 Sub15.2. Python示例
此 Python 示例打开一个窗口并设置所有可能的data format。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()
result = Win1.Save("C:\Users\UserName\Desktop\testfile.mbp")
print (result)
print (Win1.GetName(1))
_ = input("Press ENTER to quit:")15.3。connectFunction/属性
以下属性和Function与您在connect对话框 (F3) 中的设置相同。
15.3.1。联系
connect选择所需的connect。可以选择串行端口或以太网connect之一。
属性connect为整数effective值
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
15.3.2. Baud rate
仅适用于connect = 0
属性BaudRate as Longeffective值
300
600
1200
2400
4800
9600(默认)
14400
19200
38400
56000
57600
115200
128000
153600
230400
256000
460800
921600例子
BaudRate = 9600
15.3.3。data bit
仅适用于connect = 0
属性DataBits作为整数effective值
7
8(默认)
例子
DataBits = 8
15.3.4。平价
仅适用于connect = 0
财产平价作为整数effective值
0 = 无
1 = 奇数
2 = 偶数(默认)
例子
Parity = 2
15.3.5。stop bit
仅适用于connect = 0
属性StopBits作为整数effective值
1(默认)
2
例子
StopBits = 1
15.3.6。串行端口
仅适用于connect = 0
属性SerialPort作为整数effective值
1…255
默认值 = 1例子
SerialPort = 1
15.3.7。模式
仅适用于connect = 0
属性模式为整数effective值
0 = RTU 模式
1 = ASCII 模式
例子
Mode = 1
15.3.8。Delete回声
仅适用于 Connection = 0
如果您equipment或 RS232/RS485 转换器回显刚刚send的字符。
属性RemoveEcho as Integereffective值
0(默认)
1(消除回声)
例子
RemoveEcho = 1
15.3.9。Response超时
ResponseTimeout 指定 Modbus 轮询在放弃之前应等待从属设备Response的timeLength(以毫秒为单位)。
属性ResponseTimeout作为整数effective值
50…100000
默认值 = 1000例子
ResponseTimeout = 1000
15.3.10。轮询之间的延迟
属性DelayBetweenPolls作为 Integereffective值
0…1000
默认值 = 20例子
DelayBetweenPolls = 20
15.3.11. 服务器端口
仅适用于connect = 1…4
属性ServerPort为 Longeffective值
0…65535
默认值 = 502例子
ServerPort = 502
15.3.12. connect超时
ConnectTimeout 指定 Modbus 轮询应等待 TCP/IP connect成功的timeLength。
仅适用于connect = 1…4
属性ConnectTimeout作为 Integereffective值
100…30000 毫秒
默认值 = 1000 毫秒例子
ConnectTimeout = 1000
15.3.13。IP版本
仅适用于connect = 1…4
属性IPVersion作为整数effective值
4 = IP 版本 4(默认)
6 = IP 版本 6
例子
IPVersion = 4
15.3.14。开放connect
打开使用“connect”属性选择的connect。
函数OpenConnection () 作为整数参数
该函数没有参数。返回值
对于Error3-5:请检查您是否安装了最新的串口驱动。
| Error | 描述 |
|---|---|
| 0 | 成功 |
| 1 | 串口不可用 |
| 3 | 串行端口。无法从端口驱动程序获取当前设置。 |
| 4 | 串行端口。串行端口驱动程序不接受端口设置。 |
| 5 | 串行端口。串行端口驱动程序不接受超时设置。 |
| 12 | TCP/UDP connect失败。WSA启动 |
| 13 | TCP/UDP connect失败。connectError |
| 14 | TCP/UDP connect失败。暂停 |
| 15 | TCP/UDP connect失败。IOCTL |
| 17 号 | TCP/UDP connect失败。套接字Error |
| 21 | TCP/UDP connect失败。address信息 |
| 255 | connect已打开 |
如何打开 Modbus TCP/IP connect的 Excel 示例
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 示例如何设置串行connect
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:")15.3.15。Closeconnect
函数CloseConnection () As Integer参数
该函数没有参数。返回值
如果成功则为零。如果失败则非零值。
15.3.16。显示通讯交通
显示通信流量窗口。
函数ShowCommunicationTraffic ()参数
该函数没有参数。返回值
没有任何
15.3.17。Close通讯交通
Close通信流量窗口(如果显示)。
函数CloseCommunicationTraffic ()参数
该函数没有参数。返回值
没有任何
15.4。读取函数
以下Function与您在读/写定义对话框 (F8) 中设置的Function相同。读取Function与 Modbus 轮询Document关联。(有data的窗口)例子
' 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| 您必须先创建读取,然后才能使用属性获取data。 |
15.4.1. 读取线圈
Modbusfunction code01
Function ReadCoils (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 2000
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.4.2. Read discrete inputs
ModbusFunction代码02
Function ReadDiscreteInputs (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 2000
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.4.3。读取持有register
ModbusFunction代码03
Function ReadHoldingRegisters (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 125
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.4.4。读输入register
Modbus Function代码 04
Function ReadInputRegisters (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 125
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.5。自动写入Function
写入函数将存储在由属性填充的数组中的值写入。下面的 Write 函数不创建data窗口。要创建data窗口,请使用 Win 函数,例如WriteMultipleRegistersWin。
15.5.1。写单线圈
Modbus Function代码 05。
写入存储在写入数组中的第一个线圈。
Function WriteSingleCoil (SlaveID As Integer, Address As Long) As Integer参数
SlaveID:从机address 0 到 255
address:dataaddress(基址 0)返回值
如果写入数组已准备好并且data已send,则为 True。如果数组为空或参数Error,则返回 False。
控制应用程序负责通过读回写入的值来验证写入Operation。
15.5.2。写单个register
Modbus Function代码 06。
写入写入数组中存储的第一个register。
Function WriteSingleRegister (SlaveID As Integer, Address As Long) As Integer参数
SlaveID:从机address 0 到 255
address:dataaddress(基址 0)返回值
如果写入数组已准备好并且data已send,则为 True。如果数组为空或参数Error,则返回 False。
控制应用程序负责通过读回写入的值来验证写入Operation。
15.5.3。Write multiple coils
Modbus Function代码 15.
写入存储在写入数组中的线圈。
Function WriteMultipleCoils (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer返回值
如果写入数组已准备好并且data已send,则为 True。如果数组为空或参数Error,则返回 False。
控制应用程序负责通过读回写入的值来验证写入Operation。参数
SlaveID:从机address 0 到 255
address:dataaddress(基址 0)quantitydata的quantity
。1 至 1968 年
15.5.4。Write multiple registers
Modbus Function代码 16.
写入写入数组中存储的register。
Function WriteMultipleRegisters (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer参数
SlaveID:从机address 0 到 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 123返回值
如果写入数组已准备好并且data已send,则为 True。如果数组为空或参数Error,则返回 False。
控制应用程序负责通过读回写入的值来验证写入Operation。
15.5.5。Python示例
Python 示例如何创建一个从address 0 (40001) 读取 10 个register,然后写入 5 个register的窗口。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:")15.6。多种Function
各种Function与 Modbus 轮询DocumentRelated联。(有data的窗口)
15.6.1。橱窗展示
默认情况下,Modbus documentation窗口是隐藏的。ShowWindow Function使 Modbus Poll 可见并显示带有data内容的Document。
函数显示窗口()参数
该函数没有参数。返回值
没有任何
15.6.2。获取send计数
获取Request数。
函数GetTxCount () 只要参数
该函数没有参数。返回值
Request的quantity。
15.6.3。获取receive计数
获取Response数。
函数GetRxCount () 只要参数
该函数没有参数。返回值
Response数。
15.6.4。获取名称
获取值的名称。
函数GetName(索引为整数)作为字符串参数
索引:索引0对应第一个Modbusaddress。返回值
名字。
15.6.5。设置名称
更改值的名称。函数SetName(索引为整数,名称为字符串)参数
索引:索引0对应第一个Modbusaddress。
名称:值单元格的名称。返回值
没有任何
15.6.6。Allformat化
使用所选format设置所有值单元格的format。
函数FormatAll(format化为整数)参数
format:值单元格的format。返回值
没有任何
15.6.7。获取format
获取Modbus值的Display format。
函数GetFormat(索引为整数)作为整数参数
索引:索引0对应第一个Modbusaddress。
返回值
| ID | format |
|---|---|
| 0 | 签 |
| 1 | 未签名 |
| 2 | hexadecimal |
| 3 | binary |
| 4 | 浮点小端byte交换 |
| 5 | 浮点大尾数 |
| 6 | 双小端byte交换 |
| 7 | 双大端 |
| 8 | 32 位有符号小端byte交换 |
| 9 | 32 位有符号大尾数 |
| 10 | 浮点数小尾数 |
| 11 | 浮点大端byte交换 |
| 12 | 双小尾数 |
| 13 | 双大端byte交换 |
| 14 | 32 位有符号小端endianness |
| 15 | 32 位有符号大端byte交换 |
| 17 号 | 32 位无符号大端endianness |
| 18 | 32 位无符号小端byte交换 |
| 19 | 32 位无符号大端byte交换 |
| 20 | 32 位无符号小端endianness |
| 21 | 64 位有符号大尾数 |
| 22 | 64 位有符号小端byte交换 |
| 23 | 64 位有符号大端byte交换 |
| 24 | 64 位有符号小端endianness |
| 25 | 64 位无符号大端endianness |
| 26 | 64 位无符号小端byte交换 |
| 27 | 64 位无符号大端byte交换 |
| 28 | 64 位无符号小端endianness |
| 此设置仅用于显示。使用 Get/Set 值函数时,您仍然需要使用 byteOrder 来获取正确的byte order。 |
15.6.8。设置format
更改 Modbus 值的Display format。请参阅上面的format值。
函数SetFormat(索引为整数,format为整数)参数
索引:索引0对应第一个Modbusaddress。
format:值单元格的format。返回值
没有任何
15.6.9。调整窗口大小
调整打开的窗口的大小以适合网格。
函数调整窗口大小()参数
该函数没有参数。返回值
没有任何
15.6.10。调整所有列的大小
调整所有列的大小以适合单元格内的值。
函数调整所有列的大小()参数
该函数没有参数。返回值
没有任何
15.6.11。行数
指定网格中的行数。
函数行(NumberRows)参数
NumberRows:网格中的行数。
| ID | 描述 |
|---|---|
| 0 | 10 行(默认) |
| 1 | 20 行 |
| 2 | 50 行 |
| 3 | 100 行 |
| 4 | 适合quantity |
返回值
没有任何
15.6.12。读取结果
使用此属性可检查通过 Read 建立的通信是否运行成功。
属性将结果读取为整数参数
该函数没有参数。返回值
| Error | 描述 |
|---|---|
| 0 | 成功 |
| 1 | 超时Error |
| 2 | CRCError |
| 3 | ResponseError(Response不是预期的从站 ID、Function或address) |
| 4 | 写入Error |
| 5 | 读取Error |
| 6 | 端口未打开Error |
| 10 | data未初始化 |
| 11 | 收到的byte count不足 |
| 16 | byte计数Error |
| 19 | 交易IDError |
| 81小时 | 非法职能 |
| 82小时 | Illegal data address |
| 83小时 | Illegal data value |
| 84小时 | 服务器设备故障 |
| 85小时 | 承认 |
| 86小时 | 服务器设备繁忙 |
| 87小时 | NAK-否定Confirm |
| 8安时 | Gateway path unavailable |
| 8Bh | 网关目标设备无法Response |
15.6.13。写入结果
使用此函数检查写入是否成功。
该值一直为 DATA_UNINITIALIZED,直到从站的结果可用为止。请参阅ReadResult以获取可能值的列表。
属性WriteResult As Integer返回值
以整数形式返回写入结果。
15.6.14。节省
保存当前窗口。函数Save (PathName As String) As Boolean参数
PathName:文件应保存到的完全限定路径。返回值
布尔值例子
' 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
res = doc.Save("C:\Users\UserName\Desktop\testfile.mbp")15.7。自动化data属性
以下属性用于在 Modbus Poll 中设置或获取内部写入/读取数组中的值。使用的索引不是 Modbus address。无论使用什么address,索引始终从 0 开始计数。data属性与 Modbus 轮询Document关联。(有data的窗口)
每个data属性有 2 个版本:
- 没有后缀的一种,例如SRegisters,用于从内部写/读数组设置或获取值。
- 一种以 Win 作为后缀,例如SRegistersWin,用于直接从data窗口设置或获取值。当data窗口用于写入函数(例如WriteMultipleRegistersWin )时,将使用此Function。
示例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 个register的窗口。
' 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
15.7.1。线圈、线圈Win
属性线圈(索引为整数)为整数描述
在写入数组结构中设置一个线圈或从读取数组中返回一个线圈。句法
线圈(索引)[=新值]
15.7.2。SRegisters、SRegistersWin
属性SRegisters(索引为整数)为整数描述
在写入数组结构中设置register或从读取数组中返回register。句法
SRegisters(索引)[=新值]
15.7.3。URegisters、URegistersWin
属性URegisters(索引为整数)只要描述
在写入数组结构中设置register或从读取数组中返回register。句法
URegisters(索引)[=新值]
15.7.4。Ints_32、Ints_32Win
属性Ints_32(索引为整数)为 Double描述
在写入数组结构中设置一个 32 位整数,或从读取数组中返回一个整数。句法
Ints_32(索引)[=新值]
15.7.5。UInts_32、UInts_32Win
属性UInts_32(索引为整数)为 Double描述
在写入数组结构中设置一个 32 位无符号整数,或从读取数组中返回一个无符号整数。句法
UInts_32(索引)[=新值]
15.7.6。Ints_64、Ints_64Win
属性Ints_64(索引为整数)为 Double描述
在写入数组结构中设置一个 64 位整数,或从读取数组中返回一个整数。句法
Ints_64(索引)[=新值]
15.7.7。UInts_64、UInts_64Win
属性UInts_64(索引为整数)为 Double描述
在写入数组结构中设置一个 64 位无符号整数,或从读取数组中返回一个无符号整数。句法
UInts_64(索引)[=新值]
15.7.8。花车,花车赢
属性浮动(索引为整数)为单个描述
在写入数组结构中设置一个浮点数或从读取数组中返回一个浮点数。句法
浮点数(索引)[=新值]
15.7.9。双打、双打获胜
属性双精度(索引为整数)为双精度描述
在写入数组结构中设置双精度值或从读取数组中返回双精度值。句法
双打(索引)[=新值]
15.7.10。byte order
属性ByteOrder作为整数描述
设置 Ints_32、UInts_32、Ints_64、UInts_64、Floats 和 Doubles 属性使用的byte order。
Win 版本不使用此属性ByteOrder。
| ID | byte order |
|---|---|
| 0 | 大尾数(默认) |
| 1 | 小端byte交换 |
| 2 | 大端byte交换 |
| 3 | 小尾数法 |
Ints_32 示例:
byte order:Big-endian
decimal数 123456789 或hexadecimal数 07 5B CD 15
Modbus 消息中通过线路传输的顺序:07 5B CD 15句法
byte order[=新值]
15.8。编写函数(创建data窗口)
以下Function与您在读/写定义对话框 (F8) 中设置的Function相同。
该函数创建一个data窗口,并根据扫描速率写入data窗口中的data内容。
15.8.1。写单线圈赢
Modbus Function代码 05。
Function WriteSingleCoilWin (SlaveID As Integer, Address As Long, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(Base 0)
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.8.2。写单registerWin
Modbus Function代码 06。
Function WriteSingleRegisterWin (SlaveID As Integer, Address As Long, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(Base 0)
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假Python 示例如何打开一个窗口并每 1000 毫秒写入一个register
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:")15.8.3。Write multiple coilsWin
Modbus Function代码 15。
Function WriteMultipleCoilsWin (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 1968
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
15.8.4。Write multiple registersWin
Modbus Function代码 16。
Function WriteMultipleRegistersWin (SlaveID As Integer, Address As Long, Quantity As Integer, ScanRate As Long) As Integer参数
SlaveID:从机address 1 至 255
address:dataaddress(基址 0)
quantity:dataquantity。1 至 123
扫描速率: 0 至 3600000ms返回值
如果成功则为真。如果没有成功则为假
16. 异常和Error消息
Modbus 异常和Error消息以红色Text显示在每个窗口的第二行。

16.1. Modbus 异常代码
Modbus 异常是从从设备返回的Error。
| 代码 | 姓名 | 意义 |
|---|---|---|
| 01 | Illegal function | 查询中收到的Function代码不是服务器(或从站)允许的Operation。这可能是因为该Function代码仅适用于较新equipment,并且未在所选设备中实现。它还可能表明服务器(或从属设备)处于处理此类Request的Error状态,例如因为它未配置并且被要求返回register value。 |
| 02 | Illegal data address | 查询中收到的dataaddress不是服务器允许的address。更具体地,参考编号和传输Length的组合是Invalid的。对于有 100 个register的控制器,PDU 将第一个register寻址为 0,最后一个register寻址为 99。如果提交的Request的Starting register address为 96,number of registers为 4,则该Request将成功运行(至少按address)在register 96、97、98、99 上。如果提交的Request的Starting register address为 96,number of registers为 5,则该Request将失败,并出现异常代码 0x02“Illegal data address”因为它尝试对register 96、97、98、99 和 100 进行Operation,但does not existaddress为 100 的register。 |
| 03 | 非法data价值 | 查询datafield中包含的值不是服务器(或从站)允许的值。这表明复杂Request的其余部分的结构existenceError,例如隐含的Length不正确。具体来说,这并不意味着提交存储在register中的data项具有应用程序预期之外的值,因为 MODBUS 协议不知道任何特定register的任何特定值的重要性。 |
| 04 | 服务器设备故障 | 服务器(或从属服务器)尝试执行Request的Operation时发生不可恢复的Error。 |
| 05 | 承认 | 专门与编程命令结合使用。 服务器(或从站)已接受Request并正在处理它,但需要很长time才能Complete此Operation。返回此Response是为了防止客户端(或主机)发生超时Error。客户端(或主机)接下来可以发出轮询程序Complete消息以确定处理是否Complete。 |
| 06 | 服务器设备忙 | 专门与编程命令结合使用。 服务器(或从站)正在处理长time的程序命令。当服务器(或从机)空闲时,客户端(或主机)应稍后重新传输消息。 |
| 0A | Gateway path unavailable | 专门与网关结合使用,表示网关无法分配从输入端口到输出端口的内部通信路径来处理Request。通常意味着网关配置Error或过载。 |
| 0B | Gateway target device response failed | 专门与网关结合使用,表示未从目标设备获得Response。通常意味着该Device does not exist于网络上。 |
16.2. Modbus 轮询Error消息
| Error信息 | 意义 |
|---|---|
| 超时Error | 未在预期time内收到回复。检查以下内容:串行connect串行设置,例如Baud rate、奇even parity、data bit、stop bit等。Modbus 模式,RTU 或 ASCII从机IDResponse超时TCP/IP connectResponse超时检查Host和Port与slave是否一致 |
| ResponseError | 回应不是预期的。不同的从机 ID。 |
| CRC Error | 收到的Response的 CRC 值不正确。 |
| 写入Error | 这是串行驱动程序报告的Error。如果使用 USB/RS232/485 转换器并且拔掉 USB 电缆,则可能会发生这种情况。有4种Type:中断条件输入/输出Error串行connectError输出缓冲区溢出使用 TCP/IP connect的写入Error通常是由于connect丢失造成的。 |
| 读取Error | 这是串行驱动程序报告的Error。有6种Type:成帧Error字符缓冲区溢出奇even parityError输入缓冲区溢出输入/输出Error中断条件使用 TCP/IP connect的读取Error通常是由于connect丢失造成的。 |
| 收到的byte count不足 | Response的Length不是预期的。 |
| byte计数Error | Response中的byte计数不正确。与预期相比。 |
| 交易IDError | 它用于事务配对,MODBUS 服务器在Response中CopyRequest的Transaction identifier。 |
好
11
1