communicationv3.3i 实现南网谱图

main
Matthew 2 years ago
parent 612f9a56f2
commit 1b494d7bb3

@ -0,0 +1,42 @@
/*
* Copyright © 2001-2011 Stéphane Raimbault <stephane.raimbault@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#ifndef MODBUS_RTU_H
#define MODBUS_RTU_H
#include "modbus.h"
MODBUS_BEGIN_DECLS
/* Modbus_Application_Protocol_V1_1b.pdf Chapter 4 Section 1 Page 5
* RS232 / RS485 ADU = 253 bytes + slave (1 byte) + CRC (2 bytes) = 256 bytes
*/
#define MODBUS_RTU_MAX_ADU_LENGTH 256
MODBUS_API modbus_t* modbus_new_rtu(const char *device, int baud, char parity,
int data_bit, int stop_bit);
#define MODBUS_RTU_RS232 0
#define MODBUS_RTU_RS485 1
MODBUS_API int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
MODBUS_API int modbus_rtu_get_serial_mode(modbus_t *ctx);
#define MODBUS_RTU_RTS_NONE 0
#define MODBUS_RTU_RTS_UP 1
#define MODBUS_RTU_RTS_DOWN 2
MODBUS_API int modbus_rtu_set_rts(modbus_t *ctx, int mode);
MODBUS_API int modbus_rtu_get_rts(modbus_t *ctx);
MODBUS_API int modbus_rtu_set_custom_rts(modbus_t *ctx, void (*set_rts) (modbus_t *ctx, int on));
MODBUS_API int modbus_rtu_set_rts_delay(modbus_t *ctx, int us);
MODBUS_API int modbus_rtu_get_rts_delay(modbus_t *ctx);
MODBUS_END_DECLS
#endif /* MODBUS_RTU_H */

@ -0,0 +1,52 @@
/*
* Copyright © 2001-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#ifndef MODBUS_TCP_H
#define MODBUS_TCP_H
#include "modbus.h"
MODBUS_BEGIN_DECLS
#if defined(_WIN32) && !defined(__CYGWIN__)
/* Win32 with MinGW, supplement to <errno.h> */
#include <winsock2.h>
#if !defined(ECONNRESET)
#define ECONNRESET WSAECONNRESET
#endif
#if !defined(ECONNREFUSED)
#define ECONNREFUSED WSAECONNREFUSED
#endif
#if !defined(ETIMEDOUT)
#define ETIMEDOUT WSAETIMEDOUT
#endif
#if !defined(ENOPROTOOPT)
#define ENOPROTOOPT WSAENOPROTOOPT
#endif
#if !defined(EINPROGRESS)
#define EINPROGRESS WSAEINPROGRESS
#endif
#endif
#define MODBUS_TCP_DEFAULT_PORT 502
#define MODBUS_TCP_SLAVE 0xFF
/* Modbus_Application_Protocol_V1_1b.pdf Chapter 4 Section 1 Page 5
* TCP MODBUS ADU = 253 bytes + MBAP (7 bytes) = 260 bytes
*/
#define MODBUS_TCP_MAX_ADU_LENGTH 260
MODBUS_API modbus_t* modbus_new_tcp(const char *ip_address, int port);
MODBUS_API int modbus_tcp_listen(modbus_t *ctx, int nb_connection);
MODBUS_API int modbus_tcp_accept(modbus_t *ctx, int *s);
MODBUS_API modbus_t* modbus_new_tcp_pi(const char *node, const char *service);
MODBUS_API int modbus_tcp_pi_listen(modbus_t *ctx, int nb_connection);
MODBUS_API int modbus_tcp_pi_accept(modbus_t *ctx, int *s);
MODBUS_END_DECLS
#endif /* MODBUS_TCP_H */

@ -0,0 +1,53 @@
/*
* Copyright © 2010-2014 Stéphane Raimbault <stephane.raimbault@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MODBUS_VERSION_H
#define MODBUS_VERSION_H
/* The major version, (1, if %LIBMODBUS_VERSION is 1.2.3) */
#define LIBMODBUS_VERSION_MAJOR (3)
/* The minor version (2, if %LIBMODBUS_VERSION is 1.2.3) */
#define LIBMODBUS_VERSION_MINOR (1)
/* The micro version (3, if %LIBMODBUS_VERSION is 1.2.3) */
#define LIBMODBUS_VERSION_MICRO (6)
/* The full version, like 1.2.3 */
#define LIBMODBUS_VERSION 3.1.6
/* The full version, in string form (suited for string concatenation)
*/
#define LIBMODBUS_VERSION_STRING "3.1.6"
/* Numerically encoded version, eg. v1.2.3 is 0x010203 */
#define LIBMODBUS_VERSION_HEX ((LIBMODBUS_VERSION_MAJOR << 16) | \
(LIBMODBUS_VERSION_MINOR << 8) | \
(LIBMODBUS_VERSION_MICRO << 0))
/* Evaluates to True if the version is greater than @major, @minor and @micro
*/
#define LIBMODBUS_VERSION_CHECK(major,minor,micro) \
(LIBMODBUS_VERSION_MAJOR > (major) || \
(LIBMODBUS_VERSION_MAJOR == (major) && \
LIBMODBUS_VERSION_MINOR > (minor)) || \
(LIBMODBUS_VERSION_MAJOR == (major) && \
LIBMODBUS_VERSION_MINOR == (minor) && \
LIBMODBUS_VERSION_MICRO >= (micro)))
#endif /* MODBUS_VERSION_H */

@ -0,0 +1,293 @@
/*
* Copyright © 2001-2013 Stéphane Raimbault <stephane.raimbault@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#ifndef MODBUS_H
#define MODBUS_H
/* Add this for macros that defined unix flavor */
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
#ifndef _MSC_VER
#include <stdint.h>
#else
#include "stdint.h"
#endif
#include "modbus-version.h"
#if defined(_MSC_VER)
# if defined(DLLBUILD)
/* define DLLBUILD when building the DLL */
# define MODBUS_API __declspec(dllexport)
# else
# define MODBUS_API __declspec(dllimport)
# endif
#else
# define MODBUS_API
#endif
#ifdef __cplusplus
# define MODBUS_BEGIN_DECLS extern "C" {
# define MODBUS_END_DECLS }
#else
# define MODBUS_BEGIN_DECLS
# define MODBUS_END_DECLS
#endif
MODBUS_BEGIN_DECLS
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef OFF
#define OFF 0
#endif
#ifndef ON
#define ON 1
#endif
/* Modbus function codes */
#define MODBUS_FC_READ_COILS 0x01
#define MODBUS_FC_READ_DISCRETE_INPUTS 0x02
#define MODBUS_FC_READ_HOLDING_REGISTERS 0x03
#define MODBUS_FC_READ_INPUT_REGISTERS 0x04
#define MODBUS_FC_WRITE_SINGLE_COIL 0x05
#define MODBUS_FC_WRITE_SINGLE_REGISTER 0x06
#define MODBUS_FC_READ_EXCEPTION_STATUS 0x07
#define MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F
#define MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
#define MODBUS_FC_REPORT_SLAVE_ID 0x11
#define MODBUS_FC_MASK_WRITE_REGISTER 0x16
#define MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
#define MODBUS_BROADCAST_ADDRESS 0
/* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 1 page 12)
* Quantity of Coils to read (2 bytes): 1 to 2000 (0x7D0)
* (chapter 6 section 11 page 29)
* Quantity of Coils to write (2 bytes): 1 to 1968 (0x7B0)
*/
#define MODBUS_MAX_READ_BITS 2000
#define MODBUS_MAX_WRITE_BITS 1968
/* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 3 page 15)
* Quantity of Registers to read (2 bytes): 1 to 125 (0x7D)
* (chapter 6 section 12 page 31)
* Quantity of Registers to write (2 bytes) 1 to 123 (0x7B)
* (chapter 6 section 17 page 38)
* Quantity of Registers to write in R/W registers (2 bytes) 1 to 121 (0x79)
*/
#define MODBUS_MAX_READ_REGISTERS 125
#define MODBUS_MAX_WRITE_REGISTERS 123
#define MODBUS_MAX_WR_WRITE_REGISTERS 121
#define MODBUS_MAX_WR_READ_REGISTERS 125
/* The size of the MODBUS PDU is limited by the size constraint inherited from
* the first MODBUS implementation on Serial Line network (max. RS485 ADU = 256
* bytes). Therefore, MODBUS PDU for serial line communication = 256 - Server
* address (1 byte) - CRC (2 bytes) = 253 bytes.
*/
#define MODBUS_MAX_PDU_LENGTH 253
/* Consequently:
* - RTU MODBUS ADU = 253 bytes + Server address (1 byte) + CRC (2 bytes) = 256
* bytes.
* - TCP MODBUS ADU = 253 bytes + MBAP (7 bytes) = 260 bytes.
* so the maximum of both backend in 260 bytes. This size can used to allocate
* an array of bytes to store responses and it will be compatible with the two
* backends.
*/
#define MODBUS_MAX_ADU_LENGTH 260
/* Random number to avoid errno conflicts */
#define MODBUS_ENOBASE 112345678
/* Protocol exceptions */
enum {
MODBUS_EXCEPTION_ILLEGAL_FUNCTION = 0x01,
MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,
MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,
MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE,
MODBUS_EXCEPTION_ACKNOWLEDGE,
MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY,
MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE,
MODBUS_EXCEPTION_MEMORY_PARITY,
MODBUS_EXCEPTION_NOT_DEFINED,
MODBUS_EXCEPTION_GATEWAY_PATH,
MODBUS_EXCEPTION_GATEWAY_TARGET,
MODBUS_EXCEPTION_MAX
};
#define EMBXILFUN (MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_FUNCTION)
#define EMBXILADD (MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS)
#define EMBXILVAL (MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE)
#define EMBXSFAIL (MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE)
#define EMBXACK (MODBUS_ENOBASE + MODBUS_EXCEPTION_ACKNOWLEDGE)
#define EMBXSBUSY (MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY)
#define EMBXNACK (MODBUS_ENOBASE + MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE)
#define EMBXMEMPAR (MODBUS_ENOBASE + MODBUS_EXCEPTION_MEMORY_PARITY)
#define EMBXGPATH (MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_PATH)
#define EMBXGTAR (MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_TARGET)
/* Native libmodbus error codes */
#define EMBBADCRC (EMBXGTAR + 1)
#define EMBBADDATA (EMBXGTAR + 2)
#define EMBBADEXC (EMBXGTAR + 3)
#define EMBUNKEXC (EMBXGTAR + 4)
#define EMBMDATA (EMBXGTAR + 5)
#define EMBBADSLAVE (EMBXGTAR + 6)
extern const unsigned int libmodbus_version_major;
extern const unsigned int libmodbus_version_minor;
extern const unsigned int libmodbus_version_micro;
typedef struct _modbus modbus_t;
typedef struct _modbus_mapping_t {
int nb_bits;
int start_bits;
int nb_input_bits;
int start_input_bits;
int nb_input_registers;
int start_input_registers;
int nb_registers;
int start_registers;
uint8_t *tab_bits;
uint8_t *tab_input_bits;
uint16_t *tab_input_registers;
uint16_t *tab_registers;
} modbus_mapping_t;
typedef enum
{
MODBUS_ERROR_RECOVERY_NONE = 0,
MODBUS_ERROR_RECOVERY_LINK = (1<<1),
MODBUS_ERROR_RECOVERY_PROTOCOL = (1<<2)
} modbus_error_recovery_mode;
MODBUS_API int modbus_set_slave(modbus_t* ctx, int slave);
MODBUS_API int modbus_get_slave(modbus_t* ctx);
MODBUS_API int modbus_set_error_recovery(modbus_t *ctx, modbus_error_recovery_mode error_recovery);
MODBUS_API int modbus_set_socket(modbus_t *ctx, int s);
MODBUS_API int modbus_get_socket(modbus_t *ctx);
MODBUS_API int modbus_get_response_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
MODBUS_API int modbus_set_response_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
MODBUS_API int modbus_get_byte_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
MODBUS_API int modbus_set_byte_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
MODBUS_API int modbus_get_indication_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
MODBUS_API int modbus_set_indication_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
MODBUS_API int modbus_get_header_length(modbus_t *ctx);
MODBUS_API int modbus_connect(modbus_t *ctx);
MODBUS_API void modbus_close(modbus_t *ctx);
MODBUS_API void modbus_free(modbus_t *ctx);
MODBUS_API int modbus_flush(modbus_t *ctx);
MODBUS_API int modbus_set_debug(modbus_t *ctx, int flag);
MODBUS_API const char *modbus_strerror(int errnum);
MODBUS_API int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
MODBUS_API int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
MODBUS_API int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
MODBUS_API int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status);
MODBUS_API int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);
MODBUS_API int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);
MODBUS_API int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *data);
MODBUS_API int modbus_mask_write_register(modbus_t *ctx, int addr, uint16_t and_mask, uint16_t or_mask);
MODBUS_API int modbus_write_and_read_registers(modbus_t *ctx, int write_addr, int write_nb,
const uint16_t *src, int read_addr, int read_nb,
uint16_t *dest);
MODBUS_API int modbus_report_slave_id(modbus_t *ctx, int max_dest, uint8_t *dest);
MODBUS_API modbus_mapping_t* modbus_mapping_new_start_address(
unsigned int start_bits, unsigned int nb_bits,
unsigned int start_input_bits, unsigned int nb_input_bits,
unsigned int start_registers, unsigned int nb_registers,
unsigned int start_input_registers, unsigned int nb_input_registers);
MODBUS_API modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits,
int nb_registers, int nb_input_registers);
MODBUS_API void modbus_mapping_free(modbus_mapping_t *mb_mapping);
MODBUS_API int modbus_send_raw_request(modbus_t *ctx, const uint8_t *raw_req, int raw_req_length);
MODBUS_API int modbus_receive(modbus_t *ctx, uint8_t *req);
MODBUS_API int modbus_receive_confirmation(modbus_t *ctx, uint8_t *rsp);
MODBUS_API int modbus_reply(modbus_t *ctx, const uint8_t *req,
int req_length, modbus_mapping_t *mb_mapping);
MODBUS_API int modbus_reply_exception(modbus_t *ctx, const uint8_t *req,
unsigned int exception_code);
/**
* UTILS FUNCTIONS
**/
#define MODBUS_GET_HIGH_BYTE(data) (((data) >> 8) & 0xFF)
#define MODBUS_GET_LOW_BYTE(data) ((data) & 0xFF)
#define MODBUS_GET_INT64_FROM_INT16(tab_int16, index) \
(((int64_t)tab_int16[(index) ] << 48) + \
((int64_t)tab_int16[(index) + 1] << 32) + \
((int64_t)tab_int16[(index) + 2] << 16) + \
(int64_t)tab_int16[(index) + 3])
#define MODBUS_GET_INT32_FROM_INT16(tab_int16, index) ((tab_int16[(index)] << 16) + tab_int16[(index) + 1])
#define MODBUS_GET_INT16_FROM_INT8(tab_int8, index) ((tab_int8[(index)] << 8) + tab_int8[(index) + 1])
#define MODBUS_SET_INT16_TO_INT8(tab_int8, index, value) \
do { \
tab_int8[(index)] = (value) >> 8; \
tab_int8[(index) + 1] = (value) & 0xFF; \
} while (0)
#define MODBUS_SET_INT32_TO_INT16(tab_int16, index, value) \
do { \
tab_int16[(index) ] = (value) >> 16; \
tab_int16[(index) + 1] = (value); \
} while (0)
#define MODBUS_SET_INT64_TO_INT16(tab_int16, index, value) \
do { \
tab_int16[(index) ] = (value) >> 48; \
tab_int16[(index) + 1] = (value) >> 32; \
tab_int16[(index) + 2] = (value) >> 16; \
tab_int16[(index) + 3] = (value); \
} while (0)
MODBUS_API void modbus_set_bits_from_byte(uint8_t *dest, int idx, const uint8_t value);
MODBUS_API void modbus_set_bits_from_bytes(uint8_t *dest, int idx, unsigned int nb_bits,
const uint8_t *tab_byte);
MODBUS_API uint8_t modbus_get_byte_from_bits(const uint8_t *src, int idx, unsigned int nb_bits);
MODBUS_API float modbus_get_float(const uint16_t *src);
MODBUS_API float modbus_get_float_abcd(const uint16_t *src);
MODBUS_API float modbus_get_float_dcba(const uint16_t *src);
MODBUS_API float modbus_get_float_badc(const uint16_t *src);
MODBUS_API float modbus_get_float_cdab(const uint16_t *src);
MODBUS_API void modbus_set_float(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_abcd(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_dcba(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_badc(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_cdab(float f, uint16_t *dest);
#include "modbus-tcp.h"
#include "modbus-rtu.h"
MODBUS_END_DECLS
#endif /* MODBUS_H */

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

@ -1,7 +1,53 @@
#ifndef _ANALYSIS_H
#define _ANALYSIS_H
#define RSV_SPACE_SIZE 344
//南网谱图
#define MAX_CHN 1 //通道号
#define MAX_PEAK 6
#define CHN_LEN 5000
//#define RSV_SPACE_SIZE 344
#define RSV_SPACE_SIZE 3000 /*2020-07-31修改为3000*/
typedef struct __attribute__ ((__packed__))
{
char peak_name[10];//组分名称H2,CH4,C2H2,C2H4,C2H6,CO,CO2
char peak_idx;//峰编号
float peak_top;//峰顶时间
float peak_start;//峰开始点时间
float peak_end;//峰结束点时间
float peak_hgt;//峰高
float peak_area;//峰面积
}PEAK_INFO;//27
typedef struct __attribute__ ((__packed__))
{
char peak_num;//通道中峰的个数MAX_PEAK
PEAK_INFO peak_info[MAX_PEAK];//峰信息
}CHN_INFO;//1+6*27=163
typedef struct __attribute__ ((__packed__))
{
float spec_ver;//规范版本0
float file_ver;//文件版本4
short wave_type;//谱图类型编码8
long long gen_time;//谱图生成时间10
char test_flag;//测试文件标志18
char dev_name[32];//被监测设备名称19
float xt;//X轴时间间隔t51
float ymax;//Y轴最大值55
char xunit;//X轴单位0:秒 1:毫秒 59
char yunit;//Y轴单位0:mV 1:uV 63
int data_num;//每通道数据点数CHN_LEN(要求所有通道数据点数相同)67
char chn_num;//通道数MAX_CHN 71
CHN_INFO chn_info[MAX_CHN];//通道信息72(0X48)
int separator;//0x24242424 235(0xEB)
float data[MAX_CHN][CHN_LEN];//通道谱图数据
}SOUTH_WAVE_TYPE;
extern int send_analysis_req(char *file_name,int len);
extern int analysis_init(void);

@ -23,8 +23,8 @@ int comunication_flg=0;
PID_ATune HeatAutoTuner;
AUTO_TUNE_RECORD HeatTuneRecord;
int ctrl_fd=-1; //¿ØÖư崮¿Ú
int sample_fd=-1;//²É¼¯°å´®¿Ú
int ctrl_fd=-1; //<EFBFBD><EFBFBD><EFBFBD>ư崮<EFBFBD><EFBFBD>
int sample_fd=-1;//<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void mutex_init(void)

@ -373,7 +373,7 @@ void relay_set(unsigned int i,unsigned char val,unsigned int mode)
{
//printf("relay=%x %x %x %x\n",my_output_data.relay_ctrl[0],my_output_data.relay_ctrl[1],my_output_data.relay_ctrl[2],my_output_data.relay_ctrl[3]);
if(mode)
ctrl_data_retrans();
ctrl_data_retrans();
}
//show_hex(my_output_data.relay_ctrl,8);
}
@ -576,7 +576,7 @@ void ctrl_rx_routine(void *arg)
if(recv_error_tick>200)
{
LOG_DEBUG(ERROR_DEBUG,"ctrl mcu recovery\n");
}
}
recv_error_tick=0;
if(comunication_flg==0)
{

@ -1265,9 +1265,9 @@ static void man_ctrl_process(Webs *wp)
else
{
if(tmp==0)
{
{
}
}
}
HeatTuneRecord.auto_turn=tmp;
}
@ -1485,8 +1485,8 @@ static void analysis_file_process(Webs *wp)
if(str!=NULL)
{
if(strcmp(str,"dumyfile.bin")!=0)
{
sprintf(file_path,"/COMTRADE/%s",str);
{ //2021-10-28:波形目录修改至/usr_app/data目录
sprintf(file_path,"/usr_app/data/%s",str);//sprintf(file_path,"/COMTRADE/%s",str);
if(stat(file_path,&buf)==0)
{
if(buf.st_size>4096)

@ -99,6 +99,9 @@ void iec61850_rx_routine(void *arg)
int i;
time_t now;
float f=0;
int update_flg=0;
USR_MV rdre[2];
start_scl_mem();
if((iec61850_rx_mq=create_mq(IEC61850_RX_MQ,IEC61850_RX_MAX_MESSAGE,IEC61850_RX_MESSAGE_SIZE))<0)
{
@ -115,12 +118,61 @@ void iec61850_rx_routine(void *arg)
{
case CMD_SEND_PRI_DATA:
LOG_DEBUG(IEC61850_TRACE_DEBUG,"receive CMD_SEND_PRI_DATA\n");
memcpy(&ysp_pri_data,&iec61850_rx_buf[4],sizeof(YSP_PRI_DATA));
now=time(NULL);
conv_pri2iec(&ysp_pri_data,&ysp_glb_data,0,0);
now=time(NULL);
lock_input_data();
//更新油温和微水含量到ysp_glb_data
ysp_glb_data.Tmp.v.f=my_input_data.temp;//油温
ysp_glb_data.Mst.v.f=my_input_data.water;//微水
if(my_input_data.com_flg)
{
ysp_glb_data.Tmp.q=INVALID;//油温品质
ysp_glb_data.Mst.q=INVALID;//微水品质
}
else
{
ysp_glb_data.Mst.q=GOOD;
ysp_glb_data.Tmp.q=GOOD;
}
ysp_glb_data.Mst.t.secs=now;//微水时标
ysp_glb_data.Tmp.t.secs=now;//温度时标
unlock_input_data();
//更新载气压力到ysp_glb_data
get_presure(PRES_PA1,&ysp_glb_data.GasPres.v.f); //载气压力
ysp_glb_data.GasPres.t.secs=now;//压力时标
ysp_glb_data.GasPres.q=GOOD;
if(ysp_glb_data.MoDevConf.v.stVal)
{
ysp_glb_data.MoDevConf.q=INVALID;
}
else
{
ysp_glb_data.MoDevConf.q=GOOD;
}
memcpy(&ysp_pri_data,&iec61850_rx_buf[4],sizeof(YSP_PRI_DATA));
conv_pri2iec(&ysp_pri_data,&ysp_glb_data,0,0);//从ysp_pri_data拷贝数据到ysp_glb_data
rdre[0].v.stVal=1;//rcd_made
rdre[0].q=GOOD;
rdre[0].t.secs=now;
rdre[1].v.i++;//file_num
rdre[1].q=GOOD;
rdre[1].t.secs=now;
//发送ysp_glb_data到iec61850;
lock_scl_mem();
put_mv_data(0,0,(USR_MV *)&ysp_glb_data,sizeof(ysp_glb_data)/sizeof(USR_MV));
unlock_scl_mem();
put_mv_data(0,0,(USR_MV *)&ysp_glb_data,sizeof(ysp_glb_data)/sizeof(USR_MV));
put_mv_data(0,20,(USR_MV *)&rdre[0],sizeof(rdre)/sizeof(USR_MV));
unlock_scl_mem();
sleep(3);
rdre[0].v.stVal=0;//rcd_made
lock_scl_mem();
put_mv_data(0,20,(USR_MV *)&rdre[0],1);
unlock_scl_mem();
break;
default:
break;
@ -128,39 +180,45 @@ void iec61850_rx_routine(void *arg)
}
else
{
now=time(NULL);
lock_input_data();
ysp_glb_data.Tmp.v.f=my_input_data.temp;
ysp_glb_data.Mst.v.f=my_input_data.water;
if(my_input_data.com_flg)
{
ysp_glb_data.Tmp.q=INVALID;
if(update_flg==0)
{
now=time(NULL);
lock_input_data();
ysp_glb_data.Tmp.v.f=my_input_data.temp;//油温
ysp_glb_data.Mst.v.f=my_input_data.water;//微水
if(my_input_data.com_flg)
{
ysp_glb_data.Tmp.q=INVALID;//油温品质
ysp_glb_data.Mst.q=INVALID;
}
else
{
}
else
{
ysp_glb_data.Tmp.q=GOOD;
ysp_glb_data.Mst.q=GOOD;
}
unlock_input_data();
get_presure(PRES_PA1,&ysp_glb_data.GasPres.v.f);
conv_pri2iec(&ysp_pri_data,&ysp_glb_data,0,0);
ysp_glb_data.Tmp.t.secs=now;
ysp_glb_data.Mst.t.secs=now;
ysp_glb_data.GasPres.t.secs=now;
if(ysp_glb_data.MoDevConf.v.stVal)
}
unlock_input_data();
ysp_glb_data.Tmp.t.secs=now;//温度时标
get_presure(PRES_PA1,&ysp_glb_data.GasPres.v.f); //载气压力
ysp_glb_data.GasPres.t.secs=now;//压力时标
if(ysp_glb_data.MoDevConf.v.stVal)
{
ysp_glb_data.MoDevConf.q=INVALID;
}
else
else
{
ysp_glb_data.MoDevConf.q=GOOD;
}
update_flg++;
}
conv_pri2iec(&ysp_pri_data,&ysp_glb_data,0,0); //从ysp_pri_data赋值给ysp_glb_data
lock_scl_mem();
put_mv_data(0,0,(USR_MV *)&ysp_glb_data,sizeof(ysp_glb_data)/sizeof(USR_MV));
put_mv_data(0,0,(USR_MV *)&ysp_glb_data,sizeof(ysp_glb_data)/sizeof(USR_MV)); //将ysp_glb_data发送给iec61850服务
unlock_scl_mem();
}
}
}
stop_scl_mem();
}

@ -21,9 +21,16 @@
#include "sample_process.h"
#include "ctrl_process.h"
#include "iec61850_process.h"
//#include "modbus_rtu_slave.h"
#define APP_VERSION "ysp application v3.3(2016-07-14 12:00)"
//#define APP_VERSION "ysp application v3.3i(2020-09-17 13:00)"
//#define APP_VERSION "ysp application v3.3j(2021-05-25 13:00)"
//#define APP_VERSION "ysp application v3.3k(2022-08-15 15:00)"
//#define APP_VERSION "ysp application v3.3l(2022-09-19 23:00)"
#define APP_VERSION "ysp application v3.3m(2022-09-26 10:00)"
/*
2020-09-17 v3.3i modbus rtu slave
*/
typedef struct
{
@ -246,6 +253,7 @@ int main_message_process(ACTION_MSG_TYPE *msg)
{
float env_temp;//环境温度
float my_temp;//
int n;
switch(curr_state)
{
case SIX_SAMPLE:
@ -320,6 +328,37 @@ int main_message_process(ACTION_MSG_TYPE *msg)
//{
// LOG_DEBUG(TRACE_DEBUG,"Preaction:sample room colding will not start,env_temp=%f\n",env_temp);
// }
/*2022-09-09添加I9处理*/
for(n=0;n<2;n++)
{
relay_set(RLY_YV4,ON,1);
LOG_DEBUG(ACTION_DEBUG,"YV4 ON\n");
sleep(1);
relay_set(RLY_YV11,ON,0);
relay_set(RLY_YV12,ON,1);
LOG_DEBUG(ACTION_DEBUG,"YV11 ON YV12 ON\n");
sleep(10);
relay_set(RLY_YV4,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"YV4 OFF\n");
sleep(3);
relay_set(RLY_YV12,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"YV12 OFF\n");
sleep(3);
relay_set(RLY_YV5,ON,0);
relay_set(RLY_YV11,ON,0);
relay_set(RLY_YV13,ON,1);
LOG_DEBUG(ACTION_DEBUG,"YV5 YV11 YV13 ON\n");
sleep(3);
relay_set(RLY_YV13,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"YV13 OFF\n");
sleep(1);
relay_set(RLY_YV5,OFF,0);
relay_set(RLY_YV11,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"YV5 YV11 OFF\n");
sleep(1);
}
gas_make_stat.dly_cnt=0;
gas_make_stat.repeat_cnt=0;
gas_make_stat.step=50;
@ -371,6 +410,44 @@ void stop_curr_process(int reason)
printf("stop current process\n");
}
int pull_yv6(int timeout)
{
int i;
relay_set(RLY_YV7,OFF,0);
relay_set(RLY_YV6,ON,1);
for(i=0;i<timeout;i++)
{
usleep(500000);
if(io_get(STA_I7)==ON)
{
break;
}
}
if(io_get(STA_I7)==ON)
return 0;
return 1;
}
int push_yv7(int timeout)
{
int i;
relay_set(RLY_YV6,OFF,0);
relay_set(RLY_YV14,ON,0);
relay_set(RLY_YV7,ON,1);
for(i=0;i<timeout;i++)
{
usleep(500000);
if(io_get(STA_I6)==ON)
{
break;
}
}
relay_set(RLY_YV14,OFF,1);
if(io_get(STA_I6)==ON)
return 0;
return 1;
}
int gas_clean(void)
{
switch(gas_clean_stat.step)
@ -385,18 +462,26 @@ int gas_clean(void)
}
else
{
//推动一下YV7,让I6到位
LOG_DEBUG(ERROR_DEBUG,"clean_step=%d:I6 is not in right pos\n",gas_clean_stat.step);
stop_gas_clean(gas_clean_stat.step);
return gas_clean_stat.step;
if(push_yv7(3*I6_WAIT_CNT/2))
{
stop_gas_clean(gas_clean_stat.step);
return gas_clean_stat.step;
}
gas_clean_stat.dly_cnt=0;
gas_clean_stat.repeat_cnt=0;
gas_clean_stat.step++;
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:I6 is in right position after push yv7\n",gas_clean_stat.step);
}
break;
case 2://开YV14
case 2://开清洗排空阀YV14,连通外界
relay_set(RLY_YV14,ON,1);
gas_clean_stat.dly_cnt=0;
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV14 ON\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 3://开YV6
case 3://开YV6,拉气缸=从外界吸入空气
if(gas_clean_stat.dly_cnt==0)
{
relay_set(RLY_YV7,OFF,0);
@ -431,7 +516,7 @@ int gas_clean(void)
gas_clean_stat.dly_cnt++;
}
break;
case 4://开YV7
case 4://开YV7,推气缸=将气缸里的气体推出到外界
if(gas_clean_stat.dly_cnt==0)
{
relay_set(RLY_YV6,OFF,0);
@ -487,13 +572,13 @@ int gas_clean(void)
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV14 OFF\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 7://开YV15
case 7://开YV15=气缸集气阀
relay_set(RLY_YV15,ON,1);
gas_clean_stat.dly_cnt=0;
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV15 ON\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 8://开YV6
case 8://开YV6,从气杯抽气体
if(gas_clean_stat.dly_cnt==0)
{
relay_set(RLY_YV7,OFF,0);
@ -534,7 +619,7 @@ int gas_clean(void)
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV15 OFF\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 10://开YV10,延时6秒
case 10://开YV10(连接到了YV20载气清洗阀),延时6秒
if(gas_clean_stat.dly_cnt==0)
{
relay_set(RLY_YV10,ON,1);
@ -562,13 +647,13 @@ int gas_clean(void)
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV10 OFF\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 12://开YV14
case 12://开YV14,开清洗排空阀,将管内气体用载气冲出到外界
relay_set(RLY_YV14,ON,1);
gas_clean_stat.dly_cnt=0;
LOG_DEBUG(ACTION_DEBUG,"clean_step=%d:YV14 ON\n",gas_clean_stat.step);
gas_clean_stat.step++;
break;
case 13://开YV7
case 13://开YV7,同时将气缸载气推出外界
if(gas_clean_stat.dly_cnt==0)
{
relay_set(RLY_YV6,OFF,0);
@ -1114,6 +1199,7 @@ int gas_make(void)
return gas_make_stat.step;
}
}
if(gas_clean()!=0)
{
LOG_DEBUG(ERROR_DEBUG,"gas clean failed\n");
@ -1167,10 +1253,10 @@ int gas_make(void)
}
break;
case 3://关电机
relay_set(RLY_KA1,OFF,0);
relay_set(RLY_YV16,OFF,0);
relay_set(RLY_YV13,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:KA1 OFF,YV16 OFF,YV13 OFF\n",gas_make_stat.step);
relay_set(RLY_KA1,OFF,0);
relay_set(RLY_YV16,OFF,0);
relay_set(RLY_YV13,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:KA1 OFF,YV16 OFF,YV13 OFF\n",gas_make_stat.step);
gas_make_stat.dly_cnt=0;
gas_make_stat.repeat_cnt=0;
gas_make_stat.step++;
@ -1367,25 +1453,31 @@ int gas_make(void)
gas_make_stat.dly_cnt=0;
gas_make_stat.step++;
break;
case 19://等待冷井温度<-25
get_temperature(TEMP_LJ,&fval);
case 19://等待冷井温度<-20
get_temperature(TEMP_LJ,&fval);//获取冷井温度
//if(fval>(-25))
if(fval>(-20))//2016-07-03
//if(fval>(-20))//2016-07-03
//2022-08-15 取消温度判断改为延时约4秒
/*if(fval>(-10))//2020-05-18
{
gas_make_stat.dly_cnt++;
if(gas_make_stat.dly_cnt>600)//5分钟未到达设置的温度
{
LOG_DEBUG(ERROR_DEBUG,"make_step=%d:wait lj temperature arrived -25 timeout %f,exit\n",gas_make_stat.step,fval);
stop_gas_make(gas_make_stat.step);
return gas_make_stat.step;
{ //等待冷井到达设置温度超时
LOG_DEBUG(ERROR_DEBUG,"make_step=%d:wait lj temperature arrived -10 timeout %f,exit\n",gas_make_stat.step,fval);
stop_gas_make(gas_make_stat.step);//停止造气
return gas_make_stat.step; //返回失败
}
if((gas_make_stat.dly_cnt%16)==0)
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:leng jin temp is %f\n",gas_make_stat.step,fval);
break;
}
}*/
gas_make_stat.dly_cnt++;
if(gas_make_stat.dly_cnt>=8)
{
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:leng jin temp is %f\n",gas_make_stat.step,fval);
gas_make_stat.dly_cnt=0;
gas_make_stat.step++;
}
break;
case 20://开YV7,关YV6
relay_set(RLY_YV6,OFF,0);
@ -1503,23 +1595,29 @@ int gas_make(void)
break;
case 22://等待冷井温度<-28
get_temperature(TEMP_LJ,&fval);
//2022-08-15注释掉冷井温度判断,只延时大约4秒
//if(fval>(-28))
if(fval>(-25))//2016-07-03
/* if(fval>(-25))//2016-07-03
{
gas_make_stat.dly_cnt++;
if(gas_make_stat.dly_cnt>600)//5分钟未到达设置的温度
{
LOG_DEBUG(ERROR_DEBUG,"make_step=%d:wait lj temperature arrived -28 timeout %f,exit\n",gas_make_stat.step,fval);
stop_gas_make(gas_make_stat.step);
return gas_make_stat.step;
}
if((gas_make_stat.dly_cnt%16)==0)
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:leng jin wendu is %f\n",gas_make_stat.step,fval);
break;
}
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:leng jin wen du is %f\n",gas_make_stat.step,fval);
gas_make_stat.dly_cnt=0;
gas_make_stat.step++;
}*/
gas_make_stat.dly_cnt++;
if(gas_make_stat.dly_cnt>=8)
{
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:leng jin wen du is %f\n",gas_make_stat.step,fval);
gas_make_stat.dly_cnt=0;
gas_make_stat.step++;
}
break;
case 23://开YV19
//relay_set(RLY_YV20,ON,0);//和YV19一起开,和YV18一起关
@ -2042,7 +2140,7 @@ int gas_make(void)
gas_make_stat.step++;
relay_set(RLY_YV11,ON,0);
relay_set(RLY_YV12,ON,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV11 ON\n",gas_make_stat.step);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV11 ON,YV12 ON\n",gas_make_stat.step);
break;
}
else
@ -2063,6 +2161,7 @@ int gas_make(void)
if(gas_make_stat.dly_cnt>(180*2))
{
relay_set(RLY_YV12,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV12 OFF\n",gas_make_stat.step);
usleep(1000000);
relay_set(RLY_YV4,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV4 OFF\n",gas_make_stat.step);
@ -2105,7 +2204,9 @@ int gas_make(void)
else
{
relay_set(RLY_YV5,ON,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV5 ON\n",gas_make_stat.step);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV5 ON\n",gas_make_stat.step);
relay_set(RLY_YV13,ON,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV13 ON\n",gas_make_stat.step);
gas_make_stat.dly_cnt=0;
gas_make_stat.step++;
}
@ -2114,6 +2215,9 @@ int gas_make(void)
gas_make_stat.dly_cnt++;
if(gas_make_stat.dly_cnt>8)
{
relay_set(RLY_YV13,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV13 OFF\n",gas_make_stat.step);
relay_set(RLY_YV11,OFF,1);
LOG_DEBUG(ACTION_DEBUG,"make_step=%d:YV11 OFF,YV5 OFF\n",gas_make_stat.step);
usleep(1000000);
@ -2176,6 +2280,7 @@ int gas_make(void)
}
relay_set(RLY_YV18,ON,0);//开吹扫阀
relay_set(RLY_KA3,OFF,0);//关柜子风扇
LOG_DEBUG(ACTION_DEBUG,"YV18 ON,KA3 OFF\n");
time_record.heat_start_time=time(NULL)+60;//一分钟后开传感器加热
relay_dly_open_set(RLY_SENSOR,1*60);//1分钟后开启
}
@ -2588,7 +2693,7 @@ void gas_pump_process(void)
unsigned char curr_state;
float curr_pres,pre_pres;
run_tick++;
if((run_tick&1)==0)
if((run_tick&1)==0)//每隔1秒运行一次
{
get_presure(PRES_PA1,&curr_pres);//获取载气压力
relay_get(RLY_PUMP,&curr_state);//获取当前状态
@ -2597,18 +2702,19 @@ void gas_pump_process(void)
on_time_tick++;
if(on_time_tick==2)
{
start_pres=curr_pres;
start_pres=curr_pres;//记录起始压力
}
if(on_time_tick==16)
if(on_time_tick==60)//2022-08-15由24秒改成60秒
{
if(curr_pres<(start_pres+0.1))
{
relay_set(RLY_PUMP,OFF,1);
on_time_tick=0;
LOG_DEBUG(ERROR_DEBUG,"gas pump working bad,pres_pres=%fMpa,curr_pres=%fMpa\r\n",start_pres,curr_pres);
LOG_DEBUG(ERROR_DEBUG,"gas pump working bad,start_pres=%fMpa,curr_pres=%fMpa\r\n",start_pres,curr_pres);
my_para_data.mach_run_para.auto_gas_en=0;
//载气异常告警
ysp_glb_data.ActCyGasSta.v.stVal=1;
//ysp_glb_data.ActCyGasSta.v.stVal=1;
ysp_glb_data.ActCyGasSta.v.stVal=0;//2021-06-08屏蔽载气异常告警
ysp_glb_data.ActCyGasSta.q=0;
ysp_glb_data.ActCyGasSta.t.secs=time(NULL);
return;
@ -2620,7 +2726,7 @@ void gas_pump_process(void)
ysp_glb_data.ActCyGasSta.t.secs=time(NULL);
}
}
if(on_time_tick>20)//计时超过20秒就关闭
if(on_time_tick>120)//计时超过30秒就关闭,2022-08-15由30秒改为120秒
{
relay_set(RLY_PUMP,OFF,1);
LOG_DEBUG(ERROR_DEBUG,"Stop gas pump for timeout,pres=%fMpa\r\n",curr_pres);
@ -2639,9 +2745,9 @@ void gas_pump_process(void)
{
if(curr_state==OFF)
{
if(comunication_flg)
relay_set(RLY_PUMP,ON,1);
LOG_DEBUG(TRACE_DEBUG,"Start gas pump,pres=%fMpa\r\n",curr_pres);
//if(comunication_flg)
relay_set(RLY_PUMP,ON,1);
LOG_DEBUG(TRACE_DEBUG,"Start gas pump,pres=%fMpa comunication_flg=%d\r\n",curr_pres,comunication_flg);
}
//启动气缸
}
@ -2781,6 +2887,39 @@ void old_log_process(time_t now)
}
}
void sample_pre_process(void)
{
float carrier_gas_pres;
unsigned char pump_rly_state;
int i;
my_para_data.mach_run_para.auto_gas_en=1;
relay_get(RLY_PUMP,&pump_rly_state);//获取当前状态
get_presure(PRES_PA1,&carrier_gas_pres);//获取载气压力
if(carrier_gas_pres<(STOP_PRES-0.09))
{
LOG_DEBUG(TRACE_DEBUG,"carrier_gas_pres=%fMpa\r\n",carrier_gas_pres);
relay_set(RLY_PUMP,ON,1);//打开气泵
LOG_DEBUG(TRACE_DEBUG,"pump power on\n");
for(i=0;i<30;i++)
{
sleep(1);//延时1s
get_presure(PRES_PA1,&carrier_gas_pres);//获取载气压力
if(carrier_gas_pres>=STOP_PRES)
{
break;
}
}
relay_set(RLY_PUMP,OFF,1);
LOG_DEBUG(TRACE_DEBUG,"carrier_gas_pres=%fMpa stop pump\r\n",carrier_gas_pres);
LOG_DEBUG(TRACE_DEBUG,"pump power off\n");
}
else
{
/* code */
}
}
int main(int argc,char *argv[])
{
extern int send_ctrl_message(void);
@ -2799,6 +2938,7 @@ int main(int argc,char *argv[])
unsigned int smp_len;
struct stat st;
YSP_PRI_DATA dumy_ysp_data;
int gas_pump_stop_tick=0;
chdir("/usr/shxy/ysp/app");
if(argc>=3)
@ -2890,6 +3030,7 @@ int main(int argc,char *argv[])
last_sample_time_ex=last_sample_time;
time_record.dummy_sample_time=0;
//modbus_rtu_slave_init();
/*time_record.room_start_time=next_sample_time-45*60;
time_record.yv18_start_time=next_sample_time-15*60;
time_record.heat_start_time=next_sample_time+1*60; */
@ -2900,7 +3041,8 @@ int main(int argc,char *argv[])
//sensor_test(1000);
//return 1;
goahead_init();
printf("version is v3.3:2015-11-24 10:57\n");
//printf("version is v3.3:2015-11-24 10:57\n");
LOG_DEBUG(TRACE_DEBUG,APP_VERSION);
smp_len=0;
if(query_sample_data((unsigned char *)&smp_len,sizeof(SAMPLE_INPUT_TYPE))!=0)
{
@ -3060,6 +3202,12 @@ int main(int argc,char *argv[])
if(now>=next_sample_time)
{
time_record.sample_start_time=now;//记录采样开始时刻
//2021-03-09添加排水阀处理每次采样前开3秒钟
relay_set(RLY_KA8,ON,1);
LOG_DEBUG(TRACE_DEBUG,"KA8 ON\n");
sleep(3);
relay_set(RLY_KA8,OFF,1);
LOG_DEBUG(TRACE_DEBUG,"KA8 OFF\n");
//启动采样
LoadAllPara(&my_para_data);
LOG_DEBUG(TRACE_DEBUG,"reload all parameter\n");
@ -3071,6 +3219,7 @@ int main(int argc,char *argv[])
sample_cnt=(my_para_data.mach_run_para.upload_time/my_para_data.mach_run_para.start_interval);
if((upload_tick%sample_cnt)==0)
{
sample_pre_process();//add by tmb at 20200829
//启动硬采样
if(SendActionReq(SIX_SAMPLE,0)!=0)
LOG_DEBUG(TRACE_DEBUG,"send start six sample request failed\n");
@ -3087,6 +3236,7 @@ int main(int argc,char *argv[])
else
{
//调试模式
sample_pre_process();//add by tmb at 20200829
if(SendActionReq(SIX_SAMPLE,0)!=0)
LOG_DEBUG(TRACE_DEBUG,"send start six sample request failed\n");
else
@ -3146,7 +3296,18 @@ int main(int argc,char *argv[])
if(my_para_data.mach_run_para.auto_gas_en)
{
gas_pump_process();
gas_pump_stop_tick=0;
}
else
{
//2022-08-15 添加每隔半小时开启自动造气
gas_pump_stop_tick++;
if(gas_pump_stop_tick>=3600)
{
my_para_data.mach_run_para.auto_gas_en=1;
LOG_DEBUG(TRACE_DEBUG,"force enable auto make gas\n");
}
}
//采样完成后,延时10分钟关传感器加热,关吹扫阀,关YV20
relay_dly_process();
HeatAutoTuneProcess(now);

@ -0,0 +1 @@
2020-06-09 21:00 v3.3b tian jia co2 parameter setting

@ -7,12 +7,12 @@
#include "analysis.h"
#include "ysp_debug.h"
#define COMTADE_DIR "/COMTRADE"
#define VIN 4.096 //电桥输入电压
#define GND_OFFS 0.254 //差分运放输出基准偏置
#define AMP 5.94 //差分运放放大倍数
#define IN_OFFS //差分运放负引脚偏置电压
#define COMTADE_DIR "/COMTRADE" //默认波形存储目录
#define RAW_WAVE_DIR "/usr_app/data"
#define VIN 4.096 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
#define GND_OFFS 0.254 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼ƫ<EFBFBD><EFBFBD>
#define AMP 5.94 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷ŷŴ<EFBFBD><EFBFBD><EFBFBD>
#define IN_OFFS //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>õ<EFBFBD>ѹ
#define MCU_VREF 3.3
/*
typedef struct{
@ -37,7 +37,7 @@ float temperature;
unsigned int rsv[3];
}SAMPLE_OUTPUT_TYPE;
*/
static const char *dir_store_data=COMTADE_DIR;
static const char *dir_store_data=RAW_WAVE_DIR;//COMTADE_DIR; //2021-10-28修改默认波形存储目录为RAW_WAVE_DIR
static unsigned char sample_rx_buf[SEGMENT_LENGTH+7];
static unsigned char sample_tx_buf[128];
static unsigned short data_buf[10000];
@ -84,7 +84,7 @@ int sample_check(unsigned char *buf,unsigned char cmd,unsigned int buf_len)
}
//查询是否有采样数据
//<EFBFBD><EFBFBD>ѯ<EFBFBD>Ƿ<EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int query_sample_data(unsigned char *ret_data,int len)
{
int length;
@ -141,7 +141,7 @@ unsigned int query_sample_data_ex(unsigned char *ret_data,int len)
}*/
//清除采样数据
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int clear_sample_data(void)
{
int length;
@ -170,7 +170,7 @@ unsigned int clear_sample_data(void)
}
//清除采样数据
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int clear_co2_data(void)
{
int length;
@ -198,7 +198,7 @@ unsigned int clear_co2_data(void)
return 3;
}
//启动采样
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int start_sample_data(unsigned int ch,SAMPLE_PARA_TYPE *sample_para)
{
int length;
@ -243,7 +243,7 @@ int start_sample_data(unsigned int ch,SAMPLE_PARA_TYPE *sample_para)
}
/*
//启动传感器加热
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int start_sample_heat(unsigned char ch,unsigned char flg)
{
int length;
@ -269,8 +269,8 @@ int start_sample_heat(unsigned char ch,unsigned char flg)
return 3;
}*/
//读数据
//start_pos=起始位置(字节),len=读取长度(字节)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//start_pos=<EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>),len=<3D><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>)
int read_co2_segment(int start_pos,int len)
{
int length;
@ -309,7 +309,7 @@ int read_co2_segment(int start_pos,int len)
return 3;
}
//total_len字节长度
//total_len<EFBFBD>ֽڳ<EFBFBD><EFBFBD><EFBFBD>
unsigned int read_co2_data(unsigned int total_len)
{
unsigned int i;
@ -361,8 +361,8 @@ unsigned int read_co2_data(unsigned int total_len)
//读数据
//start_pos=起始位置(字节),len=读取长度(字节)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//start_pos=<EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>),len=<3D><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>)
int read_segment_data(int start_pos,int len)
{
int length;
@ -401,7 +401,7 @@ int read_segment_data(int start_pos,int len)
return 3;
}
//total_len字节长度
//total_len<EFBFBD>ֽڳ<EFBFBD><EFBFBD><EFBFBD>
unsigned int read_sample_data(unsigned int total_len)
{
unsigned int i;
@ -459,14 +459,14 @@ char *make_data_file_name(time_t now,unsigned int i)
char date_str[32];
memset(file_name,0,sizeof(file_name));
if(i==0)
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.bin",localtime(&now));
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.bin",localtime(&now));//二进制六组分文件
else if(i==1)
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.csv",localtime(&now));
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.csv",localtime(&now));//
else if(i==2)
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.co2",localtime(&now));
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.co2",localtime(&now));//co2文件
else
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.csv",localtime(&now));
sprintf(file_name,"%s/%s",dir_store_data,date_str);
strftime(date_str,sizeof(date_str),"%Y%m%d_%H%M%S.csv",localtime(&now));//
sprintf(file_name,"%s/%s",dir_store_data,date_str);//dir_store_data为默认波形存储目录
return file_name;
}
@ -494,7 +494,7 @@ int savefile(const char *file,long offs,void *ptr,unsigned int size)
return 0;
}
//采样数据直接存成32位二进制,size为字节长度
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><EFBFBD>32λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,sizeΪ<65>ֽڳ<D6BD><DAB3><EFBFBD>
int save_hex_file(const char *file,long offs,void *ptr,unsigned int size)
{
FILE *fp;
@ -526,7 +526,7 @@ int save_hex_file(const char *file,long offs,void *ptr,unsigned int size)
}
/*
//采样数据存成二进制浮点数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int save_float_file(const char *file,long offs,void *ptr,unsigned int size)
{
static float file_buf[5000];
@ -576,7 +576,7 @@ void RawConvVolt(int tmp,float *volt)
}
/*
//采样数据转换成电压再存成二进制浮点数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ<EFBFBD>ٴ<EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int save_float_file_ex(const char *file,long offs,void *ptr,unsigned int size)
{
static float file_buf[5000];
@ -650,7 +650,7 @@ int save_csv_file(const char *file,long offs,void *ptr,unsigned int size)
}
//保存数据,len为字节长度
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,lenΪ<6E>ֽڳ<D6BD><DAB3><EFBFBD>
int save_sample_data(unsigned int len)
{
int ret;
@ -658,11 +658,11 @@ int save_sample_data(unsigned int len)
time_t now;
now=time(NULL);
last_sample_time=now;
last_sample_time=now;//存储本次采样时间
my_file_name=make_data_file_name(now,0);//创建bin文件名
my_file_name=make_data_file_name(now,0);//生成原始波形文件名
if((ret=save_hex_file(my_file_name,0,(void *)data_buf,len))!=0)
if((ret=save_hex_file(my_file_name,0,(void *)data_buf,len))!=0)//保存原始波形文件
{
LOG_DEBUG(ERROR_DEBUG,"save bin file failed %s\n",my_file_name);
return -1;
@ -673,13 +673,13 @@ int save_sample_data(unsigned int len)
return -1;
}*/
if(send_analysis_req(my_file_name,strlen(my_file_name))!=0)
if(send_analysis_req(my_file_name,strlen(my_file_name))!=0)//发送波形分析请求
{
LOG_DEBUG(ERROR_DEBUG,"Send analysis request failed:file name is %s\n",my_file_name);
return -2;
}
my_file_name=make_data_file_name(now,1);//创建csv文件名
my_file_name=make_data_file_name(now,1);//生成csv文件名
if((ret=save_csv_file(my_file_name,0,(void *)data_buf,len))!=0)
{
LOG_DEBUG(ERROR_DEBUG,"save csv file failed %s\n",my_file_name);
@ -689,10 +689,11 @@ int save_sample_data(unsigned int len)
return ret;
}
//保存数据,len为字节长度
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,lenΪ<6E>ֽڳ<D6BD><DAB3><EFBFBD>
int save_co2_data(unsigned int len)
{
extern int analysis_co2(unsigned short *buf,unsigned int buf_len,float *result);
extern int analysis_co2ex(unsigned short *buf,unsigned int buf_len,float *result);
int ret=0;
char *my_file_name;
time_t now;
@ -700,7 +701,8 @@ int save_co2_data(unsigned int len)
now=time(NULL);
//last_sample_time=now;
if(analysis_co2(data_buf,len,&co2_ppm)==0)
//if(analysis_co2(data_buf,len,&co2_ppm)==0)
if(analysis_co2ex(data_buf,len/2,&co2_ppm)==0)//2020-06-11:change len to len/2
{
last_co2_ppm=co2_ppm;
co2_is_ok=1;
@ -709,18 +711,18 @@ int save_co2_data(unsigned int len)
else
{
// last_co2_ppm=0;
last_co2_ppm=co2_ppm;//2015-11-11直线的时候以基线为测量值
last_co2_ppm=co2_ppm;//2015-11-11ֱ<EFBFBD>ߵ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
co2_is_ok=0;
LOG_DEBUG(ERROR_DEBUG,"analysis co2 failed co2=%fppm\n",co2_ppm);
}
my_file_name=make_data_file_name(now,2);//创建co2文件名
my_file_name=make_data_file_name(now,2);//生成co2原始文件名
if((ret=save_hex_file(my_file_name,0,(void *)data_buf,len))!=0)
{
LOG_DEBUG(ERROR_DEBUG,"save bin file failed %s\n",my_file_name);
return -1;
}
my_file_name=make_data_file_name(now,3);//创建csv文件名
my_file_name=make_data_file_name(now,3);//生成csv文件名
if((ret=save_csv_file(my_file_name,0,(void *)data_buf,len))!=0)
{
LOG_DEBUG(ERROR_DEBUG,"save csv file failed %s\n",my_file_name);

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save