《武汉工程大学学报》  2011年01期 75-78   出版日期:2011-01-30   ISSN:1674-2869   CN:42-1779/TQ
基于MODBUS协议的TMS320LF2407A
与PC机串口通信软件设计



0引言微处理器都集成有1路或者多路硬件UART通道,能够非常方便地实现串行通信.在工业控制、电力通讯、智能仪表等领域,常常使用简便易用的串行通信方式作为数据交换的手段[1].MODBUS是MODICON公司于1979年开发的一种通讯协议.该协议是一种真正开放和免费的协议,已成为应用于工业控制器上的标准通信协议.标准的MODBUS使用RS232、RS422或RS485串行接口.MODBUS通信使用MasterSlave(主从) 方式.即只有主设备能初始化传输(查询),其它设备(从设备)根据主设备查询提供的数据作出反应[2].以DSP为核心的静止无功补偿装置需要将采集到的实时数据和故障数据上传给PC机的控制界面,以便于人机交互.利用MODBUS协议实现PC机与DSP之间的串口通信.系统以PC机作为主站(上位机),TMS320LF2407A DSP控制器作为从站(下位机),实现基于MODBUS的主从式通信.图1为DSP与PC机的模块方框图.图1DSP与PC机的模块方框图
Fig.1Module block diagram of DSP and PC1DSP与PC机的硬件连接标准的MODBUS物理层采用了RS232串行通信标准,远距离或多点通讯时可以考虑用RS422或者RS485来代替.PC机与TMS320LF2407A的硬件系统包括上位PC机,下位机DSP,电平转换芯片74LS245和通信接口芯片MAX232.TMS320LF2407A支持异步外设之间的数字通信,芯片内部集成了一个串行通信接口(SCI)模块,该模块是一个标准的通用异步接收/发送(UART)通信接口,通信接口有scitxd(SCI 发送输出引脚)和scirxd(SCI 接收输入引脚)两个外部引脚.SCI接收器和发送器是双缓冲的,每个都有自己单独的使能和中断标志.两者可以独立工作或在全双工方式下同时工作.图2所示为TMS320LF2407A串行通信接口电路,其中 MAX232芯片功耗低、集成度高、+5 V供电,具有两个接收和发送通道.PC机传输过来的数据电平为+5 V,而DSP传输数据的电平为+3.3 V,不能兼容,因此在MAX232与TMS320LF2407之间加入了芯片74LS245进行电平转换.2基于MODBUS的串口通信程序
设计2.1传输模式选择MODBUS 规定了ASCII和RTU两种传输模式.ASCII模式:一个信息中的每8位字节作为两个ASCII 字符传输;有开始和结束标记,便于程序处理,而且由于传输的都是可见的ASCII字符,因此进行调试时非常直观;字符发送的时间间隔可达到1秒而不产生错误,但通信速率较RTU 方式慢.RTU模式:信息中的每8位字节分成两个4位16进制的字符,这样可以最大限度地利用每个数据位的空间,提高了通信效率;在同样的波特率下,可比ASCII方式传送更多的数据.鉴于本系统所需传输的数据量较大,因此采用RTU模式.RTU模式的数据位:1位起始位,8位数据位、(最小有效位先发送),1位奇数校验位(可不使用),1位停止位(有校验时)或2位停止位(无校验时)[3].图2TMS320LF2407串行通信接口电路图
Fig.2TMS320LF2407 serial communication interface circuit2.2下位机通信程序设计从站DSP接收和发送数据都是采用中断方式,其通信软件流程如图3所示.图3通信程序流程图
Fig.3Flow diagrame of communication program由于从机只能被动接收上位机的命令后才进行数据的传输,因此从机上电初始化后,就会打开串行通信的接收中断,接收上位机传过来的命令与数据[4].其中,接收与发送缓冲区设置为8Bit的数组形式,长度为80.串口初始化代码如下:void Cominit(){(*SCICCR)=0x07;/* 8位字符,1停止位,无校验*/(*SCICTL1)=0x13; /* 使能发送和接收 */(*SCICTL2)=0x03; /* 使能接收和发送中断*/(*SCIHBAUD)=0x02;/* 波特率=208H,40MHz */(*SCILBAUD)=0x08;/* 208h=40*10^6/(9600*8)1 */(*SCICTL1)=0x33; /* 使能发送和接收,复位SCI */(*SCIPRI)=0x60; /*SCI中断为低优先级中断*/(*MCRA)= 0x3; }第1期王欣,等:基于MODBUS协议的TMS320LF2407A与PC机串口通信软件设计
武汉工程大学学报第33卷
当主站有命令发给从站时,将触发从站接收中断,即当第一个数据(地址码)到达时,将触发TMS320LF2407 DSP接收中断.这时,从站程序进入中断服务程序,将SCIRXBUF中的数据读出,并将该字符放到数据接收缓冲区.同样将功能码、起始地址、寄存器数量、CRC效验8个字符放到数据接收缓冲区.为了能在相同的波特率下传送更多的数据,采用RTU模式.在RTU模式中,整个MODBUS 消息帧必须作为一个连续的数据流传输.如果在帧完成之前有1.5 个字符间隔时间,接收设备将会刷新不完整的消息,并且假定下一个字节是一个新消息的地址字节.同样,如果一个新的消息在小于3.5 个字符的时间内接着前个消息开始,接收的设备将会认为它是前一个消息的延续.这将会导致一个错误,因为最后CRC 字节的值不可能是正确的,所以MODBUS协议中,两个数据包之间应提供3.5个字符的空闲时间.从机采用的是串口中断方式接收主机发送过来的数据帧,按照字节接收数据,每接收到一个字节就进入一次串口中断.接收数据时,需要启用定时器(TI)来不停监测要接收的两个相邻字节之间的时间间隔.如果两个字节之间的时间间隔小于1.5个字符时间间隔,则可以继续接收当前帧的下一字节数据;如果大于1.5个字符而小于3.5个字符的时间间隔,则表明接收到的数据是错误的,须向主机应当发送一个异常数据帧告诉主机应当重新发送数据帧;如果大于了3.5个字符的时间间隔,则准备接受新一帧数据.第一次进入串口中断时,需将本从机地址和接收到的地址信息进行比较.若相同,则继续接收该数据帧其它数据;若不同,则退出中断.当接收完整个数据帧后,从机将对接收到了的数据帧重新计算CRC值.最后从机将自己计算出来的CRC校验值同接收到的CRC域中的CRC值进行比较.如果CRC值相同,则表明接收到的数据正确,并在此基础上查看数据帧中的功能码,功能码属于所列的功能码,则按照功能码的相应功能调用子程序,并且给主机回送一条响应数据帧.如果CRC值不同,则表明接收到的数据错误,退出中断.如果功能码不属于所列的功能码,则退出中断并且发送一条异常数据帧给主机[5].实现MODBUS协议的关键是CRC校验值的算法,其算法有两种方法:根据CRC校验的定义公式x16+x12+x5+1进行计算,或在程序中建立CRC校验值表进行查找.因为对于固定字节CRC校验计算的多项式因子,其CRC值是固定的,因而采用查表法能够简化计算过程、提高通信效率、节省应答时间[6].由于在中断处理函数中不应该进行大量运算,因此将协议的核心部分编制为ModbusIndication 函数,作为通信模块和主程序的接口,其流程图如图4所示.当从站按照指令组织好了所有数据时,禁止接收中断,使能发送中断,程序从中断服务程序返回到主程序.这时,由于已使能了发送中断且发送缓冲寄存器SCITXBUF为空的中断源有效,程序将再次跳入中断服务程序中.但这一次中断服务程序的操作是将从站准备好的状态信息发送到主站.同样,当从站数据发送完毕后,从站程序禁止发送中断、使能接收中断,为下次接收主站查询命令做准备.需要强调的是:当程序每跳入一次中断服务程序,都需要查询中断标志寄存器的状态,才能判断是发生了接收中断还是发送中断.系统中下位机的主要任务是监控其它设备,接收上位机发送来的命令,并作出相应的回应.主机主要是采集从机信息,对DSP发送控制参数等.MODBUS通讯协议由主机先建立消息格式,格式包括了设备地址码、功能码、数据信息码、校验码等十六进制信息.MODBUS除了定义通信功能码外,还可以定义出错码,使主机更容易发现错误,并采取相应措施,保证了通信的可靠进行.系统中主要用到的Modbus功能代码是03H,04H和10H.其格式大致相同,例如功能码03H(读寄存器值)的格式如表1、表2所示.图4ModbusIndication函数流程图
Fig.4Flow diagrame of ModbusIndication function表1主机请求
Table 1Host requests
设备地址功能码 起始地址高位 起始地址低位寄存器数高位寄存器数低位CRC低位CRC高位100300000000874B表2从机响应
Table 2Slave response
设备地址功能码 字节计数寄存器值高位寄存器值低位CRC低位CRC高位10030200004447其中03H功能是主机读从机数据.主机的数据帧给出的是从机地址(10)、功能号(03)、数据起始地址(00 00)、寄存器数(00 00)及CRC校验码(87,4B,先低位,后高位).当从机接收到主机的读命令后,返回的数据帧包括:从机地址(10)、功能号(03H)、返回数据的字节数(02)、返回的寄存器值(00 00)以及CRC校验码(44,47).上述串口通信软件已成功应用于静止无功补偿装置,PC机可以通过Labview观察接收到来自下位机DSP的数据,程序运行结果如图5所示.图5中为非线性负载二极管整流电路的A相输入电流波形.图5程序运行结果
Fig.5The waveform of result3结语在数据通信量小且系统可靠性高的情况下,MODBUS协议不失为一种很好的解决方案,MODBUS协议具有开放性、易实现、用户范围广、可靠性强、扩展性好等优点.利用C语言编制的DSP 从站通信程序具有简单、可靠、可读性强等特点.同时,由于从站发送接收都采用了中断方式,当通信网络出现故障时,将不会影响从站仪表的工作,在最大程度上保证系统工作的稳定性.实验结果验证了串口通信系统的可行性和实用性.