[原创] 【 ST NUCLEO-H743ZI测评】建立一个modbus/TCP的从站

54chenjq   2019-2-24 23:13 楼主
       MODBUS通讯协议因为具有公开、无版权要求,易于部署以及维护的特点,所以应用较为广泛。围绕着测评NUCLEO-H743这一主题,在以太网基础上实现modbus通讯协议,也就是modbus/TCP,建立一个从站。本帖是在已经能够在nucleo-h7上建立一个cyclonetcp的TCP server基础上开展的。
定义一个结构体型变量ModbusServerSettings modbusServerSettings;

modbus1.PNG
通过modbusServerGetDefaultSettings(&modbusServerSettings);将变量设置为默认配置,

modbusServerSettings.interface = &netInterface[0];
modbusServerSettings.port = 502;
modbusServerSettings.lockCallback = modbusServerLockCallback;//null
modbusServerSettings.unlockCallback = modbusServerUnlockCallback;//null
modbusServerSettings.readCoilCallback = modbusServerReadCoilCallback;
modbusServerSettings.writeCoilCallback = modbusServerWriteCoilCallback;
modbusServerSettings.readRegCallback = modbusServerReadRegCallback;
modbusServerSettings.writeRegValueCallback = modbusServerWriteRegCallback;
以上内容分别是将网卡驱动,MODBUS从站(tcp server)端口,上锁/解锁操作(解决临界访问),读写coil与register函数
以上6个函数需要用户根据协议自己实现。通过modbusServerInit初始化modbus的TCP server然后modbusServerStart开启mosbus/tcp server,因为是基于freertos,modbusServerStart函数创建了一个modbusServerTask任务,这个任务会将以太网传输的数据进行解析,
modbusServerProcessConnectionEvents调用了modbusServerProcessRequest,处理来自于主站的命令。modbusServerProcessRequest将根据modbus的功能码进行读写线圈/寄存器操作,如下图所示。

modbus2.PNG

以读线圈为例,modbusServerProcessReadCoilsReq将调用modbusServerReadCoil函数,代码如下图

modbus3.PNG

从而,回到了给本文开头结构体变量赋值的那个用户需要实现的函数了。

modbus4.PNG

这样,主要就可以读取地址为5,4,54的“线圈变量”的值了,对应的灯0,1,按键的状态,这里我想说的是,以上三个变量,我是通过三个I/O输入的电平高低来实现的。当我们需要采集数据,比如电压信号时,就需要用到modbus的“寄存器型变量”了。


本帖简单介绍了在NUCLEO-H7上实现了mosbus/TCP的从站,粗略地讲解了数据的流向,其中MBAP header与事件等与mosbus/TCP中密切相关的内容并没有被提及,只是想让使用者能够快速上手。涉及到的一些除应用层的源码,都在https://github.com/Oryx-Embedded/CycloneTCP/tree/master/modbus此处可以见到,希望此贴对您有帮助。






此内容由EEWORLD论坛网友54chenjq原创,如需转载或用于商业用途需征得作者同意并注明出处


RTEMS

回复评论 (1)

因为太水,很少发帖,我将对帖子内容进行整理再公开。
RTEMS
点赞  2019-2-24 23:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复