FreeModbus--完全分析
更新时间:2023-11-09 21:09:01 阅读量: 教育文库 文档下载
FreeModbus--完全分析
说明:freemodbus-v1.5.0
主流程
[objc] view plaincopy
1. /* ----------------------- Start implementation -----------------------------*/ 2. int
3. main( void ) 4. {
5. eMBErrorCode eStatus; 6.
7. eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN ); 8.
9. /* Enable the Modbus Protocol Stack. */ 10. eStatus = eMBEnable( ); 11.
12. for( ;; ) 13. {
14. ( void )eMBPoll( ); 15.
16. /* Here we simply count the number of poll cycles. */ 17. usRegInputBuf[0]++; 18. } 19. }
由上述主函数可知协议栈经eMBInit和eMBEnable初始化、使能后进入协议栈的循环eMBPoll中。
eMBInit分析
首先,使用eMBInit初始化协议栈,根据你使用的参数eMBMode eMode初始化相应的函数入口!
[objc] view plaincopy
1. #if MB_RTU_ENABLED > 0 2. case MB_RTU:
3. pvMBFrameStartCur = eMBRTUStart; 4. pvMBFrameStopCur = eMBRTUStop; 5. peMBFrameSendCur = eMBRTUSend; 6. peMBFrameReceiveCur = eMBRTUReceive;
7. pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; 8. pxMBFrameCBByteReceived = xMBRTUReceiveFSM; 9. pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; 10. pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; 11.
12. eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity )
;
13. break; 14. #endif
15. #if MB_ASCII_ENABLED > 0 16. case MB_ASCII:
17. pvMBFrameStartCur = eMBASCIIStart; 18. pvMBFrameStopCur = eMBASCIIStop; 19. peMBFrameSendCur = eMBASCIISend; 20. peMBFrameReceiveCur = eMBASCIIReceive;
21. pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; 22. pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; 23. pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; 24. pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; 25.
26. eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity
);
27. break; 28. #endif
以上代码中pvMBFrameStartCur、pvMBFrameStopCur等即协议栈函数的接口,对于不同模式使用不同的函数进行赋值初始化!!此编写模式可以借鉴学习!!
其中eMBRTUInit函数对底层驱动(串口和定时器)进行了初始化。 在上述初始化完成并且成功后对事件功能也进了初始化,最后全局变量eMBState = STATE_DISABLED。 eMBEnable的分析
[objc] view plaincopy 1. eMBErrorCode 2. eMBEnable( void ) 3. {
4. eMBErrorCode eStatus = MB_ENOERR; 5.
6. if( eMBState == STATE_DISABLED ) 7. {
8. /* Activate the protocol stack. */ 9. pvMBFrameStartCur( ); 10. eMBState = STATE_ENABLED; 11. } 12. else 13. {
14. eStatus = MB_EILLSTATE; 15. }
16. return eStatus; 17. }
由第一节的分析,此时将启动协议栈pvMBFrameStartCur,查看程序该函数指针被分配到为eMBRTUStart。
该函数中将全局变量eRcvState = STATE_RX_INIT,并使能串口和定时器,注意此时的定时开始工作!!! 全局变量eMBState =STATE_ENABLED。
eMBPoll的分析
在此循环函数中xMBPortEventGet(&eEvent ) == TRUE先判断是否有事件,无事件发生则不进入状态机!
还记得第二节定时器开始工作了吗?我们先看看该定时器如果超时了会发生什么事件! 在超时中断中我们将会调用pxMBPortCBTimerExpired函数,其中有以下代码:
[objc] view plaincopy
1. BOOL
2. xMBRTUTimerT35Expired( void ) 3. {
4. BOOL xNeedPoll = FALSE; 5.
6. switch ( eRcvState ) 7. {
8. /* Timer t35 expired. Startup phase is finished. */ 9. case STATE_RX_INIT:
10. xNeedPoll = xMBPortEventPost( EV_READY ); 11. break; 12.
13. /* A frame was received and t35 expired. Notify the listener that 14. * a new frame was received. */ 15. case STATE_RX_RCV:
16. xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); 17. break; 18.
19. /* An error occured while receiving the frame. */ 20. case STATE_RX_ERROR: 21. break; 22.
23. /* Function called in an illegal state. */ 24. default:
25. assert( ( eRcvState == STATE_RX_INIT ) ||
26. ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERR
OR ) ); 27. } 28.
29. vMBPortTimersDisable( ); 30. eRcvState = STATE_RX_IDLE; 31.
32. return xNeedPoll; 33. }
上一节分析中全局变量eRcvState =STATE_RX_INIT,因此第二节所说的定时器第一次超时将会发送xNeedPoll =xMBPortEventPost( EV_READY )事件,
然后关闭定时器,全局变量eRcvState =STATE_RX_IDLE。此时,在主循环eMBPoll中将会执行一次EV_READY下的操作,
之后会一直执行eMBPoll,整个协议栈开始运行! 接收数据分析
由于FreeModbus只支持从机模式,因此我们分析一下其在接收到数据后的操作!!! 接收数据
在上三节的操作中,我们可以知道进入eMBPoll循环后,串口中断是开启的。因此在接收到数据的时候,首先响应的应该是串口中断程序。 接收中断中将会调用接收状态机:
[objc] view plaincopy
1. BOOL
2. xMBRTUReceiveFSM( void ) 3. {
4. BOOL xTaskNeedSwitch = FALSE; 5. UCHAR ucByte; 6.
7. assert( eSndState == STATE_TX_IDLE ); 8.
9. /* Always read the character. */
10. ( void )xMBPortSerialGetByte( ( CHARCHAR * ) & ucByte ); 11.
12. switch ( eRcvState ) 13. {
14. /* If we have received a character in the init state we have to 15. * wait until the frame is finished. 16. */
17. case STATE_RX_INIT:
18. vMBPortTimersEnable( ); 19. break; 20.
21. /* In the error state we wait until all characters in the 22. * damaged frame are transmitted. 23. */
24. case STATE_RX_ERROR:
25. vMBPortTimersEnable( ); 26. break; 27.
28. /* In the idle state we wait for a new character. If a character 29. * is received the t1.5 and t3.5 timers are started and the 30. * receiver is in the state STATE_RX_RECEIVCE. 31. */
32. case STATE_RX_IDLE: 33. usRcvBufferPos = 0;
34. ucRTUBuf[usRcvBufferPos++] = ucByte; 35. eRcvState = STATE_RX_RCV; 36.
37. /* Enable t3.5 timers. */ 38. vMBPortTimersEnable( ); 39. break; 40.
41. /* We are currently receiving a frame. Reset the timer after 42. * every character received. If more than the maximum possible 43. * number of bytes in a modbus frame is received the frame is 44. * ignored.
正在阅读:
FreeModbus--完全分析11-09
漫步云端作文600字07-14
人教新目标2014春八年级下册unit8Have-you-read-Treasure-Island04-15
2011年大事记07-05
201507批次财务会计复习大纲01-15
电大行政管理专科办公室管理试题及答案01-02
A电磁流量计标准MODBUS通讯协议(版本号: LMAGMODRTUV77)安均 yes01-19
停车通知12-30
我心中的英雄作文400字06-16
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- FreeModbus
- 完全
- 分析
- VB利用DataReport做报表详解 - 图文
- 国立基隆女子高级中学职员申诉评议委员会设置及评议要点
- 河道护岸结构设计的分析
- 第八讲 归一问题(三年级奥数)
- 生物高考模拟卷-高三生物试题及答案-北京市朝阳区2016届高三第一次综合练习(一模)
- 自考人力资源管理专业本科毕业论文二(1)
- 华为公司质量管理手册 - 图文
- 实验三 连续时间信号的数字处理
- 2015高教社杯全国大学生数学建模竞赛获奖名单(初稿) - 图文
- 浅析如何提高团队的组织凝聚力
- 山东2014年会计从业资格考试《财经法规》全真模拟卷二
- 网络流行语:映射社会思潮,反映社会现实与大众心态
- 夹江县初中2013届毕业会考适应性考试英语
- 山东省青岛市2018届高三统一质量检测理综物理试题 含答案
- 宁德市黑色金属铸造企业名录2018版132家 - 图文
- 满洲里市对俄边贸研究12月9日
- 细胞生物学复习名词解释
- 中共中央组织部关于印发党费收缴管理和使用的通知
- 《工业控制网络》课程教学大纲
- 西工大《理论力学B卷》18年10月作业考核(答案)