PLC实现HTTP协议的POST请求与服务端JSON双向通讯
要在PLC中实现HTTP协议的POST请求并与服务端进行JSON格式的双向通讯,通常有以下几种实现方式:
1. 使用支持HTTP功能的PLC
现代高端PLC(如西门子S7-1200/1500、罗克韦尔ControlLogix、三菱Q系列等)通常内置或可通过附加模块实现HTTP通信功能。
西门子S7-1200/1500实现示例
ST
// 使用"HTTP_POST"指令(TIA Portal环境) // 首先定义变量 VAR HTTP_POST_DB : HTTP_POST; // 数据块 RequestBody : STRING(1000) := '{"key1":"value1", "key2":123}'; Response : STRING(1000); Done : BOOL; Error : BOOL; Status : WORD; END_VAR
// 在OB1中调用 HTTP_POST_DB( REQ := TRUE, URL := 'http://example.com/api', BODY := RequestBody, CONTENT_TYPE := 'application/json', DONE => Done, ERROR => Error, STATUS => Status, RESPonSE => Response );
// 处理响应 IF Done THEN // 解析JSON响应(可能需要额外库) HTTP_POST_DB(REQ := FALSE); // 重置指令 END_IF;
2. 使用工业网关或边缘设备
如果PLC本身不支持HTTP,可以通过工业网关中转:
PLC与网关通信:使用PLC原生协议(如Modbus TCP、OPC UA等)
网关与服务端通信:网关实现HTTP POST和JSON处理
3. 使用第三方库或自定义通信模块
对于支持自定义功能的PLC(如CODESYS兼容平台):
ST
// 使用FB实现HTTP POST(伪代码) FUNCTION_BLOCK HTTP_POST_JSON VAR_INPUT Execute : BOOL; URL : STRING(255); Jsondata: STRING(2000); END_VAR VAR_OUTPUT Done : BOOL; Error : BOOL; Response : STRING(2000); END_VAR VAR // 内部实现变量 state : INT; socket : T_SOCKET; request : STRING(4000); END_VAR
// 实现TCP连接、HTTP请求构造和发送 // 包括: // 1. 解析URL // 2. 建立TCP连接 // 3. 构造HTTP请求头: // POST /api HTTP/1.1 // Host: example.com // Content-Type: application/json // Content-Length: xxx // // {"key":"value"} // 4. 发送请求 // 5. 接收响应 // 6. 解析响应
4. 使用Python脚本中转(适用于支持Python的PLC)
如Beckhoff PLC使用Python脚本:
python
import requests import json
def post_to_server(plc_data): url = "http://example.com/api" headers = {'Content-Type': 'application/json'}
# 将PLC数据转换为JSON json_data = { "temperature": plc_data.temperature, "pressure": plc_data.pressure, "status": plc_data.status }
try: response = requests.post(url, data=json.dumps(json_data), headers=headers) return response.json() # 返回服务器响应 except Exception as e: return {"error": str(e)}
JSON处理注意事项
JSON生成:
简单系统:手动拼接JSON字符串
复杂系统:使用JSON库(如西门子的"Simatic JSON Library")
JSON解析:
解析响应数据,提取所需字段
示例(伪代码):
ST// 假设Response包含:{"command": "start", "param": 42}IF Find(Response, '"command":') > 0 THENcommand := ExtractString(Response, '"command":', ',');param := ExtractInt(Response, '"param":', '}');END_IF;
实际实施建议
选择合适的方法:
高端PLC:优先使用内置HTTP功能
中低端PLC:考虑网关方案
开放平台:使用Python/C脚本
安全考虑:
使用HTTPS而非HTTP
实现认证(如Bearer token、Basic Auth)
考虑数据加密
错误处理:
实现超时机制
记录通信失败
设计重试逻辑
性能优化:
避免频繁短连接(考虑连接池或持久连接)
合理设置超时时间
压缩大数据量请求
示例完整流程(西门子环境)
在TIA Portal中添加HTTP库
创建数据块存储请求和响应
在OB1中组织程序逻辑:
ST
// 初始化 IF NOT InitDone THEN HTTP_POST_DB.URL := 'https://api.example.com/data'; HTTP_POST_DB.CONTENT_TYPE := 'application/json'; InitDone := TRUE; END_IF; // 准备JSON数据 JSON_data:= CONCAT('{"temp":', REAL_TO_STRING(Temperature)); JSON_data:= CONCAT(JSON_DATA, ',"status":'); JSON_data:= CONCAT(JSON_DATA, BOOL_TO_STRING(MachineStatus)); JSON_data:= CONCAT(JSON_DATA, '}'); // 触发请求 IF NOT HTTP_POST_DB.DONE AND NOT HTTP_POST_DB.ERROR THEN HTTP_POST_DB.BODY := JSON_DATA; HTTP_POST_DB(REQ := TRUE); END_IF; // 处理响应 IF HTTP_POST_DB.DONE THEN // 解析响应JSON ParseJSonResponse(HTTP_POST_DB.RESPONSE); HTTP_POST_DB(REQ := FALSE); ELSIF HTTP_POST_DB.ERROR THEN // 错误处理 ErrorCount := ErrorCount + 1; HTTP_POST_DB(REQ := FALSE); END_IF;
通过以上方法,PLC系统可以实现与现代IT系统的HTTP/JSON双向通信,适用于工业物联网(IIoT)应用、远程监控、云平台集成等场景。