前言
MODBUS是一种应用层消息传递协议,通常用于 I/O 系统通信和可编程逻辑控制器(PLC)通信。
链接类型 | 描述 |
---|---|
MODBUS TCP | TCP/IP 使用502端口 |
MODBUS RTU | RTU通常通过串行通信链路运行,即RS-232、 RS-422 或 RS-485。RTU 使用额外的 CRC 进行数据包检查。协议直接将每个字节作为 8 个数据位传输,因此使用“二进制” 而不是 ASCII 编码。使用串行链路开始和结束时,消息帧是按时间而不是按特定字符检测的。 |
MODBUS ASCII | 串行协议,通常在串行通信链路上运行,即 RS-232、RS-422 或 RS-485。串行 ASCII 使用额外的 LRC 数据包检查。该协议将每个字节编码为 2 个 ASCII 字符。消息帧的开始和结束由特定字符检测 (“:” 开始消息,CR/LF 结束消息)。该协议效率低于 Modbus RTU,但在某些环境中可能更可靠。 |
Modbus 提供对以下 4 种类型的数据的访问:
主表 | 对象类型 | 访问 | 说明 |
---|---|---|---|
离散输入 | 1bit | 只读 | 这种类型的数据可以由 I/O 系统提供。 |
线圈 | 1bit | 读写 | 此类数据可由应用程序更改。 |
输入寄存器 | 16位字(2字节) | 只读 | 这种类型的数据可以由 I/O 系统提供。 |
保持寄存器 | 16位字(2字节) | 读写 | 此类数据可由应用程序更改。 |
Modbus 通信由从 Modbus 客户端发送到 Modbus 服务器的请求消息组成。服务器使用响应消息进行回复。Modbus 请求消息包含:
- 描述数据传输类型的 Modbus 功能码(1字节)。
- Modbus 地址(2字节),用于描述从服务器中读取或写入数据的地址。
- 对于写入操作,则需要传输写入的数据。
Modbus模块 支持以下 9 个 Modbus 功能码:
访问 | 功能说明 | 功能码 |
---|---|---|
1bit | 读取线圈 | 1 |
1bit | 读取离散输入 | 2 |
1bit | 写入单线圈 | 5 |
1bit | 写入多个线圈 | 15 |
16位字访问(2字节) | 读取输入寄存器 | 4 |
16位字访问(2字节) | 读取保持寄存器 | 3 |
16位字访问(2字节) | 写入单个寄存器 | 6 |
16位字访问(2字节) | 写入多个寄存器 | 16 |
16位字访问(2字节) | 读/写多个寄存器 | 23 |
Modbus读取操作仅限于传输125个16位字或2000 bit。Modbus写入操作仅限于传输123个16位字或1968 bit。
编译MODBUS模块
使用到的模块下载地址
epics-base - (launchpad.net) / epics-base/epics-base / EPICS Base (anl.gov)
epics-modules/asyn: EPICS module for driver and device support
epics-modules/ipac: IPAC Carrier and Communication Module Drivers
sequencer / Download and Installation — EPICS Sequencer Version 2.2 (bessy.de)
以下步骤需要先安装好EPICS Base.
编译 SSCAN(可选)
|
|
编译 CALC(可选)
|
|
编译 asyn(必需)
|
|
编译 modbus
|
|
编译完成后,可以看到bin\<EPICS_HOST_ARCH>
路径下生成了可执行程序modbusApp
,它就是与Modbus设备通信的主程序了。
使用 MODBUS 程序
在Modbus模块的iocBoot\iocTest
目录下,可以看到很多示例程序。这里总结一下,我们使用时主要需要编写两部分内容。
- 用于配置设备连接和通信的
.cmd
文件 - 用于使用模板解析数据的
.substitutions
文件
这里给出示例并做简要说明。
envPaths
文件:用于配置程序运行时的环境变量路径。
这里需要配置好base
、asyn
、modbus
模块的路径。
|
|
|
|
|
|
最后运行程序,在终端执行:
|
|
或者在.cmd
文件第一行添加下面一行:
|
|
然后直接执行.cmd
脚本。
|
|
参考