MODBUS通讯协议因为具有公开、无版权要求,易于部署以及维护的特点,所以应用较为广泛。围绕着测评NUCLEO-H743这一主题,在以太网基础上实现modbus通讯协议,也就是modbus/TCP,建立一个从站。本帖是在已经能够在nucleo-h7上建立一个cyclonetcp的TCP server基础上开展的。
定义一个结构体型变量ModbusServerSettings modbusServerSettings;
通过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的功能码进行读写线圈/寄存器操作,如下图所示。
以读线圈为例,modbusServerProcessReadCoilsReq将调用modbusServerReadCoil函数,代码如下图
从而,回到了给本文开头结构体变量赋值的那个用户需要实现的函数了。
这样,主要就可以读取地址为5,4,54的“线圈变量”的值了,对应的灯0,1,按键的状态,这里我想说的是,以上三个变量,我是通过三个I/O输入的电平高低来实现的。当我们需要采集数据,比如电压信号时,就需要用到modbus的“寄存器型变量”了。
此内容由EEWORLD论坛网友54chenjq原创,如需转载或用于商业用途需征得作者同意并注明出处