Modbus Slave
Modbus Slave 用于在 100 个窗口中模拟多达 100 个从机设备!使用此模拟工具加快您的 PLC 编程速度。在从供应商处收到从属设备之前,请开始编程和测试。主应用程序可以访问任何打开文档中包含的数据。与 Modbus 轮询相同的用户界面。
监控串行流量。用于与 Visual Basic、Excel 等连接的 OLE 自动化。根据您的具体要求解释和显示 Modbus 数据。例如,在 Excel 中编辑从属数据。尝试该程序附带的 Excel example.xls。
Modbus 从站中打开的每个窗口都可以配置为表示来自相同或不同从站节点的数据。
Modbus 从站的系统要求
硬件要求
处理器; 建议 1 GHz 或更快
1 GB RAM
5 MB 可用硬盘空间
1024 x 768 显示分辨率操作系统要求
支持从 Windows 7 到 Windows 11 的所有 Windows 版本。
Modbus Slave 版本 8 在 Windows XP 上运行。
1.1.1. 静默安装
静默安装不需要用户干预,并且没有用户界面。用户看不到任何对话框,也不会被问到任何问题。
使用命令行 /S 开关。
Modbus从站特性
连接
Modbus Slave 使用以下方式从设备读取/写入数据:
- RS232 或 RS485 网络上的 Modbus RTU 或 ASCII。(USB/RS232/485转换器)
- Modbus TCP/IP
- TCP/IP 上的 Modbus。(Modbus RTU封装在TCP数据包中)
- 协议UDP/IP
- 基于 UDP/IP 的 Modbus。(Modbus RTU封装在UDP数据包中)
支持的 Modbus 功能
- 01 (0x01) 读取线圈
- 02 (0x02) 读取离散输入
- 03 (0x03) 读取保持寄存器
- 04 (0x04) 读取输入寄存器
- 05 (0x05) 写单个线圈
- 06 (0x06) 写单个寄存器
- 08 (0x08) 诊断(仅限串行线)
- 11 (0x0B) 获取通讯事件计数器(仅限串行线)
- 15 (0x0F) 写入多个线圈
- 16 (0x10) 写入多个寄存器
- 17 (0x11) 报告服务器 ID(仅限串行线路)
- 22 (0x16) 掩码写寄存器
- 23 (0x17) 读/写多个寄存器
- 43 / 14 (0x2B / 0x0E) 读取设备标识
显示格式
每个单元格都可以单独格式化。
- 16位有符号寄存器(Signed 16-bit register)
- 16位无符号寄存器(Unsigned 16-bit register)
- 十六进制(Hex)
- 二进制(Binary)
- 具有任意字/字节顺序的 32 位有符号整数(32-bit signed integer with any word/byte order)
- 具有任意字/字节顺序的 32 位无符号整数(32-bit unsigned integer with any word/byte order)
- 具有任意字/字节顺序的 64 位有符号整数(64-bit signed integer with any word/byte order)
- 具有任意字/字节顺序的 64 位无符号整数(64-bit unsigned integer with any word/byte order)
- 具有任意字/字节顺序的 32 位浮点数(32-bit float with any word/byte order)
- 具有任意字/字节顺序的 64位双精度浮点数(64-bit double float with any word/byte order)
其他功能
- 用于与 Excel VBA、Python 等连接的 OLE/自动化。
- 数据流量监控
- 打印和打印预览
- 字体选择
- 条件颜色
- 缩放
- 实时图表
- 保存/打开工作区
概述
Modbus Slave 使用多文档界面。这意味着可以打开多个窗口。每一个具有不同的数据内容,用于同时模拟不同的从机设备。
这张照片显示了两个打开的窗口。一个模拟来自地址 0 (40001) 从机 id 1 的 10 个保持寄存器,另一个模拟来自地址 0 (40001) 从机 id 2 的 10 个保持寄存器。
随时随地提供帮助
按 F1即可获取与当前所选项目相关的主题的上下文相关帮助。
SHIFT + F1调用特殊的“帮助模式”,其中光标变成帮助光标(箭头+问号)。然后,用户可以选择用户界面中的可见对象,例如菜单项、工具栏按钮或窗口。这将打开有关描述所选项目的主题的帮助。
命名单元格
您可以在此处键入任何文本来指定值单元格。您还可以从 Excel 单元格复制/粘贴文本。
值单元格
显示 Modbus 寄存器的数据值。如果双击值单元格,将出现一个对话框,您可以在该值单元格中输入新值。在值单元格中键入数字也会显示输入对话框。
更改字体
要更改字体,您有 2 个选项
- 选择要更改的单元格,然后右键单击。
- 选择要更改的单元格,然后选择菜单→显示→字体。
条件颜色
条件颜色可帮助您直观地显示特定范围内的值。3 种颜色选择
- 默认颜色:如果没有任何条件颜色计算结果为 true,则使用此颜色。
- 规则 1:如果表达式的计算结果为 true,则使用此颜色选择。规则 1 优先于规则 2。
- 规则 2:如果表达式的计算结果为 true,则使用此颜色选择。
7 种比较运算符
- not used: 未使用
- equal to: 等于
- greater than: 大于
- less than: 小于
- greater than or equal to: 大于等于
- less than or equal to: 小于等于
- and: 与
当数据类型为 float 或 32 位 long 类型时,不能使用“and”运算符。如果选择“and”,则条件值将以十六进制数字形式输入。如果单元格和条件值中的任何位均为 1,则其计算结果为 true。
颜色示例
如果单元格值大于 0,则为绿色;如果小于 0,则为红色。
缩放
缩放可帮助您将原始值缩放为人类可读的值。缩放仅适用于有符号和无符号 16/32 位整数。
(X1,Y1) 和 (X2,Y2)
一条通过两点 (X1,Y1) 和 (X2,Y2) 的直线
Slope=m=Y2−Y1/X2−X1
直线方程
Y=m⋅(X−X1)+Y1
精确
小数点后的位数。
启用
必须启用此功能,以从Modbus服务器/从站缩放值。如果选择了非16/32位整数显示格式,缩放会自动禁用
实时图表
该图表可以实时绘制 12 个系列,每个系列最多 100000 个点。
打开一个新窗口
要打开另一个窗口,您有 3 个选项:
- 按 CTRL+N
- 在文件菜单中选择新建
- 按工具栏上的
连接对话框
要打开连接对话框,您有 2 个选项:
- 按F3
- 从连接菜单中选择连接
连接(Connection)
有 5 种不同的连接类型:
- 串口:
通过串行线路的 Modbus。RS232 或 RS485。可以使用USB串行转换器。 - Modbus TCP/IP:
如果要与 MODBUS TCP/IP 网络通信,请选择 TCP/IP。在这种情况下,从站 ID 与 MODBUS TCP/IP 中使用的单元 ID 相同。
端口号默认为 502。 - Modbus UDP/IP:
如果要与 MODBUS UDP/IP 网络通信,请选择 UDP/IP。这与 Modbus TCP/IP 相同,但使用无连接 UDP 协议。 - TCP/IP 上的 Modbus RTU:
这是通过 TCP/IP 网络而不是串行线路发送的 RTU 消息。 - Modbus RTU Over UDP/IP:
这是通过 UDP/IP 网络而不是串行线路发送的 RTU 消息。
根据您的选择,一些其他设置将呈灰色。
串口设置(Serial Settings)
使用这些参数来设置串行端口设置。仅当连接类型为“串行端口”时它们才可用。模式
使用此选项选择RTU或ASCII模式。默认 RTU。数字SR
指定是否监视 DSR(数据集就绪)信号以进行输出流控制。如果该成员为 TRUE 并且 DSR 关闭,则输出将暂停,直到再次发送 DSR。CTS
指定是否监视 CTS(清除发送)信号以进行输出流量控制。如果启用此复选框并且关闭 CTS,则输出将暂停,直到再次发送 CTS。即时战略切换
指定如果字节可用于传输,则 RTS 线将为高电平。发送所有缓冲字节后,RTS 线将为低电平。
如果您的 232/485 转换器没有自动方向开关,则可以使用它来切换方向。
如果可能,应避免使用 RTS 控制的 RS232/RS485 转换器。对于Windows、Linux等非实时操作系统,很难确定发射机关闭的具体时间。如果过早关闭,字符可能仍位于 FIFO 或 UART 的发送寄存器中,并且这些字符将会丢失。因此从机将无法识别该消息。另一方面,如果关闭得太晚,则从设备的消息会被损坏,并且主设备将无法识别该消息。 |
TCP/IP服务器(TCP/IP Server)
TCP/IP 服务器设置仅在使用以太网连接时可用。IP地址
指定要侦听的 IP 地址。如果您的 PC 上有多个网络连接,这非常有用。Modbus Slave 的每个实例都可以侦听特定网络。默认为本地主机 127.0.0.1任何地址
如果您希望 Modbus Slave 侦听所有网络,请选中此项。忽略单元 ID
许多PLC设备会忽略该字段,并且大多数客户端默认值为零。然而,网关或专用程序可以使用单元号来指示需要什么类型的处理。港口
服务器端口号。默认502
从机定义(Slave definition)
使用此命令可以定义要为活动窗口定义的数据数组。
要打开 Slave Definition 对话框,您有 3 个选项:
- 按 F8
- 从设置菜单中选择“从站定义”
- 按工具栏上的
从机ID(Slave ID)
范围 1 到 255。(MODBUS 协议规范规定为 247)。值 0 也可以直接与 MODBUS/TCP 或 MODBUS/UDP 设备通信。
功能码(Function)
您可以选择 4 个功能代码中的 1 个。
- 01:读取线圈(0x)。接受写入功能 05 和 15
- 02:读取离散输入 (1x)
- 03:读取保持寄存器(4x)。接受写入功能 06、16、22 和 23
- 04:读取输入寄存器(3x)
地址(Address)
Modbus协议中的地址很混乱!一些协议规范使用协议/消息地址,而其他协议规范使用设备寻址。
协议/消息地址
某些协议规范使用从 0 到 65535 计数的协议/消息地址以及功能代码。这也是新的 Modbus 规范所使用的内容。这是通过线路发送的消息中的地址。
Modbus Slave 使用协议/消息地址从 0 到 65535 计数。
设备地址
一些协议规范使用设备地址/寄存器。寄存器从 1 开始计数。第一个数字描述要使用的功能。这意味着设备地址 40101 由地址 100 标识。“4”表示保持寄存器和 4x 寄存器从 1 开始计数。因此“4XXXX”引用是隐式的。更令人困惑的是:4x 表示功能代码 03,3x 表示功能代码 04!
5 位与 6 位寻址
地址格式 4x 从 40001 计数到 49999。下一个地址不是50000。在过去,9999 个地址就足够了。有些情况下9999还不够。然后添加一个零。40101 变为 400101,依此类推。这称为 6 位寻址或扩展寻址。
这对于 Modbus Slave 来说不是问题。410001 变成 10000。“4”被丢弃,剩下的 10001 减 1,因为我们从 0 而不是 1 开始计数。
地址示例
这些示例展示了在规范使用设备地址的情况下如何设置 Modbus 从站。
定义保持寄存器
您想要从设备 ID 2 的设备地址 40011 定义 20 个寄存器。从“4”我们知道这是功能 03“读取保持寄存器”。
- 从机 ID = 2
- 功能 =“03 读取保持寄存器 (4x)”
- 地址 = 10(11 减 1)
- 数量 = 20
定义离散输入
您想要从从站 ID 5 的地址 110201 定义 1000 个线圈。从“1”我们知道这是功能 02“读取离散输入”
- 从机 ID = 5
- 功能 =“02 读取离散输入 (1x)”
- 地址 = 10200 (10201 – 1)
- 数量 = 1000
隐藏名称列(Hide name columns)
隐藏所有名称列。如果不使用它们,这可以方便地腾出更多空间。
单元格中的地址(Address in cell)
如果启用,地址也会显示在值单元格中,例如:2000 = 00000
PLC 地址(基地址 1)PLC Addresses (Base 1)
此选项会将地址显示为设备地址。
行数(Rows)
指定您喜欢的网格中的行数。
实时图表(Real time Charting)
使用此命令可在图表中实时绘制最多 12 个数据系列。
实时图表速度很快,能够在收到新数据后尽快绘制新线。
所有图表设置都保存在工作区文件中。保存/打开工作区 |
要打开实时图表对话框,您有 2 个选项:
- 按 Alt + R
- 从显示菜单中选择“实时图表”
X 轴显示自图表启动以来的秒数。
当点到达图表末尾时,有 3 个选项:
- 结束时停止:图表停止。
- 结束时重新启动:图表重新开始。
- 继续:继续,直到达到最大点数或按下停止按钮。
设置(Settings)
默认情况下,所有 12 个系列都链接到左侧 Y 轴。如果要将系列链接到右 Y 轴,请选中“右 Y 轴”复选框。指定
- 颜色
- 右 Y 轴
- 标题。如果标题为空,则使用阅读窗口中的名称进行初始化
- 抵消
展示
- 文件名
- 地址
偏移对于在同一 Y 轴上对齐数据点很有用。例如,0 或 1 的数据点可以偏移,这样它们就不会绘制在彼此之上。
变焦功能
如果您想查看更多详细信息,放大图表会很有用。缩放由鼠标左键控制。要缩放图表的特定部分,只需左键单击图表(这将是缩放矩形的左上角)并拖动到右下角。将出现一个矩形。一旦释放鼠标按钮,轴就会自动调整到您选择的区域。
如果您左键单击图表(例如开始缩放),但如果您移动到左上角,则使用缩放和平移功能完成的所有修改都将被取消(图表将处于原来的状态)在进行平移和缩放操作之前)。
平移功能
要平移控件,请右键单击控件上的某处并移动鼠标。鼠标下方的点将跟随鼠标的移动。
将数据链接到图表系列
除非将 Modbus 数据单元链接到 12 个系列之一,否则图表不知道要使用哪些数据。为此,请选择一个值单元格,然后从菜单→显示中选择“链接到图表”。
出口系列
将系列数据保存到磁盘或复制到剪贴板。将数据直接粘贴到 Excel 中以进行进一步处理。
尽管使用非逗号字段分隔符,但该文件仍具有 .csv 扩展名。
分隔符:选择分隔文本文件中的值的字符。复制/粘贴到 Excel 时使用制表符分隔符。此外还给出了一些附加信息。
- 点数
- 最大分值
- 最小分值
- 平均分值
显示格式
标记要格式化的单元格。从显示菜单中选择 28 种显示格式之一。
本机 Modbus 寄存器
16 位 Modbus 寄存器可以以 4 种不同的模式显示。
- 签
- 未签名
- 十六进制
- ASCII – 十六进制
- 二进制
32 位有符号整数(32-bit signed integer)
它结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 有符号整数 大尾数
- 有符号整数 小尾数
- 有符号整数大端字节交换
- 有符号整数小端字节交换例子字节顺序:AB CD(大端)
十进制数 123456789 或十六进制数07 5B CD 15
Modbus 消息中通过线路传输的顺序:07 5B CD 15
32 位无符号整数(32-bit unsigned integer)
它结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 无符号整数 大尾数
- 无符号整数 小尾数
- 无符号整数 Big-endian 字节交换
- 无符号整数小端字节交换例子字节顺序:AB CD(大端)
十进制数 123456789 或十六进制数07 5B CD 15
Modbus 消息中通过线路传输的顺序:07 5B CD 15
64 位有符号整数(64-bit signed integer)
它结合了 4 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 有符号整数 大尾数
- 有符号整数 小尾数
- 有符号整数大端字节交换
- 有符号整数小端字节交换例子字节顺序: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 位无符号整数(64-bit unsigned integer)
它结合了 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位浮点数(32-bit floating)
它结合了 2 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 浮点大尾数
- 浮点数小尾数
- 浮点大端字节交换
- 浮点小端字节交换例子字节顺序:AB CD(大端)
浮点数 123456.00 或十六进制47 F1 20 00
Modbus 消息中的线路顺序:47 F1 20 00
64位双精度浮点数(64-bit double)
它结合了 4 个 16 位 Modbus 寄存器。它可以以 4 种不同的字/字节顺序显示。
- 双大尾数
- 双小端
- 双大端字节交换
- 双小端字节交换例子字节顺序:AB CD EF GH(大端)
浮点数 123456789.00 或十六进制41 9D 6F 34 54 00 00 00
Modbus 消息中的线路顺序:41 9D 6F 34 54 00 00 00
保存/打开工作区
如果您打开许多相关的 Modbus 窗口,可以方便地在一个工作区中保存所有打开和排列的 Modbus 窗口的当前布局的快照。
工作区 (*msw) 是一个包含所有打开窗口的显示信息和文件名的文件。不是实际内容。为此,请转到文件→保存工作区。
连接和图表设置存储在工作区文件中。
当您打开工作区文件时,Modbus Slave 将打开所有 Modbus 窗口并以您保存的布局显示它们。
通讯流量
选择菜单“显示”→“通讯”以显示串行线路或以太网电缆上的流量。使用停止按钮暂时停止更新以进行检查。
使用复制按钮将所选行复制到剪贴板。
该窗口仅显示 Modbus 从站发送和接收的数据。您不能将其用作数据嗅探器。 |
在执行其他命令时保持此窗口打开。 |
OLE/自动化
自动化(以前称为 OLE 自动化)使一个应用程序可以操作另一应用程序中实现的对象。
自动化客户端是一个可以操作属于另一个应用程序的公开对象的应用程序。这也称为自动化控制器。
自动化服务器是向其他应用程序公开可编程对象的应用程序。Modbus Slave是一个自动化服务器。
这意味着您可以使用任何支持VBA(Visual Basic for Applications)的程序(例如Visual Basic、Excel等)根据您的具体要求解释和显示modbus数据。
Excel 示例
当您想要编写宏时,您应该显示“开发人员”选项卡或在开发人员模式下运行。
Excel 2007
- 单击 Microsoft Office 按钮,然后单击 Excel 选项。
- 单击“流行”,然后选中“在功能区中显示开发人员选项卡”复选框。
请注意,功能区是 Microsoft Fluent 用户界面的一部分。
Excel 2010、2016
- 单击文件选项卡。
- 单击选项。Excel 选项窗口将打开。
- 在左侧窗格中单击“自定义功能区”。
- 在右侧窗格的“主选项卡”下,选中“开发人员”复选框。
- 单击“确定”。“开发人员”选项卡现在应该显示在功能区中(最右侧的选项卡)。
Excel 示例代码
此示例打开一个模拟保持寄存器的窗口。
Modbus Slave 是隐藏的,但您可以通过取消注释“ShowWindow”行来显示它。这将显示其中一个窗口。
Modbus Slave 安装中还包含一个示例。
开始 → 所有程序 → Modbus Slave → Excel 示例Excel VBA 示例
Public doc As Object Public app As Object Dim status As Integer Dim n As Integer Private Sub StartSlave_Click() ' Create an application object. You can only create 1 application object Set app = CreateObject("Mbslave.Application") ' Create a new Modbus Slave document (Data Window) ' This is the same as open a new data window in Modbus Slave ' You can create up to 50 Modbus Slave documents (Data Window) Set doc = CreateObject("Mbslave.Document") ' Show Modbus Slave ' res = doc.ShowWindow() ' Create doc2 if needed. ' Set doc2 = CreateObject("Mbslave.Document") ' Set one of 5 connection types. app.Connection = 1 ' Modbus TCP/IP ' TCP/IP settings. ' No need to set IP address. We listen to any address. (Default). app.ServerPort = 502 app.IPVersion = 4 ' Open the connection. res = app.OpenConnection() Range("D5").Value = res res = doc.SetupHoldingRegisters(1, 100, 8) doc.SRegisters(0) = 1 ' Modbus address 100 doc.SRegisters(1) = -10 ' Note that the Index used counts from 0 doc.URegisters(2) = 50000 ' no matter the Modbus address used. doc.URegisters(3) = 60000 doc.Longs(4) = 10000 ' A long takes 2 registers doc.Floats(6) = 123.45 ' A float takes 2 registers ' Now a master can read 8 Holding registers with a mix of 3 data types 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('Mbslave.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("Mbslave.Document") # Setup 100 holding registers with slave ID 1, address 0 (40001) Win1.SetupHoldingRegisters(1, 0, 100) # 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 # Use ByteOrder to set the actual endianness 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") # Set different values Win1.SRegisters(0, -100) Win1.SRegisters(1, 100) Win1.URegisters(2, 43690) Win1.URegisters(3, 65535) Win1.ByteOrder = BE Win1.Ints_32(4, -123456) Win1.ByteOrder = LE Win1.Ints_32(6, -123456) Win1.ByteOrder = BE_BS Win1.Ints_32(8, -123456) Win1.ByteOrder = LE_BS Win1.Ints_32(10, -123456) Win1.ByteOrder = BE Win1.UInts_32(12, 123456) Win1.ByteOrder = LE Win1.UInts_32(14, 123456) Win1.ByteOrder = BE_BS Win1.UInts_32(16, 123456) Win1.ByteOrder = LE_BS Win1.UInts_32(18, 123456) Win1.ByteOrder = BE Win1.Ints_64(20, -123456) Win1.ByteOrder = LE Win1.Ints_64(24, -123456) Win1.ByteOrder = BE_BS Win1.Ints_64(28, -123456) Win1.ByteOrder = LE_BS Win1.Ints_64(32, -123456) Win1.ByteOrder = BE Win1.UInts_64(40, 123456) Win1.ByteOrder = LE Win1.UInts_64(44, 123456) Win1.ByteOrder = BE_BS Win1.UInts_64(48, 123456) Win1.ByteOrder = LE_BS Win1.UInts_64(52, 123456) Win1.ByteOrder = BE Win1.Floats (60, 123.456) Win1.ByteOrder = LE Win1.Floats (62, 123.456) Win1.ByteOrder = BE_BS Win1.Floats(64, 123.456) Win1.ByteOrder = LE_BS Win1.Floats(66, 123.456) Win1.ByteOrder = BE Win1.Doubles(80, 123.456) Win1.ByteOrder = LE Win1.Doubles(84, 123.456) Win1.ByteOrder = BE_BS Win1.Doubles(88, 123.456) Win1.ByteOrder = LE_BS Win1.Doubles(92, 123.456) # Refresh Win1.EnableRefresh = True Win1.ResizeAllColumns () Win1.ResizeWindow() print (Win1.GetName(1)) _ = input("Press ENTER to quit:")
连接功能/属性
以下属性和功能与您在连接对话框 (F3) 中的设置相同。
连接
连接选择所需的连接。可以选择串行端口或以太网连接之一。
属性连接为整数有效值
0 = 串行端口
1 = Modbus TCP/IP
2 = Modbus UDP/IP
3 = Modbus RTU over TCP/IP
4 = Modbus RTU over UDP/IP
例子
Connection = 0
波特率
仅适用于连接 = 0
属性BaudRate as Long有效值
300
600
1200
2400
4800
9600(默认)
14400
19200
38400
56000
57600
115200
128000
153600
230400
256000
460800
921600例子
BaudRate = 9600
数据位
仅适用于连接 = 0
属性DataBits作为整数有效值
7
8(默认)
例子
DataBits = 8
校验位
仅适用于连接 = 0
财产平价作为整数有效值
0 = 无
1 = 奇数
2 = 偶数(默认)
例子
Parity = 2
停止位
仅适用于连接 = 0
属性StopBits作为整数有效值
1(默认)
2
例子
StopBits = 1
串行端口
仅适用于连接 = 0
属性SerialPort作为整数有效值
1…255
默认值 = 1例子
SerialPort = 1
服务器端口
仅适用于连接 = 1…4
属性ServerPort为 Long有效值
0…65535
默认值 = 502例子
ServerPort = 502
IP版本
仅适用于连接 = 1…4
属性IPVersion作为整数有效值
4 = IP 版本 4(默认)
6 = IP 版本 6
例子
IPVersion = 4
任意地址
仅适用于连接 = 1…4
属性AnyAddress作为整数有效值
0 = 任何地址 = false
1 = 任何地址 = true(默认)
例子
AnyAddress = 1
忽略单位ID
仅适用于连接 = 1…4
属性IgnoreUnitID作为 Integer有效值
0 = 忽略单元 ID = false
1 = 忽略单元 ID = true(默认)
例子
IgnoreUnitID = 1
开放连接
打开使用“连接”属性选择的连接。
函数OpenConnection () 作为整数
返回值:
如果成功则为零。如果失败则非零值。如何打开 Modbus TCP/IP 连接的示例
Public app As Object Dim res As Integer ' Create an object to Modbus Slave Set app = CreateObject("Mbslave.Application") app.Connection = 1 ' Select Modbus TCP/IP app.IPVersion = 4 ' app.IPAddress = "192.168.1.27" ' No need to setup if AnyAddress = 1. Modbus Slave listen on all. app.ServerPort = 502 res = OpenConnection()
如何设置串行连接的示例
Public app As Object Dim status As Integer ' Create an object to Modbus Slave Set app = CreateObject("Mbslave.Application") app.Connection = 0 ' Mode is serial port app.SerialPort = 1 ' Com port 1 app.BaudRate = 9600 ' 9600 baud app.Parity = 0 ' None parity app.Mode = 0 ' RTU mode status = app.OpenConnection()
关闭连接
函数CloseConnection () As Integer返回值
如果成功则为零。如果失败则非零值。
显示通讯交通
函数ShowCommunicationTraffic ()
显示通信流量窗口。
关闭通讯交通
函数CloseCommunicationTraffic ()
关闭通信流量窗口(如果显示)。
自动化设置功能
以下功能与您在读/写定义对话框 (F8) 中设置的功能相同。读取功能与 Modbus 从站文档相关联。(带有数据的窗口)
.示例
Res = doc.SetupDiscreteInputs (1, 100, 5) Coils (0) = 1 ' Address 100 = 1 Coils (1) = 0 ' Note that the index used in Coils starts from 0 Coils (2) = 1 ' no matter the address used. Coils (3) = 0 Coils (4) = 1 ' Now the Master reads 1, 0, 1, 0, 1 when read 5 discrete inputs starting from address 100
设置线圈
Function SetupCoils (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer返回值
如果成功则为真。如果没有成功则为假参数
SlaveID:从机地址 1 至 255
地址:数据地址(基址 0)
数量:数据数量。1 至 10000
设置离散输入
函数设置离散输入(SlaveID 作为整数,地址作为整数,数量作为整数)作为整数返回值
如果成功则为真。如果没有成功则为假参数
SlaveID:从机地址 1 至 255
地址:数据地址(基址 0)
数量:数据数量。1 至 10000
设置保持寄存器
函数SetupHoldingRegisters (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer返回值
如果成功则为真。如果没有成功则为假参数
SlaveID:从机地址 1 至 255
地址:数据地址(基址 0)
数量:数据数量。1 至 10000
设置输入寄存器
函数SetupInputRegisters (SlaveID As Integer, Address As Long, Quantity As Integer) As Integer返回值
如果成功则为真。如果没有成功则为假参数
SlaveID:从机地址 1 至 255
地址:数据地址(基址 0)
数量:数据数量。1 至 10000
橱窗展示
函数ShowWindow ()
默认情况下,Modbus 文档窗口是隐藏的。ShowWindow 功能使 Modbus Poll 可见并显示带有数据内容的文档。
获取名称
函数GetName(索引为整数)为字符串描述
获取值的名称。
索引 0 对应于第一个 Modbus 地址。
设置名称
函数SetName(索引为整数,名称为字符串)描述
设置值的名称。
索引 0 对应于第一个 Modbus 地址。
自动递增
属性AutoIncrement(索引为整数)为布尔值描述
设置值的自动增量。
索引 0 对应于第一个 Modbus 地址。
句法
自动增量(索引)[=新值]
全部格式化
函数FormatAll(格式化为整数)
使用所选格式设置所有值单元格的格式。参数
格式:值单元格的格式。
获取格式
函数GetFormat(索引为整数)作为整数描述
获取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 来获取正确的字节顺序。 |
设置格式
函数SetFormat(索引为整数,格式为整数)描述
设置 Modbus 值的显示格式。请参阅上面的格式值。
调整窗口大小
函数ResizeWindow ()
调整打开的窗口的大小以适合网格。
行数
函数Rows (NumberRows)
指定网格中的行数。参数
NumberRows:网格中的行数。
ID | 描述 |
---|---|
0 | 10 行(默认) |
1 | 20 行 |
2 | 50 行 |
3 | 适合数量 |
自动化数据属性
以下属性用于设置或获取 Modbus 从站内部写入/读取数组中的值。使用的索引不是 Modbus 地址。无论使用什么地址,索引始终从 0 开始计数。数据属性与 Modbus 从站文档关联。(有数据的窗口)
示例1:
' doc is assumed created first. See Excel example. doc.SRegisters(0) = 1 doc.SRegisters(1) = 10 doc.SRegisters(2) = 1234
使用浮点值的示例 2:
doc.Floats(0) = 1.3 doc.Floats(2) = 10.5 doc.Floats(4) = 1234.12
线圈(Coils)
属性 线圈(索引 As Integer) As Integer
描述
在写入数组结构中设置一个线圈或从读取数组中返回一个线圈。
语法
Coils(Index) [=newvalue]
短整型寄存器(SRegisters)
属性 短整型寄存器(索引 As Integer) As Integer
描述
在写入数组结构中设置一个寄存器或从读取数组中返回一个寄存器。
语法
SRegisters(Index) [=newvalue]
无符号寄存器(URegisters)
属性 无符号寄存器(索引 As Integer) As Long
描述
在写入数组结构中设置一个寄存器或从读取数组中返回一个寄存器。
语法
URegisters(索引)[=新值]
32位整型(Ints_32)
属性 32位整型(索引 As Integer) As Double
描述
在写入数组结构中设置一个32位整数或从读取数组中返回一个整数。
语法
URegisters(Index) [=newvalue]
无符号32位整型(UInts_32)
属性 无符号32位整型(索引 As Integer) As Double
描述
在写入数组结构中设置一个32位无符号整数或从读取数组中返回一个无符号整数。
语法
UInts_32(Index) [=newvalue]
64位整型(Ints_64)
属性 64位整型(索引 As Integer) As Double
描述
在写入数组结构中设置一个64位整数或从读取数组中返回一个整数。
语法
Ints_64(Index) [=newvalue]
无符号64位整型(UInts_64)
属性 无符号64位整型(索引 As Integer) As Double
描述
在写入数组结构中设置一个64位无符号整数或从读取数组中返回一个无符号整数。
语法
UInts_64(Index) [=newvalue]
浮点数(Floats)
属性 浮点数(索引 As Integer) As Single
描述
在写入数组结构中设置一个浮点数或从读取数组中返回一个浮点数。
语法
Floats(Index) [=newvalue]
双精度浮点数(Doubles)
属性 双精度浮点数(索引 As Integer) As Double
描述
在写入数组结构中设置一个双精度浮点数或从读取数组中返回一个双精度浮点数。
语法
Doubles(Index) [=newvalue]
字节顺序(ByteOrder)
属性ByteOrder作为整数描述
设置 Ints_32、UInts_32、Ints_64、UInts_64、浮点数 和 双精度浮点数 属性使用的字节顺序。
ID | 字节顺序 |
---|---|
0 | 大端序(默认) |
1 | 小端序字节交换 |
2 | 大端序字节交换 |
3 | 小端序 |
Ints_32 示例:
字节顺序:大端序
十进制数123456789 或 十六进制 07 5B CD 15
在Modbus消息中的传输顺序:07 5B CD 15
语法
字节顺序 [=新值]
评论列表(94条)
下载
666.支持Long 64字节
666
感谢楼主
666
非常感谢!
非常感谢!
6666
6666
软件下载
教程是下功夫了
教程详细
谢谢楼主分享
666
666
教程很详细
666
测试一下
666
感谢分享
很需要,谢谢。
正需要谢谢
感谢分享
谢谢分享
感谢分享
感谢分享
11
11
11
看看怎么样