forked from xuos/xiuos
				
			feat add S7 protocol in control framework and add plc app demo from liu_weichao
it is OK
This commit is contained in:
		
						commit
						e0bc75c405
					
				| 
						 | 
					@ -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
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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。
 | 
				
			||||||
 | 
					-  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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区。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
SRC_FILES := ge_versamax001.c
 | 
					SRC_FILES := ge_versamax001.c ge_cpe100.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,57 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					typora-copy-images-to: upload
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 艾默生(原GE) 通信测试
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[TOC]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 小型VersaMAX CPU001测试
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 通信接线及参数设置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 串口
 | 
				
			||||||
 | 
					  * COM2为15孔D型 RS485。波特率:19200,数据位:8位,停止位:1位,校验:偶校验。接线按下图典型双线接法。
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 存储区
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 存储区 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。
 | 
				
			||||||
| 
						 | 
					@ -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 <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 109 KiB  | 
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					SRC_FILES := inovance_am401_cpu1608tn_ethernet.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -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等,则需按位进行读取后然后组合得到。
 | 
				
			||||||
| 
						 | 
					@ -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 <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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区数据。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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) 剪裁配置完成后,用过烧写器下载至矽达通中,重启后完成测试。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
| 
						 | 
					@ -11,10 +11,39 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @file omron_cj2m.c
 | 
					 * @file omron_cp1h.c
 | 
				
			||||||
 * @brief PLC OMRON CJ2M app
 | 
					 * @brief PLC OMRON CP1H app
 | 
				
			||||||
 * @version 3.0
 | 
					 * @version 3.0
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2023.4.1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,4 +45,4 @@ void ControlOmronCP1LTest(void)
 | 
				
			||||||
        //ControlProtocolClose(fins_protocol);
 | 
					        //ControlProtocolClose(fins_protocol);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
PRIV_SHELL_CMD_FUNCTION(ControlOmronCP1LTest, Omron Plc FINS Demo, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
					PRIV_SHELL_CMD_FUNCTION(ControlOmronCP1LTest, Omron Plc Cp1l Demo, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,34 @@
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2022.9.27
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -19,9 +19,6 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <control.h>
 | 
					#include <control.h>
 | 
				
			||||||
 | 
					 | 
				
			||||||
extern int Adapter4GActive(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ControlM241Test(void)
 | 
					void ControlM241Test(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i, j = 0;
 | 
					    int i, j = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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) 剪裁配置完成后,用过烧写器下载至矽达通中,重启后完成测试。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
| 
						 | 
					@ -15,9 +15,6 @@
 | 
				
			||||||
 * @brief PLC SIEMENS S7-1200 app
 | 
					 * @brief PLC SIEMENS S7-1200 app
 | 
				
			||||||
 * @version 3.0
 | 
					 * @version 3.0
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2023.3.27
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,9 +15,31 @@
 | 
				
			||||||
 * @brief PLC SIEMENS S7-1500 app
 | 
					 * @brief PLC SIEMENS S7-1500 app
 | 
				
			||||||
 * @version 3.0
 | 
					 * @version 3.0
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2023.3.27
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <control.h>
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -11,13 +11,10 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @file siemens_s7_200_smart.c
 | 
					 * @file siemens_s7_200 smart.c
 | 
				
			||||||
 * @brief PLC SIEMENS S7-200 SMART app
 | 
					 * @brief PLC SIEMENS S7-200 smart app
 | 
				
			||||||
 * @version 3.0
 | 
					 * @version 3.0
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2023.3.27
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,9 +15,6 @@
 | 
				
			||||||
 * @brief PLC SIEMENS S7-300 app
 | 
					 * @brief PLC SIEMENS S7-300 app
 | 
				
			||||||
 * @version 3.0
 | 
					 * @version 3.0
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022.9.27
 | 
					 * @date 2023.3.27
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -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 <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -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 <control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MODBUS_TCP_UNIT_ID                     0x01
 | 
					
 | 
				
			||||||
#define MODBUS_TCP_READ_CMD_LENGTH             0x0C
 | 
					#define MODBUS_TCP_READ_CMD_LENGTH             0x0C
 | 
				
			||||||
#define MODBUS_TCP_WRITE_SINGLE_CMD_LENGTH     0x0C
 | 
					#define MODBUS_TCP_WRITE_SINGLE_CMD_LENGTH     0x0C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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[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[7] = function_code;
 | 
				
			||||||
    p_base_data_info->p_command[8] = start_address >> 8;
 | 
					    p_base_data_info->p_command[8] = start_address >> 8;
 | 
				
			||||||
    p_base_data_info->p_command[9] = start_address;
 | 
					    p_base_data_info->p_command[9] = start_address;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ endif
 | 
				
			||||||
config CONTROL_PROTOCOL_S7
 | 
					config CONTROL_PROTOCOL_S7
 | 
				
			||||||
        bool "Using s7 control protocol"
 | 
					        bool "Using s7 control protocol"
 | 
				
			||||||
        default n
 | 
					        default n
 | 
				
			||||||
 | 
					        select CONTROL_USING_SOCKET
 | 
				
			||||||
if CONTROL_PROTOCOL_S7
 | 
					if CONTROL_PROTOCOL_S7
 | 
				
			||||||
        source "$APP_DIR/Framework/control/plc_protocol/s7/Kconfig"
 | 
					        source "$APP_DIR/Framework/control/plc_protocol/s7/Kconfig"
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -329,7 +329,11 @@ void *ReceivePlcDataTask(void *parameter)
 | 
				
			||||||
        /*read all variable item data, put them into circular_area*/
 | 
					        /*read all variable item data, put them into circular_area*/
 | 
				
			||||||
        if (i == control_protocol->recipe->read_item_count) {
 | 
					        if (i == control_protocol->recipe->read_item_count) {
 | 
				
			||||||
            printf("%s get %d item %d length\n", __func__, i, data_length);
 | 
					            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);
 | 
					            CircularAreaAppWrite(circular_area, fins_data, data_length, 0);
 | 
				
			||||||
 | 
					            printf("%s\n",fins_data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /*read data every single 'read_period' ms*/
 | 
					        /*read data every single 'read_period' ms*/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 <stdint.h>
 | 
				
			||||||
 | 
					# include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//******************************************************************************
 | 
				
			||||||
 | 
					//                                   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
 | 
				
			||||||
| 
						 | 
					@ -17,3 +17,26 @@
 | 
				
			||||||
 * @author AIIT XUOS Lab
 | 
					 * @author AIIT XUOS Lab
 | 
				
			||||||
 * @date 2022-10-08
 | 
					 * @date 2022-10-08
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef S7_H
 | 
				
			||||||
 | 
					#define S7_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <control_def.h>
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,2 @@
 | 
				
			||||||
SRC_FILES := 
 | 
					SRC_FILES := libs7.a s7.c
 | 
				
			||||||
 | 
					 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -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 <s7.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -21,8 +21,6 @@
 | 
				
			||||||
#include <control.h>
 | 
					#include <control.h>
 | 
				
			||||||
#include <control_def.h>
 | 
					#include <control_def.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ControlProtocolType control_protocol;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @description: Control Framework Find certain Protocol
 | 
					 * @description: Control Framework Find certain Protocol
 | 
				
			||||||
 * @param void
 | 
					 * @param void
 | 
				
			||||||
| 
						 | 
					@ -293,6 +291,8 @@ int ControlFrameworkInit(void)
 | 
				
			||||||
        goto _out;
 | 
					        goto _out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    printf("%u %u\n",control_protocol->recipe->total_data_length,control_protocol->recipe->device_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    printf("%s ControlPeripheralInit done\n", __func__);
 | 
					    printf("%s ControlPeripheralInit done\n", __func__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_out:
 | 
					_out:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,10 +24,13 @@
 | 
				
			||||||
#include <transform.h>
 | 
					#include <transform.h>
 | 
				
			||||||
#include <list.h>
 | 
					#include <list.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ControlProtocol;
 | 
					struct ControlProtocol;
 | 
				
			||||||
typedef struct ControlProtocol *ControlProtocolType;
 | 
					typedef struct ControlProtocol *ControlProtocolType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,6 +111,9 @@ int ControlProtocolWrite(struct ControlProtocol *control_protocol, const void *b
 | 
				
			||||||
/*Control Framework Protocol Ioctl*/
 | 
					/*Control Framework Protocol Ioctl*/
 | 
				
			||||||
int ControlProtocolIoctl(struct ControlProtocol *control_protocol, int cmd, void *args);
 | 
					int ControlProtocolIoctl(struct ControlProtocol *control_protocol, int cmd, void *args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Control Framework new certain Protocol*/
 | 
				
			||||||
 | 
					ControlProtocolType control_protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,6 +45,10 @@ extern int ModbusTcpProtocolInit(struct ControlRecipe *p_recipe);
 | 
				
			||||||
extern int ModbusUartProtocolInit(struct ControlRecipe *p_recipe);
 | 
					extern int ModbusUartProtocolInit(struct ControlRecipe *p_recipe);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONTROL_PROTOCOL_S7
 | 
				
			||||||
 | 
					extern int S7ProtocolInit(struct ControlRecipe *p_recipe);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
CONTROL FRAMEWORK READ DATA FORMAT:
 | 
					CONTROL FRAMEWORK READ DATA FORMAT:
 | 
				
			||||||
|  HEAD |device_id|read data length|read item count|         data         |
 | 
					|  HEAD |device_id|read data length|read item count|         data         |
 | 
				
			||||||
| 
						 | 
					@ -80,6 +84,9 @@ static struct ControlProtocolInitParam protocol_init[] =
 | 
				
			||||||
#ifdef CONTROL_PROTOCOL_MODBUS_UART
 | 
					#ifdef CONTROL_PROTOCOL_MODBUS_UART
 | 
				
			||||||
    { PROTOCOL_MODBUS_UART, ModbusUartProtocolInit },
 | 
					    { PROTOCOL_MODBUS_UART, ModbusUartProtocolInit },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONTROL_PROTOCOL_S7
 | 
				
			||||||
 | 
					    { PROTOCOL_S7, S7ProtocolInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{ PROTOCOL_END, NULL },
 | 
						{ PROTOCOL_END, NULL },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -445,23 +452,16 @@ 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 = 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;
 | 
					        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);
 | 
					        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;
 | 
					        protocol_format_info.p_read_item_data = p_recipe->protocol_data.data + CONTROL_DATA_HEAD_LENGTH;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /*Init The Control Protocol*/
 | 
					        /*Init The Control Protocol*/
 | 
				
			||||||
        ControlProtocolInitDesc(p_recipe, protocol_init);
 | 
					        ControlProtocolInitDesc(p_recipe, protocol_init);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /*Format Data Header, Reference "CONTROL FRAMEWORK READ DATA FORMAT"*/
 | 
					        /*Format Data Header, Reference "CONTROL FRAMEWORK READ DATA FORMAT"*/
 | 
				
			||||||
        FormatDataHeader(p_recipe);
 | 
					        FormatDataHeader(p_recipe);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint16_t read_item_count = p_recipe->read_item_count;
 | 
					        uint16_t read_item_count = p_recipe->read_item_count;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (i = 0; i < read_item_count; i ++) {
 | 
					        for (i = 0; i < read_item_count; i ++) {
 | 
				
			||||||
            cJSON *read_single_item_json = cJSON_GetArrayItem(read_item_list_json, 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_single_item_json = read_single_item_json;
 | 
				
			||||||
            protocol_format_info.read_item_index = i;
 | 
					            protocol_format_info.read_item_index = i;
 | 
				
			||||||
 | 
					 | 
				
			||||||
            /*Format Protocol Cmd By Analyze Variable Item One By One*/
 | 
					            /*Format Protocol Cmd By Analyze Variable Item One By One*/
 | 
				
			||||||
            ret = p_recipe->ControlProtocolFormatCmd(p_recipe, &protocol_format_info);
 | 
					            ret = p_recipe->ControlProtocolFormatCmd(p_recipe, &protocol_format_info);
 | 
				
			||||||
                if (ret < 0) {
 | 
					                if (ret < 0) {
 | 
				
			||||||
| 
						 | 
					@ -470,5 +470,6 @@ void RecipeReadVariableItem(struct ControlRecipe *p_recipe, cJSON *p_recipe_file
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ extern "C" {
 | 
				
			||||||
        }                                                                                           \
 | 
					        }                                                                                           \
 | 
				
			||||||
    }while (0)   
 | 
					    }while (0)   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum
 | 
					typedef enum
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    UNIFORM_BOOL = 1,
 | 
					    UNIFORM_BOOL = 1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,11 @@
 | 
				
			||||||
export CROSS_COMPILE ?=/usr/bin/arm-none-eabi-
 | 
					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 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 -mfloat-abi=hard -ffunction-sections -fdata-sections -x assembler-with-cpp -Wa,-mimplicit-it=thumb  -gdwarf-2
 | 
					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 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi_hc32f4a0.map,-cref,-u,Reset_Handler -T $(BSP_ROOT)/link.lds
 | 
					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 -mfloat-abi=hard -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -Werror
 | 
					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
 | 
					export DEFINES := -DHAVE_CCONFIG_H -DHC32F4A0 -DUSE_DDL_DRIVER -DHAVE_SIGINFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue