Modbus的通信参数存在flash中,如果改乱了,该怎么办--FreeModbus从站设计(12)

在上一篇文章中,介绍了如何将Modbus的通信参数存储在单片机STM32F103C8T6的flash中,这样可以简化硬件电路设计,功能扩展也更加灵活。但孔丙火(微信公众号:孔丙火)认为,这种方法也有副作用,因为是用通信的方法修改参数,如果用户把上次修改的参数忘记了,岂不是无法建立串口连接了?要么一个一个参数地试,费时费力,要么重新刷单片机的程序,但这需要开发工程师的参与。公众号之前有一篇文章,是讲PLC的上电停止功能的,这里可以做一个借鉴,来解决这个问题。大体的意思,就是为用户保留一个数据命令,当单片机上电的时候,收到这个命令,就采用默认的通信参数运行,这时用户是可以通过串口连接单片机的,然后再把通信参数改成自己需要的就可以了。

原创 点赞0 阅读2147 收藏0 评论0 21 天前

如何把Modbus的通信参数存在单片机的flash中-FreeModbus从站设计(11)

作为从站,Modbus-RTU通信的参数主要包括从站地址和串口参数,串口参数又包括波特率、校验位、停止位等,把这些参数存储在单片机的flash里,孔丙火(微信公众号:孔丙火)认为,可以简化电路设计,应用更加灵活。介绍了STM32F103C8T6的flash的组织结构,进一步分析了通信参数在flash中的存储位置,阐述了基于HAL库写flash的方法和通信参数修改的基本流程。代码经过实践,可以实现将通信参数存在flash中,并可以通过Modbus命令修改通信参数。

原创 点赞0 阅读2122 收藏0 评论0 21 天前

单片机程序中,Modbus功能码的回调函数如何编写--FreeModbus从站设计(10)

FreeModbus从站设计(10)-Modbus功能码的回调函数如何编写 关键词:FreeModbus CubeMX HAL库 串口 功能码 此系列的前面几篇文章,主要是阐述了用HAL库生成keil工程、如何将FreeModbus的代码加入keil工程、协议栈的初始化、串口和定时器接口函数的修改等内容,并整理了FreeModbus协议栈调与HAL库函数的调用关系,通过以上这些工作,Modbus的

原创 点赞0 阅读10000+ 收藏0 评论0 2021-06-19

为什么有的PLC需要上电停止功能,能防止PLC变砖 (可编程控制器 串口通信)

PLC(可编程控制器)在工业控制中使用非常广泛,型号很多,有一部分PLC有上电停止的功能,它们为什么需要这个功能呢?孔丙火(微信公众号:孔丙火)分析了上电停止的具体用途及实现路径,对于没有启停旋钮、没有专用编程口或编程电缆、通信口即作为编程口又作为通用口、通信口同时支持主站和从站设置的PLC,上电停止功能是需要的。同时,这种设计,对于单片机的串口通信设计,具有很好的借鉴意义。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-05-19

当RS485隔离遇见Freemodbus,你知道该怎么做吗?

基于RS485物理接口的Modbus总线在工业控制中广泛应用。Freemodbus是一个免费的实用的协议栈,孔丙火(微信公众号:孔丙火)用它实现了一个从站。串口收发信号和RS485芯片的收发使能信号采用光耦进行了隔离,在测试过程发现了偶尔出现TimeOut的问题,经过查找及分析,发现是光耦信号延时导致的,给出了解决方案,并对问题进行了详细分析。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-04-20

用两张图,详解FreeModbus在单片机串口上的数据收发过程-FreeModbus从站设计(9)

用两张图把FreeModbus在单片机串口上数据收发流程进行了梳理,脉络更加清晰。有了这样一个思路,可以更好地理解,移植FreeModbus的时候,为什么需要修改portserial.c和porttimer.c中的函数,和为什么需要修改串口中断的回调函数。从这篇文章中,也可以看出,采用HAL库是比较简单的,像是中断处理这些内容库函数都已经处理好了,很方便,可以提高开发效率。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-04-17

CAN总线波形上的尖尖角,从何而来?(几种经典解释)

CAN波形中的冲击是由于电平陡然变化,在传输双绞线上电波反射造成的,回波反射的原理应该是很复杂的,查阅了相关文献,理论公式一大堆,什么基尔霍夫定律等等,总之,对于我们这些搞应用研究的人来说,一句话,看不懂,但有没有其他方法可以简单理解这种现象呢,我想是有的,下面列举几种比较通俗的解释,有的用自然现象解释,有的用人性解释,反应了CAN总线作为自然界的一部分,就会遵循自然规律,有的“道法自然”意思。

转载 点赞0 阅读10000+ 收藏0 评论0 2021-04-16

AD(Altium Designer)软件中原理图自制模板的妙用

在实际生产中,如果用CAD出产品的原理图出现问题或效率低下时,试试本文的方法,可以提高效率,直接将AD(Altium Designer)软件中的原理图图框设计为自己需要的图框,可以直接打印或存档。以AD09为例,孔丙火(微信公众号:孔丙火)认为,如果是自己玩玩,画好原理图,然后做板子调试就OK了,原理图用什么图框,要不要图框都无所谓。但作为一个产品,无论是工业的还是民用的,都要出图纸,否则无法移交生产,也无法存档。每家公司的图纸都有自己的要求,一般是用AutoCAD出图,也可以用其他设计软件出图,这样有时会有问题,效率低下。因此,将AD软件中的原理图的图框设计成公司要求的格式,可以直接打印存档,可以很好地解决上述问题。

转载 点赞0 阅读10000+ 收藏0 评论0 2021-04-16

Modbus-RTU的字符时间到底是多长?你知道吗?

Modbus-RTU协议中有一个字符时间的概念。Modbus-RTU总线是通过时间间隔来判断一帧数据结束的,3.5个字符时间内没有收到新的数据,则认为这一帧数据结束。那这个字符时间到底是多少呢?确切地说,应该是在偶校验的情况下发送一个byte数据的时间。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-04-15

CAN总线和Modbus总线,该如何选择

CAN总线和Modbus总线是工控领域常用的两种现场总线,简单的说哪个好哪个不好是没有意义的,要根据不同的应用场景来做选择。CAN总线是无主结构,在通信方式上更加灵活,且是短帧发送,单帧数据消耗的总线带宽更少,但传输大量数据时效率会降低。Modbus总线是主从结构,只有主站能发起通信,但每帧数据的数据量比较大,在传输大量数据时有优势。实时性方面也不能单纯地说哪个高哪个低,还是要看用户的需求。系统集成怎么选、实时语音传输怎么选、传输故障停机信号怎么选,以3个小案例为基础,描述了该如何在CAN总线和Modbus总线之间进行抉择。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-04-12

1句话,揭开CAN总线的神秘面纱

用一句话概括CAN总线的基本特征:CAN总线是一种基于“先来后到、无损仲裁”机制、多主(无主)结构、具有帧ID、应用数据最多8个字节、采用差分电平的国际标准现场总线。虽然没有面面俱到,但体现了CAN总线的重点特色,有利于对CAN总线有一个清晰的认识。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-04-08

其实ST的HAL库与FreeModbus移植很配哦--FreeModbus从站设计(8)

摘要:用HAL库函数理清Modbus的数据收发流程。阐述了HAL库与FreeModbus协议栈接口的基本框架。最初设想是能不能完全用HAL库的函数来实现的FreeModbus移植。基于HAL库实现vMBPortSerialEnable()这个函数。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-03-21

FreeModbus从站设计(7)-如何让RTU的定时器正常工作起来

在CubeMX工程配置中,已经将定时器2(TIM2)的时钟周期(可以理解为心跳一下)设为50us,Counter Period(产生中断)暂时设为了35,也就是说50us×35=1750us产生一次中断,这个时间就是判断RTU中帧间隔的标准。但在Freemodbus协议栈(遵循Modbus国标)中,这个时间不是固定的,在波特率小于19200bps时,需要具体计算这个时间,当波特率大于或等于19200bps时,这个时间固定为1750us,如图1所示。因此,孔丙火(微信公众号:孔丙火)认为,把它设为固定值是不方便的,当波特率修改的时候,还要单独修改此参数,可以用一个变量来设置此参数,变量的值随波特率而改变,这也有利于后期通信参数修改的程序。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-03-20

STM32F103、FreeModbus从站设计(6)-让串口和Modbus初始化的参数同步起来

孔丙火(微信公众号:孔丙火)主要介绍协议栈初始化,以及与串口相关的代码修改。串口的初始化函数是CubeMx自动生成的,其波特率等参数最好与freemodbus协议栈初始化参数保持一致,这样方便程序的维护和功能扩展,例如,当需要修改通信的波特率的时候,只需要修改一处就可以了,不用先修改串口的初始化参数,再修改协议栈的参数,这是一个实战例程与纯教程的区别。 本文的总体思路:创建一些全局变量,用于存储通信参数,串口、定时器、Freemodbus协议栈的初始化,都采用这些变量,需要更改的时候,只需改变这些变量的值即可。另外,这些通信参数后续计划存储在flash里面,定时器的参数会随波特率的不同而改变,这些在后续的文章中会阐述。

原创 点赞0 阅读10000+ 收藏0 评论0 2021-03-18

STM32F103、FreeModbus从站设计(5)-如何将FreeModbus代码加入keil工

STM32F103、FreeModbus从站设计(5)-如何将FreeModbus代码加入keil。详细阐述如何获取freemodbus代码,代码的大体结构,如何将freemodbus加入keil工程。讲解了注意事项,全实战演示,实际可用。

原创 点赞0 阅读10000+ 收藏0 评论0 2020-12-26

STM32F103C8T6、FreeModbus从站的设计与测试(4)——定时器、中断初始化

关键词:Modbus FreeModbus STM32F103C8T6 CubeMX1.串口参数设置我们选择UART2来做RS485接口,UART1作为备用,用来做调试中的串口打印用。串口的参数配置比较简单,不再赘述。注意要启用串口中断,FreeModbus采用中断的方式接受和发送串口数据。2.定时器参数设置采用TIM2来作为FreeModbus的定时器,孔丙火(微信公众号:孔丙火)这里主要实现工

原创 点赞0 阅读335 收藏0 评论0 2020-12-08

STM32F103C8T6、FreeModbus从站的设计与测试(3)——时钟、串口初始化

关键词:Modbus FreeModbus STM32F103C8T6 CubeMX 1.开发环境 (1)STM32CubeMX,版本:4.27.0,截止写稿时,最新版本已到6,但孔丙火(微信公众号:孔丙火)实在是用不习惯版本5以后的界面,所以还继续用4版本的。 图1 (2)MDK(Keil),版本:5.17,有部分朋友用的还是4版本的,建议升级到5,在5下装一个兼容包,就可以用5打开4版本的程

原创 点赞0 阅读279 收藏0 评论0 2020-11-09

STM32F103C8T6、FreeModbus从站的设计与测试(2)——硬件设计

单片机采用STM32F103C8T6,从孔丙火(微信公众号:孔丙火)的认知来看,这款单片机是当前比较常用的型号之一。UART1用过ISP下载和串口打印,UART2用于RS485通信,整块板子采用DC5V供电,通过AMIS1117转换成3.3V给单片机供电,RS485采用隔离设计,隔离电源采用IB0505S-W75R3,隔离电压是1500VDC,485信号转换及隔离采用ADM2483BRWZ。在单片机部分加一个外部看门狗SP706SEN,同时具备供电电源监控功能,单片机供电电源低于2.93V时会复位单片机。

原创 点赞0 阅读297 收藏0 评论0 2020-11-07

STM32F103C8T6、FreeModbus从站的设计与测试(1)——引言

用FreeModbus协议栈实现一个基于串口通信的Modbus从站,采用什么单片机呢,这个可以随便选,只要有一个UART接口就可以,那就选一个常用的,意法半导体的STM32F103C8T6,Cortex-M3的内核,片上资源对于Modbus协议来说也足够。孔丙火(微信公众号:孔丙火)在网上也查看了一些STM32F103移植FreeModbus的资料,总感觉不清晰,看起来有点费劲,可能是我的水平太差吧,所以在一次开发Modbus从站的过程中,想着整理一下开发心得,目的是对正在开发Modbus的朋友有一些帮助,少走一些弯路,另外,网上缺乏一些对Modbus协议测试的文章,我也把相关的心得写出来,包括各种功能码的测试、错误码的测试等。

原创 点赞0 阅读354 收藏0 评论0 2020-10-17

关于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] );”,我认为这不能算是一个错误,且听我的分析。

原创 点赞1 阅读780 收藏0 评论0 2020-10-09

STM32F103C8T6-CubeMx串口收发程序详细设计与测试(2)——程序规划、代码编写及测试

STM32F103C8T6-CubeMx串口收发程序详细设计与测试。演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程。对使用到的函数进行了说明,阐述了各个函数的调用顺序和调用关系,在目标板上对代码进行了测试,结果表明,可以实现预期功能。

原创 点赞0 阅读809 收藏0 评论0 2020-10-07