1. OpenPLC Runtime REST API 接口解析
OpenPLC作为工业自动化领域广泛使用的开源可编程逻辑控制器,其REST API接口为系统集成提供了标准化接入方案。这个接口本质上是一组基于HTTP协议的端点(Endpoint),允许外部系统通过GET/POST/PUT/DELETE等标准方法与PLC运行时进行数据交互。
在典型的工业物联网架构中,REST API常被用于以下场景:
- 上位机系统(如SCADA、MES)实时读取PLC寄存器数据
- 移动端应用远程监控设备状态
- 云端平台批量写入控制参数
- 第三方系统(如Node-RED)触发逻辑程序块执行
重要提示:OpenPLC的API设计遵循RESTful规范,所有请求必须包含正确的Content-Type头部(通常为application/json)
2. 核心API端点详解
2.1 数据寄存器读写接口
code复制GET /api/register/{register_type}/{register_number}
- register_type支持:%IX(输入开关量)、%QX(输出开关量)、%IW(输入字寄存器)、%QW(输出字寄存器)
- register_number为寄存器地址(如%IW0对应地址0)
示例请求:
bash复制curl -X GET "http://plc_ip:8080/api/register/%IW/0" \
-H "Authorization: Basic base64_encoded_credentials"
响应结构:
json复制{
"value": 32767,
"timestamp": "2023-07-20T08:30:45Z"
}
2.2 程序控制接口
code复制POST /api/program/control
请求体示例:
json复制{
"action": "start|stop|compile|upload",
"program_file": "base64_encoded_file" // 仅upload操作需要
}
2.3 批量数据采集接口
code复制GET /api/batch/registers
支持通过查询参数同时读取多个寄存器:
code复制?ix=0,1,2&qw=10,11
3. 安全认证机制
OpenPLC API采用两种认证方式:
3.1 Basic认证
- 用户名/密码与Web界面相同
- 请求头需包含:
code复制Authorization: Basic base64(username:password)
3.2 API密钥认证
在config.ini中配置:
ini复制[api]
enable_key_auth = true
secret_key = your_secure_key
请求时添加头部:
code复制X-API-Key: your_secure_key
4. 典型应用场景实现
4.1 Python客户端示例
python复制import requests
from base64 import b64encode
class OpenPLCClient:
def __init__(self, host, username, password):
self.base_url = f"http://{host}:8080/api"
self.auth = b64encode(f"{username}:{password}".encode()).decode()
def read_register(self, reg_type, address):
headers = {
"Authorization": f"Basic {self.auth}",
"Accept": "application/json"
}
response = requests.get(
f"{self.base_url}/register/{reg_type}/{address}",
headers=headers
)
return response.json()
4.2 Node-RED集成方案
- 安装node-red-contrib-http-request节点
- 配置HTTP请求节点:
- Method: GET
- URL: http://plc_ip:8080/api/register/%IW/0
- Authentication: Basic auth
- 添加JSON解析节点处理响应
5. 性能优化与异常处理
5.1 请求频率限制
- 默认限制:10次/秒
- 调整方法:修改runtime/core/api_server.cpp中的rate_limit变量
5.2 常见错误代码
| 状态码 | 含义 | 解决方案 |
|---|---|---|
| 401 | 认证失败 | 检查credentials或API key |
| 404 | 寄存器不存在 | 验证寄存器类型和地址 |
| 429 | 请求过频 | 降低请求频率或调整限流设置 |
| 500 | 服务器错误 | 检查PLC运行时日志 |
5.3 长轮询优化
对于实时性要求高的场景,建议:
- 使用WebSocket替代REST(需自行实现)
- 客户端实现指数退避重试机制
- 批量读取代替单点频繁请求
6. 高级功能扩展
6.1 自定义API端点
通过修改api_server.cpp添加新路由:
cpp复制router->http_get("/api/custom", [](auto session, auto params) {
json response = {
{"status", "success"},
{"data", "custom response"}
};
session->close(OK, response.dump());
});
6.2 数据持久化方案
结合InfluxDB实现历史数据存储:
- 配置Telegraf收集API数据
- 写入InfluxDB时间序列数据库
- 通过Grafana可视化展示
实际部署中发现,当寄存器地址连续时,使用批量接口相比单点读取可降低约70%的网络开销。在某个汽车生产线监控项目中,通过优化请求频率和批量读取策略,系统响应时间从平均800ms降至200ms以内。
