【 ST NUCLEO-H743ZI测评】建立一个modbus/TCP的从站
<div class='showpostmsg'> MODBUS通讯协议因为具有公开、无版权要求,易于部署以及维护的特点,所以应用较为广泛。围绕着测评NUCLEO-H743这一主题,在以太网基础上实现modbus通讯协议,也就是modbus/TCP,建立一个从站。本帖是在已经能够在nucleo-h7上建立一个cyclonetcp的TCP server基础上开展的。定义一个结构体型变量ModbusServerSettings modbusServerSettings;
通过modbusServerGetDefaultSettings(&modbusServerSettings);将变量设置为默认配置,
modbusServerSettings.interface = &netInterface;
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的“寄存器型变量”了。
本帖简单介绍了在NUCLEO-H7上实现了mosbus/TCP的从站,粗略地讲解了数据的流向,其中MBAP header与事件等与mosbus/TCP中密切相关的内容并没有被提及,只是想让使用者能够快速上手。涉及到的一些除应用层的源码,都在https://github.com/Oryx-Embedded/CycloneTCP/tree/master/modbus此处可以见到,希望此贴对您有帮助。
此内容由EEWORLD论坛网友54chenjq原创,如需转载或用于商业用途需征得作者同意并注明出处
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 因为太水,很少发帖,我将对帖子内容进行整理再公开。
页:
[1]