zoukankan      html  css  js  c++  java
  • MODBUS移植的参考文章

    http://www.modbus.org/specs.php

    https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32

    http://www.360doc.com/content/14/0906/09/17350204_407389804.shtml

    http://blog.csdn.net/dldw8816/article/details/50595154

    https://www.cnblogs.com/skl374199080/archive/2013/12/16/3476153.html

    http://blog.csdn.net/arminkztl/article/details/11738395

    从机流程

    /*first:
    ->从机等待串口数据包
    ->接收到数据包触发串口中断-
    ->xMBRTUReceiveFSM()函数
    -->不断接收数据但不保存,不断重置定时器-
    ->直到数据接收完后产生3.5T定时器中断,代表接收完成
    ->中断函数调用xMBRTUTimerT35Expired(void)函数
    ->根据状态RXINIT调用xMBPortEventPost(EV_READY)事件函数加入序列
    ->关闭定时器,设为RXIDLE,返回主程序。
    ->主程序poll根据EVREADY空操作取出事件,返回
    second:
    ->再次接收到串口数据包
    ->进入中断函数xMBRTUReceiveFSM()
    ->根据状态RXIDLE数据存入RTUBUF,状态设为RXRCV,启动定时器
    ->收到下个数据包,存储数据并重置定时器,不断重复直到接收完数据包
    ->收完后产生3.5T定时中断xMBRTUTimerT35Expired()
    ->根据RXRCV发送事件EV_FRAME_RECEIVED,关闭定时器设为RXIDLE,返回主程序poll
    ->根据FRAMERECEIVED调用eMBRTUReceive()处理收到数据的存储指针,然后发送事件EV_EXECUTE
    ->然后返回主程序,继续执行poll,
    ->根据EVEXECUTE,提取功能码,并判断功能码确定功能处理函数指针,并调用该函数
    处理:
    ->调用功能函数解析数据包(长度/地址、寄存器数量)
    ->执行功能函数的回调函数,提取数据。返回poll
    ->执行eMBRTUSend()
    ->TXXMIT,使能串口发送功能
    ->发送中断,调用xMBRTUTransmitFSM( )函数,输出完毕事件设为EV_FRAME_SENT,禁用串口发送,状态改为TXIDLE------à返回poll,根据FRAMESENT取出事件清空队列,一个循环完成
    */

    libmodbus

    rt_thread对其的实现实现:TCP需要开启TCP server,SAL,为避免错误可以屏蔽或让 wiz_setsockopt()直接返回0,注意modbus_mapping_new()几个参数的关系,不然会出现访问未动态分配的内存地址。

    freemodbus:

    rt_thread对其的实现实现

  • 相关阅读:
    python3.5+flask+mysql
    Python魔法师
    Redis
    Socket
    Python线程
    Python全栈之路--Django ORM详解
    基本算法
    Python_Select解析
    如何做好一名DBA【转】
    解决MySQL忘记root密码
  • 原文地址:https://www.cnblogs.com/jieruishu/p/8108231.html
Copyright © 2011-2022 走看看