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