zoukankan      html  css  js  c++  java
  • Modbus库开发笔记之五:Modbus RTU Slave开发

    Modbus在串行链路上分为Slave和Master,这一节我们就来开发Slave。对于Modbus RTU从站来说,需要实现的功能其实与Modbus TCP的服务器端是一样的。其操作过程也是一样的。首先接收到主站的访问命令,对该命令报文进行解析,这里我们也只是实现前面提到的8种功能码。其次我们根据解析的结果进行对应的操作,具体的软件访问结构如下:

    从上图中不难发现实际是3步:

    第1步、接到命令后先解析。解析的方式与前面几节中的类式。

    第2步、根据解析结果进行操作。包括更具命令修改或者获取变量的值。

    第3步、生成响应并返回给主机。

    1、解析主机命令

    从机在接收到主机的命令报文后,对其进行解析,我们暂且支持上图所示的8种功能码。

    /*解析接收到的信息,并返回合成的回复信息和信息的字节长度,通过回调函数*/

    uint16_t ParsingMasterAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes,uint16_t rxLength)

    该函数接收接受到的报文,并生成响应信息报文,返回值是响应报文的长度。在开发应用是将接收到的报文发送个该函数,并将生成的响应信息返回个客户端就可以了。

    2、结果操作

    解析之后无论是读命令还是写命令都需要进行相应的操作。我们根据不同的功能码封装不同的操作:

    /*处理读线圈状态命令*/

    static uint16_t HandleReadCoilStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理读输入状态命令*/

    static uint16_t HandleReadInputStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理读保持寄存器命令*/

    static uint16_t HandleReadHoldingRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理读输入寄存器命令*/

    static uint16_t HandleReadInputRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理写单个线圈命令*/

    static uint16_t HandleWriteSingleCoilCommand(uint16_t coilAddress,uint16_t coilValue,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理写单个寄存器命令*/

    static uint16_t HandleWriteSingleRegisterCommand(uint16_t registerAddress,uint16_t registerValue,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理写多个线圈状态*/

    static uint16_t HandleWriteMultipleCoilCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    /*处理写多个寄存器状态*/

    static uint16_t HandleWriteMultipleRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)

    同样我们也是定义一个函数指针数组来实现这8个函数的调用:

    uint16_t (*HandleMasterCommand[])(uint16_t,uint16_t,uint8_t *,uint8_t *)={HandleReadCoilStatusCommand,

                                                                              HandleReadInputStatusCommand,

                                                                              HandleReadHoldingRegisterCommand,

                                                                              HandleReadInputRegisterCommand,

                                                                              HandleWriteSingleCoilCommand,

                                                                              HandleWriteSingleRegisterCommand,

                                                                              HandleWriteMultipleCoilCommand,

                                                                              HandleWriteMultipleRegisterCommand};

    3、生成从机响应

    处理完还需要生成从机的相应信息,无论是读操作命令还是写操作命令,我们均在对应的功能码处理时生成响应报文。这么一来在开发应用时,只需要调用解析函数据可以实现全部的功能了。

  • 相关阅读:
    必备java参考资源列表
    java中使用js函数
    6.游戏特别离不开脚本(3)-JS脚本操作java(2)(直接解析JS公式,并非完整JS文件或者函数)
    6.游戏特别离不开脚本(3)-JS脚本操作java(直接解析JS公式,并非完整JS文件或者函数)
    6.游戏特别离不开脚本(2)-获取脚本引擎
    6.游戏特别离不开脚本(1)-原因
    5.eclipse 自带的jdk没有源码,改了它
    4.调个绿豆沙护眼色
    3.myeclipse 8.5 m1 注册码
    Zxing中文乱码的简单解决办法
  • 原文地址:https://www.cnblogs.com/foxclever/p/7258751.html
Copyright © 2011-2022 走看看