zoukankan      html  css  js  c++  java
  • Modbus库开发笔记:Modbus ASCII Master开发

      这一节我们来封装Modbus ASCII Master应用,Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用,而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数,以便在开发具体应用时调用。

      对于ASCII主站我们主要实现的功能有两个:其一是生成访问RTU从站的命令,总共支持8中功能码。其二是对ASCII从站端返回的信息进行解析并根据结果进行各种操作,同样也是支持8中功能吗的操作。具体软件访问结构如下:

     

    1、访问命令的生成

      客户端作为主动交互端,需要向服务器发各种操作请求命令。所以对于ASCII主站来说,首先要生成访问服务器的命令。生成命令只需要按标准的协议格式来生成即可,目前我们只支持前面提到的8个功能码。

    /*生成访问从站的命令*/

    uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo, void *dataList, uint8_t *commandBytes)

      这样在开发具体的客户端应用时只需要调用这个函数来生成访问服务器的命令就可以了。

    2、响应信息的解析

      如前一节所述,服务器收到命令后,根据命令进行处理并生成响应信息返回给客户端。客户端接到命令后首先要对响应信息进行解析,解析的过程其实与服务器端是一致的。所不同的是,不需要再根据解析结果生成响应信息了。

    /*解析收到的从站相应信息*/

    void ParsingAsciiSlaveRespondMessage(uint8_t *recievedMessage, uint8_t *command,uint16_t rxLength)

      这样在开发客户端应用时,我们调用这一函数来解析响应信息就可以了。

    3、响应处理

      对于解析出来的信息,我们需要根据情况实现操作,比如修改变量的值等,应为主要支持的操作码是8个,理论上对应的每种功能码都会有不同的操作,但事实上,由于写操作命令已经不需要做任何操作了,所以对应的操作实际上只有读操作的4种功能码。

    /*处理读从站状态量返回信息,读线圈状态位0x01功能码*/

    static void HandleReadCoilStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

    /*处理读从站状态量返回信息,读输入状态位0x02功能码*/

    static void HandleReadInputStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

    /*处理读从站寄存器值的返回信息,读保持寄存器0x03功能码)*/

    static void HandleReadHoldingRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

    /*处理读从站寄存器值的返回信息,读输入寄存器0x04功能码*/

    static void HandleReadInputRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

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

    void (*HandleServerRespond[])(uint8_t *,uint16_t,uint16_t)={HandleReadCoilStatusRespond, HandleReadInputStatusRespond, HandleReadHoldingRegisterRespond, HandleReadInputRegisterRespond};

      到这里,ASCII主站的封装就完成了,当然具体的数据处理部分需要在开发具体应用是才能确定。

      源代码可上Github下载:https://github.com/foxclever/Modbus

    欢迎关注:

  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/foxclever/p/9727389.html
Copyright © 2011-2022 走看看