diff --git a/APP_Framework/Applications/control_app/plc_demo/Makefile b/APP_Framework/Applications/control_app/plc_demo/Makefile index 723d7c32c..e6f45b376 100755 --- a/APP_Framework/Applications/control_app/plc_demo/Makefile +++ b/APP_Framework/Applications/control_app/plc_demo/Makefile @@ -1,3 +1,3 @@ -SRC_DIR := advantech beckhoff br delta mitsubishi omron schneider siemens ge xinje +SRC_DIR := advantech beckhoff br delta mitsubishi omron schneider siemens ge xinje inovance include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Applications/control_app/plc_demo/inovance/Makefile b/APP_Framework/Applications/control_app/plc_demo/inovance/Makefile new file mode 100644 index 000000000..5b7f58eef --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/inovance/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := inovance_am401_cpu1608tn_ethernet.c + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/inovance/README.md b/APP_Framework/Applications/control_app/plc_demo/inovance/README.md new file mode 100644 index 000000000..3e774abc4 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/inovance/README.md @@ -0,0 +1,26 @@ +# INOVANCE AM4011608TN通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 网口 + + * CN3 EtherNET,Mosbus TCP协议,IP:192.168.250.50,Port:502 + +* 串口 + * CN1 RS485,AM401只支持一路串口,AM600可支持两路串口。AM401接线:pin1:485-,pin2:485+。波特率:9600,数据位:8位,停止位:1位,校验:偶校验 + +## 存储区 + +- 存储区 I,Q,M区。 + +## 通信测试 + +(1)共测试BOOL,INT16,INT32,FLOAT共四种类型数据。 + +(2)测试M区及Q区数据。 + +(3)M区数据测试,用功能码03,以字为单位读取。如读MX0.3,则读取MW0,然后按位拆解。如读MW100,则配方文件中起始地址则直接写100即可。如读MDx,则配方文件中起始地址应为2*x,这是汇川的地址编码规则决定,如MD200,则对应400。 + +(4)Q区数据测试,用功能码01,以位为单位读取。如读QX.Y,则配方文件中起始地址为X*8+Y;如读QW,QD等,则需按位进行读取后然后组合得到。 diff --git a/APP_Framework/Applications/control_app/plc_demo/inovance/inovance_am401_cpu1608tn_ethernet.c b/APP_Framework/Applications/control_app/plc_demo/inovance/inovance_am401_cpu1608tn_ethernet.c new file mode 100644 index 000000000..5ed855108 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/inovance/inovance_am401_cpu1608tn_ethernet.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * @file inovance_am401_cpu1608tn_ethernet.c + * @brief PLC inovance am401 app + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2023.4.25 + */ + +#include + +extern int Adapter4GActive(void); + +void ControlInovanceam401EthernetTest(void) +{ + int i, j = 0; + int read_data_length = 0; + uint8_t read_data[128] = {0}; + +#ifdef CONNECTION_ADAPTER_4G + Adapter4GActive(); +#endif + + ControlProtocolType modbus_tcp_protocol = ControlProtocolFind(); + if (NULL == modbus_tcp_protocol) { + printf("%s get modbus tcp protocol %p failed\n", __func__, modbus_tcp_protocol); + return; + } + + printf("%s get modbus tcp protocol %p successfull\n", __func__, modbus_tcp_protocol); + + if (CONTROL_REGISTERED == modbus_tcp_protocol->protocol_status) { + ControlProtocolOpen(modbus_tcp_protocol); + + for (;;) { + read_data_length = ControlProtocolRead(modbus_tcp_protocol, read_data, sizeof(read_data)); + printf("%s read [%d] modbus tcp data %d using receipe file\n", __func__, i, read_data_length); + if (read_data_length) { + for (j = 0; j < read_data_length; j ++) { + printf("j %d data 0x%x\n", j, read_data[j]); + } + } + i++; + memset(read_data, 0, sizeof(read_data)); + PrivTaskDelay(10000); + } + + //ControlProtocolClose(modbus_tcp_protocol); + } +} +PRIV_SHELL_CMD_FUNCTION(ControlInovanceam401EthernetTest, inovance am401 ethernet Demo, PRIV_SHELL_CMD_MAIN_ATTR); + + diff --git a/APP_Framework/Applications/control_app/plc_demo/inovance/test_recipe_inovance_am401_tcp.json b/APP_Framework/Applications/control_app/plc_demo/inovance/test_recipe_inovance_am401_tcp.json new file mode 100644 index 000000000..0f75a0366 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/inovance/test_recipe_inovance_am401_tcp.json @@ -0,0 +1,80 @@ +{ + "device_id": 1, + "device_name": "INOVANCE_AM401_TCP", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.50", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.1", + "netmask": "255.255.254.0", + "port": 502 + }, + "protocol_type": 2, + "read_period": 2000, + "read_item_list": [ + { + "value_name": "q00", + "value_type": 1, + "function_code": 1, + "start_address": 0, + "quantity": 1 + }, + { + "value_name": "q01", + "value_type": 1, + "function_code": 1, + "start_address":1, + "quantity": 1 + }, + { + "value_name": "q10", + "value_type": 1, + "function_code": 1, + "start_address": 8, + "quantity": 1 + }, + { + "value_name": "mw100", + "value_type": 3, + "function_code": 3, + "start_address": 100, + "quantity": 1 + }, + { + "value_name": "mw101", + "value_type": 3, + "function_code": 3, + "start_address": 101, + "quantity": 1 + }, + { + "value_name": "md200", + "value_type": 4, + "function_code": 3, + "start_address": 400, + "quantity": 2 + }, + { + "value_name": "md201", + "value_type": 4, + "function_code": 3, + "start_address": 402, + "quantity": 2 + }, + { + "value_name": "md300", + "value_type": 9, + "function_code": 3, + "start_address": 600, + "quantity": 2 + }, + { + "value_name": "md301", + "value_type": 9, + "function_code": 3, + "start_address": 602, + "quantity": 2 + } + + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1500.c b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1500.c index 15bd8f1f7..10aa2d722 100644 --- a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1500.c +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1500.c @@ -18,3 +18,28 @@ * @date 2023.3.27 */ +#include +void ControlS71500Test(void) +{ + int i = 0; + uint16_t read_data_length = 0; + uint8_t read_data[1024] = {0}; + ControlProtocolType s7_protocol = ControlProtocolFind(); + if (NULL == s7_protocol) { + printf("%s get s7 protocol %p failed\n", __func__, s7_protocol); + return; + } + printf("%s get s7 protocol %p successfull\n", __func__, s7_protocol); + if (CONTROL_REGISTERED == s7_protocol->protocol_status) { + ControlProtocolOpen(s7_protocol); + for (;;) { + read_data_length = ControlProtocolRead(s7_protocol, read_data, sizeof(read_data)); + printf("%s read [%d] s7 data %d using receipe file\n", __func__, i, read_data_length); + i++; + memset(read_data, 0, sizeof(read_data)); + PrivTaskDelay(10000); + } + } +} + +PRIV_SHELL_CMD_FUNCTION(ControlS71500Test, Siemens Plc S7_1512 Demo, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/siemens/test_recipe_S7_1512.json b/APP_Framework/Applications/control_app/plc_demo/siemens/test_recipe_S7_1512.json index 08cb7ed04..31df9a200 100644 --- a/APP_Framework/Applications/control_app/plc_demo/siemens/test_recipe_S7_1512.json +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/test_recipe_S7_1512.json @@ -1,6 +1,6 @@ { "device_id": 1, - "device_name": "打包机", + "device_name": "demo", "communication_type": 0, "socket_config": { "plc_ip": "192.168.250.2", diff --git a/APP_Framework/Applications/control_app/plc_demo/xinje/Makefile b/APP_Framework/Applications/control_app/plc_demo/xinje/Makefile index fcf6b1e27..a9157a614 100755 --- a/APP_Framework/Applications/control_app/plc_demo/xinje/Makefile +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/Makefile @@ -1,3 +1,3 @@ -SRC_FILES := xsdh-60a32-e.c xdh-60t4-e.c +SRC_FILES := xdh_60t4_e.c xsdh_60a32_e.c include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Applications/control_app/plc_demo/xinje/xdh_60t4_e.c b/APP_Framework/Applications/control_app/plc_demo/xinje/xdh_60t4_e.c index 498451102..3ed40cccd 100644 --- a/APP_Framework/Applications/control_app/plc_demo/xinje/xdh_60t4_e.c +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/xdh_60t4_e.c @@ -19,6 +19,7 @@ */ #include + void ControlXDHTest(void) { int i, j = 0; diff --git a/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh_60a32_e.c b/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh_60a32_e.c index cca093524..87b6a7780 100644 --- a/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh_60a32_e.c +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh_60a32_e.c @@ -20,6 +20,7 @@ #include + void ControlXSDHTest(void) { int i, j = 0; diff --git a/APP_Framework/Framework/control/plc_protocol/s7/s7.c b/APP_Framework/Framework/control/plc_protocol/s7/s7.c index 9ea8d6433..757aaa3e8 100644 --- a/APP_Framework/Framework/control/plc_protocol/s7/s7.c +++ b/APP_Framework/Framework/control/plc_protocol/s7/s7.c @@ -102,24 +102,6 @@ static struct ControlDone s7_protocol_done = ._ioctl = NULL, }; -/** - * @description: S7 Protocol Value Type - * @param uniform_value_type - uniform value type - * @return success : 0-8 error : -1 - */ -static uint8_t GetUniformValueTypeMemorySize(UniformValueType uniform_value_type) -{ - if (uniform_value_type == UNIFORM_BOOL || uniform_value_type == UNIFORM_INT8 || uniform_value_type == UNIFORM_UINT8) - return 1; - if (uniform_value_type == UNIFORM_INT16 || uniform_value_type == UNIFORM_UINT16) - return 2; - if (uniform_value_type == UNIFORM_INT32 || uniform_value_type == UNIFORM_UINT32 || uniform_value_type == UNIFORM_FLOAT) - return 4; - if (uniform_value_type == UNIFORM_DOUBLE) - return 8; - return 0; -} - /** * @description: Push Data Onto a Stack One By One * @param datastack - data stack pointer @@ -181,7 +163,7 @@ int8_t ReadPlcDataByRecipe(struct ControlRecipe *p_recipe) } TS7DataItem data_info = ((S7ReadItem*)p_read_item + i)->data_info; Cli_ReadMultiVars(s7_plc, &data_info, 1); - uint16_t Size = GetUniformValueTypeMemorySize(((S7ReadItem*)p_read_item + i)->value_type); + uint16_t Size = GetValueTypeMemorySize(((S7ReadItem*)p_read_item + i)->value_type); PrintHexNumberList("s7 recv", data_info.pdata,Size); PushDataIntoStack(s7_data,data_info.pdata,Size); MdelayKTask(100); @@ -200,6 +182,79 @@ int8_t ReadPlcDataByRecipe(struct ControlRecipe *p_recipe) return 0; } +/** + * @description: S7 Protocol read item Init + * @param p_read_item - read item pointer + * @param read_item_json - read item json pointer + * @param p_data - unused + * @return success : 0 error : -1 + */ +static uint8_t InitialS7ReadItem(S7ReadItem* p_read_item, cJSON* read_item_json, uint8_t* p_data) +{ + p_read_item->value_type = cJSON_GetObjectItem(read_item_json, "value_type")->valueint; + strncpy(p_read_item->value_name, cJSON_GetObjectItem(read_item_json, "value_name")->valuestring, 20); + TS7DataItem* p_data_info = &(p_read_item->data_info); + p_data_info->Amount = cJSON_GetObjectItem(read_item_json, "amount")->valueint; + p_data_info->Start = cJSON_GetObjectItem(read_item_json, "start")->valueint; + p_data_info->DBNumber = cJSON_GetObjectItem(read_item_json, "db_number")->valueint; + char* area_valuestring = cJSON_GetObjectItem(read_item_json, "area")->valuestring; + if (strcmp(area_valuestring, "I") == 0) + p_data_info->Area = S7AreaPE; + else if (strcmp(area_valuestring, "Q") == 0) + p_data_info->Area = S7AreaPA; + else if (strcmp(area_valuestring, "M") == 0) + p_data_info->Area = S7AreaMK; + else if (strcmp(area_valuestring, "DB") == 0) + p_data_info->Area = S7AreaDB; + else if (strcmp(area_valuestring, "C") == 0) + p_data_info->Area = S7AreaCT; + else if (strcmp(area_valuestring, "T") == 0) + p_data_info->Area = S7AreaTM; + char* wordlen_valuestring = cJSON_GetObjectItem(read_item_json, "wordlen")->valuestring; + if (strcmp(wordlen_valuestring, "Bit") == 0) + p_data_info->WordLen = S7WLBit; + else if (strcmp(wordlen_valuestring, "Byte") == 0) + p_data_info->WordLen = S7WLByte; + else if (strcmp(wordlen_valuestring, "Word") == 0) + p_data_info->WordLen = S7WLWord; + else if (strcmp(wordlen_valuestring, "DWord") == 0) + p_data_info->WordLen = S7WLDWord; + else if (strcmp(wordlen_valuestring, "Real") == 0) + p_data_info->WordLen = S7WLReal; + else if (strcmp(wordlen_valuestring, "Counter") == 0) + p_data_info->WordLen = S7WLCounter; + else if (strcmp(wordlen_valuestring, "Timer") == 0) + p_data_info->WordLen = S7WLTimer; + p_data_info->pdata = p_data; + printf("value_type is %d, amount is %d, start is %04d, db_number is %d, area is 0x%03x, wordlen is %d.\n", + p_read_item->value_type, p_data_info->Amount, p_data_info->Start, p_data_info->DBNumber, + p_data_info->Area, p_data_info->WordLen); + return GetValueTypeMemorySize(p_read_item->value_type); +} + +/** + * @description: S7 Protocol Cmd Generate + * @param p_recipe - recipe pointer + * @param protocol_format_info - protocol format info pointer + * @return success : 0 error : -1 + */ +int S7ProtocolFormatCmd(struct ControlRecipe *p_recipe, ProtocolFormatInfo *protocol_format_info) +{ + int ret = 0; + uint8_t* S7_plc_read_data = malloc(p_recipe->protocol_data.data_length); + uint16_t S7_plc_read_data_index = 8; + cJSON *read_single_item_json = protocol_format_info->read_single_item_json; + int i = protocol_format_info->read_item_index; + if (i == 0) + p_recipe->read_item = malloc(sizeof(S7ReadItem) * p_recipe->read_item_count); + S7_plc_read_data_index += InitialS7ReadItem((S7ReadItem*)(p_recipe->read_item) + i, + read_single_item_json,S7_plc_read_data + S7_plc_read_data_index); + if (S7_plc_read_data_index == 8) { + ret = -1; + printf("%s read %d item failed!\n", __func__, i); + } + return ret; +} /** * @description: S7 Protocol Init * @param p_recipe - recipe pointer @@ -212,12 +267,8 @@ int S7ProtocolInit(struct ControlRecipe *p_recipe) PrivFree(p_recipe->read_item); return -1; } - memset(p_recipe->read_item, 0, sizeof(S7ReadItem)); - - // p_recipe->ControlProtocolFormatCmd = S7ProtocolFormatCmd; - + p_recipe->ControlProtocolFormatCmd = S7ProtocolFormatCmd; p_recipe->done = &s7_protocol_done; - return 0; } diff --git a/APP_Framework/Framework/control/shared/control.c b/APP_Framework/Framework/control/shared/control.c index 9c4c3e444..fc0ff7fe8 100755 --- a/APP_Framework/Framework/control/shared/control.c +++ b/APP_Framework/Framework/control/shared/control.c @@ -20,7 +20,6 @@ #include #include -//#include "s7.h" /** * @description: Control Framework Find certain Protocol @@ -295,17 +294,6 @@ int ControlFrameworkInit(void) printf("%u %u\n",control_protocol->recipe->total_data_length,control_protocol->recipe->device_id); printf("%s ControlPeripheralInit done\n", __func__); - - //s7 read - - - - // ret = ReadPlcDataByRecipe(control_protocol->recipe); - // if (ret < 0) { - // printf("%s failed!\n", __func__); - // PrivFree(control_protocol); - // goto _out; - // } _out: return ret; diff --git a/APP_Framework/Framework/control/shared/control.h b/APP_Framework/Framework/control/shared/control.h index 5c3ec43ce..2639a4719 100644 --- a/APP_Framework/Framework/control/shared/control.h +++ b/APP_Framework/Framework/control/shared/control.h @@ -24,6 +24,7 @@ #include #include + #ifdef __cplusplus extern "C" { #endif diff --git a/APP_Framework/Framework/control/shared/control_def.c b/APP_Framework/Framework/control/shared/control_def.c index 2531503df..4808b2423 100644 --- a/APP_Framework/Framework/control/shared/control_def.c +++ b/APP_Framework/Framework/control/shared/control_def.c @@ -20,7 +20,6 @@ #include #include -#include "s7.h" /*using cirtular area to receive data*/ #define PLC_DATA_LENGTH 1024 @@ -430,73 +429,6 @@ int RecipeBasicInformation(struct ControlRecipe *p_recipe, cJSON *p_recipe_file_ printf("\n************************************************************\n"); } -static uint8_t GetS7ValueTypeMemorySize(UniformValueType uniform_value_type) -{ - if (uniform_value_type == UNIFORM_BOOL || uniform_value_type == UNIFORM_INT8 || uniform_value_type == UNIFORM_UINT8) - return 1; - if (uniform_value_type == UNIFORM_INT16 || uniform_value_type == UNIFORM_UINT16) - return 2; - if (uniform_value_type == UNIFORM_INT32 || uniform_value_type == UNIFORM_UINT32 || uniform_value_type == UNIFORM_FLOAT) - return 4; - if (uniform_value_type == UNIFORM_DOUBLE) - return 8; - return 0; -} - -/** - * @description: S7 Protocol read item Init - * @param p_read_item - read item pointer - * @param read_item_json - read item json pointer - * @param p_data - unused - * @return success : 0 error : -1 - */ -static uint8_t InitialS7ReadItem(S7ReadItem* p_read_item, cJSON* read_item_json, uint8_t* p_data) -{ - p_read_item->value_type = cJSON_GetObjectItem(read_item_json, "value_type")->valueint; - strncpy(p_read_item->value_name, cJSON_GetObjectItem(read_item_json, "value_name")->valuestring, 20); - TS7DataItem* p_data_info = &(p_read_item->data_info); - p_data_info->Amount = cJSON_GetObjectItem(read_item_json, "amount")->valueint; - p_data_info->Start = cJSON_GetObjectItem(read_item_json, "start")->valueint; - p_data_info->DBNumber = cJSON_GetObjectItem(read_item_json, "db_number")->valueint; - char* area_valuestring = cJSON_GetObjectItem(read_item_json, "area")->valuestring; - if (strcmp(area_valuestring, "I") == 0) - p_data_info->Area = S7AreaPE; - else if (strcmp(area_valuestring, "Q") == 0) - p_data_info->Area = S7AreaPA; - else if (strcmp(area_valuestring, "M") == 0) - p_data_info->Area = S7AreaMK; - else if (strcmp(area_valuestring, "DB") == 0) - p_data_info->Area = S7AreaDB; - else if (strcmp(area_valuestring, "C") == 0) - p_data_info->Area = S7AreaCT; - else if (strcmp(area_valuestring, "T") == 0) - p_data_info->Area = S7AreaTM; - char* wordlen_valuestring = cJSON_GetObjectItem(read_item_json, "wordlen")->valuestring; - if (strcmp(wordlen_valuestring, "Bit") == 0) - p_data_info->WordLen = S7WLBit; - else if (strcmp(wordlen_valuestring, "Byte") == 0) - p_data_info->WordLen = S7WLByte; - else if (strcmp(wordlen_valuestring, "Word") == 0) - p_data_info->WordLen = S7WLWord; - else if (strcmp(wordlen_valuestring, "DWord") == 0) - p_data_info->WordLen = S7WLDWord; - else if (strcmp(wordlen_valuestring, "Real") == 0) - p_data_info->WordLen = S7WLReal; - else if (strcmp(wordlen_valuestring, "Counter") == 0) - p_data_info->WordLen = S7WLCounter; - else if (strcmp(wordlen_valuestring, "Timer") == 0) - p_data_info->WordLen = S7WLTimer; - p_data_info->pdata = p_data; - printf("value_type is %d, amount is %d, start is %04d, db_number is %d, area is 0x%03x, wordlen is %d.\n", - p_read_item->value_type, p_data_info->Amount, p_data_info->Start, p_data_info->DBNumber, - p_data_info->Area, p_data_info->WordLen); - return GetS7ValueTypeMemorySize(p_read_item->value_type); -} - - - - - /** * @description: Control Framework Read Variable Item Function * @param p_recipe - Control recipe pointer @@ -526,37 +458,15 @@ void RecipeReadVariableItem(struct ControlRecipe *p_recipe, cJSON *p_recipe_file /*Format Data Header, Reference "CONTROL FRAMEWORK READ DATA FORMAT"*/ FormatDataHeader(p_recipe); uint16_t read_item_count = p_recipe->read_item_count; - - - uint8_t* S7_plc_read_data; - S7_plc_read_data = malloc(p_recipe->protocol_data.data_length); - uint16_t S7_plc_read_data_index = 8; - for (i = 0; i < read_item_count; i ++) { cJSON *read_single_item_json = cJSON_GetArrayItem(read_item_list_json, i); - protocol_format_info.read_single_item_json = read_single_item_json; protocol_format_info.read_item_index = i; - switch (p_recipe->protocol_type) { - - case PROTOCOL_S7: - if (i == 0) - p_recipe->read_item = malloc(sizeof(S7ReadItem) * p_recipe->read_item_count); - S7_plc_read_data_index += InitialS7ReadItem((S7ReadItem*)(p_recipe->read_item) + i, - read_single_item_json,S7_plc_read_data + S7_plc_read_data_index); - if (S7_plc_read_data_index == 8) { - printf("%s read %d item failed!\n", __func__, i); - continue; - } - break; - - default: - /*Format Protocol Cmd By Analyze Variable Item One By One*/ - ret = p_recipe->ControlProtocolFormatCmd(p_recipe, &protocol_format_info); + /*Format Protocol Cmd By Analyze Variable Item One By One*/ + ret = p_recipe->ControlProtocolFormatCmd(p_recipe, &protocol_format_info); if (ret < 0) { printf("%s read %d item failed!\n", __func__, i); continue; - } } } }