2022-07-10 03:39:00 +08:00
2022-07-10 03:36:18 +08:00
2022-07-09 14:30:30 +08:00
2022-07-10 03:36:18 +08:00
2022-07-10 03:36:18 +08:00
2022-07-10 03:39:00 +08:00

EdgeManagerSCADA系统

API

API设计最大程度遵循了已有的MES规范。

class EDataCapture

0. HTTP POST: set_node_data

请求

需保证每次传入数据的工序单元working subclass和数值类型type 一致。

在此基础上尽量单次传入尽量多数据使得性能最大化。

但仍需兼顾传输速率和超时时间。

{
    "action": "set_node_data",
    "param": {
        "working_subclass": <string>,
        "type": "string" | "int" | "float" | "bool",
        "data": [
            {
                "code": <string>,
                // value的类型需与type对应
                "value": <string | int | float | bool>,
                "device_code": [string],
                "batch": [string]
            },
            {
                "code": <string>,
                "value": <string | int | float | bool>,
                "device_code": [string],
                "batch": [string]
            },
            ...
        ]
    }
}

返回

操作成功:

{
    "action": "result_set_data",
    "errcode": 0,
    "errmsg": ""
}

操作失败:

{
    "action": "result_set_data",
    "errcode": 4002,
    "errmsg": "ROLLBACKed: Bad data received (structure and/or values)"
}

开发环境

拉取代码:

# 建议先配置SSH key pair
git clone ssh://git@118.195.187.246:10022/ysun/EdgeManager.git
cd EdgeManager

一键部署PHP workerman和TimescaleDB环境

docker compose up -d

进入交互式Prompt

docker exec -it edge_manager bash

后端调试:

# In container
php EdgeManager.php --server_name=GPU-server-01 --user=postgres --password=big_dick start

前端调试:

# In host
# yarn
# yarn watch
yarn serve

客户端连接:

sudo apt install postgresql-client
# 登入
psql -h localhost -U postgres
# 显示数据库列表
\l

技术细节

0. EdgeManager\EDataCapture\EDataCapture -> set_data()为什么是以6507524为大小chunked的

首先明确一点根据PostgreSQL的技术架构条件允许的情况下一次性插入多条记录是效率最高的,比如:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

这其中,仅插入部分字段的值,比如:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

的效率又远远不如插入全部列但使用特殊变量DEFAULT替代缺少的字段比如

INSERT INTO films VALUES
    ('UA502', 'Bananas', DEFAULT, '1971-07-13', 'Comedy', '82 minutes');

PostgreSQL的文档里没有提及这个话题因为源码里为SQL语句的内存分配指定了一个最大长度常量MaxAllocSize其大小为比1GB小1字节。这个值可以在编译前手动修改所以理论上每个PG运行的实例都可以不一样如果我们使用的PG并非修改过源码手动编译的那么SQL语句的最大长度为1024 ** 3 - 1 = 1073741823 bytes。

安全起见下述计算假定working_subclass等字段的最大长度均为我们以往约定的45 bytes。

而此处我源码中的SQL语句头长度为131 bytes注意末尾空格

单个语句体的长度为165 bytes

所以其最多可以一次性插入(1073741823 - 131) / 165条记录,向下取整后即为6507524

Description
No description provided
Readme 2.1 MiB
Languages
Vue 40.9%
JavaScript 28.6%
SCSS 16%
PHP 12.9%
Smarty 0.6%
Other 1%