Browse Source

20230627, huli snap7

yct 1 year ago
parent
commit
62d7a85e46

+ 2 - 0
plc调度节点/error_code/error_code.h

@@ -5,6 +5,8 @@
 //#define PROCESS_TEST 1
 //#define TIME_TEST 1
 
+#define SETTING_PATH "../setting/"
+
 #define PLC_S7_COMMUNICATION 1	//是否开启plc的通信, 1:开启和plc的通信, 注释:关闭和plc的通信
 #define WAIT_PLC_RESPONSE 1		//是否等待plc的答复, 1:等待plc的答复, 注释:不等待plc的答复,直接向主控返回成功
 //#define MEASURE_TO_PLC_CORRECTION 1		//修正感测数据, 1:对感测数据进行修正, 注释:不修改感测数据.由感测模块去调整

+ 31 - 2
plc调度节点/snap7_communication/snap7_communication_base.cpp

@@ -10,7 +10,7 @@ Snap7_communication_base::Snap7_communication_base()
 	m_communication_status = SNAP7_COMMUNICATION_UNKNOWN;
 	m_communication_delay_time_ms = SNAP7_COMMUNICATION_DELAY_TIME_MS;
 	mp_communication_thread = NULL;
-
+	m_error_count = 0;
 }
 
 Snap7_communication_base::~Snap7_communication_base()
@@ -21,7 +21,7 @@ Snap7_communication_base::~Snap7_communication_base()
 //初始化 通信 模块。如下三选一
 Error_manager Snap7_communication_base::communication_init()
 {
-	return  communication_init_from_protobuf(SNAP7_COMMUNICATION_PARAMETER_PATH);
+	return  communication_init_from_protobuf(SETTING_PATH SNAP7_COMMUNICATION_PARAMETER_PATH);
 }
 //初始化 通信 模块。从文件读取
 Error_manager Snap7_communication_base::communication_init_from_protobuf(std::string prototxt_path)
@@ -125,6 +125,13 @@ Error_manager Snap7_communication_base::set_communication_delay_time_ms(int time
 	return Error_code::SUCCESS;
 }
 
+//修改状态
+Error_manager Snap7_communication_base::set_snap7_communication_statu(Snap7_communication_base::Snap7_communication_statu statu)
+{
+	m_communication_status = statu;
+	return Error_code::SUCCESS;
+}
+
 //通信连接
 Error_manager Snap7_communication_base::communication_connect(std::string ip_string)
 {
@@ -198,6 +205,17 @@ Error_manager t_error;
 							//接受数据, 读取DB块,
 							t_error = read_data_buf(iter->second);
 							if (t_error == Error_code::SNAP7_READ_ERROR)
+							{
+								m_error_count++;
+								LOG(INFO) << "find plc connection error, error_conut = "<< m_error_count;
+								std::this_thread::sleep_for(std::chrono::milliseconds(100));
+							}
+							else
+							{
+								m_error_count = 0;
+							}
+
+							if ( m_error_count >= SNAP7_COMMUNICATION_ERROR_COUNT_MAX )
 							{
 								m_communication_status = SNAP7_COMMUNICATION_DISCONNECT;
 								std::cout << " huli test :::: " << " t_error = " << t_error << std::endl;
@@ -226,6 +244,17 @@ Error_manager t_error;
 							//发送数据, 写入DB块,
 							t_error = write_data_buf(iter->second);
 							if (t_error == Error_code::SNAP7_WRITE_ERROR)
+							{
+								m_error_count++;
+								LOG(INFO) << "find plc connection error, error_conut = "<< m_error_count;
+								std::this_thread::sleep_for(std::chrono::milliseconds(100));
+							}
+							else
+							{
+								m_error_count = 0;
+							}
+
+							if ( m_error_count >= SNAP7_COMMUNICATION_ERROR_COUNT_MAX )
 							{
 								m_communication_status = SNAP7_COMMUNICATION_DISCONNECT;
 								std::cout << " huli test :::: " << " t_error = " << t_error << std::endl;

+ 9 - 1
plc调度节点/snap7_communication/snap7_communication_base.h

@@ -21,8 +21,12 @@ class Snap7_communication_base
 public:
 	//snap7的通信延时, 默认50ms
 #define SNAP7_COMMUNICATION_DELAY_TIME_MS 	10
+
+//snap7, 通信错误的最大次数, 默认3
+#define SNAP7_COMMUNICATION_ERROR_COUNT_MAX 	10
+
 //snap7的通信参数路径
-#define SNAP7_COMMUNICATION_PARAMETER_PATH	"../setting/snap7_communication.prototxt"
+#define SNAP7_COMMUNICATION_PARAMETER_PATH	"snap7_communication.prototxt"
 	//通信状态
 	enum Snap7_communication_statu
 	{
@@ -61,6 +65,9 @@ public://get or set member variable
 	//修改通信延时, 单位ms
 	Error_manager set_communication_delay_time_ms(int time);
 
+	//修改状态
+	Error_manager set_snap7_communication_statu(Snap7_communication_base::Snap7_communication_statu statu);
+
 protected://member functions
 	//通信连接
 	Error_manager communication_connect(std::string ip_string);
@@ -86,6 +93,7 @@ public:
 	//状态
 	Snap7_communication_statu				m_communication_status;	//通信状态
 	std::string						m_ip_string;			//通信ip
+	int 							m_error_count;			//错误的计数, 如果超过3次就重连
 
 	//通信模块
 	std::mutex  					m_communication_lock;	//通信锁