• 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

    欢迎关注:

  • 相关阅读:
    Linux下安装FTP服务(Ubuntu)
    Ubuntu下无法使用Secure_CRT连接服务器
    Mysql 锁机制
    PHP提取HTML代码中img标签下src属性
    Mysql 隐式转换
    PHPExcel在TP下使用
    ThinkPHP同时操作多个数据库
    PHP 时间相关操作
    ThinkPHP输入验证和I方法使用
    ThinkPHP模板内使用U方法
  • 原文地址:https://www.cnblogs.com/foxclever/p/9727389.html
Copyright © 2020-2023  润新知