全球军事网站,求个网站2020急急急,php网站挂马,莱州信息网这一节我们来封装Modbus ASCII Master应用#xff0c;Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用#xff0c;而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数#xff0c;以便在开发具体应用时调用。
对于ASCII主站我们主…这一节我们来封装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
欢迎关注