当前位置: 首页 > web >正文

AT32网线拔插下,modbus tcp断线重连

此处断线重连指的是,网线拔掉后的重连。

分析

我们首先看modbus初始化函数。

while(emac_system_init() == ERROR);
tcpip_stack_init();
modbustcp_init();||创建任务v
sys_thread_new("modbustcp_thread", modbustcp_thread, NULL, 512,6);
--------------------||v
void modbustcp_thread(void *arg)
{	LWIP_UNUSED_ARG(arg);
eMBErrorCode    xStatus;
for( ;; )
{if( eMBTCPInit( MB_TCP_PORT_USE_DEFAULT ) != MB_ENOERR){#ifdef MYDEBUGprintf("%s: can't initialize modbus stack!\r\n", PROG);#endif}else if( eMBEnable(  ) != MB_ENOERR ){#ifdef MYDEBUGprintf("%s: can't enable modbus stack!\r\n", PROG );#endif}else{do{xStatus = eMBPoll(  );vTaskDelay(5);}while( xStatus == MB_ENOERR );}/* An error occured. Maybe we can restart. */( void )eMBDisable(  );( void )eMBClose(  );
}
}

网线断连不在modbus这里,而是在lwip协议里。

我们打开

tcpip_stack_init();

发现它主要是做了一个网络的初始化,并且创建了一个任务,这个任务就是用来检测是否发生网络问题。(这里优先级原本为3,这里我修改了一下)

xTaskCreate((TaskFunction_t)ethernetif_set_link, "ethernetif_set_link", 512, &netif, tskIDLE_PRIORITY + 4, &link_status_handler);

走进任务

void ethernetif_set_link(void const *argument)
{struct netif *netif = (struct netif *)argument;uint16_t regvalue = 0;for(;;){/* Read PHY_BSR*/regvalue = link_update();if(regvalue > 0){at32_led_on(LED4);at32_led_off(LED2);}else{at32_led_on(LED2);at32_led_off(LED4);}/* Check whether the netif link down and the PHY link is up */if(!netif_is_link_up(netif) && (regvalue)){/* network cable is connected */ netif_set_link_up(netif);        }else if(netif_is_link_up(netif) && (!regvalue)){/* network cable is dis-connected */netif_set_link_down(netif);;}/* Suspend thread for 200 ms */vTaskDelay(200);}
}

首先,通过link_update函数来获取链路是否连接,即网线是否正常插上。其次netif_is_link_up是用来检测是否有网络连接。这里两个判断,是判断:

一、网线正常插上,但是网络没有连接上、就调用netif_set_link_up来进行连接。

二、网线没有插上,但是网络已经连接过了,这里调用netif_set_link_down进行断开。

我们要做的就是这里:

修改

在这个函数外部,加上变量作为标志位:

ConnectState modbus_need_reconnect = EMAC_START;

在该函数头文件里增加:

typedef enum conState{EMAC_START = 0,	//无链路连接,无网络连接,此时代表刚上电。EMAC_ERROR,			//无链路连接,有网络连接,此时代表错误发生,需要重新连接EMAC_CONNECT,		//有链路连接,无网络连接,此时代表需要进行连接EMAC_OK		//有链路连接,有网络连接,此时代表正常连接中
}ConnectState;
extern ConnectState modbus_need_reconnect; //该变量用于判断是否发生断开。当网线断开时为0,连接时为1;

我这里定义了四种状态,分别作为连接的状态,通过不同的状态,我们可以得到此刻网络的情况,来进行对应的处理。

那么我们打开我们modbus初始化的文件。在头文件里记得包含这个变量

extern ConnectState modbus_need_reconnect;

然后修改初始化代码:

void modbustcp_thread(void *arg)
{	LWIP_UNUSED_ARG(arg);eMBErrorCode    xStatus;for( ;; )
{if(modbus_need_reconnect != EMAC_OK){vTaskDelay(100);continue;}if( eMBTCPInit( MB_TCP_PORT_USE_DEFAULT ) != MB_ENOERR || modbus_need_reconnect != EMAC_OK){#ifdef MYDEBUGprintf("%s: can't initialize modbus stack!\r\n current connect state:%d\n", PROG , modbus_need_reconnect);#endif}else if( eMBEnable(  ) != MB_ENOERR || modbus_need_reconnect != EMAC_OK ){#ifdef MYDEBUGprintf("%s: can't enable modbus stack!\r\n current connect state:%d\n", PROG ,modbus_need_reconnect);#endif}else{do{xStatus = eMBPoll(  );vTaskDelay(5);}while( xStatus == MB_ENOERR && modbus_need_reconnect == EMAC_OK);}/* An error occured. Maybe we can restart. */( void )eMBDisable(  );( void )eMBClose(  );
}
}

这里主要是多了个判断,如果已经ok了,那么就正常empoll,否则就restart,重新开始。

http://www.xdnf.cn/news/19999.html

相关文章:

  • Linux awk命令完全指南:从原理到实战,搞定文本处理难题
  • 【AI】人工智能 传统和现代 架构和算法的演变历史
  • windows安装谷歌浏览器地址
  • TypeScript `infer` 关键字详解(从概念到实战)
  • AGV 搬运小车路径规划:从地图构建到路径决策的技术全解析
  • 打通 Flutter 与原生状态管理:Android ViewModel 的运用
  • SpringBoot+PDF.js实现按需分片加载(包含可运行样例源码)
  • C++小游戏
  • 腾讯开源HunyuanWorld-Voyager突破性原生3D重建与视频扩散框架
  • 计算机大数据毕业设计选题:基于Spark+hadoop的全球香水市场趋势分析系统
  • 优思学院|5个为什么(5 Whys)分析法一文讲清楚
  • AI编写自动点击器 - 毫秒级精准鼠标连点器
  • kafka:【1】概念关系梳理
  • kvm 虚拟机如何安装 qemu-guest-agent
  • kali_linux
  • 【Linux】线程封装
  • 【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)
  • 采用基于模型的方法实现车辆SOA威胁分析自动化
  • wpf 自定义密码文本框,并且可以双向绑定
  • 吱吱企业通讯软件以安全为核心,构建高效沟通与协作一体化平台
  • 什么是Agent?小白如何学习使用Agent?一篇文档带你详细了解神秘的Agent
  • 容器tomcat镜像制作
  • 算法题2:动态规划
  • Python委托迭代完全指南:从基础到高级设计模式实践
  • Vision Pro图像处理工具全解析
  • Hadoop HDFS-SecondaryNameNode(2nn)详细介绍
  • PPI网络与TF-miRNA调控网络的实现方法(基于《列腺癌研究.pdf》)
  • 跟做springboot尚品甄选项目
  • 理解用户需求
  • 第6章:垃圾回收分析与调优