打印

基于TMS320F2407A DSP的MODBUS通信协议的实现

[复制链接]
1091|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Violin11|  楼主 | 2019-3-14 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于TMS320F2407A DSP的MODBUS通信协议的实现



摘要:Modbus 协议是应用于电子控制器上的一种通用协议,通过此协议,控制器相互之间、控制器通过其他网络(例如以太网)和其它设备之间可以通信,如今MODBUS协议已经成为我国工业自动化网络协议规范的国家标准之一。本文详细讨论MODUBS 在TMS320LF2407A DSP 上的 实现。
关键词:MODBUS, TMS320LF2407A, DSP

一、引言
       DSP,也称数字信号处理器,是一种具有特殊结构的微处理器。DSP芯片的内部采用程序和数据分开的哈佛(Harvard)结构,具有专门的硬件乘法器,采用多级流水线操作,提供特殊的DSP 指令,用来快速地实现各种数字信号处理算法。近年来,随着微电子技术的发展,特别是各种高性能 SOC(System On Chip)的设计水平的提高,各种高度集成化的单片DSP的性能不断提高,相应的软件和开发工具日臻完善,同时价格越来越低,使得DSP在工业自动化领域的应用越来越广泛。
由于DSP功能强大,为了有效管理多任务,以及满足控制或仪表系统的实时性要求,可以使用实时嵌入式操作系统,如目前已经有针对不同DSP的实时嵌入式操作系统的成熟移植方案,而且工业控制已从单机控制走向集中监控、集散控制,工业控制器和仪表联网也为网络管理提供了方便,而Modbus就是工业控制器和仪表应用最广的网络协议之一。

二、嵌入式DSP TMS320LF2407A
       TMS320LF2407A(以下简称为2407A)是美国德州仪器(TI)公司生产的一款应用于控制领域的高性能定点DSP芯片,是TI 2000系列DSP中应用较成熟的一款, 内核为16位的定点DSP CPU,具有低成本、低功耗、高速运算能力,采用高性能静态CMOS技术,供电电压为3.3V,指令周期可达25 ns,片内集成了多种外设模块及存储器,如集成有串行通信接口 (SCI)、16位的同步串行外围接口(SPI)、符合CAN2.OB规范要求的CAN通信模块以及32K字的FLASH存储器,构成了真正的单芯片控制器,具有很高的性价比。在工业自动化领域已经得到了广泛的应用,如电机数字化控制、测控仪表、运动控制。

MODBUS通信协议
  Modbus它是一种真正开放、标准的、免收许可费的网络通讯协议,在工业自动化领域被广为应用。在过去的二十几年中已被大量的应用于自动化控制器和测控仪表中,目前MODBUS协议已经成为我国工业自动化网络协议规范的国家标准之一。MODBUS协议可以使用RS232,RS422,RS485串口作为物理接口。
MODBUS通信使用Master-Slave(主-从)方式,即仅一设备(主设备)能初始化传输(查询),其它设备(从设备)根据主设备查询提供的数据作出相应反应,如图1。需要注意的是MODBUS协议采用“大头”(Big -Endian)传输方式,即先传输数据高字节。本文2407A控制器作为MODBUS Slave设备。



控制器能设置为两种传输模式(ASCII或RTU)中的任何一种标准的Modbus网络通信,如图2,图3:


MODBUS主要功能代码如下表:


本文MODBUS采用RTU模式。一典型的消息帧如图4所示:


三、MODBUS在2407A上的实现
        2407A片内的可编程SCI模块支持CPU与异步外设之间的异步串行数字通信。该SCI接收器和发送器是双缓冲的,每一个都有自己单独的使能和中断标志位,2407A的串口通信可采用查询或中断模式来实现,本文串口通信中数据接收采用中断模式,发送采用查询模式,。串口配置如下表:


串口初始化汇编代码如下:
SCI_INIT:
    LDP      #0E1H
    LACL     MCRA
    OR      #03H     ;Output Control Reg A
    SACL     MCRA     ;配置串行口引脚为特殊功能:TXD、RXD
    LDP      #DP_PF1
    SPLK     #0067H, SCICCR    ;1 停止位,偶校验,8 数据位
    SPLK     #0003H, SCICTL1   ;接收、发送、内部时钟使能
    SPLK     #0002H, SCICTL2   ;接收中断使能
    SPLK     #0002H, SCIHBAUD
    SPLK    #0008H, SCILBAUD   ;波特率 = 9600 bps (40 MHz 系统时钟)
    SPLK    #0020H, SCIPRI     
    SPLK     #0023H, SCICTL1   ;串口初始化完成
由于2407A在串口通信中接收每帧数据包后,会在接收状态寄存器中相应的BREAK标志位置位,可以很方便通过查询该标志位,判断是否接收了Modbus数据帧,进而对该MODBUS协议数据帧进行解析。MODBUS 协议解析部分可以用C语言实现,下面的C代码为2407A响应MODBUS协议数据帧(函数hr_modbus_request)及读取多个保持寄存器值(函数read4x)的部分代码,其他MODBUS功能代码实现类似。
int hr_modbus_request (unsigned char *msg, unsigned msg_len)  {
     unsigned ref,no;
  if (msg[1] == 3)    {                  /* 功能码为读多个保持寄存器  */
         ref = ((msg[2] << 8) + msg[3]);     /* 参考地址  */
         no  = ((msg[4] << 8) + msg[5]);     /* 寄存器数量  */
         if (0 == hr_read4x(ref, no, &msg[3]))  {
          msg[2] = no * 2;   
return (2+msg[2]);
            }
        else    {
          msg [1]= 0x80;
          msg[2] = 1;
    return 2;
   }
        }     
  ……/* 其他功能码识别类似 */
   }
int read4x(unsigned ref, unsigned no, unsigned *buf)  {   /* 读取多个保持寄存器功能 */ if (ref < total_regs && (ref+no) <= total_regs)  {    memcpy(buf,®[ref],2*no);    return 0; } else return 1;
}
通过仿真器把系统程序固化到2407A片内FLASH中,在PC上运行Win-Tech公司的ModScan32软件
(Modbus协议通信Master端软件),读取32个MODBUS协议保持寄存器的值,在9600波特率,0.5s扫描时间间隔下,通信稳定。


四、结束语
      TMS320LF2407A为开发人员提供了高性能的数字解决方案,通过在2407A上实现Modbus协议,使得系统具有很好的开放性和通用性。同时在别的嵌入式系统的串口通信的实现上也有很好的借鉴意义。

相关帖子

沙发
Violin11|  楼主 | 2019-3-14 16:21 | 只看该作者
基于TMS320F2407A DSP的MODBUS通信协议的实现

文档.pdf

173.88 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

717

主题

1010

帖子

3

粉丝