![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Modbus
文章平均质量分 79
从单片机到PLC
从单片机到PLC,还有嵌入式
展开
-
Modbus的通信参数存在flash中,如果改乱了,该怎么办--FreeModbus从站设计(12)
将Modbus的通信参数存储在单片机STM32F103C8T6的flash中,可以简化硬件电路设计,功能扩展也更加灵活。这种方法也有副作用,因为是用通信的方法修改参数,如果用户把上次修改的参数忘记了,岂不是无法建立串口连接了?要么一个一个参数地试,费时费力,要么重新刷单片机的程序,但这需要开发工程师的参与。公众号之前有一篇文章,是讲PLC的上电停止功能的,这里可以做一个借鉴,来解决这个问题。大体的意思,就是为用户保留一个数据命令,当单片机上电的时候,收到这个命令,就采用默认的通信参数运行。原创 2021-07-09 20:54:05 · 425 阅读 · 1 评论 -
如何把Modbus的通信参数存在单片机的flash中-FreeModbus从站设计(11)
作为从站,Modbus-RTU通信的参数主要包括从站地址和串口参数,串口参数又包括波特率、校验位、停止位等,把这些参数存储在单片机的flash里,孔丙火(微信公众号:孔丙火)认为,可以简化电路设计,应用更加灵活。通用串口参数中数据位,在Modbus-RTU通信中是不需要设置的,因为Modbus协议规范规定,Modbus-RTU的数据位必须为8位。介绍了STM32F103C8T6的flash的组织结构,进一步分析了通信参数在flash中的存储位置,阐述了基于HAL库写flash的方法和通信参数修改的基本流程。原创 2021-07-08 11:40:12 · 855 阅读 · 3 评论 -
单片机程序中,Modbus功能码的回调函数如何编写--FreeModbus从站设计(10)
FreeModbus从站设计(10)-Modbus功能码的回调函数如何编写关键词:FreeModbus CubeMX HAL库 串口 功能码此系列的前面几篇文章,主要是阐述了用HAL库生成keil工程、如何将FreeModbus的代码加入keil工程、协议栈的初始化、串口和定时器接口函数的修改等内容,并整理了FreeModbus协议栈调与HAL库函数的调用关系,通过以上这些工作,Modbus的通路(串口和定时器)已经通了,下面就是数据的处理部分了。数据处理部分主要是对各个功能码的回调函数的编写.原创 2021-06-19 22:05:02 · 1501 阅读 · 4 评论 -
当RS485隔离遇见Freemodbus,你碰到问题了吗?
基于RS485物理接口的Modbus总线在工业控制中广泛应用。Freemodbus是一个免费的实用的协议栈,孔丙火(微信公众号:孔丙火)用它实现了一个从站。串口收发信号和RS485芯片的收发使能信号采用光耦进行了隔离,在测试过程发现了偶尔出现TimeOut的问题,经过查找及分析,发现是光耦信号延时导致的,给出了解决方案,并对问题进行了详细分析。原创 2021-04-20 12:49:52 · 1981 阅读 · 2 评论 -
用两张图,详解FreeModbus在单片机串口上的数据收发过程-FreeModbus从站设计(9)
用两张图把FreeModbus在单片机串口上数据收发流程进行了梳理,脉络更加清晰。有了这样一个思路,可以更好地理解,移植FreeModbus的时候,为什么需要修改portserial.c和porttimer.c中的函数,和为什么需要修改串口中断的回调函数。从这篇文章中,也可以看出,采用HAL库是比较简单的,像是中断处理这些内容库函数都已经处理好了,很方便,可以提高开发效率。原创 2021-04-17 17:48:35 · 1664 阅读 · 0 评论 -
Modbus-RTU的字符时间是发送一个字节数据的时间吗
Modbus-RTU协议中有一个字符时间的概念。Modbus-RTU总线是通过时间间隔来判断一帧数据结束的,3.5个字符时间内没有收到新的数据,则认为这一帧数据结束。那这个字符时间到底是多少呢?确切地说,应该是在偶校验的情况下发送一个byte数据的时间。原创 2021-04-15 10:55:30 · 1619 阅读 · 0 评论 -
CAN总线和Modbus总线,该如何选择
CAN总线和Modbus总线是工控领域常用的两种现场总线,简单的说哪个好哪个不好是没有意义的,要根据不同的应用场景来做选择。CAN总线是无主结构,在通信方式上更加灵活,且是短帧发送,单帧数据消耗的总线带宽更少,但传输大量数据时效率会降低。Modbus总线是主从结构,只有主站能发起通信,但每帧数据的数据量比较大,在传输大量数据时有优势。实时性方面也不能单纯地说哪个高哪个低,还是要看用户的需求。系统集成怎么选、实时语音传输怎么选、传输故障停机信号怎么选,以3个小案例为基础,描述了该如何在CAN总线和Modbus原创 2021-04-12 13:10:51 · 8426 阅读 · 0 评论 -
其实ST的HAL库与FreeModbus移植很配哦--FreeModbus从站设计(8)
用HAL库函数理清Modbus的数据收发流程。阐述了HAL库与FreeModbus协议栈接口的基本框架。最初设想是能不能完全用HAL库的函数来实现的FreeModbus移植。基于HAL库实现vMBPortSerialEnable()这个函数。原创 2021-03-21 21:33:19 · 896 阅读 · 9 评论 -
FreeModbus从站设计(7)-如何让RTU的定时器正常工作起来
在CubeMX工程配置中,已经将定时器2(TIM2)的时钟周期(可以理解为心跳一下)设为50us,Counter Period(产生中断)暂时设为了35,也就是说50us×35=1750us产生一次中断,这个时间就是判断RTU中帧间隔的标准。但在Freemodbus协议栈(遵循Modbus国标)中,这个时间不是固定的,在波特率小于19200bps时,需要具体计算这个时间,当波特率大于或等于19200bps时,这个时间固定为1750us,如图1所示。因此,孔丙火(微信公众号:孔丙火)认为,把它设为固定值是不方原创 2021-03-20 11:38:01 · 1324 阅读 · 0 评论 -
STM32F103、FreeModbus从站设计(6)-让串口和Modbus初始化的参数同步起来
FreeModbus从站设计(6)-让串口和Modbus初始化的参数同步起来关键词:Modbus FreeModbus STM32F103C8T6 CubeMX 移植1.基本原理在这一篇文章中,孔丙火(微信公众号:孔丙火)主要介绍协议栈初始化,以及与串口相关的代码修改。串口的初始化函数是CubeMx自动生成的,其波特率等参数最好与freemodbus协议栈初始化参数保持一致,这样方便程序的维护和功能扩展,例如,当需要修改通信的波特率的时候,只需要修改一处就可以了,不用先修改串口的初始化参数.原创 2021-03-18 20:55:00 · 773 阅读 · 2 评论 -
STM32F103、FreeModbus从站设计(5)-如何将FreeModbus代码加入keil工程
STM32F103、FreeModbus从站设计(5)-如何将FreeModbus代码加入keil。详细阐述如何获取freemodbus代码,代码的大体结构,如何将freemodbus加入keil工程。讲解了注意事项,全实战演示,实际可用。原创 2020-12-26 13:44:46 · 701 阅读 · 0 评论 -
STM32F103C8T6、FreeModbus从站的设计与测试(4)——定时器、中断初始化(CubeMX配置)
关键词:Modbus FreeModbus STM32F103C8T6 CubeMX1.串口参数设置我们选择UART2来做RS485接口,UART1作为备用,用来做调试中的串口打印用。串口的参数配置比较简单,不再赘述。注意要启用串口中断,FreeModbus采用中断的方式接受和发送串口数据。2.定时器参数设置采用TIM2来作为FreeModbus的定时器,孔丙火(微信公众号:孔丙火)这里主要实现工业控制中常用的Modbus-RTU功能,RTU协议中是靠时间间隔来判断一个数据帧是否结束的,所以原创 2020-12-08 15:58:21 · 1537 阅读 · 0 评论 -
STM32F103C8T6、FreeModbus从站的设计与测试(3)——时钟、串口初始化(CubeMX配置)
关键词:Modbus FreeModbus STM32F103C8T6 CubeMX1.开发环境(1)STM32CubeMX,版本:4.27.0,截止写稿时,最新版本已到6,但孔丙火(微信公众号:孔丙火)实在是用不习惯版本5以后的界面,所以还继续用4版本的。图1(2)MDK(Keil),版本:5.17,有部分朋友用的还是4版本的,建议升级到5,在5下装一个兼容包,就可以用5打开4版本的程序。2.时钟及串口初始化(1)新建CubeMX工程孔丙火(微信公众号:孔丙火)认为,这一步原创 2020-11-09 12:44:58 · 1005 阅读 · 0 评论 -
STM32F103C8T6、FreeModbus从站的设计与测试(2)——硬件设计
单片机采用STM32F103C8T6,从孔丙火(微信公众号:孔丙火)的认知来看,这款单片机是当前比较常用的型号之一。UART1用过ISP下载和串口打印,UART2用于RS485通信,整块板子采用DC5V供电,通过AMIS1117转换成3.3V给单片机供电,RS485采用隔离设计,隔离电源采用IB0505S-W75R3,隔离电压是1500VDC,485信号转换及隔离采用ADM2483BRWZ。原创 2020-11-07 08:56:13 · 1148 阅读 · 0 评论 -
STM32F103C8T6、FreeModbus从站的设计与测试(1)——引言
用FreeModbus协议栈实现一个基于串口通信的Modbus从站,采用什么单片机呢,这个可以随便选,只要有一个UART接口就可以,那就选一个常用的,意法半导体的STM32F103C8T6,Cortex-M3的内核,片上资源对于Modbus协议来说也足够。原创 2020-10-17 17:46:08 · 954 阅读 · 0 评论 -
关于freemodbus协议中eMBFuncReadHoldingRegister()函数的所谓错误
摘要:网上看到有好心的网友提示,freemodbus协议中的mbfuncholding.c 文件中eMBFuncReadHoldingRegister()函数,有一处错误,即:第185行的“usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );”应为“usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );”,我认为这不能算是一个错误,且听我原创 2020-10-09 22:33:11 · 2922 阅读 · 1 评论 -
简说Modbus-RTU与Modbus-ASCII
Modbus在串行总线通信中的协议有RTU和ASCII两种。两种协议的不同之处,孔丙火(微信公众号:孔丙火)认为,最简单的讲,就是:RTU是直接发送数据,二进制代码,其表示的物理意义,需要发送端和接收端进行约定;ASCII发送的数据是用于表示字符的二进制代码。原创 2019-06-12 16:01:55 · 6852 阅读 · 2 评论