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/br/Makefile b/APP_Framework/Applications/control_app/plc_demo/br/Makefile index 5ed1ef7ee..e7701d2c3 100755 --- a/APP_Framework/Applications/control_app/plc_demo/br/Makefile +++ b/APP_Framework/Applications/control_app/plc_demo/br/Makefile @@ -1,3 +1,3 @@ -SRC_FILES := br_x20cp0410.c br_x20cp1381.c br_x20cp1586.c +SRC_FILES := br_x20cp0410.c br_x20cp1381.c br_x20cp1586.c br_ppc2100.c include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Applications/control_app/plc_demo/br/README.md b/APP_Framework/Applications/control_app/plc_demo/br/README.md new file mode 100644 index 000000000..23bb4aae4 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/br/README.md @@ -0,0 +1,23 @@ +# 贝加莱 PPC2100通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 网口 + * 通过ETH1 RJ45 网口连接 + * 网口参数:IP:192.168.250.26 Port:502 + * 测试的协议:Modbus TCP + +## 存储区 + +- 贝加莱PLC与其他PLC不同,没有明确类似M,D等这样的存储区的概念,Modbus地址取决于库函数中结构体变量索引。 + +## 通信测试 + +- 共测试BOOL,INT16,INT32,FLOAT,DOUBLE 共五种类型数据。 +- 测试BOOL型变量,用功能码01,测其他类型变量用功能码03。 +- + + + diff --git a/APP_Framework/Applications/control_app/plc_demo/br/br_ppc2100.c b/APP_Framework/Applications/control_app/plc_demo/br/br_ppc2100.c new file mode 100644 index 000000000..faaa476a2 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/br/br_ppc2100.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 br_ppc2100.c + * @brief PLC BR PPC2100 app + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2023.5.8 + */ + +#include + +extern int Adapter4GActive(void); + +void ControlBrTest_PPC2100(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(ControlBrTest_PPC2100, Delta ppc2100 Demo, PRIV_SHELL_CMD_MAIN_ATTR); + + diff --git a/APP_Framework/Applications/control_app/plc_demo/br/test_recipe_br_ppc2100.json b/APP_Framework/Applications/control_app/plc_demo/br/test_recipe_br_ppc2100.json new file mode 100644 index 000000000..566b15e05 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/br/test_recipe_br_ppc2100.json @@ -0,0 +1,93 @@ +{ + "device_id": 1, + "device_name": "BR_PPC2100", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.26", + "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": "motorrun", + "value_type": 1, + "function_code": 2, + "start_address": 0, + "quantity": 1 + }, + { + "value_name": "motorstop", + "value_type": 1, + "function_code": 2, + "start_address": 1, + "quantity": 1 + }, + { + "value_name": "valueopen", + "value_type": 1, + "function_code": 1, + "start_address": 100, + "quantity": 1 + }, + { + "value_name": "valueclose", + "value_type": 1, + "function_code": 1, + "start_address": 101, + "quantity": 1 + }, + { + "value_name": "step", + "value_type": 3, + "function_code": 4, + "start_address": 100, + "quantity": 1 + }, + { + "value_name": "temperature", + "value_type": 9, + "function_code": 4, + "start_address": 101, + "quantity": 2 + }, + { + "value_name": "status", + "value_type": 4, + "function_code": 4, + "start_address": 103, + "quantity": 2 + }, + { + "value_name": "mode", + "value_type": 3, + "function_code": 3, + "start_address": 200, + "quantity": 1 + }, + { + "value_name": "setTemperature", + "value_type": 9, + "function_code": 3, + "start_address": 201, + "quantity": 2 + }, + { + "value_name": "setConuter", + "value_type": 4, + "function_code": 3, + "start_address": 203, + "quantity": 2 + }, + { + "value_name": "LrealTest", + "value_type": 8, + "function_code": 3, + "start_address": 205, + "quantity": 4 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/delta/README.md b/APP_Framework/Applications/control_app/plc_demo/delta/README.md new file mode 100644 index 000000000..16ba6225c --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/delta/README.md @@ -0,0 +1,22 @@ +# 台达 DVP通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 网口 + * 通过自带 RJ45 网口连接 + * 网口参数:IP:192.168.250.27 Port:502 + * 测试的协议:Modbus TCP + +## 存储区 + +- 含M,D,X,Y。台达PLC中 各存储区地址和Modbus地址有明确的对应表,详见台达DVP协议解析测试文档。 + +## 通信测试 + +- 共测试BOOL,INT16,INT32,FLOAT 共四种类型数据。 +- 测试D区,M区和Y区。 + + + diff --git a/APP_Framework/Applications/control_app/plc_demo/delta/test_recipe_delta_dvp.json b/APP_Framework/Applications/control_app/plc_demo/delta/test_recipe_delta_dvp.json new file mode 100644 index 000000000..426eca883 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/delta/test_recipe_delta_dvp.json @@ -0,0 +1,80 @@ +{ + "device_id": 1, + "device_name": "DELTA_DVP", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.27", + "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": "M20", + "value_type": 1, + "function_code": 1, + "start_address": 2068, + "quantity": 1 + }, + { + "value_name": "M100", + "value_type": 1, + "function_code": 1, + "start_address":2148, + "quantity": 1 + }, + { + "value_name": "Y10", + "value_type": 1, + "function_code": 1, + "start_address": 1288, + "quantity": 1 + }, + { + "value_name": "D200", + "value_type": 3, + "function_code": 3, + "start_address":4296, + "quantity": 1 + }, + { + "value_name": "D201", + "value_type": 3, + "function_code": 3, + "start_address": 4297, + "quantity": 1 + }, + { + "value_name": "D220", + "value_type": 4, + "function_code": 3, + "start_address": 4316, + "quantity": 2 + }, + { + "value_name": "D222", + "value_type": 4, + "function_code": 3, + "start_address": 4318, + "quantity": 2 + }, + { + "value_name": "D300", + "value_type": 9, + "function_code": 3, + "start_address": 4396, + "quantity": 2 + }, + { + "value_name": "D302", + "value_type": 9, + "function_code": 3, + "start_address": 4398, + "quantity": 2 + } + + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/Makefile b/APP_Framework/Applications/control_app/plc_demo/ge/Makefile index 1b9589bee..395ba6518 100644 --- a/APP_Framework/Applications/control_app/plc_demo/ge/Makefile +++ b/APP_Framework/Applications/control_app/plc_demo/ge/Makefile @@ -1,3 +1,3 @@ -SRC_FILES := ge_versamax001.c +SRC_FILES := ge_versamax001.c ge_cpe100.c include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/ge README.md b/APP_Framework/Applications/control_app/plc_demo/ge/ge README.md new file mode 100644 index 000000000..6a605ce43 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/ge/ge README.md @@ -0,0 +1,57 @@ +--- +typora-copy-images-to: upload +--- + +# 艾默生(原GE) 通信测试 + +[TOC] + +## 小型VersaMAX CPU001测试 + +### 通信接线及参数设置 + +* 串口 + * COM2为15孔D型 RS485。波特率:19200,数据位:8位,停止位:1位,校验:偶校验。接线按下图典型双线接法。 + + ![ge_versamax_serial](./img/ge_versamax_serial.png) + +### 存储区 + +- 存储区 I,Q,AI,R区。其他内存区如M,AQ不能直接访问,要通过程序转换访问。 + +### 通信测试 + +- 共测试BOOL,INT16,FLOAT共三种类型数据。 + + +- 测试R区及Q区数据。 + + +- R区数据测试,用功能码03,以字为单位读取。配方中start_address字段为PLC地址直接减1。 + + +- Q区数据测试,用功能码01,以位为单位读取。配方中start_address字段为PLC地址直接减1。 + +## 中型PLC CPE100通信测试 + +### 通信接线及参数设置 + +- 网口 + - 网口RJ45,参数 IP:192.168.250.28 端口号:502 + +### 存储区 + +- 存储区 I,Q,AI,R区。其他内存区如M,AQ不能直接访问,要通过程序转换访问。 + +### 通信测试 + +- 共测试BOOL,INT16,INT32,FLOAT,DOUBLE共五种类型数据。 + + +- 测试R区及Q区数据。 + + +- R区数据测试,用功能码03,以字为单位读取。配方中start_address字段为PLC地址直接减1。 + + +- Q区数据测试,用功能码01,以位为单位读取。配方中start_address字段为PLC地址直接减1。 diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/ge_cpe100.c b/APP_Framework/Applications/control_app/plc_demo/ge/ge_cpe100.c new file mode 100644 index 000000000..a018e2bdf --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/ge/ge_cpe100.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 ge_cpe100.c + * @brief PLC GE Versamax app + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2022.9.27 + */ + +#include + +extern int Adapter4GActive(void); + +void ControlGecpe100Test(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(ControlGecpe100Test, ge cpe100 Demo, PRIV_SHELL_CMD_MAIN_ATTR); + + diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/img/ge_versamax_serial.png b/APP_Framework/Applications/control_app/plc_demo/ge/img/ge_versamax_serial.png new file mode 100644 index 000000000..f1337958e Binary files /dev/null and b/APP_Framework/Applications/control_app/plc_demo/ge/img/ge_versamax_serial.png differ diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_cpe_tcp.json b/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_cpe_tcp.json new file mode 100644 index 000000000..cd022aaf5 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_cpe_tcp.json @@ -0,0 +1,73 @@ +{ + "device_id": 1, + "device_name": "GE_CPE100_TCP", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.28", + "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": "Q001", + "value_type": 1, + "function_code": 1, + "start_address": 0, + "quantity": 1 + }, + { + "value_name": "Q010", + "value_type": 1, + "function_code": 1, + "start_address":9, + "quantity": 1 + }, + { + "value_name": "Q066", + "value_type": 1, + "function_code": 1, + "start_address": 65, + "quantity": 1 + }, + { + "value_name": "Q100", + "value_type": 1, + "function_code": 1, + "start_address":99, + "quantity": 1 + }, + { + "value_name": "R11", + "value_type": 3, + "function_code": 3, + "start_address": 10, + "quantity": 1 + }, + { + "value_name": "R12", + "value_type": 9, + "function_code": 3, + "start_address": 11, + "quantity": 2 + }, + { + "value_name": "R14", + "value_type": 8, + "function_code": 3, + "start_address": 13, + "quantity": 4 + }, + { + "value_name": "R18", + "value_type": 4, + "function_code": 3, + "start_address": 17, + "quantity": 2 + } + + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_versamax_rtu.json b/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_versamax_rtu.json new file mode 100644 index 000000000..d3834f322 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/ge/test_recipe_ge_versamax_rtu.json @@ -0,0 +1,58 @@ +{ + "device_id": 1, + "device_name": "GE_VersaMAX_RTU", + "communication_type": 1, + "serial_config": { + "station": 1, + "baud_rate": 19200, + "data_bits": 8, + "stop_bits": 1, + "check_mode": 2 + }, + "protocol_type": 3, + "read_period": 2000, + "read_item_list": [ + { + "value_name": "Q001", + "value_type": 1, + "function_code": 1, + "start_address": 0, + "quantity": 1 + }, + { + "value_name": "Q010", + "value_type": 1, + "function_code": 1, + "start_address": 9, + "quantity": 1 + }, + { + "value_name": "Q066", + "value_type": 1, + "function_code": 1, + "start_address": 65, + "quantity": 1 + }, + { + "value_name": "Q100", + "value_type": 1, + "function_code": 1, + "start_address": 99, + "quantity": 1 + }, + { + "value_name": "R11", + "value_type": 3, + "function_code": 3, + "start_address": 10, + "quantity": 1 + }, + { + "value_name": "R12", + "value_type": 9, + "function_code": 3, + "start_address": 11, + "quantity": 2 + } + ] +} \ No newline at end of file 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/mitsubishi/README.md b/APP_Framework/Applications/control_app/plc_demo/mitsubishi/README.md new file mode 100644 index 000000000..a5fa32bb6 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/mitsubishi/README.md @@ -0,0 +1,24 @@ +# 三菱 FX2N通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 串口 + * FX2N自带8针圆口422,用于程序的下载。全系列不支持网口,且需购买串口拓展模块FX2N-485-BD用于通信测试。 + * 接线:RDA和SDA短接,引出A;RDB与SDB短接,引出B。 + * 串口模块支持MC-1C协议,通信速率:9600;数据位:7bit;停止位:1bit;校验:偶校验 + +## 存储区 + +- 存储区 I,Q,M,D区。 + +## 通信测试 + +- 共测试BOOL,INT16,FLOAT共三种类型数据。 + + +- 测试M区及D区数据。 + + + diff --git a/APP_Framework/Applications/control_app/plc_demo/mitsubishi/test_recipe_mc_1c.json b/APP_Framework/Applications/control_app/plc_demo/mitsubishi/test_recipe_mc_1c.json new file mode 100644 index 000000000..264a0accf --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/mitsubishi/test_recipe_mc_1c.json @@ -0,0 +1,331 @@ +{ + "device_id": 769, + "device_name": "S01", + "communication_type": 1, + "serial_config": { + "station": 1, + "baud_rate": 9600, + "data_bits": 7, + "stop_bits": 1, + "check_mode": 3 + }, + "protocol_type": 9, + "read_period": 1000, + "read_item_list": [ + { + "value_name": "", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "0", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "ֹͣ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "1", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "ʹ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "2", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "3", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "ͣ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "4", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "λ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "5", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "λ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "6", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "Զ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "20", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "21", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "22", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "ֶģʽ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "23", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "Զģʽ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "24", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "з", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "25", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "λ", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "26", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "1", + "value_type": 1, + "device_code": "M", + "head_device_number_string": "27", + "device_points_count": 1, + "command_type": 0, + "monitoring_timer": 100 + }, + { + "value_name": "", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "0", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "1", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "1", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "2", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "2", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "3", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "3", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "4", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "4", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "5", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "5", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "6", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "50", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "7", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "51", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "8", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "52", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "9", + "value_type": 3, + "device_code": "D", + "head_device_number_string": "53", + "device_points_count": 1, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "ٶ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "200", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "ٶ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "202", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "ٶ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "204", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "ʼλ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "206", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "յλ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "208", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "ֵ", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "300", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "1", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "302", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "2", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "304", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "3", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "306", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + }, + { + "value_name": "4", + "value_type": 9, + "device_code": "D", + "head_device_number_string": "308", + "device_points_count": 2, + "command_type": 1, + "monitoring_timer": 100 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/README.md b/APP_Framework/Applications/control_app/plc_demo/omron/README.md new file mode 100755 index 000000000..b7dd8af5e --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/omron/README.md @@ -0,0 +1,70 @@ +# OMRON_CP1L通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 本体无接口,增加CP1W-CIF41网络板卡 + +* FINS协议,PLC IP:192.168.250.31,Port:9600 + +## 存储区 + +- 存储区 W,D区。 + +## JSON配方设计 + +* 共测试BOOL,INT16共2种类型数据,以下为JSON文件解释。 + + - ```json + { + "device_id": 1, //设备ID默认是1,此参数无效 + "device_name": "CP1L", //设备名称,自定义 + "communication_type": 0, //通讯协议类型 0是以太网,1是串口 + "socket_config": { //以太网配置 + "plc_ip": "192.168.250.31", //PLC的IP地址 + "local_ip": "192.168.250.233", //矽达通IP地址设定 + "gateway": "192.168.250.1", //矽达通的网关地址设定 + "netmask": "255.255.255.0", //矽达通子网掩码设定 + "port": 9600 //端口号设定 + }, + "protocol_type": 5, //通讯协议,5代表FINS协议 + "read_period": 100, //交互周期ms + "read_item_list": [ + { + "value_name": "停止", //变量名称,自定义 + "value_type": 1, //变量类型,BOOL = 1,INT8 = 2,INT16,INT32,UINT8,UINT16,UINT32,DOUBLE,FLOAT = 9 + "area_char": "W", //变量功能块 + "data_type": 0, //数据传输类型,BOOL = 0,WORD = 1 + "start_address": 100, //起始地址 + "bit_address": 1, //BOOL地址偏移位,采集变量地址是W100.1 + "data_length": 1 //BOOL长度,默认是1,代表读取1个BOOL长度 + }, + { + "value_name": "转速", //变量名称,自定义 + "value_type": 3, //变量类型,BOOL = 1,INT8 = 2,INT16,INT32,UINT8,UINT16,UINT32,DOUBLE,FLOAT = 9 + "area_char": "D", //变量功能块 + "data_type": 1, //数据传输类型,BOOL = 0,WORD = 1 + "start_address": 101, //起始地址 + "bit_address": 0, //以WORD采集方式时此参数无效,采集变量地址是D101 + "data_length": 1 //WORD长度,默认是1,代表读取1个WORD长度,2个字节 + } + ] + } + ``` + +## 通信测试 + + (1) 新增1个通信demo,命名为omron_cp1l.c; + + (2) 复制样例代码程序到omron_cp1l.c文件中; + + (3) void **ControlOmronCP1LTest**(void) 更改函数名; + + (4) PRIV_SHELL_CMD_FUNCTION(**ControlOmronCP1LTest**, **Omron Plc Cp1l Demo**, PRIV_SHELL_CMD_MAIN_ATTR);更改测试指令; + + (5) 剪裁配置完成后,用过烧写器下载至矽达通中,重启后完成测试。 + + + + \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1h.c b/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1h.c index ba28d4533..4985c435c 100644 --- a/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1h.c +++ b/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1h.c @@ -11,10 +11,39 @@ */ /** - * @file omron_cj2m.c - * @brief PLC OMRON CJ2M app + * @file omron_cp1h.c + * @brief PLC OMRON CP1H app * @version 3.0 * @author AIIT XUOS Lab - * @date 2022.9.27 + * @date 2023.4.1 */ +#include + +void ControlOmronCP1HTest(void) +{ + int i = 0; + uint16_t read_data_length = 0; + uint8_t read_data[1024] = {0}; + ControlProtocolType fins_protocol = ControlProtocolFind(); + if (NULL == fins_protocol) { + printf("%s get fins protocol %p failed\n", __func__, fins_protocol); + return; + } + + printf("%s get fins protocol %p successfull\n", __func__, fins_protocol); + + if (CONTROL_REGISTERED == fins_protocol->protocol_status) { + ControlProtocolOpen(fins_protocol); + + for (;;) { + read_data_length = ControlProtocolRead(fins_protocol, read_data, sizeof(read_data)); + printf("%s read [%d] fins data %d using receipe file\n", __func__, i, read_data_length); + i++; + PrivTaskDelay(100000); + } + + //ControlProtocolClose(fins_protocol); + } +} +PRIV_SHELL_CMD_FUNCTION(ControlOmronCP1HTest, Omron Plc Cp1h Demo, PRIV_SHELL_CMD_MAIN_ATTR); diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1l.c b/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1l.c index 814af8f3b..86fe2ce1d 100644 --- a/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1l.c +++ b/APP_Framework/Applications/control_app/plc_demo/omron/omron_cp1l.c @@ -45,4 +45,4 @@ void ControlOmronCP1LTest(void) //ControlProtocolClose(fins_protocol); } } -PRIV_SHELL_CMD_FUNCTION(ControlOmronCP1LTest, Omron Plc FINS Demo, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file +PRIV_SHELL_CMD_FUNCTION(ControlOmronCP1LTest, Omron Plc Cp1l Demo, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/omron_nx102.c b/APP_Framework/Applications/control_app/plc_demo/omron/omron_nx102.c index 0b091db28..1d242e93c 100644 --- a/APP_Framework/Applications/control_app/plc_demo/omron/omron_nx102.c +++ b/APP_Framework/Applications/control_app/plc_demo/omron/omron_nx102.c @@ -18,6 +18,34 @@ * @date 2022.9.27 */ - +#include + +void ControlOmronNX102Test(void) +{ + int i = 0; + uint16_t read_data_length = 0; + uint8_t read_data[1024] = {0}; + ControlProtocolType fins_protocol = ControlProtocolFind(); + if (NULL == fins_protocol) { + printf("%s get fins protocol %p failed\n", __func__, fins_protocol); + return; + } + + printf("%s get fins protocol %p successfull\n", __func__, fins_protocol); + + if (CONTROL_REGISTERED == fins_protocol->protocol_status) { + ControlProtocolOpen(fins_protocol); + + for (;;) { + read_data_length = ControlProtocolRead(fins_protocol, read_data, sizeof(read_data)); + printf("%s read [%d] fins data %d using receipe file\n", __func__, i, read_data_length); + i++; + PrivTaskDelay(10000); + } + + // ControlProtocolClose(fins_protocol); + } +} +PRIV_SHELL_CMD_FUNCTION(ControlOmronNX102Test, Omron Plc FINS Demo, PRIV_SHELL_CMD_MAIN_ATTR); diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1H.json b/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1H.json new file mode 100644 index 000000000..00c641e8f --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1H.json @@ -0,0 +1,70 @@ +{ + "device_id": 1, + "device_name": "CP1H", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.46", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.1", + "netmask": "255.255.255.0", + "port": 9600 + }, + "protocol_type": 5, + "read_period": 100, + "read_item_list": [ + { + "value_name": "启动", + "value_type": 1, + "area_char": "W", + "data_type": 0, + "start_address": 10, + "bit_address": 0, + "data_length": 1 + }, + { + "value_name": "停止", + "value_type": 1, + "area_char": "W", + "data_type": 0, + "start_address": 10, + "bit_address": 1, + "data_length": 1 + }, + { + "value_name": "暂停", + "value_type": 1, + "area_char": "W", + "data_type": 0, + "start_address": 10, + "bit_address": 2, + "data_length": 1 + }, + { + "value_name": "整型1", + "value_type": 3, + "area_char": "D", + "data_type": 1, + "start_address": 100, + "bit_address": 0, + "data_length": 1 + }, + { + "value_name": "整型2", + "value_type": 3, + "area_char": "D", + "data_type": 1, + "start_address": 101, + "bit_address": 0, + "data_length": 1 + }, + { + "value_name": "浮点", + "value_type": 9, + "area_char": "D", + "data_type": 1, + "start_address": 110, + "bit_address": 0, + "data_length": 2 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1L.json b/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1L.json new file mode 100644 index 000000000..ae11016da --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/omron/test_recipe_CP1L.json @@ -0,0 +1,52 @@ +{ + "device_id": 1, + "device_name": "CP1L", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.31", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.1", + "netmask": "255.255.255.0", + "port": 9600 + }, + "protocol_type": 5, + "read_period": 100, + "read_item_list": [ + { + "value_name": "启动", + "value_type": 1, + "area_char": "W", + "data_type": 0, + "start_address": 100, + "bit_address": 0, + "data_length": 1 + }, + { + "value_name": "停止", + "value_type": 1, + "area_char": "W", + "data_type": 0, + "start_address": 100, + "bit_address": 1, + "data_length": 1 + }, + { + "value_name": "转速", + "value_type": 3, + "area_char": "D", + "data_type": 1, + "start_address": 101, + "bit_address": 0, + "data_length": 1 + }, + { + "value_name": "产量", + "value_type": 3, + "area_char": "D", + "data_type": 1, + "start_address": 102, + "bit_address": 0, + "data_length": 1 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/schneider/schneider_m241.c b/APP_Framework/Applications/control_app/plc_demo/schneider/schneider_m241.c index 60fb1d2b6..4fcdb35bb 100644 --- a/APP_Framework/Applications/control_app/plc_demo/schneider/schneider_m241.c +++ b/APP_Framework/Applications/control_app/plc_demo/schneider/schneider_m241.c @@ -19,9 +19,6 @@ */ #include - -extern int Adapter4GActive(void); - void ControlM241Test(void) { int i, j = 0; diff --git a/APP_Framework/Applications/control_app/plc_demo/siemens/README.md b/APP_Framework/Applications/control_app/plc_demo/siemens/README.md new file mode 100644 index 000000000..be90b92b8 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/README.md @@ -0,0 +1,79 @@ +# SIEMENS - S7-1512通信测试 + +[TOC] + +## 通信接线及参数设置 + +* 本体以太网口 + +* S7协议,PLC IP:192.168.250.2,Port:102 + +## 存储区 + +- 存储区 Q,DB区。 + +## JSON配方设计 + +* 共测试BOOL,INT16共2种类型数据,以下为JSON文件解释。 + + - ```json + { + "device_id": 1, //设备ID默认是1,此参数无效 + "device_name": "S7-1512", //设备名称,自定义 + "communication_type": 0, //通讯协议类型 0是以太网,1是串口 + "socket_config": { //以太网配置 + "plc_ip": "192.168.250.2", //PLC的IP地址 + "local_ip": "192.168.250.233", //矽达通IP地址设定 + "gateway": "192.168.250.1", //矽达通的网关地址设定 + "netmask": "255.255.255.0", //矽达通子网掩码设定 + "port": 102 //端口号设定 + }, + "protocol_type": 1, //通讯协议,5代表FINS协议 + "read_period": 100, //交互周期ms + "read_item_list": [ + { + "value_name": "布尔1", //变量名称,自定义 + "value_type": 1, //变量类型,BOOL = 1,INT8 = 2,INT16,INT32,UINT8,UINT16,UINT32,DOUBLE,FLOAT = 9 + "area": "Q", //变量功能块 + "wordlen": "Bit", //变量字长类型,有:Bit Byte Word DWord Real Counter Timer + "db_number": 1, //如为DB区,填写对应的DB块编号,如不是DB区,无效 + "start": 1, //BOOL地址偏移位,采集变量地址是Q0.1 + "amount": 1 //BOOL长度,默认是1,代表读取1个BOOL长度 + }, + { + "value_name": "整型", //变量名称,自定义 + "value_type": 3, //变量类型,BOOL = 1,INT8 = 2,INT16,INT32,UINT8,UINT16,UINT32,DOUBLE,FLOAT = 9 + "area": "DB", //变量功能块 + "wordlen": "Word", //变量字长类型,有:Bit Byte Word DWord Real Counter Timer + "db_number": 18, //如为DB区,即DB18块 + "start": 2, //Word地址偏移位,采集变量地址是DB18.DBW2 + "amount": 1 //Word长度,默认是1,代表读取1个WORD长度,2个字节 + }, + { + "value_name": "浮点数", //变量名称,自定义 + "value_type": 9, //变量类型,BOOL = 1,INT8 = 2,INT16,INT32,UINT8,UINT16,UINT32,DOUBLE,FLOAT = 9 + "area": "DB", //变量功能块 + "wordlen": "Real", //变量字长类型,有:Bit Byte Word DWord Real Counter Timer + "db_number": 18, //如为DB区,即DB18块 + "start": 18, //Real地址偏移位,采集变量地址是DB18.DBD18 + "amount": 1 //Real长度,默认是1,代表读取1个Real长度,4个字节 + } + ] + } + ``` + +## 通信测试 + + (1) 新增1个通信demo,命名为simens_s7_1500.c; + + (2) 复制样例代码程序到simens_s7_1500.c文件中; + + (3) void **ControlS71500Test**(void)更改函数名; + + (4) PRIV_SHELL_CMD_FUNCTION(**ControlS71500Test, Siemens Plc S7_1512 Demo**, PRIV_SHELL_CMD_MAIN_ATTR);更改测试指令; + + (5) 剪裁配置完成后,用过烧写器下载至矽达通中,重启后完成测试。 + + + + \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1200.c b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1200.c index 541b17d5c..9cbbeae1a 100644 --- a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1200.c +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_1200.c @@ -15,9 +15,6 @@ * @brief PLC SIEMENS S7-1200 app * @version 3.0 * @author AIIT XUOS Lab - * @date 2022.9.27 + * @date 2023.3.27 */ - - - 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 9f4d5a822..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 @@ -15,9 +15,31 @@ * @brief PLC SIEMENS S7-1500 app * @version 3.0 * @author AIIT XUOS Lab - * @date 2022.9.27 + * @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/siemens_s7_200_smart.c b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_200_smart.c index 61a3ea207..848cf3374 100644 --- a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_200_smart.c +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_200_smart.c @@ -11,13 +11,10 @@ */ /** - * @file siemens_s7_200_smart.c - * @brief PLC SIEMENS S7-200 SMART app + * @file siemens_s7_200 smart.c + * @brief PLC SIEMENS S7-200 smart app * @version 3.0 * @author AIIT XUOS Lab - * @date 2022.9.27 + * @date 2023.3.27 */ - - - diff --git a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_300.c b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_300.c index 0f8f88a96..88d09209e 100644 --- a/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_300.c +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/siemens_s7_300.c @@ -15,9 +15,6 @@ * @brief PLC SIEMENS S7-300 app * @version 3.0 * @author AIIT XUOS Lab - * @date 2022.9.27 + * @date 2023.3.27 */ - - - 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 new file mode 100644 index 000000000..f9530f371 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/siemens/test_recipe_S7_1512.json @@ -0,0 +1,70 @@ +{ + "device_id": 1, + "device_name": "S7-1512", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.2", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.252", + "netmask": "255.255.255.0", + "port": 102 + }, + "protocol_type": 1, + "read_period": 100, + "read_item_list": [ + { + "value_name": "布尔1", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 1, + "amount": 1 + }, + { + "value_name": "布尔2", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 2, + "amount": 1 + }, + { + "value_name": "布尔3", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 3, + "amount": 1 + }, + { + "value_name": "布尔4", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 4, + "amount": 1 + }, + { + "value_name": "整型", + "value_type": 3, + "area": "DB", + "wordlen": "Word", + "db_number": 18, + "start": 2, + "amount": 1 + }, + { + "value_name": "浮点数", + "value_type": 9, + "area": "DB", + "wordlen": "Real", + "db_number": 18, + "start": 18, + "amount": 1 + } + ] +} \ No newline at end of file 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/test_recipe_xdh_60t4-e.json b/APP_Framework/Applications/control_app/plc_demo/xinje/test_recipe_xdh_60t4-e.json new file mode 100644 index 000000000..a0e38b514 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/test_recipe_xdh_60t4-e.json @@ -0,0 +1,184 @@ +{ + "device_id": 1, + "device_name": "OP01", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.32", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.1", + "netmask": "255.255.255.0", + "port": 502 + }, + "protocol_type": 2, + "read_period": 100, + "read_item_list": [ + { + "value_name": "M19", + "value_type": 1, + "function_code": 5, + "start_address": 19, + "quantity": 1 + }, + { + "value_name": "M20", + "value_type": 1, + "function_code": 5, + "start_address":20, + "quantity": 1 + }, + { + "value_name": "D500", + "value_type": 4, + "function_code": 6, + "start_address": 500, + "quantity": 1 + }, + { + "value_name": "D501", + "value_type": 4, + "function_code": 6, + "start_address": 501, + "quantity": 1 + }, + { + "value_name": "D502", + "value_type": 4, + "function_code": 6, + "start_address": 502, + "quantity": 1 + }, + { + "value_name": "D503", + "value_type": 4, + "function_code": 6, + "start_address": 503, + "quantity": 1 + }, + { + "value_name": "D504", + "value_type": 4, + "function_code": 6, + "start_address": 504, + "quantity": 1 + }, + { + "value_name": "M22", + "value_type": 1, + "function_code": 5, + "start_address": 22, + "quantity": 1 + }, + { + "value_name": "D505", + "value_type": 4, + "function_code": 6, + "start_address": 505, + "quantity": 1 + }, + { + "value_name": "D506", + "value_type": 4, + "function_code": 6, + "start_address": 506, + "quantity": 1 + }, + { + "value_name": "D507", + "value_type": 4, + "function_code": 6, + "start_address": 507, + "quantity": 1 + }, + { + "value_name": "D508", + "value_type": 4, + "function_code": 6, + "start_address": 508, + "quantity": 1 + }, + { + "value_name": "D509", + "value_type": 4, + "function_code": 6, + "start_address": 509, + "quantity": 1 + }, + { + "value_name": "D510", + "value_type": 4, + "function_code": 6, + "start_address": 510, + "quantity": 1 + }, + { + "value_name": "D511", + "value_type": 4, + "function_code": 6, + "start_address": 511, + "quantity": 1 + }, + { + "value_name": "M23", + "value_type": 1, + "function_code": 5, + "start_address": 23, + "quantity": 1 + }, + { + "value_name": "M24", + "value_type": 1, + "function_code": 5, + "start_address":24, + "quantity": 1 + }, + { + "value_name": "M25", + "value_type": 1, + "function_code": 5, + "start_address": 25, + "quantity": 1 + }, + { + "value_name": "M26", + "value_type": 1, + "function_code": 5, + "start_address": 26, + "quantity": 1 + }, + { + "value_name": "M29", + "value_type": 1, + "function_code": 5, + "start_address": 29, + "quantity": 1 + }, + { + "value_name": "D513", + "value_type": 4, + "function_code": 3, + "start_address": 513, + "quantity": 1 + }, + { + "value_name": "D515", + "value_type": 4, + "function_code": 3, + "start_address": 515, + "quantity": 1 + }, + { + "value_name": "M27", + "value_type": 1, + "function_code": 1, + "start_address":27, + "quantity": 1 + }, + { + "value_name": "M28", + "value_type": 1, + "function_code": 1, + "start_address":28, + "quantity": 1 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Applications/control_app/plc_demo/xinje/test_recipe_xsdh-60a32-e.json b/APP_Framework/Applications/control_app/plc_demo/xinje/test_recipe_xsdh-60a32-e.json new file mode 100644 index 000000000..0adc210a0 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/test_recipe_xsdh-60a32-e.json @@ -0,0 +1,93 @@ +{ + "device_id": 255, + "device_name": "GJ2", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.45", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.1", + "netmask": "255.255.255.0", + "port": 502 + }, + "protocol_type": 2, + "read_period": 100, + "read_item_list": [ + { + "value_name": "QX40.0", + "value_type": 1, + "function_code": 1, + "start_address":0, + "quantity": 1 + }, + { + "value_name": "QX40.1", + "value_type": 1, + "function_code": 1, + "start_address": 1, + "quantity": 1 + }, + { + "value_name": "QX40.2", + "value_type": 1, + "function_code": 1, + "start_address": 2, + "quantity": 1 + }, + { + "value_name": "QX40.3", + "value_type": 1, + "function_code": 1, + "start_address":3, + "quantity": 1 + }, + { + "value_name": "QX40.4", + "value_type": 1, + "function_code": 1, + "start_address": 4, + "quantity": 1 + }, + { + "value_name": "QW0", + "value_type": 3, + "function_code": 3, + "start_address": 0, + "quantity": 2 + }, + { + "value_name": "QW1", + "value_type": 3, + "function_code": 3, + "start_address": 1, + "quantity": 2 + }, + { + "value_name": "QW2", + "value_type": 3, + "function_code": 3, + "start_address": 2, + "quantity": 2 + }, + { + "value_name": "QW3", + "value_type": 3, + "function_code": 3, + "start_address": 3, + "quantity": 2 + }, + { + "value_name": "QW10", + "value_type": 3, + "function_code": 4, + "start_address": 0, + "quantity": 2 + }, + { + "value_name": "QW11", + "value_type": 3, + "function_code": 4, + "start_address": 1, + "quantity": 2 + } + ] +} \ No newline at end of file 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 deleted file mode 100644 index 823be9644..000000000 --- a/APP_Framework/Applications/control_app/plc_demo/xinje/xdh-60t4-e.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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 mitsubishi_fx3u.c - * @brief PLC MITSUBISHI FX3U app - * @version 3.0 - * @author AIIT XUOS Lab - * @date 2023.2.1 - */ - 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 new file mode 100644 index 000000000..3ed40cccd --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/xdh_60t4_e.c @@ -0,0 +1,52 @@ +/* + * 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 xdh-60t4-e.c + * @brief PLC XINJE XDH-60T4-E app + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2023.4.5 + */ + +#include + +void ControlXDHTest(void) +{ + int i, j = 0; + int read_data_length = 0; + uint8_t read_data[128] = {0}; + 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(ControlXDHTest, Xinje Plc XDH_60T4_E Demo, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file 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 deleted file mode 100644 index ed106879b..000000000 --- a/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh-60a32-e.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 mitsubishi_fx3u.c - * @brief PLC MITSUBISHI FX3U app - * @version 3.0 - * @author AIIT XUOS Lab - * @date 2023.3.1 - */ 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 new file mode 100644 index 000000000..87b6a7780 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/xinje/xsdh_60a32_e.c @@ -0,0 +1,53 @@ +/* + * 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 xsdh-60a32-e.c + * @brief PLC XINJE XSDH-60A32-E app + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2023.3.28 + */ + + +#include + +void ControlXSDHTest(void) +{ + int i, j = 0; + int read_data_length = 0; + uint8_t read_data[128] = {0}; + 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(ControlXSDHTest, Xinje Plc XSDH_60A32_E Demo, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file diff --git a/APP_Framework/Framework/control/ipc_protocol/include/modbus_tcp.h b/APP_Framework/Framework/control/ipc_protocol/include/modbus_tcp.h index 3d1532ace..4dcb5afa1 100755 --- a/APP_Framework/Framework/control/ipc_protocol/include/modbus_tcp.h +++ b/APP_Framework/Framework/control/ipc_protocol/include/modbus_tcp.h @@ -27,7 +27,7 @@ extern "C" { #endif -#define MODBUS_TCP_UNIT_ID 0x01 + #define MODBUS_TCP_READ_CMD_LENGTH 0x0C #define MODBUS_TCP_WRITE_SINGLE_CMD_LENGTH 0x0C diff --git a/APP_Framework/Framework/control/ipc_protocol/modbus_tcp/modbus_tcp.c b/APP_Framework/Framework/control/ipc_protocol/modbus_tcp/modbus_tcp.c index dfd0f3577..6babdf9a5 100755 --- a/APP_Framework/Framework/control/ipc_protocol/modbus_tcp/modbus_tcp.c +++ b/APP_Framework/Framework/control/ipc_protocol/modbus_tcp/modbus_tcp.c @@ -225,7 +225,7 @@ static int ModbusTcpInitialDataInfo(ModbusTcpReadItem *p_read_item, uint16_t ind p_base_data_info->p_command[5] = 0x09; } - p_base_data_info->p_command[6] = MODBUS_TCP_UNIT_ID; + p_base_data_info->p_command[6] = control_protocol->recipe->device_id; p_base_data_info->p_command[7] = function_code; p_base_data_info->p_command[8] = start_address >> 8; p_base_data_info->p_command[9] = start_address; diff --git a/APP_Framework/Framework/control/plc_protocol/Kconfig b/APP_Framework/Framework/control/plc_protocol/Kconfig index 91e27b474..315d9600f 100755 --- a/APP_Framework/Framework/control/plc_protocol/Kconfig +++ b/APP_Framework/Framework/control/plc_protocol/Kconfig @@ -23,6 +23,7 @@ endif config CONTROL_PROTOCOL_S7 bool "Using s7 control protocol" default n + select CONTROL_USING_SOCKET if CONTROL_PROTOCOL_S7 source "$APP_DIR/Framework/control/plc_protocol/s7/Kconfig" endif diff --git a/APP_Framework/Framework/control/plc_protocol/fins/fins.c b/APP_Framework/Framework/control/plc_protocol/fins/fins.c index 0a8c20125..aef282046 100644 --- a/APP_Framework/Framework/control/plc_protocol/fins/fins.c +++ b/APP_Framework/Framework/control/plc_protocol/fins/fins.c @@ -329,7 +329,11 @@ void *ReceivePlcDataTask(void *parameter) /*read all variable item data, put them into circular_area*/ if (i == control_protocol->recipe->read_item_count) { printf("%s get %d item %d length\n", __func__, i, data_length); + // for(int i = 0; i < data_length; i++){ + // printf("%x\n",fins_data[i]); + // } CircularAreaAppWrite(circular_area, fins_data, data_length, 0); + printf("%s\n",fins_data); } /*read data every single 'read_period' ms*/ diff --git a/APP_Framework/Framework/control/plc_protocol/include/libs7.h b/APP_Framework/Framework/control/plc_protocol/include/libs7.h new file mode 100644 index 000000000..ed3fa1e8c --- /dev/null +++ b/APP_Framework/Framework/control/plc_protocol/include/libs7.h @@ -0,0 +1,408 @@ +/* + * 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. + */ + +#ifndef snap7_h +#define snap7_h +//--------------------------------------------------------------------------- +# include +# include + +//****************************************************************************** +// COMMON +//****************************************************************************** +// Exact length types regardless of platform/processor +typedef uint8_t byte; +typedef uint16_t word; +typedef uint32_t longword; +typedef byte* pbyte; +typedef word* pword; +typedef uintptr_t S7Object; // multi platform/processor object reference + // DON'T CONFUSE IT WITH AN OLE OBJECT, IT'S SIMPLY + // AN INTEGER VALUE (32 OR 64 BIT) USED AS HANDLE. + +#ifndef __cplusplus +typedef struct +{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}tm; + +typedef int bool; +#define false 0; +#define true 1; +#endif + +static const int errLibInvalidParam = -1; +static const int errLibInvalidObject = -2; + +// CPU status +#define S7CpuStatusUnknown 0x00 +#define S7CpuStatusRun 0x08 +#define S7CpuStatusStop 0x04 + +// ISO Errors +static const longword errIsoConnect = 0x00010000; // Connection error +static const longword errIsoDisconnect = 0x00020000; // Disconnect error +static const longword errIsoInvalidPDU = 0x00030000; // Bad format +static const longword errIsoInvalidDataSize = 0x00040000; // Bad Datasize passed to send/recv buffer is invalid +static const longword errIsoNullPointer = 0x00050000; // Null passed as pointer +static const longword errIsoShortPacket = 0x00060000; // A short packet received +static const longword errIsoTooManyFragments = 0x00070000; // Too many packets without EoT flag +static const longword errIsoPduOverflow = 0x00080000; // The sum of fragments data exceded maximum packet size +static const longword errIsoSendPacket = 0x00090000; // An error occurred during send +static const longword errIsoRecvPacket = 0x000A0000; // An error occurred during recv +static const longword errIsoInvalidParams = 0x000B0000; // Invalid TSAP params +static const longword errIsoResvd_1 = 0x000C0000; // Unassigned +static const longword errIsoResvd_2 = 0x000D0000; // Unassigned +static const longword errIsoResvd_3 = 0x000E0000; // Unassigned +static const longword errIsoResvd_4 = 0x000F0000; // Unassigned + +// Tag Struct +typedef struct { + int Area; + int DBNumber; + int Start; + int Size; + int WordLen; +}TS7Tag, * PS7Tag; + +//------------------------------------------------------------------------------ +// PARAMS LIST +//------------------------------------------------------------------------------ +static const int p_u16_LocalPort = 1; +static const int p_u16_RemotePort = 2; +static const int p_i32_PingTimeout = 3; +static const int p_i32_SendTimeout = 4; +static const int p_i32_RecvTimeout = 5; +static const int p_i32_WorkInterval = 6; +static const int p_u16_SrcRef = 7; +static const int p_u16_DstRef = 8; +static const int p_u16_SrcTSap = 9; +static const int p_i32_PDURequest = 10; +static const int p_i32_MaxClients = 11; +static const int p_i32_BSendTimeout = 12; +static const int p_i32_BRecvTimeout = 13; +static const int p_u32_RecoveryTime = 14; +static const int p_u32_KeepAliveTime = 15; + +// Client/Partner Job status +static const int JobComplete = 0; +static const int JobPending = 1; + +//****************************************************************************** +// CLIENT +//****************************************************************************** + +// Error codes +static const longword errNegotiatingPDU = 0x00100000; +static const longword errCliInvalidParams = 0x00200000; +static const longword errCliJobPending = 0x00300000; +static const longword errCliTooManyItems = 0x00400000; +static const longword errCliInvalidWordLen = 0x00500000; +static const longword errCliPartialDataWritten = 0x00600000; +static const longword errCliSizeOverPDU = 0x00700000; +static const longword errCliInvalidPlcAnswer = 0x00800000; +static const longword errCliAddressOutOfRange = 0x00900000; +static const longword errCliInvalidTransportSize = 0x00A00000; +static const longword errCliWriteDataSizeMismatch = 0x00B00000; +static const longword errCliItemNotAvailable = 0x00C00000; +static const longword errCliInvalidValue = 0x00D00000; +static const longword errCliCannotStartPLC = 0x00E00000; +static const longword errCliAlreadyRun = 0x00F00000; +static const longword errCliCannotStopPLC = 0x01000000; +static const longword errCliCannotCopyRamToRom = 0x01100000; +static const longword errCliCannotCompress = 0x01200000; +static const longword errCliAlreadyStop = 0x01300000; +static const longword errCliFunNotAvailable = 0x01400000; +static const longword errCliUploadSequenceFailed = 0x01500000; +static const longword errCliInvalidDataSizeRecvd = 0x01600000; +static const longword errCliInvalidBlockType = 0x01700000; +static const longword errCliInvalidBlockNumber = 0x01800000; +static const longword errCliInvalidBlockSize = 0x01900000; +static const longword errCliDownloadSequenceFailed = 0x01A00000; +static const longword errCliInsertRefused = 0x01B00000; +static const longword errCliDeleteRefused = 0x01C00000; +static const longword errCliNeedPassword = 0x01D00000; +static const longword errCliInvalidPassword = 0x01E00000; +static const longword errCliNoPasswordToSetOrClear = 0x01F00000; +static const longword errCliJobTimeout = 0x02000000; +static const longword errCliPartialDataRead = 0x02100000; +static const longword errCliBufferTooSmall = 0x02200000; +static const longword errCliFunctionRefused = 0x02300000; +static const longword errCliDestroying = 0x02400000; +static const longword errCliInvalidParamNumber = 0x02500000; +static const longword errCliCannotChangeParam = 0x02600000; + +static const int MaxVars = 20; // Max vars that can be transferred with MultiRead/MultiWrite + +// Client Connection Type +static const word CONNTYPE_PG = 0x0001; // Connect to the PLC as a PG +static const word CONNTYPE_OP = 0x0002; // Connect to the PLC as an OP +static const word CONNTYPE_BASIC = 0x0003; // Basic connection + +// Area ID +static const byte S7AreaPE = 0x81; +static const byte S7AreaPA = 0x82; +static const byte S7AreaMK = 0x83; +static const byte S7AreaDB = 0x84; +static const byte S7AreaCT = 0x1C; +static const byte S7AreaTM = 0x1D; + +// Word Length +static const int S7WLBit = 0x01; +static const int S7WLByte = 0x02; +static const int S7WLWord = 0x04; +static const int S7WLDWord = 0x06; +static const int S7WLReal = 0x08; +static const int S7WLCounter = 0x1C; +static const int S7WLTimer = 0x1D; + +// Block type +static const byte Block_OB = 0x38; +static const byte Block_DB = 0x41; +static const byte Block_SDB = 0x42; +static const byte Block_FC = 0x43; +static const byte Block_SFC = 0x44; +static const byte Block_FB = 0x45; +static const byte Block_SFB = 0x46; + +// Sub Block Type +static const byte SubBlk_OB = 0x08; +static const byte SubBlk_DB = 0x0A; +static const byte SubBlk_SDB = 0x0B; +static const byte SubBlk_FC = 0x0C; +static const byte SubBlk_SFC = 0x0D; +static const byte SubBlk_FB = 0x0E; +static const byte SubBlk_SFB = 0x0F; + +// Block languages +static const byte BlockLangAWL = 0x01; +static const byte BlockLangKOP = 0x02; +static const byte BlockLangFUP = 0x03; +static const byte BlockLangSCL = 0x04; +static const byte BlockLangDB = 0x05; +static const byte BlockLangGRAPH = 0x06; + +// Read/Write Multivars +typedef struct { + int Area; + int WordLen; + int Result; + int DBNumber; + int Start; + int Amount; + void* pdata; +} TS7DataItem, * PS7DataItem; + +//typedef int TS7ResultItems[MaxVars]; +//typedef TS7ResultItems *PS7ResultItems; + +// List Blocks +typedef struct { + int OBCount; + int FBCount; + int FCCount; + int SFBCount; + int SFCCount; + int DBCount; + int SDBCount; +} TS7BlocksList, * PS7BlocksList; + +// Blocks info +typedef struct { + int BlkType; // Block Type (OB, DB) + int BlkNumber; // Block number + int BlkLang; // Block Language + int BlkFlags; // Block flags + int MC7Size; // The real size in bytes + int LoadSize; // Load memory size + int LocalData; // Local data + int SBBLength; // SBB Length + int CheckSum; // Checksum + int Version; // Block version + // Chars info + char CodeDate[11]; // Code date + char IntfDate[11]; // Interface date + char Author[9]; // Author + char Family[9]; // Family + char Header[9]; // Header +} TS7BlockInfo, * PS7BlockInfo; + +typedef word TS7BlocksOfType[0x2000]; +typedef TS7BlocksOfType* PS7BlocksOfType; + +// Order code +typedef struct { + char Code[21]; + byte V1; + byte V2; + byte V3; +} TS7OrderCode, * PS7OrderCode; + +// CPU Info +typedef struct { + char ModuleTypeName[33]; + char SerialNumber[25]; + char ASName[25]; + char Copyright[27]; + char ModuleName[25]; +} TS7CpuInfo, * PS7CpuInfo; + +// CP Info +typedef struct { + int MaxPduLengt; + int MaxConnections; + int MaxMpiRate; + int MaxBusRate; +} TS7CpInfo, * PS7CpInfo; + +// See §33.1 of "System Software for S7-300/400 System and Standard Functions" +// and see SFC51 description too +typedef struct { + word LENTHDR; + word N_DR; +} SZL_HEADER, * PSZL_HEADER; + +typedef struct { + SZL_HEADER Header; + byte Data[0x4000 - 4]; +} TS7SZL, * PS7SZL; + +// SZL List of available SZL IDs : same as SZL but List items are big-endian adjusted +typedef struct { + SZL_HEADER Header; + word List[0x2000 - 2]; +} TS7SZLList, * PS7SZLList; + +// See §33.19 of "System Software for S7-300/400 System and Standard Functions" +typedef struct { + word sch_schal; + word sch_par; + word sch_rel; + word bart_sch; + word anl_sch; +} TS7Protection, * PS7Protection; + +// Client completion callback +typedef void (*pfn_CliCompletion) (void* usrPtr, int opCode, int opResult); +//------------------------------------------------------------------------------ +// Import prototypes +//------------------------------------------------------------------------------ +S7Object Cli_Create(); +void Cli_Destroy(S7Object* Client); +int Cli_ConnectTo(S7Object Client, const char* Address, int Rack, int Slot); +int Cli_SetConnectionParams(S7Object Client, const char* Address, word LocalTSAP, word RemoteTSAP); +int Cli_SetConnectionType(S7Object Client, word ConnectionType); +int Cli_Connect(S7Object Client); +int Cli_Disconnect(S7Object Client); +int Cli_GetParam(S7Object Client, int ParamNumber, void* pValue); +int Cli_SetParam(S7Object Client, int ParamNumber, void* pValue); +int Cli_SetAsCallback(S7Object Client, pfn_CliCompletion pCompletion, void* usrPtr); +// Data I/O main functions +int Cli_ReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void* pUsrData); +int Cli_WriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void* pUsrData); +int Cli_ReadMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount); +int Cli_WriteMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount); +// Data I/O Lean functions +int Cli_DBRead(S7Object Client, int DBNumber, int Start, int Size, void* pUsrData); +int Cli_DBWrite(S7Object Client, int DBNumber, int Start, int Size, void* pUsrData); +int Cli_MBRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_MBWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_EBRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_EBWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_ABRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_ABWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_TMRead(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_TMWrite(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_CTRead(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_CTWrite(S7Object Client, int Start, int Amount, void* pUsrData); +// Directory functions +int Cli_ListBlocks(S7Object Client, TS7BlocksList* pUsrData); +int Cli_GetAgBlockInfo(S7Object Client, int BlockType, int BlockNum, TS7BlockInfo* pUsrData); +int Cli_GetPgBlockInfo(S7Object Client, void* pBlock, TS7BlockInfo* pUsrData, int Size); +int Cli_ListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType* pUsrData, int* ItemsCount); +// Blocks functions +int Cli_Upload(S7Object Client, int BlockType, int BlockNum, void* pUsrData, int* Size); +int Cli_FullUpload(S7Object Client, int BlockType, int BlockNum, void* pUsrData, int* Size); +int Cli_Download(S7Object Client, int BlockNum, void* pUsrData, int Size); +int Cli_Delete(S7Object Client, int BlockType, int BlockNum); +int Cli_DBGet(S7Object Client, int DBNumber, void* pUsrData, int* Size); +int Cli_DBFill(S7Object Client, int DBNumber, int FillChar); +// Date/Time functions +int Cli_GetPlcDateTime(S7Object Client, tm* DateTime); +int Cli_SetPlcDateTime(S7Object Client, tm* DateTime); +int Cli_SetPlcSystemDateTime(S7Object Client); +// System Info functions +int Cli_GetOrderCode(S7Object Client, TS7OrderCode* pUsrData); +int Cli_GetCpuInfo(S7Object Client, TS7CpuInfo* pUsrData); +int Cli_GetCpInfo(S7Object Client, TS7CpInfo* pUsrData); +int Cli_ReadSZL(S7Object Client, int ID, int Index, TS7SZL* pUsrData, int* Size); +int Cli_ReadSZLList(S7Object Client, TS7SZLList* pUsrData, int* ItemsCount); +// Control functions +int Cli_PlcHotStart(S7Object Client); +int Cli_PlcColdStart(S7Object Client); +int Cli_PlcStop(S7Object Client); +int Cli_CopyRamToRom(S7Object Client, int Timeout); +int Cli_Compress(S7Object Client, int Timeout); +int Cli_GetPlcStatus(S7Object Client, int* Status); +// Security functions +int Cli_GetProtection(S7Object Client, TS7Protection* pUsrData); +int Cli_SetSessionPassword(S7Object Client, char* Password); +int Cli_ClearSessionPassword(S7Object Client); +// Low level +int Cli_IsoExchangeBuffer(S7Object Client, void* pUsrData, int* Size); +// Misc +int Cli_GetExecTime(S7Object Client, int* Time); +int Cli_GetLastError(S7Object Client, int* LastError); +int Cli_GetPduLength(S7Object Client, int* Requested, int* Negotiated); +int Cli_ErrorText(int Error, char* Text, int TextLen); +// 1.1.0 +int Cli_GetConnected(S7Object Client, int* Connected); +//------------------------------------------------------------------------------ +// Async functions +//------------------------------------------------------------------------------ +int Cli_AsReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void* pUsrData); +int Cli_AsWriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void* pUsrData); +int Cli_AsDBRead(S7Object Client, int DBNumber, int Start, int Size, void* pUsrData); +int Cli_AsDBWrite(S7Object Client, int DBNumber, int Start, int Size, void* pUsrData); +int Cli_AsMBRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsMBWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsEBRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsEBWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsABRead(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsABWrite(S7Object Client, int Start, int Size, void* pUsrData); +int Cli_AsTMRead(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_AsTMWrite(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_AsCTRead(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_AsCTWrite(S7Object Client, int Start, int Amount, void* pUsrData); +int Cli_AsListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType* pUsrData, int* ItemsCount); +int Cli_AsReadSZL(S7Object Client, int ID, int Index, TS7SZL* pUsrData, int* Size); +int Cli_AsReadSZLList(S7Object Client, TS7SZLList* pUsrData, int* ItemsCount); +int Cli_AsUpload(S7Object Client, int BlockType, int BlockNum, void* pUsrData, int* Size); +int Cli_AsFullUpload(S7Object Client, int BlockType, int BlockNum, void* pUsrData, int* Size); +int Cli_AsDownload(S7Object Client, int BlockNum, void* pUsrData, int Size); +int Cli_AsCopyRamToRom(S7Object Client, int Timeout); +int Cli_AsCompress(S7Object Client, int Timeout); +int Cli_AsDBGet(S7Object Client, int DBNumber, void* pUsrData, int* Size); +int Cli_AsDBFill(S7Object Client, int DBNumber, int FillChar); +int Cli_CheckAsCompletion(S7Object Client, int* opResult); +int Cli_WaitAsCompletion(S7Object Client, int Timeout); + + +#endif // snap7_h diff --git a/APP_Framework/Framework/control/plc_protocol/include/s7.h b/APP_Framework/Framework/control/plc_protocol/include/s7.h index f89f1f122..9021d3d5a 100644 --- a/APP_Framework/Framework/control/plc_protocol/include/s7.h +++ b/APP_Framework/Framework/control/plc_protocol/include/s7.h @@ -16,4 +16,27 @@ * @version 3.0 * @author AIIT XUOS Lab * @date 2022-10-08 - */ \ No newline at end of file + */ + +#ifndef S7_H +#define S7_H + +#include +#include "libs7.h" + +#define BASE_PLC_RECV_BUFF_SIZE 1024 + +ControlProtocolType control_protocol; + +int8_t ReadPlcDataByRecipe(struct ControlRecipe *p_recipe); +void voidpush(uint8_t *datastack,uint8_t* args,uint16_t length); +static uint8_t GetUniformValueTypeMemorySize(UniformValueType uniform_value_type); + +typedef struct +{ + TS7DataItem data_info; + UniformValueType value_type; + char value_name[20]; +}S7ReadItem; + +#endif \ No newline at end of file diff --git a/APP_Framework/Framework/control/plc_protocol/s7/Kconfig b/APP_Framework/Framework/control/plc_protocol/s7/Kconfig index 139597f9c..e69de29bb 100755 --- a/APP_Framework/Framework/control/plc_protocol/s7/Kconfig +++ b/APP_Framework/Framework/control/plc_protocol/s7/Kconfig @@ -1,2 +0,0 @@ - - diff --git a/APP_Framework/Framework/control/plc_protocol/s7/Makefile b/APP_Framework/Framework/control/plc_protocol/s7/Makefile old mode 100755 new mode 100644 index 608656f03..1271dfd9f --- a/APP_Framework/Framework/control/plc_protocol/s7/Makefile +++ b/APP_Framework/Framework/control/plc_protocol/s7/Makefile @@ -1,4 +1,2 @@ -SRC_FILES := - +SRC_FILES := libs7.a s7.c include $(KERNEL_ROOT)/compiler.mk - diff --git a/APP_Framework/Framework/control/plc_protocol/s7/libs7.a b/APP_Framework/Framework/control/plc_protocol/s7/libs7.a new file mode 100644 index 000000000..33e08b109 Binary files /dev/null and b/APP_Framework/Framework/control/plc_protocol/s7/libs7.a differ diff --git a/APP_Framework/Framework/control/plc_protocol/s7/s7.c b/APP_Framework/Framework/control/plc_protocol/s7/s7.c new file mode 100644 index 000000000..900fd379b --- /dev/null +++ b/APP_Framework/Framework/control/plc_protocol/s7/s7.c @@ -0,0 +1,242 @@ +/* + * 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 s7.c + * @brief plc protocol s7 + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2023-4-14 + */ + +#include + +/** + * @description: S7 Receive Plc Data Task + * @param parameter - parameter pointer + * @return + */ +void *ReceivePlcDataTask(void *parameter) +{ + printf("%s %d\n", __func__, __LINE__); + ReadPlcDataByRecipe(control_protocol->recipe); +} + +/** + * @description: S7 Protocol Open + * @param control_protocol - control protocol pointer + * @return success : 0 error + */ +int S7Open(struct ControlProtocol *control_protocol) +{ + ControlProtocolOpenDef(control_protocol); + return 0; +} + +/** + * @description: S7 Protocol Close + * @param control_protocol - control protocol pointer + * @return success : 0 error + */ +int S7Close(struct ControlProtocol *control_protocol) +{ + ControlProtocolCloseDef(); + + return 0; +} + +/** + * @description: S7 Protocol Read Data + * @param control_protocol - control protocol pointer + * @param buf - read data buffer pointer + * @param len - read data length + * @return success : data length error : 0 + */ +int S7Read(struct ControlProtocol *control_protocol, void *buf, size_t len) +{ + struct CircularAreaApp *circular_area = (struct CircularAreaApp *)control_protocol->args; + return CircularAreaAppRead(circular_area, buf, len); +} + +static struct ControlDone s7_protocol_done = +{ + ._open = S7Open, + ._close = S7Close, + ._read = S7Read, + ._write = NULL, + ._ioctl = NULL, +}; + +/** + * @description: Push Data Onto a Stack One By One + * @param datastack - data stack pointer + * @param args - data pointer + * @param length - data length + * @return + */ +void PushDataIntoStack(uint8_t *datastack,uint8_t* args,uint16_t length) +{ + static int index = 8; + for(int i =0; i < length; i ++) { + datastack[index] = args[i]; + index++; + if(index >= control_protocol->recipe->protocol_data.data_length){ + index = 8; + } + } +} + +/** + * @description: Read PLC Data By Recipe + * @param p_recipe - recipe pointer + * @return success : 0 error : -1 + */ +int8_t ReadPlcDataByRecipe(struct ControlRecipe *p_recipe) +{ + uint16_t data_length = control_protocol->recipe->protocol_data.data_length; + uint8_t *s7_data = control_protocol->recipe->protocol_data.data; + struct CircularAreaApp *circular_area = (struct CircularAreaApp *)control_protocol->args; + + S7Object s7_plc = {0}; + char plc_ip_string[15] = {0}; + s7_plc = Cli_Create(); + sprintf(plc_ip_string, "%u.%u.%u.%u", + p_recipe->socket_config.plc_ip[0], + p_recipe->socket_config.plc_ip[1], + p_recipe->socket_config.plc_ip[2], + p_recipe->socket_config.plc_ip[3]); + int16_t read_item_count = p_recipe->read_item_count; + uint8_t *p_read_item = (uint8_t *)(p_recipe->read_item); + + while (1) { + int8_t error = 0; + while (!error) { + uint16_t i = 0; + for (i = 0; i < read_item_count; i ++) { + int is_connected = 0; + Cli_GetConnected(s7_plc, &is_connected); + while (!is_connected) { + if (Cli_ConnectTo(s7_plc, plc_ip_string, 0, 1) != 0) { + PrivTaskDelay(1000); + } else { + break; + } + } + TS7DataItem data_info = ((S7ReadItem*)p_read_item + i)->data_info; + Cli_ReadMultiVars(s7_plc, &data_info, 1); + uint16_t Size = GetValueTypeMemorySize(((S7ReadItem*)p_read_item + i)->value_type); + ControlPrintfList("S7 RECV", data_info.pdata,Size); + PushDataIntoStack(s7_data,data_info.pdata,Size); + PrivTaskDelay(100); + } + + /*read all variable item data, put them into circular_area*/ + if (i == read_item_count) { + printf("%s get %d item %d length\n", __func__, i, data_length); + CircularAreaAppWrite(circular_area, s7_data, data_length, 0); + } + } + } + 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 = PrivMalloc(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 (0 == i) + p_recipe->read_item = PrivMalloc(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 + * @return success : 0 error : -1 + */ +int S7ProtocolInit(struct ControlRecipe *p_recipe) +{ + p_recipe->read_item = PrivMalloc(sizeof(S7ReadItem) * p_recipe->read_item_count); + if (NULL == p_recipe->read_item) { + PrivFree(p_recipe->read_item); + return -1; + } + memset(p_recipe->read_item, 0, sizeof(S7ReadItem)); + p_recipe->ControlProtocolFormatCmd = S7ProtocolFormatCmd; + p_recipe->done = &s7_protocol_done; + + return 0; +} diff --git a/APP_Framework/Framework/control/plc_protocol/s7/test_recipe_s7.json b/APP_Framework/Framework/control/plc_protocol/s7/test_recipe_s7.json new file mode 100644 index 000000000..31df9a200 --- /dev/null +++ b/APP_Framework/Framework/control/plc_protocol/s7/test_recipe_s7.json @@ -0,0 +1,88 @@ +{ + "device_id": 1, + "device_name": "demo", + "communication_type": 0, + "socket_config": { + "plc_ip": "192.168.250.2", + "local_ip": "192.168.250.233", + "gateway": "192.168.250.252", + "netmask": "255.255.255.0", + "port": 102 + }, + "protocol_type": 1, + "read_period": 100, + "read_item_list": [ + { + "value_name": "浮点数", + "value_type": 9, + "area": "DB", + "wordlen": "Real", + "db_number": 18, + "start": 18, + "amount": 1 + }, + { + "value_name": "整型1", + "value_type": 3, + "area": "M", + "wordlen": "WORD", + "db_number": 1, + "start": 100, + "amount": 1 + }, + { + "value_name": "整型2", + "value_type": 3, + "area": "M", + "wordlen": "WORD", + "db_number": 1, + "start": 102, + "amount": 1 + }, + { + "value_name": "布尔1", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 1, + "amount": 1 + }, + { + "value_name": "布尔2", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 2, + "amount": 1 + }, + { + "value_name": "布尔3", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 3, + "amount": 1 + }, + { + "value_name": "布尔4", + "value_type": 1, + "area": "Q", + "wordlen": "Bit", + "db_number": 1, + "start": 4, + "amount": 1 + }, + { + "value_name": "整型3", + "value_type": 3, + "area": "DB", + "wordlen": "Word", + "db_number": 18, + "start": 2, + "amount": 1 + } + ] +} \ No newline at end of file diff --git a/APP_Framework/Framework/control/shared/control.c b/APP_Framework/Framework/control/shared/control.c index c0a4dc9ea..fc0ff7fe8 100755 --- a/APP_Framework/Framework/control/shared/control.c +++ b/APP_Framework/Framework/control/shared/control.c @@ -21,8 +21,6 @@ #include #include -ControlProtocolType control_protocol; - /** * @description: Control Framework Find certain Protocol * @param void @@ -292,6 +290,8 @@ int ControlFrameworkInit(void) PrivFree(control_protocol); goto _out; } + + printf("%u %u\n",control_protocol->recipe->total_data_length,control_protocol->recipe->device_id); printf("%s ControlPeripheralInit done\n", __func__); diff --git a/APP_Framework/Framework/control/shared/control.h b/APP_Framework/Framework/control/shared/control.h index f73cc0625..2639a4719 100644 --- a/APP_Framework/Framework/control/shared/control.h +++ b/APP_Framework/Framework/control/shared/control.h @@ -24,10 +24,13 @@ #include #include + #ifdef __cplusplus extern "C" { #endif + + struct ControlProtocol; typedef struct ControlProtocol *ControlProtocolType; @@ -108,6 +111,9 @@ int ControlProtocolWrite(struct ControlProtocol *control_protocol, const void *b /*Control Framework Protocol Ioctl*/ int ControlProtocolIoctl(struct ControlProtocol *control_protocol, int cmd, void *args); +/*Control Framework new certain Protocol*/ +ControlProtocolType control_protocol; + #ifdef __cplusplus } #endif diff --git a/APP_Framework/Framework/control/shared/control_def.c b/APP_Framework/Framework/control/shared/control_def.c index c19ae9757..4808b2423 100644 --- a/APP_Framework/Framework/control/shared/control_def.c +++ b/APP_Framework/Framework/control/shared/control_def.c @@ -45,6 +45,10 @@ extern int ModbusTcpProtocolInit(struct ControlRecipe *p_recipe); extern int ModbusUartProtocolInit(struct ControlRecipe *p_recipe); #endif +#ifdef CONTROL_PROTOCOL_S7 +extern int S7ProtocolInit(struct ControlRecipe *p_recipe); +#endif + /* CONTROL FRAMEWORK READ DATA FORMAT: | HEAD |device_id|read data length|read item count| data | @@ -80,6 +84,9 @@ static struct ControlProtocolInitParam protocol_init[] = #ifdef CONTROL_PROTOCOL_MODBUS_UART { PROTOCOL_MODBUS_UART, ModbusUartProtocolInit }, #endif +#ifdef CONTROL_PROTOCOL_S7 + { PROTOCOL_S7, S7ProtocolInit }, +#endif { PROTOCOL_END, NULL }, }; @@ -445,30 +452,24 @@ void RecipeReadVariableItem(struct ControlRecipe *p_recipe, cJSON *p_recipe_file p_recipe->protocol_data.data = PrivMalloc(CONTROL_DATA_HEAD_LENGTH + p_recipe->total_data_length); p_recipe->protocol_data.data_length = CONTROL_DATA_HEAD_LENGTH + p_recipe->total_data_length; memset(p_recipe->protocol_data.data, 0, p_recipe->protocol_data.data_length); - protocol_format_info.p_read_item_data = p_recipe->protocol_data.data + CONTROL_DATA_HEAD_LENGTH; - /*Init The Control Protocol*/ ControlProtocolInitDesc(p_recipe, protocol_init); - /*Format Data Header, Reference "CONTROL FRAMEWORK READ DATA FORMAT"*/ FormatDataHeader(p_recipe); - uint16_t read_item_count = p_recipe->read_item_count; - 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; - /*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; + if (ret < 0) { + printf("%s read %d item failed!\n", __func__, i); + continue; } } } + } diff --git a/APP_Framework/Framework/control/shared/control_def.h b/APP_Framework/Framework/control/shared/control_def.h index 96957ad20..dec7a189a 100644 --- a/APP_Framework/Framework/control/shared/control_def.h +++ b/APP_Framework/Framework/control/shared/control_def.h @@ -44,6 +44,7 @@ extern "C" { } \ }while (0) + typedef enum { UNIFORM_BOOL = 1, diff --git a/Ubiquitous/XiZi_IIoT/board/hc32f4a0/config.mk b/Ubiquitous/XiZi_IIoT/board/hc32f4a0/config.mk index 258d2dca3..c52aca76a 100644 --- a/Ubiquitous/XiZi_IIoT/board/hc32f4a0/config.mk +++ b/Ubiquitous/XiZi_IIoT/board/hc32f4a0/config.mk @@ -1,11 +1,11 @@ export CROSS_COMPILE ?=/usr/bin/arm-none-eabi- -export CFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -fgnu89-inline -Wa,-mimplicit-it=thumb -Werror -export AFLAGS := -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -x assembler-with-cpp -Wa,-mimplicit-it=thumb -gdwarf-2 -export LFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi_hc32f4a0.map,-cref,-u,Reset_Handler -T $(BSP_ROOT)/link.lds -export CXXFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -Werror +export CFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -fgnu89-inline -Wa,-mimplicit-it=thumb -Werror +export AFLAGS := -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -x assembler-with-cpp -Wa,-mimplicit-it=thumb -gdwarf-2 +export LFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi_hc32f4a0.map,-cref,-u,Reset_Handler -T $(BSP_ROOT)/link.lds +export CXXFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -Werror -export APPLFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi_app.map,-cref,-u, -T $(BSP_ROOT)/link_userspace.lds +export APPLFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi_app.map,-cref,-u, -T $(BSP_ROOT)/link_userspace.lds export DEFINES := -DHAVE_CCONFIG_H -DHC32F4A0 -DUSE_DDL_DRIVER -DHAVE_SIGINFO