跳到主要内容

插件开发案例: S7 PLC

s7插件提供资源“/s7”,实现对S7 PLC的读和写的访问

插件URI格式

GET | PUT /s7?DI=[uuid]&ITEMS=[items]&area=[DB]&an=[area number]&addr=[address]&type=[data type]

参考:S7 plugin.manifest文件>>

插件回调框架

S7_PLC_APIS_all =
{
{MODULE_API_VERSION_1},

S7_PLC_ParseConfigurationFromJson,
S7_PLC_FreeConfiguration,
S7_PLC_Create,
S7_PLC_Destroy,
S7_PLC_Receive,
S7_PLC_Start};

插件初始化

void S7_PLC_Start(MODULE_HANDLE module){

// 初始化微服务框架
RESTFUL_CONTEXT ctx = WA_InitRestful(
module_data->broker, module, "mod-ab-plc");
module_data->restful_context = ctx;

// 注册资源/s7以及处理函数入口
WA_RegisterResource(ctx, "/s7", res_s7_cmd_get_handler, T_Get);
WA_RegisterResource(ctx, "/s7", res_s7_cmd_put_handler, T_Put);

// 加载用户通过Web界面配置本插件的虚拟设备
load_device_config();

// 创建任务调度器(新线程), 创建S7连接任务
module_data->task_scheduler = bh_task_run_new_scheduler();

bh_schedule_task(module_data->task_scheduler, task1, 0);
}

资源实现函数

void res_s7_cmd_get_handler(restful_request_t *request, REQ_ENV_HANDLE req_env){

// 解析请求的查询字段
char *di = parse_s7_cmd_query(request->query, &AREA, &area_Number, &start_address, &items, &type);

// 查找目标设备名是否已经连接
device = find_device_open(di);

// 使用请求中的参数读S7设备
res = daveReadBytes(device->dc, AREA, area_Number, start_address, length, NULL);

// 将读取结果返回请求者
wa_req_env_handover_payload(req_env, CONTENT_2_05, IA_APPLICATION_JSON, strlen(payload), &payload);
}