用libmodbus写了一个modbus tcp服务端,但是写的这个服务端不同于标准的modbus tcp架构,这个服务端是主动请求客户端数据,客户端连接服务端,为啥服务端给客户端发送请求时,帧结构中的事物处理标识,在客户端断开连接后没清零,客户端再次重新连接,事务处理标识是接着上次的数字自增,而不是从1开始。还有开两个服务端时候,共用一个事物处理标识,两个服务端的事物处理标识交叉自增的。
17条回答 默认 最新
关注 获得0.45元问题酬金 引自免费微信小程序:皆我百晓生
这个问题可能是由于libmodbus库没有正确处理事务处理标识导致的。事务处理标识(Transaction Identifier)是Modbus协议中用于识别不同请求和响应之间的关联的字段。每当客户端发送一个请求时,事务处理标识会自增,然后服务端根据该标识进行响应。
关于您描述的问题,出现事务处理标识不清零或交叉自增的情况,可能是以下几个原因导致的:
-
代码逻辑错误:您可能在处理连接断开时没有正确处理事务处理标识的清零。需要在客户端断开连接时,将相应的事务处理标识重置为初始值。
-
并发访问问题:由于您开启了两个服务端,而两个服务端使用了共享的事务处理标识,这可能导致两个服务端同时访问并自增同一个事务处理标识的值。您可以尝试为每个服务端分配独立的事务处理标识。
针对这个问题,我为您提供以下解决方案:
1. 清零事务处理标识:
您可以在处理客户端连接断开的地方,手动将事务处理标识重置为初始值。示例如下:
void handleClientDisconnect(int clientSocket) { // 关闭客户端连接,处理事务处理标识的清零 resetTransactionIdentifier(); } void resetTransactionIdentifier() { // 将事务处理标识重置为初始值 transactionIdentifier = 0; // 或者是你希望的起始值 }
2. 分配独立的事务处理标识:
为每个服务端分配独立的事务处理标识,可以使用不同的计数器或者变量。示例如下:
int server1TransactionIdentifier = 0; // 服务端1的事务处理标识 int server2TransactionIdentifier = 0; // 服务端2的事务处理标识 void incrementServer1TransactionIdentifier() { server1TransactionIdentifier++; } void incrementServer2TransactionIdentifier() { server2TransactionIdentifier++; }
这样,您就可以在每个服务端的请求中使用相应的事务处理标识。
希望以上解决方案能够帮助您解决问题!如有需要,请告知。
解决 无用评论 打赏 举报-
悬赏问题
- ¥15 依据报错在原代吗格式的基础上解决问题
- ¥15 在虚拟机中安装flash code
- ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
- ¥20 verilog状态机方法流水灯
- ¥15 pandas代码实现不了意图
- ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
- ¥25 LT码在高斯信道下的误码率仿真
- ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
- ¥15 yolov5目标检测并显示目标出现的时间或视频帧
- ¥15 电视版的优酷可以设置电影连续播放吗?