不会编程的猫咪 2023-12-31 16:36 采纳率: 0%
浏览 84
已结题

libmodbus 库的modbus tcp使用问题

用libmodbus写了一个modbus tcp服务端,但是写的这个服务端不同于标准的modbus tcp架构,这个服务端是主动请求客户端数据,客户端连接服务端,为啥服务端给客户端发送请求时,帧结构中的事物处理标识,在客户端断开连接后没清零,客户端再次重新连接,事务处理标识是接着上次的数字自增,而不是从1开始。还有开两个服务端时候,共用一个事物处理标识,两个服务端的事物处理标识交叉自增的。

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-12-31 19:48
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    这个问题可能是由于libmodbus库没有正确处理事务处理标识导致的。事务处理标识(Transaction Identifier)是Modbus协议中用于识别不同请求和响应之间的关联的字段。每当客户端发送一个请求时,事务处理标识会自增,然后服务端根据该标识进行响应。

    关于您描述的问题,出现事务处理标识不清零或交叉自增的情况,可能是以下几个原因导致的:

    1. 代码逻辑错误:您可能在处理连接断开时没有正确处理事务处理标识的清零。需要在客户端断开连接时,将相应的事务处理标识重置为初始值。

    2. 并发访问问题:由于您开启了两个服务端,而两个服务端使用了共享的事务处理标识,这可能导致两个服务端同时访问并自增同一个事务处理标识的值。您可以尝试为每个服务端分配独立的事务处理标识。

    针对这个问题,我为您提供以下解决方案:

    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++;
    }
    

    这样,您就可以在每个服务端的请求中使用相应的事务处理标识。

    希望以上解决方案能够帮助您解决问题!如有需要,请告知。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 赞助了问题酬金15元 12月31日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?